From 2f95b6911d2a92177480c68ab117736a987ab8f6 Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Mon, 25 Jul 2016 19:39:46 +0300 Subject: [PATCH 001/253] fix(android): Fixing version reporting --- actor-sdk/sdk-core-android/android-google-maps/build.gradle | 2 +- actor-sdk/sdk-core-android/android-google-push/build.gradle | 2 +- actor-sdk/sdk-core-android/android-sdk/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-google-maps/build.gradle b/actor-sdk/sdk-core-android/android-google-maps/build.gradle index 8b47e517fb..e25667ecd2 100644 --- a/actor-sdk/sdk-core-android/android-google-maps/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-maps/build.gradle @@ -112,7 +112,7 @@ if (project.rootProject.file('gradle.properties').exists()) { properties.load(project.rootProject.file('gradle.properties').newDataInputStream()) ossrhUsername = properties.getProperty("ossrhUsername", "") ossrhPassword = properties.getProperty("ossrhPassword", "") - version = baseVersion + properties.getProperty("build_index", "") + version = baseVersion + "." + properties.getProperty("build_index", "") nexusStaging { username ossrhUsername diff --git a/actor-sdk/sdk-core-android/android-google-push/build.gradle b/actor-sdk/sdk-core-android/android-google-push/build.gradle index 788b88b806..7e6e58cf81 100644 --- a/actor-sdk/sdk-core-android/android-google-push/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-push/build.gradle @@ -109,7 +109,7 @@ if (project.rootProject.file('gradle.properties').exists()) { properties.load(project.rootProject.file('gradle.properties').newDataInputStream()) ossrhUsername = properties.getProperty("ossrhUsername", "") ossrhPassword = properties.getProperty("ossrhPassword", "") - version = baseVersion + properties.getProperty("build_index", "") + version = baseVersion + "." + properties.getProperty("build_index", "") nexusStaging { username ossrhUsername diff --git a/actor-sdk/sdk-core-android/android-sdk/build.gradle b/actor-sdk/sdk-core-android/android-sdk/build.gradle index 835f300b91..de80ee6c67 100644 --- a/actor-sdk/sdk-core-android/android-sdk/build.gradle +++ b/actor-sdk/sdk-core-android/android-sdk/build.gradle @@ -159,7 +159,7 @@ if (project.rootProject.file('gradle.properties').exists()) { properties.load(project.rootProject.file('gradle.properties').newDataInputStream()) ossrhUsername = properties.getProperty("ossrhUsername", "") ossrhPassword = properties.getProperty("ossrhPassword", "") - version = baseVersion + properties.getProperty("build_index", "") + version = baseVersion + "." + properties.getProperty("build_index", "") print("##teamcity[buildNumber '$version']") From fa9584464d883a8dc1520368e18abc4ce1df7eb2 Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Mon, 25 Jul 2016 20:07:36 +0300 Subject: [PATCH 002/253] feat(iOS): Adding version --- actor-sdk/sdk-core-ios/VERSION | 1 + 1 file changed, 1 insertion(+) create mode 100644 actor-sdk/sdk-core-ios/VERSION diff --git a/actor-sdk/sdk-core-ios/VERSION b/actor-sdk/sdk-core-ios/VERSION new file mode 100644 index 0000000000..415b19fc36 --- /dev/null +++ b/actor-sdk/sdk-core-ios/VERSION @@ -0,0 +1 @@ +2.0 \ No newline at end of file From a1d10ad79e34beb79d385a463cba1ec186fb9089 Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Mon, 25 Jul 2016 20:15:05 +0300 Subject: [PATCH 003/253] feat(iOS): Version update --- actor-sdk/sdk-core-ios/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-ios/VERSION b/actor-sdk/sdk-core-ios/VERSION index 415b19fc36..f398a20612 100644 --- a/actor-sdk/sdk-core-ios/VERSION +++ b/actor-sdk/sdk-core-ios/VERSION @@ -1 +1 @@ -2.0 \ No newline at end of file +3.0 \ No newline at end of file From 1c97a5384dcba08f59c631e14d4fb2265011ee2b Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Mon, 25 Jul 2016 20:01:17 +0300 Subject: [PATCH 004/253] feat(scheme): Added showJoinLeaveMessages --- actor-sdk/sdk-api/actor.json | 11 +++++++++++ .../im.actor.api/models/im/actor/api/scheme.mps | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/actor-sdk/sdk-api/actor.json b/actor-sdk/sdk-api/actor.json index 7316b4f0d6..b27bd3cb55 100644 --- a/actor-sdk/sdk-api/actor.json +++ b/actor-sdk/sdk-api/actor.json @@ -10415,6 +10415,12 @@ "argument": "canAdminsEditGroupInfo", "category": "full", "description": " Can admins edit group info" + }, + { + "type": "reference", + "argument": "showJoinLeaveMessages", + "category": "full", + "description": " Should join and leave messages be visible to members" } ], "expandable": "true", @@ -10438,6 +10444,11 @@ "type": "bool", "id": 4, "name": "canAdminsEditGroupInfo" + }, + { + "type": "bool", + "id": 5, + "name": "showJoinLeaveMessages" } ] } diff --git a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps index 39bb9626af..dc46e3760b 100644 --- a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps +++ b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps @@ -9131,6 +9131,11 @@ + + + + + @@ -9154,6 +9159,11 @@ + + + + + From e6adff9fffc8a37d5f3b2759a9c525a5e0b7e210 Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Mon, 25 Jul 2016 21:09:05 +0300 Subject: [PATCH 005/253] fix(js): Fixing JS compilation errors --- .../main/java/im/actor/core/js/JsFacade.java | 152 ++++++------------ .../actor/core/js/modules/JsFilesModule.java | 6 +- .../actor/core/js/modules/JsIdleModule.java | 6 +- 3 files changed, 50 insertions(+), 114 deletions(-) diff --git a/actor-sdk/sdk-core/core/core-js/src/main/java/im/actor/core/js/JsFacade.java b/actor-sdk/sdk-core/core/core-js/src/main/java/im/actor/core/js/JsFacade.java index d51189299f..b10a810aa4 100644 --- a/actor-sdk/sdk-core/core/core-js/src/main/java/im/actor/core/js/JsFacade.java +++ b/actor-sdk/sdk-core/core/core-js/src/main/java/im/actor/core/js/JsFacade.java @@ -448,17 +448,9 @@ public JsPromise editMessage(JsPeer peer, String id, String newText) { return JsPromise.create(new JsPromiseExecutor() { @Override public void execute() { - messenger.updateMessage(peer.convert(), newText, Long.parseLong(id)).start(new CommandCallback() { - @Override - public void onResult(Void res) { - resolve(); - } - - @Override - public void onError(Exception e) { - reject(e.getMessage()); - } - }); + messenger.updateMessage(peer.convert(), newText, Long.parseLong(id)) + .then(r -> resolve()) + .failure(e -> reject(e.getMessage())); } }); } @@ -1233,39 +1225,39 @@ private JsArray convertSearchRes(List>() { - @Override - public void onResult(List res) { - Log.d(TAG, "findGroups:result"); - JsArray jsRes = JsArray.createArray().cast(); - for (PeerSearchEntity s : res) { - if (s.getPeer().getPeerType() == PeerType.GROUP) { - jsRes.push(JsPeerSearchResult.create(messenger.buildPeerInfo(s.getPeer()), - s.getDescription(), s.getMembersCount(), (int) (s.getDate() / 1000L), - messenger.buildPeerInfo(Peer.user(s.getCreatorUid())), s.isPublic(), - s.isJoined())); - } else if (s.getPeer().getPeerType() == PeerType.PRIVATE) { - jsRes.push(JsPeerSearchResult.create(messenger.buildPeerInfo(s.getPeer()))); - } - // jsRes.push(); - } - resolve(jsRes); - } - - @Override - public void onError(Exception e) { - Log.d(TAG, "findGroups:error"); - reject(e.getMessage()); - } - }); - } - }); - } +// @UsedByApp +// public JsPromise findGroups() { +// return JsPromise.create(new JsPromiseExecutor() { +// @Override +// public void execute() { +// messenger.findPeers(PeerSearchType.GROUPS).start(new CommandCallback>() { +// @Override +// public void onResult(List res) { +// Log.d(TAG, "findGroups:result"); +// JsArray jsRes = JsArray.createArray().cast(); +// for (PeerSearchEntity s : res) { +// if (s.getPeer().getPeerType() == PeerType.GROUP) { +// jsRes.push(JsPeerSearchResult.create(messenger.buildPeerInfo(s.getPeer()), +// s.getDescription(), s.getMembersCount(), (int) (s.getDate() / 1000L), +// messenger.buildPeerInfo(Peer.user(s.getCreatorUid())), s.isPublic(), +// s.isJoined())); +// } else if (s.getPeer().getPeerType() == PeerType.PRIVATE) { +// jsRes.push(JsPeerSearchResult.create(messenger.buildPeerInfo(s.getPeer()))); +// } +// // jsRes.push(); +// } +// resolve(jsRes); +// } +// +// @Override +// public void onError(Exception e) { +// Log.d(TAG, "findGroups:error"); +// reject(e.getMessage()); +// } +// }); +// } +// }); +// } @UsedByApp public void changeMyAvatar(final JsFile file) { @@ -1329,43 +1321,19 @@ public JsPromise editGroupTitle(final int gid, final String newTitle) { return JsPromise.create(new JsPromiseExecutor() { @Override public void execute() { - //noinspection ConstantConditions - messenger.editGroupTitle(gid, newTitle).start(new CommandCallback() { - @Override - public void onResult(Void res) { - Log.d(TAG, "editGroupTitle:result"); - resolve(); - } - @Override - public void onError(Exception e) { - Log.d(TAG, "editGroupTitle:error"); - reject(e.getMessage()); - } - }); + messenger.editGroupTitle(gid, newTitle) + .then(r -> resolve()) + .failure(e -> reject(e.getMessage())); } + }); } + @UsedByApp public JsPromise editGroupAbout(final int gid, final String newAbout) { - return JsPromise.create(new JsPromiseExecutor() { - @Override - public void execute() { - messenger.editGroupAbout(gid, newAbout).start(new CommandCallback() { - @Override - public void onResult(Void res) { - resolve(); - } - - @Override - public void onError(Exception e) { - Log.e(TAG, e); - reject(e.getMessage()); - } - }); - } - }); + return JsPromise.from(messenger.editGroupAbout(gid, newAbout).map(r -> null)); } @UsedByApp @@ -1386,19 +1354,9 @@ public JsPromise createGroup(final String title, final JsFile file, final int[] public void execute() { String avatarDescriptor = file != null ? provider.registerUploadFile(file) : null; //noinspection ConstantConditions - messenger.createGroup(title, avatarDescriptor, uids).start(new CommandCallback() { - @Override - public void onResult(Integer res) { - Log.d(TAG, "createGroup:result"); - resolve(JsPeer.create(Peer.group(res))); - } - - @Override - public void onError(Exception e) { - Log.d(TAG, "createGroup:error"); - reject(e.getMessage()); - } - }); + messenger.createGroup(title, avatarDescriptor, uids) + .then(r -> resolve(JsPeer.create(Peer.group(r)))) + .failure(e -> reject(e.getMessage())); } }); } @@ -1451,25 +1409,7 @@ public void onError(Exception e) { @UsedByApp public JsPromise leaveGroup(final int gid) { - return JsPromise.create(new JsPromiseExecutor() { - @Override - public void execute() { - //noinspection ConstantConditions - messenger.leaveGroup(gid).start(new CommandCallback() { - @Override - public void onResult(Void res) { - Log.d(TAG, "leaveGroup:result"); - resolve(); - } - - @Override - public void onError(Exception e) { - Log.d(TAG, "leaveGroup:error"); - reject(e.getMessage()); - } - }); - } - }); + return JsPromise.from(messenger.leaveGroup(gid).map(r -> null)); } @UsedByApp diff --git a/actor-sdk/sdk-core/core/core-js/src/main/java/im/actor/core/js/modules/JsFilesModule.java b/actor-sdk/sdk-core/core/core-js/src/main/java/im/actor/core/js/modules/JsFilesModule.java index 65221f229b..82dd212b84 100644 --- a/actor-sdk/sdk-core/core/core-js/src/main/java/im/actor/core/js/modules/JsFilesModule.java +++ b/actor-sdk/sdk-core/core/core-js/src/main/java/im/actor/core/js/modules/JsFilesModule.java @@ -22,10 +22,8 @@ import im.actor.core.network.RpcException; import im.actor.runtime.Log; import im.actor.runtime.Storage; -import im.actor.runtime.actors.ActorCreator; +import im.actor.runtime.actors.ActorCancellable; import im.actor.runtime.actors.ActorRef; -import im.actor.runtime.actors.Cancellable; -import im.actor.runtime.actors.Props; import static im.actor.runtime.actors.ActorSystem.system; @@ -137,7 +135,7 @@ private static class FileBinderActor extends ModuleActor { private boolean isLoading = false; private JsFilesModule filesModule; private ArrayList filesQueue = new ArrayList<>(); - private Cancellable performCancellable; + private ActorCancellable performCancellable; public FileBinderActor(JsFilesModule filesModule, ModuleContext context) { super(context); diff --git a/actor-sdk/sdk-core/core/core-js/src/main/java/im/actor/core/js/modules/JsIdleModule.java b/actor-sdk/sdk-core/core/core-js/src/main/java/im/actor/core/js/modules/JsIdleModule.java index a4137ea121..0be53dc8fc 100644 --- a/actor-sdk/sdk-core/core/core-js/src/main/java/im/actor/core/js/modules/JsIdleModule.java +++ b/actor-sdk/sdk-core/core/core-js/src/main/java/im/actor/core/js/modules/JsIdleModule.java @@ -5,10 +5,8 @@ import im.actor.core.modules.AbsModule; import im.actor.core.modules.ModuleActor; import im.actor.core.modules.ModuleContext; -import im.actor.runtime.actors.ActorCreator; +import im.actor.runtime.actors.ActorCancellable; import im.actor.runtime.actors.ActorRef; -import im.actor.runtime.actors.Cancellable; -import im.actor.runtime.actors.Props; import static im.actor.runtime.actors.ActorSystem.system; @@ -41,7 +39,7 @@ private static class IdleActor extends ModuleActor implements JsIdleCallback { private boolean isAppVisible = true; private JsMessenger messenger; - private Cancellable flushCancellable; + private ActorCancellable flushCancellable; private boolean isElectron = JsElectronApp.isElectron(); public IdleActor(JsMessenger messenger, ModuleContext context) { From accc0b2501462e4785a124e65954af960464ba15 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 14 Jul 2016 05:32:40 +0300 Subject: [PATCH 006/253] wip(server): channels logic implementation --- .../actor-core/src/main/protobuf/dialog.proto | 4 +- .../src/main/protobuf/groupV2.proto | 16 ++- .../server/dialog/DialogCommandHandlers.scala | 10 +- .../actor/server/dialog/DialogExtension.scala | 4 +- .../server/group/GroupCommandHandlers.scala | 70 ++++++++--- .../actor/server/group/GroupOperations.scala | 19 ++- .../group/GroupPeerCommandHandlers.scala | 38 ++++-- .../actor/server/group/GroupProcessor.scala | 7 ++ .../server/group/GroupQueryHandlers.scala | 115 +++++++++++++----- .../im/actor/server/group/GroupState.scala | 13 +- .../messaging/MessagingServiceImpl.scala | 1 + 11 files changed, 223 insertions(+), 74 deletions(-) diff --git a/actor-server/actor-core/src/main/protobuf/dialog.proto b/actor-server/actor-core/src/main/protobuf/dialog.proto index 0910ff52ba..bd5016f130 100644 --- a/actor-server/actor-core/src/main/protobuf/dialog.proto +++ b/actor-server/actor-core/src/main/protobuf/dialog.proto @@ -259,7 +259,9 @@ message DialogCommands { google.protobuf.StringValue delivery_tag = 13; } - message SendMessageAck {} + message SendMessageAck { + Peer updated_sender = 1; + } message MessageReceived { option (scalapb.message).extends = "im.actor.server.dialog.DirectDialogCommand"; diff --git a/actor-server/actor-core/src/main/protobuf/groupV2.proto b/actor-server/actor-core/src/main/protobuf/groupV2.proto index f00627bb63..405a836fa3 100644 --- a/actor-server/actor-core/src/main/protobuf/groupV2.proto +++ b/actor-server/actor-core/src/main/protobuf/groupV2.proto @@ -39,13 +39,14 @@ message GroupEnvelope { GroupQueries.GetAccessHash get_access_hash = 15; GroupQueries.GetTitle get_title = 16; GroupQueries.GetIntegrationToken get_integration_token = 17; - GroupQueries.GetMembers get_members = 18; + GroupQueries.GetMembers get_members = 18; // internalGetMembers GroupQueries.LoadMembers load_members = 19; GroupQueries.IsPublic is_public = 20; GroupQueries.IsHistoryShared is_history_shared = 21; GroupQueries.GetApiStruct get_api_struct = 22; GroupQueries.GetApiFullStruct get_api_full_struct = 23; GroupQueries.CheckAccessHash check_access_hash = 24; + GroupQueries.CanSendMessage can_send_message = 26; } DialogEnvelope dialog_envelope = 25; } @@ -273,4 +274,17 @@ message GroupQueries { repeated int32 user_ids = 1; google.protobuf.BytesValue offset = 2;// should it be Option[Array[Byte]] } + + message CanSendMessage { + option (scalapb.message).extends = "GroupQuery"; + + int32 client_user_id = 1; + } + + message CanSendMessageResponse { + bool can_send = 1; + bool is_channel = 2; + repeated int32 member_ids = 3; + google.protobuf.Int32Value bot_id = 4; + } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogCommandHandlers.scala index 478c984b2a..548cd039ba 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogCommandHandlers.scala @@ -58,15 +58,19 @@ trait DialogCommandHandlers extends PeersImplicits with UserAcl { case false ⇒ withNonBlockedPeer[SeqStateDate](userId, sm.getDest)( default = for { - _ ← dialogExt.ackSendMessage(peer, sm.copy(date = Some(sendDate))) - _ ← db.run(writeHistoryMessage(selfPeer, peer, new DateTime(sendDate), sm.randomId, message.header, message.toByteArray)) + SendMessageAck(updatedSender) ← dialogExt.ackSendMessage(peer, sm.withDate(sendDate)) + finalPeer = updatedSender getOrElse selfPeer + _ ← db.run(writeHistoryMessage(finalPeer, peer, new DateTime(sendDate), sm.randomId, message.header, message.toByteArray)) //_ = dialogExt.updateCounters(peer, userId) + // not sure about sender user id. It could be wrong when we have updatedSender! SeqState(seq, state) ← deliveryExt.senderDelivery(userId, optClientAuthId, peer, sm.randomId, sendDate, message, sm.isFat, sm.deliveryTag) } yield SeqStateDate(seq, state, sendDate), failed = for { _ ← db.run(writeHistoryMessageSelf(userId, peer, userId, new DateTime(sendDate), sm.randomId, message.header, message.toByteArray)) SeqState(seq, state) ← deliveryExt.senderDelivery(userId, optClientAuthId, peer, sm.randomId, sendDate, message, sm.isFat, sm.deliveryTag) - } yield SeqStateDate(seq, state, sendDate) + } yield { + SeqStateDate(seq, state, sendDate) + } ) } } yield seqStateDate diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogExtension.scala b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogExtension.scala index f90749ab58..69a2611377 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogExtension.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogExtension.scala @@ -152,8 +152,8 @@ final class DialogExtensionImpl(system: ActorSystem) extends DialogExtension wit } yield seqStateDate.copy(seq = seq, state = state) } - def ackSendMessage(peer: Peer, sm: SendMessage): Future[Unit] = - (processorRegion(peer) ? envelope(peer, DialogEnvelope().withSendMessage(sm))).mapTo[SendMessageAck] map (_ ⇒ ()) + def ackSendMessage(peer: Peer, sm: SendMessage): Future[SendMessageAck] = + (processorRegion(peer) ? envelope(peer, DialogEnvelope().withSendMessage(sm))).mapTo[SendMessageAck] def writeMessage( peer: ApiPeer, diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 9fa5cb7a14..e66f708253 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -121,7 +121,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { ) /////////////////////////// - // new group api updates // + // Groups V2 API updates // /////////////////////////// // send service message to group @@ -176,15 +176,15 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val dateMillis = evt.ts.toEpochMilli val memberIds = newState.memberIds - val members = newState.members.values.map(_.asStruct).toVector + val apiMembers = newState.members.values.map(_.asStruct).toVector // if user ever been in this group - we should push these updates, // but don't push them if user is first time in group. in this case we should push FatSeqUpdate - val inviteeUpdatesNew: List[Update] = refreshGroupUpdates(newState) + val inviteeUpdatesNew: List[Update] = refreshGroupUpdates(newState, cmd.inviteeUserId) // send everyone in group, including invitee. // send `FatSeqUpdate` if this user invited to group for first time. - val membersUpdateNew = UpdateGroupMembersUpdated(groupId, members) + val membersUpdateNew = UpdateGroupMembersUpdated(groupId, apiMembers) val inviteeUpdateObsolete = UpdateGroupInviteObsolete( groupId, @@ -205,6 +205,37 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { //TODO: remove deprecated db.run(GroupUserRepo.create(groupId, cmd.inviteeUserId, cmd.inviterUserId, evt.ts, None, isAdmin = false)) + // def inviteGROUPUpdates: Future[SeqState] = + // for { + // _ ← seqUpdExt.deliverUserUpdate( + // userId = cmd.inviteeUserId, + // membersUpdateNew, + // pushRules = seqUpdExt.pushRules(isFat = !inviteeIsExUser, Some(PushTexts.Invited)), + // deliveryId = s"invite_${groupId}_${cmd.randomId}" + // ) + // + // // push all group updates to inviteeUserId + // _ ← FutureExt.ftraverse(inviteeUpdatesNew) { update ⇒ + // seqUpdExt.deliverUserUpdate(userId = cmd.inviteeUserId, update) + // } + // + // // push updated members list to all group members except inviteeUserId + // seqState ← seqUpdExt.broadcastClientUpdate( + // userId = cmd.inviterUserId, + // authId = cmd.inviterAuthId, + // bcastUserIds = (memberIds - cmd.inviterUserId) - cmd.inviteeUserId, + // update = membersUpdateNew, + // deliveryId = s"useradded_${groupId}_${cmd.randomId}" + // ) + // /////////////////////////////////////////////// + // } yield seqState + + // def inviteCHANNELUpdates: Future[SeqState] = if(newState.isAdmin()) + // for { + // + // + // } yield () + val result: Future[SeqStateDate] = for { /////////////////////////// // old group api updates // @@ -236,9 +267,10 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { ) /////////////////////////// - // new group api updates // + // Groups V2 API updates // /////////////////////////// + ////////////////////////////////////////////////// // push updated members list to inviteeUserId, _ ← seqUpdExt.deliverUserUpdate( userId = cmd.inviteeUserId, @@ -260,6 +292,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { update = membersUpdateNew, deliveryId = s"useradded_${groupId}_${cmd.randomId}" ) + ////////////////////////////////////////////////// // explicitly send service message SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( @@ -309,7 +342,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // If user was invited to group by other member - we don't need to push group updates, // cause they we pushed already on invite step val joiningUserUpdatesNew: List[Update] = - if (wasInvited) List.empty[Update] else refreshGroupUpdates(newState) + if (wasInvited) List.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId) // нужно отправить ему апдейт о членах в группе. // всем нужно отправить апдейт о изменившихся членах в группе. можно в любом случае отправить @@ -348,7 +381,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { ) /////////////////////////// - // new group api updates // + // Groups V2 API updates // /////////////////////////// // push all group updates to joiningUserId @@ -440,7 +473,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { ) /////////////////////////// - // new group api updates // + // Groups V2 API updates // /////////////////////////// // push updated members list to all group members @@ -526,7 +559,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { ) /////////////////////////// - // new group api updates // + // Groups V2 API updates // /////////////////////////// // push updated members list to all group members. Don't push to kicked user! @@ -561,6 +594,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } + //TODO: channels, don't allow non-admin to change topic protected def updateAvatar(cmd: UpdateAvatar): Unit = { if (state.nonMember(cmd.clientUserId)) { sender() ! notMember @@ -585,7 +619,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { _ ← seqUpdExt.broadcastClientUpdate(cmd.clientUserId, cmd.clientAuthId, memberIds, updateObsolete) /////////////////////////// - // new group api updates // + // Groups V2 API updates // /////////////////////////// SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( @@ -609,6 +643,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } + //TODO: channels, don't allow non-admin to change topic protected def updateTitle(cmd: UpdateTitle): Unit = { val title = cmd.title if (state.nonMember(cmd.clientUserId)) { @@ -651,7 +686,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { ) /////////////////////////// - // new group api updates // + // Groups V2 API updates // /////////////////////////// SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( @@ -677,6 +712,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } + //TODO: channels, don't allow non-admin to change topic protected def updateTopic(cmd: UpdateTopic): Unit = { def isValidTopic(topic: Option[String]) = topic.forall(_.length < 255) @@ -722,7 +758,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { ) /////////////////////////// - // new group api updates // + // Groups V2 API updates // /////////////////////////// SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( @@ -786,7 +822,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { ) /////////////////////////// - // new group api updates // + // Groups V2 API updates // /////////////////////////// SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( @@ -872,7 +908,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { ) /////////////////////////// - // new group api updates // + // Groups V2 API updates // /////////////////////////// _ ← seqUpdExt.broadcastPeopleUpdate( @@ -928,15 +964,15 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Updates that will be sent to user, when he enters group. // Helps clients that have this group to refresh it's data. // TODO: review when chanels will be added - private def refreshGroupUpdates(newState: GroupState): List[Update] = List( + private def refreshGroupUpdates(newState: GroupState, userId: Int): List[Update] = List( UpdateGroupMemberChanged(groupId, isMember = true), UpdateGroupAboutChanged(groupId, newState.about), UpdateGroupAvatarChanged(groupId, newState.avatar), UpdateGroupTopicChanged(groupId, newState.topic), UpdateGroupTitleChanged(groupId, newState.title), UpdateGroupOwnerChanged(groupId, newState.ownerUserId), - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = true), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = true) + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = newState.canViewMembers(userId)), + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = true) // TODO: figure out right value // UpdateGroupExtChanged(groupId, newState.extension) //TODO: figure out and fix // if(bigGroup) UpdateGroupMembersCountChanged(groupId, newState.extension) ) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala index d350a2657d..b599ef87ce 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala @@ -150,11 +150,21 @@ private[group] sealed trait Queries { .withCheckAccessHash(CheckAccessHash(hash))).mapTo[CheckAccessHashResponse] map (_.isCorrect) //(memberIds, invitedUserIds, botId) - def getMemberIds(groupId: Int): Future[(Seq[Int], Seq[Int], Option[Int])] = + // TODO: should be signed as internal API, and become narrowly scoped + def getMemberIds(groupId: Int): Future[(Seq[Int], Seq[Int], Option[Int])] = //TODO: prepare for channel (viewRegion.ref ? GroupEnvelope(groupId) .withGetMembers(GetMembers())).mapTo[GetMembersResponse] map (r ⇒ (r.memberIds, r.invitedUserIds, r.botId)) + def canSendMessage(groupId: Int, clientUserId: Int): Future[CanSendMessageInfo] = + (viewRegion.ref ? + GroupEnvelope(groupId) + .withCanSendMessage(CanSendMessage(clientUserId))).mapTo[CanSendMessageResponse] map { + case CanSendMessageResponse(canSend, isChannel, memberIds, botId) ⇒ + CanSendMessageInfo(canSend, isChannel, memberIds.toSet, botId) + } + + //TODO: move to separate Query. def isMember(groupId: Int, userId: Int): Future[Boolean] = getMemberIds(groupId) map (_._1.contains(userId)) @@ -173,3 +183,10 @@ private[group] sealed trait Queries { GroupEnvelope(groupId) .withLoadMembers(LoadMembers(clientUserId, limit, offset map ByteString.copyFrom))).mapTo[LoadMembersResponse] map (r ⇒ r.userIds → r.offset.map(_.toByteArray)) } + +final case class CanSendMessageInfo( + canSend: Boolean, + isChannel: Boolean, + memberIds: Set[Int], + botId: Option[Int] +) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupPeerCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupPeerCommandHandlers.scala index 3523f87e28..bca7533ee3 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupPeerCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupPeerCommandHandlers.scala @@ -1,11 +1,10 @@ package im.actor.server.group -import akka.actor.Status import akka.http.scaladsl.util.FastFuture import akka.pattern.pipe import im.actor.api.rpc.PeersImplicits import im.actor.server.dialog.DialogCommands._ -import im.actor.server.group.GroupErrors.NotAMember +import im.actor.server.group.GroupErrors.{ NotAMember, NotAdmin } import im.actor.server.model.Peer import scala.concurrent.Future @@ -17,8 +16,18 @@ trait GroupPeerCommandHandlers extends PeersImplicits { protected def incomingMessage(state: GroupPeerState, sm: SendMessage): Unit = { val senderUserId = sm.getOrigin.id - (withMemberIds(groupId) { (memberIds, _, optBot) ⇒ - if (canSend(memberIds, optBot, senderUserId)) { + + val result: Future[SendMessageAck] = groupExt.canSendMessage(groupId, senderUserId) flatMap { + case CanSendMessageInfo(true, isChannel, memberIds, optBotId) ⇒ + val (ack, smUpdated) = if (isChannel) { + optBotId map { botId ⇒ + val botPeer = Peer.privat(botId) + SendMessageAck().withUpdatedSender(botPeer) → sm.withOrigin(botPeer) + } getOrElse (SendMessageAck() → sm) + } else { + SendMessageAck() → sm + } + val receiverIds = sm.forUserId match { case Some(id) if memberIds.contains(id) ⇒ Seq(id) case _ ⇒ memberIds - senderUserId @@ -26,18 +35,23 @@ trait GroupPeerCommandHandlers extends PeersImplicits { for { _ ← Future.traverse(receiverIds) { userId ⇒ - dialogExt.ackSendMessage(Peer.privat(userId), sm) + dialogExt.ackSendMessage(Peer.privat(userId), smUpdated) } } yield { self ! LastSenderIdChanged(senderUserId) - SendMessageAck() + ack } - } else FastFuture.successful(Status.Failure(NotAMember)) - } recover { - case e ⇒ - log.error(e, "Failed to send message") - throw e - }) pipeTo sender() + case CanSendMessageInfo(false, true, _, _) ⇒ + FastFuture.failed(NotAdmin) + case CanSendMessageInfo(false, _, _, _) ⇒ + FastFuture.failed(NotAMember) + } + + result onFailure { + case e: Exception ⇒ log.error(e, "Failed to send message") + } + + result pipeTo sender() } protected def messageReceived(state: GroupPeerState, mr: MessageReceived) = { diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index fb053f1d04..5d562402f4 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -45,6 +45,7 @@ object GroupProcessor { 20017 → classOf[GroupCommands.MakeUserAdmin], 20018 → classOf[GroupCommands.RevokeIntegrationToken], 20020 → classOf[GroupCommands.RevokeIntegrationTokenAck], + 20021 → classOf[GroupCommands.TransferOwnership], 21001 → classOf[GroupQueries.GetIntegrationToken], 21002 → classOf[GroupQueries.GetIntegrationTokenResponse], @@ -60,6 +61,11 @@ object GroupProcessor { 21013 → classOf[GroupQueries.GetAccessHashResponse], 21014 → classOf[GroupQueries.IsHistoryShared], 21015 → classOf[GroupQueries.IsHistorySharedResponse], + 21016 → classOf[GroupQueries.GetTitle], + 21017 → classOf[GroupQueries.LoadMembers], + 21018 → classOf[GroupQueries.GetApiFullStruct], + 21019 → classOf[GroupQueries.CanSendMessage], + 21020 → classOf[GroupQueries.CanSendMessageResponse], 22003 → classOf[GroupEvents.UserInvited], 22004 → classOf[GroupEvents.UserJoined], @@ -153,6 +159,7 @@ private[group] final class GroupProcessor case GetApiStruct(clientUserId) ⇒ getApiStruct(clientUserId) case GetApiFullStruct(clientUserId) ⇒ getApiFullStruct(clientUserId) case CheckAccessHash(accessHash) ⇒ checkAccessHash(accessHash) + case CanSendMessage(clientUserId) ⇒ canSendMessage(clientUserId) } def persistenceId: String = GroupProcessor.persistenceIdFor(groupId) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index 517d00e127..62655a9e1f 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -7,6 +7,9 @@ import com.google.protobuf.ByteString import com.google.protobuf.wrappers.Int32Value import im.actor.api.rpc.groups.{ ApiGroup, ApiGroupFull, ApiGroupType, ApiMember } import im.actor.server.group.GroupQueries._ +import im.actor.server.group.GroupType.{ Channel, General, Public } + +import scala.concurrent.Future trait GroupQueryHandlers { self: GroupProcessor ⇒ @@ -19,14 +22,16 @@ trait GroupQueryHandlers { protected def getTitle = FastFuture.successful(GetTitleResponse(state.title)) - protected def getIntegrationToken(optUserId: Option[Int]) = { + protected def getIntegrationToken(optUserId: Option[Int]): Future[GetIntegrationTokenResponse] = { val canViewToken = optUserId.forall(state.isAdmin) FastFuture.successful(GetIntegrationTokenResponse( if (canViewToken) state.bot.map(_.token) else None )) } - protected def getMembers = + //TODO: do something with this method. Will this method used in "client" context. + // If not - don't change it. Maybe rename to `getMembersInternal` + protected def getMembers: Future[GetMembersResponse] = FastFuture.successful { GetMembersResponse( memberIds = state.members.keySet.toSeq, @@ -35,22 +40,33 @@ trait GroupQueryHandlers { ) } - protected def loadMembers(clientUserId: Int, limit: Int, offsetBs: Option[ByteString]) = { - implicit val mat = ActorMaterializer() - val offset = offsetBs map (_.toByteArray) map (Int32Value.parseFrom(_).value) getOrElse 0 - - for { - (userIds, nextOffset) ← Source(state.members.keySet) - .mapAsync(1)(userId ⇒ userExt.getName(userId, clientUserId) map (userId → _)) - .runFold(Vector.empty[(Int, String)])(_ :+ _) map { users ⇒ - val tail = users.sortBy(_._2).map(_._1).drop(offset) - val nextOffset = if (tail.length > limit) Some(Int32Value(offset + limit).toByteArray) else None - (tail.take(limit), nextOffset) - } - } yield LoadMembersResponse( - userIds = userIds, - offset = nextOffset map ByteString.copyFrom - ) + //TODO: rewrite to sort by online + name. Won't work like this + // we can subscribe group object to group onlines! When online comes, we reorder key-set. Use that key set as source. + protected def loadMembers(clientUserId: Int, limit: Int, offsetBs: Option[ByteString]): Future[LoadMembersResponse] = { + def load = { + implicit val mat = ActorMaterializer() + val offset = offsetBs map (_.toByteArray) map (Int32Value.parseFrom(_).value) getOrElse 0 + + for { + (userIds, nextOffset) ← Source(state.members.keySet) + .mapAsync(1)(userId ⇒ userExt.getName(userId, clientUserId) map (userId → _)) + .runFold(Vector.empty[(Int, String)])(_ :+ _) map { users ⇒ + val tail = users.sortBy(_._2).map(_._1).drop(offset) + val nextOffset = if (tail.length > limit) Some(Int32Value(offset + limit).toByteArray) else None + (tail.take(limit), nextOffset) + } + } yield LoadMembersResponse( + userIds = userIds, + offset = nextOffset map ByteString.copyFrom + ) + } + + state.typ match { + case General | Public ⇒ load + case Channel ⇒ + if (state.isAdmin(clientUserId)) load + else FastFuture.successful(LoadMembersResponse(Seq.empty, offsetBs)) + } } protected def isPublic = @@ -63,7 +79,7 @@ trait GroupQueryHandlers { //TODO: what if state changes during request? protected def getApiStruct(clientUserId: Int) = { val isMember = state.isMember(clientUserId) - val apiMembers = getApiMembers(state, clientUserId) + val (members, count) = membersAndCount(state, clientUserId) FastFuture.successful { GetApiStructResponse( @@ -74,14 +90,14 @@ trait GroupQueryHandlers { avatar = state.avatar, isMember = Some(isMember), creatorUserId = state.creatorUserId, - members = apiMembers, - createDate = extractCreatedMillis(state), + members = members, + createDate = extractCreatedAtMillis(state), isAdmin = Some(state.isAdmin(clientUserId)), theme = state.topic, about = state.about, isHidden = Some(state.isHidden), ext = None, - membersCount = Some(apiMembers.size), + membersCount = Some(count), groupType = Some(state.typ match { case GroupType.Channel ⇒ ApiGroupType.CHANNEL case GroupType.General | GroupType.Public | GroupType.Unrecognized(_) ⇒ ApiGroupType.GROUP @@ -101,13 +117,13 @@ trait GroupQueryHandlers { theme = state.topic, about = state.about, ownerUserId = state.creatorUserId, - createDate = extractCreatedMillis(state), + createDate = extractCreatedAtMillis(state), ext = None, - canViewMembers = Some(state.canViewMembers(clientUserId)), - canInvitePeople = Some(state.canInvitePeople(clientUserId)), + canViewMembers = Some(state.canViewMembers(clientUserId)), // TODO: revisit + canInvitePeople = Some(state.canInvitePeople(clientUserId)), // TODO: revisit isSharedHistory = Some(state.isHistoryShared), isAsyncMembers = Some(state.members.size > 100), - members = getApiMembers(state, clientUserId) + members = membersAndCount(state, clientUserId)._1 ) ) } @@ -115,15 +131,50 @@ trait GroupQueryHandlers { protected def checkAccessHash(hash: Long) = FastFuture.successful(CheckAccessHashResponse(isCorrect = state.accessHash == hash)) - private def extractCreatedMillis(group: GroupState): Long = + protected def canSendMessage(clientUserId: Int): Future[CanSendMessageResponse] = + FastFuture.successful { + val canSend = state.bot.exists(_.userId == clientUserId) || { + state.typ match { + case General | Public ⇒ state.isMember(clientUserId) + case Channel ⇒ state.isAdmin(clientUserId) + } + } + CanSendMessageResponse( + canSend = canSend, + isChannel = state.typ.isChannel, + memberIds = state.memberIds.toSeq, + botId = state.bot.map(_.userId) + ) + } + + private def extractCreatedAtMillis(group: GroupState): Long = group.createdAt.map(_.toEpochMilli).getOrElse(throw new RuntimeException("No date created provided for group!")) - private def getApiMembers(group: GroupState, clientUserId: Int) = + /** + * Return group members, and number of members. + * If `clientUserId` is not a group member, return empty members list and 0 + * For `General` and `Public` groups return all members and their number. + * For `Channel` return members list only if `clientUserId` is group admin. Otherwise return empty members list and real members count + */ + private def membersAndCount(group: GroupState, clientUserId: Int): (Vector[ApiMember], Int) = { + def apiMembers = group.members.toVector map { + case (_, m) ⇒ + ApiMember(m.userId, m.inviterUserId, m.invitedAt.toEpochMilli, Some(m.isAdmin)) + } + if (state.isMember(clientUserId)) { - group.members.toVector map { - case (_, m) ⇒ - ApiMember(m.userId, m.inviterUserId, m.invitedAt.toEpochMilli, Some(m.isAdmin)) + state.typ match { + case General | Public ⇒ + apiMembers → group.membersCount + case Channel ⇒ + if (state.isAdmin(clientUserId)) + apiMembers → group.membersCount + else + Vector.empty[ApiMember] → group.membersCount } - } else Vector.empty[ApiMember] + } else { + Vector.empty[ApiMember] → 0 + } + } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 128d3dac95..fbe9d2dd44 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -58,7 +58,7 @@ private[group] final case class GroupState( about: Option[String], avatar: Option[Avatar], topic: Option[String], - typ: GroupType, + typ: GroupType, // TODO: rename to groupType isHidden: Boolean, isHistoryShared: Boolean, @@ -86,18 +86,21 @@ private[group] final case class GroupState( def isAdmin(userId: Int): Boolean = members.get(userId) exists (_.isAdmin) + // owner will be super-admin in case of channels def isOwner(userId: Int): Boolean = userId == ownerUserId def isExUser(userId: Int): Boolean = exUserIds.contains(userId) + // in case of general/public can view members if user is member + // in case of channel can view members only if clientUserId is admin def canViewMembers(clientUserId: Int) = - (typ.isGeneral || typ.isPublic) && isMember(clientUserId) + ((typ.isGeneral || typ.isPublic) || isAdmin(clientUserId)) && isMember(clientUserId) + /** + * For now, all members can invite other users to group + */ def canInvitePeople(clientUserId: Int) = isMember(clientUserId) - def canViewMembers(group: GroupState, userId: Int) = - (group.typ.isGeneral || group.typ.isPublic) && isMember(userId) - def isNotCreated = createdAt.isEmpty //TODO: Maybe val. immutable anyway def isCreated = createdAt.nonEmpty //TODO: Maybe val. immutable anyway diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/MessagingServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/MessagingServiceImpl.scala index 5933fcec21..2b7eb0722e 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/MessagingServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/MessagingServiceImpl.scala @@ -30,6 +30,7 @@ final class MessagingServiceImpl(implicit protected val actorSystem: ActorSystem override def onFailure: PartialFunction[Throwable, RpcError] = { case GroupErrors.NotAMember ⇒ CommonRpcErrors.forbidden("You are not a group member.") + case GroupErrors.NotAdmin ⇒ CommonRpcErrors.forbidden("Only admin can perform this action.") case DialogErrors.MessageToSelf ⇒ CommonRpcErrors.forbidden("Sending messages to self is not allowed.") case InvalidAccessHash ⇒ CommonRpcErrors.InvalidAccessHash case DialogErrors.DialogAlreadyArchived(peer) ⇒ From 9c17145b21733ee5ad3f45969f9d87ba3193b3db Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 14 Jul 2016 06:50:09 +0300 Subject: [PATCH 007/253] wip(server): channels progress --- .../server/group/GroupCommandHandlers.scala | 184 +++++++++++------- .../im/actor/server/group/GroupState.scala | 2 + actor-server/project/Build.scala | 3 +- actor-server/project/StartHook.scala | 15 ++ 4 files changed, 129 insertions(+), 75 deletions(-) create mode 100644 actor-server/project/StartHook.scala diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index e66f708253..85a57344d3 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -205,36 +205,62 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { //TODO: remove deprecated db.run(GroupUserRepo.create(groupId, cmd.inviteeUserId, cmd.inviterUserId, evt.ts, None, isAdmin = false)) - // def inviteGROUPUpdates: Future[SeqState] = - // for { - // _ ← seqUpdExt.deliverUserUpdate( - // userId = cmd.inviteeUserId, - // membersUpdateNew, - // pushRules = seqUpdExt.pushRules(isFat = !inviteeIsExUser, Some(PushTexts.Invited)), - // deliveryId = s"invite_${groupId}_${cmd.randomId}" - // ) - // - // // push all group updates to inviteeUserId - // _ ← FutureExt.ftraverse(inviteeUpdatesNew) { update ⇒ - // seqUpdExt.deliverUserUpdate(userId = cmd.inviteeUserId, update) - // } - // - // // push updated members list to all group members except inviteeUserId - // seqState ← seqUpdExt.broadcastClientUpdate( - // userId = cmd.inviterUserId, - // authId = cmd.inviterAuthId, - // bcastUserIds = (memberIds - cmd.inviterUserId) - cmd.inviteeUserId, - // update = membersUpdateNew, - // deliveryId = s"useradded_${groupId}_${cmd.randomId}" - // ) - // /////////////////////////////////////////////// - // } yield seqState - - // def inviteCHANNELUpdates: Future[SeqState] = if(newState.isAdmin()) - // for { - // - // - // } yield () + def inviteGROUPUpdates: Future[SeqState] = + for { + // push updated members list to inviteeUserId, + _ ← seqUpdExt.deliverUserUpdate( + userId = cmd.inviteeUserId, + membersUpdateNew, + pushRules = seqUpdExt.pushRules(isFat = !inviteeIsExUser, Some(PushTexts.Invited)), + deliveryId = s"invite_${groupId}_${cmd.randomId}" + ) + + // push all "refresh group" updates to inviteeUserId + _ ← FutureExt.ftraverse(inviteeUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.inviteeUserId, update) + } + + // push updated members list to all group members except inviteeUserId + seqState ← seqUpdExt.broadcastClientUpdate( + userId = cmd.inviterUserId, + authId = cmd.inviterAuthId, + bcastUserIds = (memberIds - cmd.inviterUserId) - cmd.inviteeUserId, + update = membersUpdateNew, + deliveryId = s"useradded_${groupId}_${cmd.randomId}" + ) + /////////////////////////////////////////////// + } yield seqState + + def inviteCHANNELUpdates: Future[SeqState] = + for { + // push `UpdateGroupMembersUpdated` to invitee only if he is admin. + // invitee could be admin, if he created this group, and turning back + _ ← if (newState.isAdmin(cmd.inviteeUserId)) { + seqUpdExt.deliverUserUpdate( + userId = cmd.inviteeUserId, + membersUpdateNew, + pushRules = seqUpdExt.pushRules(isFat = !inviteeIsExUser, Some(PushTexts.Invited)), + deliveryId = s"invite_${groupId}_${cmd.randomId}" + ) + } else { + FastFuture.successful(()) + } + + // push all "refresh group" updates to inviteeUserId + _ ← FutureExt.ftraverse(inviteeUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.inviteeUserId, update) + } + + // push updated members list to all ADMINS + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = newState.adminIds, + update = membersUpdateNew, + deliveryId = s"useradded_${groupId}_${cmd.randomId}" + ) + + // get current SeqState for inviter user + seqState ← seqUpdExt.getSeqState(cmd.inviterUserId, cmd.inviterAuthId) + } yield seqState val result: Future[SeqStateDate] = for { /////////////////////////// @@ -270,29 +296,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Groups V2 API updates // /////////////////////////// - ////////////////////////////////////////////////// - // push updated members list to inviteeUserId, - _ ← seqUpdExt.deliverUserUpdate( - userId = cmd.inviteeUserId, - membersUpdateNew, - pushRules = seqUpdExt.pushRules(isFat = !inviteeIsExUser, Some(PushTexts.Invited)), - deliveryId = s"invite_${groupId}_${cmd.randomId}" - ) - - // push all group updates to inviteeUserId - _ ← FutureExt.ftraverse(inviteeUpdatesNew) { update ⇒ - seqUpdExt.deliverUserUpdate(userId = cmd.inviteeUserId, update) - } - - // push updated members list to all group members except inviteeUserId - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - userId = cmd.inviterUserId, - authId = cmd.inviterAuthId, - bcastUserIds = (memberIds - cmd.inviterUserId) - cmd.inviteeUserId, - update = membersUpdateNew, - deliveryId = s"useradded_${groupId}_${cmd.randomId}" - ) - ////////////////////////////////////////////////// + SeqState(seq, state) ← if (newState.typ.isChannel) inviteCHANNELUpdates else inviteGROUPUpdates // explicitly send service message SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( @@ -344,9 +348,6 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val joiningUserUpdatesNew: List[Update] = if (wasInvited) List.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId) - // нужно отправить ему апдейт о членах в группе. - // всем нужно отправить апдейт о изменившихся членах в группе. можно в любом случае отправить - // push to everyone, including joining user. // if joining user wasn't invited - send update as FatSeqUpdate // update date when member got into group @@ -366,24 +367,8 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { isAdmin = false )) - val result: Future[(SeqStateDate, Vector[Int], Long)] = + def joinGROUPUpdates: Future[SeqState] = for { - /////////////////////////// - // old group api updates // - /////////////////////////// - - // push update about members to all users, except joining user - _ ← seqUpdExt.broadcastPeopleUpdate( - memberIds - cmd.joiningUserId, - membersUpdateObsolete, - pushRules = seqUpdExt.pushRules(isFat = true, None), - deliveryId = s"userjoined_obsolete_${groupId}_${randomId}" - ) - - /////////////////////////// - // Groups V2 API updates // - /////////////////////////// - // push all group updates to joiningUserId _ ← FutureExt.ftraverse(joiningUserUpdatesNew) { update ⇒ seqUpdExt.deliverUserUpdate(userId = cmd.joiningUserId, update) @@ -391,7 +376,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // push updated members list to joining user, // TODO???: isFat = !wasInvited - is it correct? - SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( + seqState ← seqUpdExt.deliverClientUpdate( userId = cmd.joiningUserId, authId = cmd.joiningUserAuthId, update = membersUpdateNew, @@ -406,6 +391,57 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { membersUpdateNew, deliveryId = s"userjoined_${groupId}_${randomId}" ) + } yield seqState + + def joinCHANNELUpdates: Future[SeqState] = + for { + // push all group updates to joiningUserId + _ ← FutureExt.ftraverse(joiningUserUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.joiningUserId, update) + } + + // push `UpdateGroupMembersUpdated` to joining user only if he is admin. + // joining user can be admin, if he created this group, and turning back + // TODO???: isFat = !wasInvited - is it correct? + seqState ← if (newState.isAdmin(cmd.joiningUserId)) { + seqUpdExt.deliverClientUpdate( + userId = cmd.joiningUserId, + authId = cmd.joiningUserAuthId, + update = membersUpdateNew, + pushRules = seqUpdExt.pushRules(isFat = !wasInvited, None), //!wasInvited means that user came for first time here + deliveryId = s"join_${groupId}_${randomId}" + ) + } else { + seqUpdExt.getSeqState(cmd.joiningUserId, cmd.joiningUserAuthId) + } + + // push updated members list to all ADMINS + _ ← seqUpdExt.broadcastPeopleUpdate( + newState.adminIds - cmd.joiningUserId, + membersUpdateNew, + deliveryId = s"userjoined_${groupId}_${randomId}" + ) + } yield seqState + + val result: Future[(SeqStateDate, Vector[Int], Long)] = + for { + /////////////////////////// + // old group api updates // + /////////////////////////// + + // push update about members to all users, except joining user + _ ← seqUpdExt.broadcastPeopleUpdate( + memberIds - cmd.joiningUserId, + membersUpdateObsolete, + pushRules = seqUpdExt.pushRules(isFat = true, None), + deliveryId = s"userjoined_obsolete_${groupId}_${randomId}" + ) + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// + + SeqState(seq, state) ← if (newState.typ.isChannel) joinCHANNELUpdates else joinGROUPUpdates SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( apiGroupPeer, diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index fbe9d2dd44..ac29c3c85b 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -74,6 +74,8 @@ private[group] final case class GroupState( def memberIds = members.keySet //TODO: Maybe lazy val. immutable anyway + def adminIds = (members filter (_._2.isAdmin == true)).keySet //TODO: Maybe lazy val. immutable anyway + def membersCount = members.size //TODO: Maybe lazy val. immutable anyway def isMember(userId: Int): Boolean = members.contains(userId) diff --git a/actor-server/project/Build.scala b/actor-server/project/Build.scala index f35f67fcb9..59786e31fb 100644 --- a/actor-server/project/Build.scala +++ b/actor-server/project/Build.scala @@ -9,7 +9,7 @@ import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys.MultiJvm import com.typesafe.sbt.packager.archetypes.JavaServerAppPackaging import com.typesafe.sbt.packager.debian.JDebPackaging -object Build extends sbt.Build with Versioning with Releasing with Packaging { +object Build extends sbt.Build with Versioning with Releasing with Packaging with StartHook { val ScalaVersion = "2.11.8" val BotKitVersion = getVersion @@ -89,6 +89,7 @@ object Build extends sbt.Build with Versioning with Releasing with Packaging { "actor", file("."), settings = + startUpSettings ++ packagingSettings ++ defaultSettingsServer ++ Revolver.settings ++ diff --git a/actor-server/project/StartHook.scala b/actor-server/project/StartHook.scala new file mode 100644 index 0000000000..62ca90f078 --- /dev/null +++ b/actor-server/project/StartHook.scala @@ -0,0 +1,15 @@ +package im.actor + +import sbt.Keys._ +import sbt._ + +private[actor] trait StartHook { + lazy val startUpSettings = Seq( + onLoad in Global := { state => + + println("============== hello world") + state + } + ) + +} From d8b3bebfd77cd6cd5f9da2744552aff001f393a3 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 14 Jul 2016 07:53:46 +0300 Subject: [PATCH 008/253] wip(server): channel updates --- .../actor/server/dialog/ActorDelivery.scala | 9 +- .../server/group/GroupCommandHandlers.scala | 331 ++++++++++++------ .../server/sequence/SeqUpdatesExtension.scala | 3 + .../operations/DeliveryOperations.scala | 16 +- actor-server/project/Build.scala | 3 +- actor-server/project/StartHook.scala | 15 - 6 files changed, 246 insertions(+), 131 deletions(-) delete mode 100644 actor-server/project/StartHook.scala diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/ActorDelivery.scala b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/ActorDelivery.scala index e82dbaee32..5433dd0acd 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/ActorDelivery.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/ActorDelivery.scala @@ -1,11 +1,9 @@ package im.actor.server.dialog import akka.actor.ActorSystem -import akka.http.scaladsl.util.FastFuture import im.actor.api.rpc.PeersImplicits import im.actor.api.rpc.counters.{ ApiAppCounters, UpdateCountersChanged } import im.actor.api.rpc.messaging._ -import im.actor.server.db.DbExtension import im.actor.server.messaging.PushText import im.actor.server.model.Peer import im.actor.server.sequence.{ PushData, PushRules, SeqState, SeqUpdatesExtension } @@ -54,7 +52,7 @@ final class ActorDelivery()(implicit val system: ActorSystem) .withCensoredText(censoredPushText) .withPeer(peer) ), - deliveryId = deliveryId(peer, randomId), + deliveryId = seqUpdExt.msgDeliveryId(peer, randomId), deliveryTag = deliveryTag ) } yield () @@ -100,7 +98,7 @@ final class ActorDelivery()(implicit val system: ActorSystem) default = Some(senderUpdate), custom = senderAuthId map (authId ⇒ Map(authId → senderClientUpdate)) getOrElse Map.empty, pushRules = PushRules(isFat = isFat, excludeAuthIds = senderAuthId.toSeq), - deliveryId = deliveryId(peer, randomId), + deliveryId = seqUpdExt.msgDeliveryId(peer, randomId), deliveryTag = deliveryTag ) } @@ -134,9 +132,6 @@ final class ActorDelivery()(implicit val system: ActorSystem) ) } yield () - private def deliveryId(peer: Peer, randomId: Long) = - s"msg_${peer.`type`.value}_${peer.id}_${randomId}" - private def reduceKey(prefix: String, peer: Peer): String = s"${prefix}_${peer.`type`.value}_${peer.id}" diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 85a57344d3..6d193759ad 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -8,6 +8,7 @@ import akka.pattern.pipe import im.actor.api.rpc.Update import im.actor.api.rpc.files.ApiAvatar import im.actor.api.rpc.groups._ +import im.actor.api.rpc.messaging.{ ApiMessage, UpdateMessage } import im.actor.api.rpc.users.ApiSex import im.actor.concurrent.FutureExt import im.actor.server.CommonErrors @@ -205,7 +206,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { //TODO: remove deprecated db.run(GroupUserRepo.create(groupId, cmd.inviteeUserId, cmd.inviterUserId, evt.ts, None, isAdmin = false)) - def inviteGROUPUpdates: Future[SeqState] = + def inviteGROUPUpdates: Future[SeqStateDate] = for { // push updated members list to inviteeUserId, _ ← seqUpdExt.deliverUserUpdate( @@ -221,17 +222,26 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } // push updated members list to all group members except inviteeUserId - seqState ← seqUpdExt.broadcastClientUpdate( + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( userId = cmd.inviterUserId, authId = cmd.inviterAuthId, bcastUserIds = (memberIds - cmd.inviterUserId) - cmd.inviteeUserId, update = membersUpdateNew, deliveryId = s"useradded_${groupId}_${cmd.randomId}" ) - /////////////////////////////////////////////// - } yield seqState - def inviteCHANNELUpdates: Future[SeqState] = + // explicitly send service message + SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( + apiGroupPeer, + cmd.inviterUserId, + cmd.inviterAuthId, + cmd.randomId, + serviceMessage, + deliveryTag = Some(Optimization.GroupV2) + ) + } yield SeqStateDate(seq, state, date) + + def inviteCHANNELUpdates: Future[SeqStateDate] = for { // push `UpdateGroupMembersUpdated` to invitee only if he is admin. // invitee could be admin, if he created this group, and turning back @@ -258,9 +268,24 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { deliveryId = s"useradded_${groupId}_${cmd.randomId}" ) - // get current SeqState for inviter user - seqState ← seqUpdExt.getSeqState(cmd.inviterUserId, cmd.inviterAuthId) - } yield seqState + // push service message to invitee + _ ← pushUpdateMessage( + userId = cmd.inviteeUserId, + authId = 0L, + ts = dateMillis, + randomId = cmd.randomId, + serviceMessage + ) + + // push service message to inviter and return seqState + SeqState(seq, state) ← pushUpdateMessage( + userId = cmd.inviterUserId, + authId = cmd.inviterAuthId, + ts = dateMillis, + randomId = cmd.randomId, + serviceMessage + ) + } yield SeqStateDate(seq, state, dateMillis) val result: Future[SeqStateDate] = for { /////////////////////////// @@ -296,18 +321,9 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Groups V2 API updates // /////////////////////////// - SeqState(seq, state) ← if (newState.typ.isChannel) inviteCHANNELUpdates else inviteGROUPUpdates + seqStateDate ← if (newState.typ.isChannel) inviteCHANNELUpdates else inviteGROUPUpdates - // explicitly send service message - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - cmd.inviterUserId, - cmd.inviterAuthId, - cmd.randomId, - serviceMessage, - deliveryTag = Some(Optimization.GroupV2) - ) - } yield SeqStateDate(seq, state, date) + } yield seqStateDate result pipeTo sender() } @@ -336,6 +352,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val newState = commit(evt) val date = evt.ts + val dateMillis = date.toEpochMilli val memberIds = newState.memberIds val members = newState.members.values.map(_.asStruct).toVector val randomId = ACLUtils.randomLong() @@ -367,7 +384,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { isAdmin = false )) - def joinGROUPUpdates: Future[SeqState] = + def joinGROUPUpdates: Future[SeqStateDate] = for { // push all group updates to joiningUserId _ ← FutureExt.ftraverse(joiningUserUpdatesNew) { update ⇒ @@ -376,7 +393,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // push updated members list to joining user, // TODO???: isFat = !wasInvited - is it correct? - seqState ← seqUpdExt.deliverClientUpdate( + SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( userId = cmd.joiningUserId, authId = cmd.joiningUserAuthId, update = membersUpdateNew, @@ -391,9 +408,17 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { membersUpdateNew, deliveryId = s"userjoined_${groupId}_${randomId}" ) - } yield seqState - def joinCHANNELUpdates: Future[SeqState] = + SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( + apiGroupPeer, + senderUserId = cmd.joiningUserId, + senderAuthId = cmd.joiningUserAuthId, + randomId = randomId, + serviceMessage // no delivery tag. This updated handled this way in Groups V1 + ) + } yield SeqStateDate(seq, state, date) + + def joinCHANNELUpdates: Future[SeqStateDate] = for { // push all group updates to joiningUserId _ ← FutureExt.ftraverse(joiningUserUpdatesNew) { update ⇒ @@ -403,7 +428,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // push `UpdateGroupMembersUpdated` to joining user only if he is admin. // joining user can be admin, if he created this group, and turning back // TODO???: isFat = !wasInvited - is it correct? - seqState ← if (newState.isAdmin(cmd.joiningUserId)) { + SeqState(seq, state) ← if (newState.isAdmin(cmd.joiningUserId)) { seqUpdExt.deliverClientUpdate( userId = cmd.joiningUserId, authId = cmd.joiningUserAuthId, @@ -421,7 +446,16 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { membersUpdateNew, deliveryId = s"userjoined_${groupId}_${randomId}" ) - } yield seqState + + // push service message to joining user and return seqState + _ ← pushUpdateMessage( + userId = cmd.joiningUserId, + authId = cmd.joiningUserAuthId, + ts = dateMillis, + randomId = randomId, + serviceMessage + ) + } yield SeqStateDate(seq, state, dateMillis) val result: Future[(SeqStateDate, Vector[Int], Long)] = for { @@ -441,16 +475,9 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Groups V2 API updates // /////////////////////////// - SeqState(seq, state) ← if (newState.typ.isChannel) joinCHANNELUpdates else joinGROUPUpdates + seqStateDate ← if (newState.typ.isChannel) joinCHANNELUpdates else joinGROUPUpdates - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - senderUserId = cmd.joiningUserId, - senderAuthId = cmd.joiningUserAuthId, - randomId = randomId, - serviceMessage // no delivery tag. This updated handled this way in Groups V1 - ) - } yield (SeqStateDate(seq, state, date), memberIds.toVector :+ inviterUserId, randomId) + } yield (seqStateDate, memberIds.toVector :+ inviterUserId, randomId) result pipeTo sender() } @@ -474,11 +501,15 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val updateObsolete = UpdateGroupUserLeaveObsolete(groupId, cmd.userId, dateMillis, cmd.randomId) - val leftUserUpdatesNew = List( - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupMembersUpdated(groupId, members = Vector.empty), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) - ) + val leftUserUpdatesNew = + if (state.typ.isChannel) List( + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) + ) + else List( + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), + UpdateGroupMembersUpdated(groupId, members = Vector.empty), + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) + ) val membersUpdateNew = UpdateGroupMembersUpdated(groupId, members) @@ -492,6 +523,67 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } yield () ) + val leaveGROUPUpdates: Future[SeqStateDate] = + for { + // push updated members list to all group members + _ ← seqUpdExt.broadcastPeopleUpdate( + state.memberIds - cmd.userId, + membersUpdateNew + ) + + SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( + apiGroupPeer, + senderUserId = cmd.userId, + senderAuthId = cmd.authId, + randomId = cmd.randomId, + message = serviceMessage, + deliveryTag = Some(Optimization.GroupV2) + ) + + // push left user that he is no longer a member + SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( + userId = cmd.userId, + authId = cmd.authId, + update = UpdateGroupMemberChanged(groupId, isMember = false) + ) + + // push left user updates + // • with empty group members + // • that he can't view and invite members + _ ← FutureExt.ftraverse(leftUserUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.userId, update) + } + } yield SeqStateDate(seq, state, date) + + val leaveCHANNELUpdates: Future[SeqStateDate] = + for { + // push updated members list to all ADMINS, except userId(if he was there) + _ ← seqUpdExt.broadcastPeopleUpdate( + state.adminIds - cmd.userId, + membersUpdateNew + ) + + // push service message to left user + _ ← pushUpdateMessage( + userId = cmd.userId, + authId = cmd.authId, + ts = dateMillis, + randomId = cmd.randomId, + message = serviceMessage + ) + + // push left user that he is no longer a member + SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( + userId = cmd.userId, + authId = cmd.authId, + update = UpdateGroupMemberChanged(groupId, isMember = false) + ) + + _ ← FutureExt.ftraverse(leftUserUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.userId, update) + } + } yield SeqStateDate(seq, state, dateMillis) + // read this dialog by user that leaves group. don't wait for ack dialogExt.messageRead(apiGroupPeer, cmd.userId, 0L, dateMillis) val result: Future[SeqStateDate] = for { @@ -512,36 +604,9 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Groups V2 API updates // /////////////////////////// - // push updated members list to all group members - _ ← seqUpdExt.broadcastPeopleUpdate( - state.memberIds - cmd.userId, - membersUpdateNew - ) + seqStateDate ← if (state.typ.isChannel) leaveCHANNELUpdates else leaveGROUPUpdates - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - senderUserId = cmd.userId, - senderAuthId = cmd.authId, - randomId = cmd.randomId, - message = serviceMessage, - deliveryTag = Some(Optimization.GroupV2) - ) - - // push left user that he is no longer a member - SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( - userId = cmd.userId, - authId = cmd.authId, - update = UpdateGroupMemberChanged(groupId, isMember = false) - ) - - // push left user updates - // • with empty group members - // • that he can't view and invite members - _ ← FutureExt.ftraverse(leftUserUpdatesNew) { update ⇒ - seqUpdExt.deliverUserUpdate(userId = cmd.userId, update) - } - - } yield SeqStateDate(seq, state, date) + } yield seqStateDate result andThen { case _ ⇒ commit(evt) } pipeTo sender() } @@ -549,7 +614,9 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } protected def kick(cmd: Kick): Unit = { - if (state.nonMember(cmd.kickerUserId) || state.nonMember(cmd.kickedUserId)) { + if (state.typ.isChannel && !state.isAdmin(cmd.kickedUserId)) { + sender() ! notAdmin + } else if (state.nonMember(cmd.kickerUserId) || state.nonMember(cmd.kickedUserId)) { sender() ! notMember } else { persist(UserKicked(Instant.now, cmd.kickedUserId, cmd.kickerUserId)) { evt ⇒ @@ -560,12 +627,17 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val updateObsolete = UpdateGroupUserKickObsolete(groupId, cmd.kickedUserId, cmd.kickerUserId, dateMillis, cmd.randomId) - val kickedUserUpdatesNew: List[Update] = List( - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupMembersUpdated(groupId, members = Vector.empty), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), - UpdateGroupMemberChanged(groupId, isMember = false) - ) + val kickedUserUpdatesNew: List[Update] = + if (state.typ.isChannel) List( + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), + UpdateGroupMemberChanged(groupId, isMember = false) + ) + else List( + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), + UpdateGroupMembersUpdated(groupId, members = Vector.empty), + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), + UpdateGroupMemberChanged(groupId, isMember = false) + ) val membersUpdateNew = UpdateGroupMembersUpdated(groupId, members) @@ -579,6 +651,68 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } yield () ) + val kickGROUPUpdates: Future[SeqStateDate] = + for { + // push updated members list to all group members. Don't push to kicked user! + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + userId = cmd.kickerUserId, + authId = cmd.kickerAuthId, + bcastUserIds = newState.memberIds - cmd.kickerUserId, + update = membersUpdateNew + ) + + SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( + apiGroupPeer, + senderUserId = cmd.kickerUserId, + senderAuthId = cmd.kickerAuthId, + randomId = cmd.randomId, + message = serviceMessage, + deliveryTag = Some(Optimization.GroupV2) + ) + + // push kicked user updates + // • with empty group members + // • that he is no longer a member of group + // • that he can't view and invite members + _ ← FutureExt.ftraverse(kickedUserUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.kickedUserId, update) + } + } yield SeqStateDate(seq, state, date) + + val kickCHANNELUpdates: Future[SeqStateDate] = + for { + // push updated members list to all ADMINS. Don't push to kicked user! + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + userId = cmd.kickerUserId, + authId = cmd.kickerAuthId, + bcastUserIds = newState.adminIds - cmd.kickerUserId, + update = membersUpdateNew + ) + + // push service message to kicker user + _ ← pushUpdateMessage( + userId = cmd.kickerUserId, + authId = cmd.kickerAuthId, //??? what's a point? + ts = dateMillis, + randomId = cmd.randomId, + serviceMessage + ) + + // push service message to kicked user + _ ← pushUpdateMessage( + userId = cmd.kickedUserId, + authId = 0L, + ts = dateMillis, + randomId = cmd.randomId, + serviceMessage + ) + + // push kicked user updates + _ ← FutureExt.ftraverse(kickedUserUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.kickedUserId, update) + } + } yield SeqStateDate(seq, state, dateMillis) + // read this dialog by kicked user. don't wait for ack dialogExt.messageRead(apiGroupPeer, cmd.kickedUserId, 0L, dateMillis) val result: Future[SeqStateDate] = for { @@ -598,32 +732,9 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Groups V2 API updates // /////////////////////////// - // push updated members list to all group members. Don't push to kicked user! - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - userId = cmd.kickerUserId, - authId = cmd.kickerAuthId, - bcastUserIds = newState.memberIds - cmd.kickerUserId, - update = membersUpdateNew - ) - - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - senderUserId = cmd.kickerUserId, - senderAuthId = cmd.kickerAuthId, - randomId = cmd.randomId, - message = serviceMessage, - deliveryTag = Some(Optimization.GroupV2) - ) + seqStateDate ← if (state.typ.isChannel) kickCHANNELUpdates else kickGROUPUpdates - // push kicked user updates - // • with empty group members - // • that he is no longer a member of group - // • that he can't view and invite members - _ ← FutureExt.ftraverse(kickedUserUpdatesNew) { update ⇒ - seqUpdExt.deliverUserUpdate(userId = cmd.kickedUserId, update) - } - - } yield SeqStateDate(seq, state, date) + } yield seqStateDate result pipeTo sender() } @@ -987,6 +1098,26 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } + // или все таки будет broadcast? + private def pushUpdateMessage(userId: Int, authId: Long, ts: Long, randomId: Long, message: ApiMessage): Future[SeqState] = { + val messUpdate = UpdateMessage( + peer = apiGroupPeer, + senderUserId = userId, + date = ts, + randomId = randomId, + message = message, + attributes = None, + quotedMessage = None + ) + seqUpdExt.deliverClientUpdate( + userId = userId, + authId = authId, + update = messUpdate, + deliveryId = seqUpdExt.msgDeliveryId(apiGroupPeer.asModel, randomId), + deliveryTag = Some(Optimization.GroupV2) + ) + } + private def trimToEmpty(s: Option[String]): Option[String] = s map (_.trim) filter (_.nonEmpty) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/SeqUpdatesExtension.scala b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/SeqUpdatesExtension.scala index 9f0b5ede23..ee7837b359 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/SeqUpdatesExtension.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/SeqUpdatesExtension.scala @@ -63,6 +63,9 @@ final class SeqUpdatesExtension(_system: ActorSystem) optTs.getOrElse(throw new RuntimeException(s"No Migration timestamp found for ${MigrationNameList.MultiSequence}")) } + def msgDeliveryId(peer: Peer, randomId: Long) = + s"msg_${peer.`type`.value}_${peer.id}_${randomId}" + def getSeqState(userId: Int, authId: Long): Future[SeqState] = (region.ref ? Envelope(userId).withGetSeqState(GetSeqState(authId))).mapTo[SeqState] diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DeliveryOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DeliveryOperations.scala index 62a149c645..80a199b4d0 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DeliveryOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DeliveryOperations.scala @@ -21,12 +21,13 @@ trait DeliveryOperations { this: SeqUpdatesExtension ⇒ * Send update to all devices of user and return `SeqState` associated with `authId` */ def deliverClientUpdate( - userId: Int, - authId: Long, - update: Update, - pushRules: PushRules = PushRules(), - reduceKey: Option[String] = None, - deliveryId: String = "" + userId: Int, + authId: Long, + update: Update, + pushRules: PushRules = PushRules(), + reduceKey: Option[String] = None, + deliveryId: String = "", + deliveryTag: Option[String] = None ): Future[SeqState] = deliverUpdate( userId, @@ -34,7 +35,8 @@ trait DeliveryOperations { this: SeqUpdatesExtension ⇒ UpdateMapping(default = Some(serializedUpdate(update))), pushRules, reduceKey, - deliveryId + deliveryId, + deliveryTag ) /** diff --git a/actor-server/project/Build.scala b/actor-server/project/Build.scala index 59786e31fb..f35f67fcb9 100644 --- a/actor-server/project/Build.scala +++ b/actor-server/project/Build.scala @@ -9,7 +9,7 @@ import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys.MultiJvm import com.typesafe.sbt.packager.archetypes.JavaServerAppPackaging import com.typesafe.sbt.packager.debian.JDebPackaging -object Build extends sbt.Build with Versioning with Releasing with Packaging with StartHook { +object Build extends sbt.Build with Versioning with Releasing with Packaging { val ScalaVersion = "2.11.8" val BotKitVersion = getVersion @@ -89,7 +89,6 @@ object Build extends sbt.Build with Versioning with Releasing with Packaging wit "actor", file("."), settings = - startUpSettings ++ packagingSettings ++ defaultSettingsServer ++ Revolver.settings ++ diff --git a/actor-server/project/StartHook.scala b/actor-server/project/StartHook.scala deleted file mode 100644 index 62ca90f078..0000000000 --- a/actor-server/project/StartHook.scala +++ /dev/null @@ -1,15 +0,0 @@ -package im.actor - -import sbt.Keys._ -import sbt._ - -private[actor] trait StartHook { - lazy val startUpSettings = Seq( - onLoad in Global := { state => - - println("============== hello world") - state - } - ) - -} From 498105a27149e0c56d41da3751bf5e27aebb4fea Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 14 Jul 2016 08:04:46 +0300 Subject: [PATCH 009/253] wip(server): channel edit only by admin --- .../server/group/GroupCommandHandlers.scala | 59 +++++++++++++------ 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 6d193759ad..0a7aa5381f 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -741,9 +741,10 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } - //TODO: channels, don't allow non-admin to change topic protected def updateAvatar(cmd: UpdateAvatar): Unit = { - if (state.nonMember(cmd.clientUserId)) { + if (state.typ.isChannel && !state.isAdmin(cmd.clientUserId)) { + sender() ! notAdmin + } else if (state.nonMember(cmd.clientUserId)) { sender() ! notMember } else { persist(AvatarUpdated(Instant.now, cmd.avatar)) { evt ⇒ @@ -790,10 +791,11 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } - //TODO: channels, don't allow non-admin to change topic protected def updateTitle(cmd: UpdateTitle): Unit = { val title = cmd.title - if (state.nonMember(cmd.clientUserId)) { + if (state.typ.isChannel && !state.isAdmin(cmd.clientUserId)) { + sender() ! notAdmin + } else if (state.nonMember(cmd.clientUserId)) { sender() ! notMember } else if (!isValidTitle(title)) { sender() ! Status.Failure(InvalidTitle) @@ -859,13 +861,14 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } - //TODO: channels, don't allow non-admin to change topic protected def updateTopic(cmd: UpdateTopic): Unit = { def isValidTopic(topic: Option[String]) = topic.forall(_.length < 255) val topic = trimToEmpty(cmd.topic) - if (state.nonMember(cmd.clientUserId)) { + if (state.typ.isChannel && !state.isAdmin(cmd.clientUserId)) { + sender() ! notAdmin + } else if (state.nonMember(cmd.clientUserId)) { sender() ! notMember } else if (!isValidTopic(topic)) { sender() ! Status.Failure(TopicTooLong) @@ -1041,6 +1044,36 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { //TODO: remove deprecated db.run(GroupUserRepo.makeAdmin(groupId, cmd.candidateUserId)) + val adminGROUPUpdates: Future[SeqStateDate] = + for { + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = memberIds + cmd.clientUserId, + updateAdmin + ) + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + memberIds - cmd.clientUserId, + updateMembers + ) + } yield SeqStateDate(seq, state, dateMillis) + + val adminCHANNELUpdates: Future[SeqStateDate] = + for { + // push admin changed to all + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = memberIds + cmd.clientUserId, + updateAdmin + ) + // push changed members to admins and fresh admin + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + (newState.adminIds - cmd.clientUserId) + cmd.candidateUserId, + updateMembers + ) + } yield SeqStateDate(seq, state, dateMillis) + val result: Future[(Vector[ApiMember], SeqStateDate)] = for { /////////////////////////// @@ -1058,17 +1091,9 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Groups V2 API updates // /////////////////////////// - _ ← seqUpdExt.broadcastPeopleUpdate( - userIds = memberIds + cmd.clientUserId, - updateAdmin - ) - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - cmd.clientUserId, - cmd.clientAuthId, - memberIds - cmd.clientUserId, - updateMembers - ) - } yield (members, SeqStateDate(seq, state, dateMillis)) + seqStateDate ← if (state.typ.isChannel) adminCHANNELUpdates else adminGROUPUpdates + + } yield (members, seqStateDate) result pipeTo sender() } From 75f49bbcd38e716978acb34ca6b0c2060a039062 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 14 Jul 2016 08:22:27 +0300 Subject: [PATCH 010/253] wip(server): push UpdateGroupMembersCountChanged in channel --- .../server/group/GroupCommandHandlers.scala | 24 +++++++++++++++++++ .../server/group/GroupQueryHandlers.scala | 4 ++-- .../im/actor/server/group/GroupState.scala | 2 +- .../api/rpc/service/GroupsServiceSpec.scala | 14 ++--------- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 0a7aa5381f..c3fe238f52 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -268,6 +268,12 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { deliveryId = s"useradded_${groupId}_${cmd.randomId}" ) + // push UpdateGroupMembersCountChanged to all group members + _ ← seqUpdExt.broadcastPeopleUpdate( + newState.memberIds, + UpdateGroupMembersCountChanged(groupId, newState.membersCount) + ) + // push service message to invitee _ ← pushUpdateMessage( userId = cmd.inviteeUserId, @@ -447,6 +453,12 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { deliveryId = s"userjoined_${groupId}_${randomId}" ) + // push UpdateGroupMembersCountChanged to all group members + _ ← seqUpdExt.broadcastPeopleUpdate( + newState.memberIds, + UpdateGroupMembersCountChanged(groupId, newState.membersCount) + ) + // push service message to joining user and return seqState _ ← pushUpdateMessage( userId = cmd.joiningUserId, @@ -563,6 +575,12 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { membersUpdateNew ) + // push UpdateGroupMembersCountChanged to all group members + _ ← seqUpdExt.broadcastPeopleUpdate( + state.memberIds - cmd.userId, + UpdateGroupMembersCountChanged(groupId, state.membersCount - 1) + ) + // push service message to left user _ ← pushUpdateMessage( userId = cmd.userId, @@ -689,6 +707,12 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { update = membersUpdateNew ) + // push UpdateGroupMembersCountChanged to all group members + _ ← seqUpdExt.broadcastPeopleUpdate( + newState.memberIds, + UpdateGroupMembersCountChanged(groupId, newState.membersCount) + ) + // push service message to kicker user _ ← pushUpdateMessage( userId = cmd.kickerUserId, diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index 62655a9e1f..4fd40f44c5 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -119,8 +119,8 @@ trait GroupQueryHandlers { ownerUserId = state.creatorUserId, createDate = extractCreatedAtMillis(state), ext = None, - canViewMembers = Some(state.canViewMembers(clientUserId)), // TODO: revisit - canInvitePeople = Some(state.canInvitePeople(clientUserId)), // TODO: revisit + canViewMembers = Some(state.canViewMembers(clientUserId)), + canInvitePeople = Some(state.canInvitePeople(clientUserId)), isSharedHistory = Some(state.isHistoryShared), isAsyncMembers = Some(state.members.size > 100), members = membersAndCount(state, clientUserId)._1 diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index ac29c3c85b..d6d4dbf7bd 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -96,7 +96,7 @@ private[group] final case class GroupState( // in case of general/public can view members if user is member // in case of channel can view members only if clientUserId is admin def canViewMembers(clientUserId: Int) = - ((typ.isGeneral || typ.isPublic) || isAdmin(clientUserId)) && isMember(clientUserId) + isMember(clientUserId) && ((typ.isGeneral || typ.isPublic) || (typ.isChannel && isAdmin(clientUserId))) /** * For now, all members can invite other users to group diff --git a/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/GroupsServiceSpec.scala b/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/GroupsServiceSpec.scala index 84b300db8b..5d070d51ea 100644 --- a/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/GroupsServiceSpec.scala +++ b/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/GroupsServiceSpec.scala @@ -72,11 +72,11 @@ final class GroupsServiceSpec it should "set 'about' to empty when None comes" in e20 - it should "forbid to set invalid 'about' field (empty, or longer than 255 characters)" in e21 + it should "forbid to set 'about' field longer than 255 characters" in e21 "EditGroupTopic" should "allow any group member to change topic" in e22 - it should "forbid to set invalid topic (empty, or longer than 255 characters)" in e23 + it should "forbid to set topic longer than 255 characters" in e23 it should "set topic to empty when None comes" in e24 @@ -794,11 +794,6 @@ final class GroupsServiceSpec resp shouldEqual Error(GroupRpcErrors.AboutTooLong) } - val emptyAbout = "" - whenReady(service.handleEditGroupAbout(groupOutPeer, 1L, Some(emptyAbout), Vector.empty)) { resp ⇒ - resp shouldEqual Error(GroupRpcErrors.AboutTooLong) - } - val groupAbout = groupExt.getApiFullStruct(groupOutPeer.groupId, user.id).futureValue.about groupAbout shouldEqual None } @@ -845,11 +840,6 @@ final class GroupsServiceSpec resp shouldEqual Error(GroupRpcErrors.TopicTooLong) } - val emptyTopic = "" - whenReady(service.handleEditGroupTopic(groupOutPeer, 2L, Some(emptyTopic), Vector.empty)) { resp ⇒ - resp shouldEqual Error(GroupRpcErrors.TopicTooLong) - } - val groupTopic = groupExt.getApiFullStruct(groupOutPeer.groupId, user.id).futureValue.theme groupTopic shouldEqual None } From 2e80bf29242c0f8035ebc8c65125c69dd737add4 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 14 Jul 2016 16:33:19 +0300 Subject: [PATCH 011/253] fix(server): set canSendMessage in ApiGroup --- .../scala/im/actor/server/group/GroupQueryHandlers.scala | 2 +- .../main/scala/im/actor/server/group/GroupState.scala | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index 4fd40f44c5..1500067942 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -102,7 +102,7 @@ trait GroupQueryHandlers { case GroupType.Channel ⇒ ApiGroupType.CHANNEL case GroupType.General | GroupType.Public | GroupType.Unrecognized(_) ⇒ ApiGroupType.GROUP }), - canSendMessage = None + canSendMessage = Some(state.canSendMessage(clientUserId)) ) ) } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index d6d4dbf7bd..5844d86389 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -7,6 +7,7 @@ import im.actor.api.rpc.misc.ApiExtension import im.actor.server.cqrs.{ Event, ProcessorState } import im.actor.server.file.Avatar import im.actor.server.group.GroupEvents._ +import im.actor.server.group.GroupType.{ Channel, General, Public } private[group] final case class Member( userId: Int, @@ -103,6 +104,14 @@ private[group] final case class GroupState( */ def canInvitePeople(clientUserId: Int) = isMember(clientUserId) + def canSendMessage(clientUserId: Int) = + { + typ match { + case General | Public ⇒ isMember(clientUserId) + case Channel ⇒ isAdmin(clientUserId) + } + } || bot.exists(_.userId == clientUserId) + def isNotCreated = createdAt.isEmpty //TODO: Maybe val. immutable anyway def isCreated = createdAt.nonEmpty //TODO: Maybe val. immutable anyway From 51132c8d8d22055f5114dbd7e24815cf872c348e Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 14 Jul 2016 22:08:38 +0300 Subject: [PATCH 012/253] fix(server): fix service messages in channels --- .../server/group/GroupCommandHandlers.scala | 109 ++++++++---------- .../actor/server/group/GroupOperations.scala | 3 +- .../server/group/GroupQueryHandlers.scala | 2 +- .../im/actor/server/group/GroupState.scala | 6 + 4 files changed, 58 insertions(+), 62 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index c3fe238f52..9794afaf34 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -8,7 +8,7 @@ import akka.pattern.pipe import im.actor.api.rpc.Update import im.actor.api.rpc.files.ApiAvatar import im.actor.api.rpc.groups._ -import im.actor.api.rpc.messaging.{ ApiMessage, UpdateMessage } +import im.actor.api.rpc.messaging.{ ApiMessage, ApiServiceMessage, UpdateMessage } import im.actor.api.rpc.users.ApiSex import im.actor.concurrent.FutureExt import im.actor.server.CommonErrors @@ -274,22 +274,17 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { UpdateGroupMembersCountChanged(groupId, newState.membersCount) ) - // push service message to invitee - _ ← pushUpdateMessage( - userId = cmd.inviteeUserId, - authId = 0L, - ts = dateMillis, - randomId = cmd.randomId, - serviceMessage - ) - - // push service message to inviter and return seqState - SeqState(seq, state) ← pushUpdateMessage( + // push service message to invitee and inviter + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( userId = cmd.inviterUserId, authId = cmd.inviterAuthId, - ts = dateMillis, - randomId = cmd.randomId, - serviceMessage + Set(cmd.inviteeUserId), + update = serviceMessageUpdate( + cmd.inviterUserId, + dateMillis, + cmd.randomId, + serviceMessage + ) ) } yield SeqStateDate(seq, state, dateMillis) @@ -349,6 +344,11 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // user was invited in group by other group user val wasInvited = state.isInvited(cmd.joiningUserId) + // trying to figure out who invited joining user. + // Descdending priority: + // • inviter defined in `Join` command (when invited via token) + // • inviter from members list (when invited by other user) + // • group creator (safe fallback) val optMember = state.members.get(cmd.joiningUserId) val inviterUserId = cmd.invitingUserId .orElse(optMember.map(_.inviterUserId)) @@ -459,13 +459,15 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { UpdateGroupMembersCountChanged(groupId, newState.membersCount) ) - // push service message to joining user and return seqState - _ ← pushUpdateMessage( - userId = cmd.joiningUserId, - authId = cmd.joiningUserAuthId, - ts = dateMillis, - randomId = randomId, - serviceMessage + // push service message only to inviter + _ ← seqUpdExt.deliverUserUpdate( + userId = inviterUserId, + update = serviceMessageUpdate( + cmd.joiningUserId, + dateMillis, + randomId, + serviceMessage + ) ) } yield SeqStateDate(seq, state, dateMillis) @@ -581,14 +583,19 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { UpdateGroupMembersCountChanged(groupId, state.membersCount - 1) ) - // push service message to left user - _ ← pushUpdateMessage( - userId = cmd.userId, - authId = cmd.authId, - ts = dateMillis, - randomId = cmd.randomId, - message = serviceMessage - ) + // push service message to user, who invited leaving user + optInviter = state.members.get(cmd.userId) map (_.inviterUserId) + _ ← optInviter map { inviter ⇒ + seqUpdExt.deliverUserUpdate( + userId = cmd.userId, + update = serviceMessageUpdate( + cmd.userId, + dateMillis, + cmd.randomId, + serviceMessage + ) + ) + } getOrElse FastFuture.successful(()) // push left user that he is no longer a member SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( @@ -713,22 +720,15 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { UpdateGroupMembersCountChanged(groupId, newState.membersCount) ) - // push service message to kicker user - _ ← pushUpdateMessage( - userId = cmd.kickerUserId, - authId = cmd.kickerAuthId, //??? what's a point? - ts = dateMillis, - randomId = cmd.randomId, - serviceMessage - ) - - // push service message to kicked user - _ ← pushUpdateMessage( - userId = cmd.kickedUserId, - authId = 0L, - ts = dateMillis, - randomId = cmd.randomId, - serviceMessage + // push service message to kicker and kicked users. + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = Set(cmd.kickedUserId, cmd.kickerUserId), + update = serviceMessageUpdate( + cmd.kickerUserId, + dateMillis, + cmd.randomId, + serviceMessage + ) ) // push kicked user updates @@ -1147,25 +1147,16 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } - // или все таки будет broadcast? - private def pushUpdateMessage(userId: Int, authId: Long, ts: Long, randomId: Long, message: ApiMessage): Future[SeqState] = { - val messUpdate = UpdateMessage( + private def serviceMessageUpdate(senderUserId: Int, date: Long, randomId: Long, message: ApiServiceMessage) = + UpdateMessage( peer = apiGroupPeer, - senderUserId = userId, - date = ts, + senderUserId = senderUserId, + date = date, randomId = randomId, message = message, attributes = None, quotedMessage = None ) - seqUpdExt.deliverClientUpdate( - userId = userId, - authId = authId, - update = messUpdate, - deliveryId = seqUpdExt.msgDeliveryId(apiGroupPeer.asModel, randomId), - deliveryTag = Some(Optimization.GroupV2) - ) - } private def trimToEmpty(s: Option[String]): Option[String] = s map (_.trim) filter (_.nonEmpty) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala index b599ef87ce..adcfb2810a 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala @@ -46,8 +46,7 @@ private[group] sealed trait Commands extends UserAcl { def joinGroup(groupId: Int, joiningUserId: Int, joiningUserAuthId: Long, invitingUserId: Option[Int]): Future[(SeqStateDate, Vector[Int], Long)] = (processorRegion.ref ? GroupEnvelope(groupId) - .withJoin(Join(joiningUserId, joiningUserAuthId, invitingUserId = None)) //None? - ).mapTo[(SeqStateDate, Vector[Int], Long)] + .withJoin(Join(joiningUserId, joiningUserAuthId, invitingUserId = invitingUserId))).mapTo[(SeqStateDate, Vector[Int], Long)] def inviteToGroup(groupId: Int, inviteeUserId: Int, randomId: Long)(implicit client: AuthorizedClientData): Future[SeqStateDate] = inviteToGroup(client.userId, client.authId, groupId, inviteeUserId, randomId) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index 1500067942..2e390f87b0 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -122,7 +122,7 @@ trait GroupQueryHandlers { canViewMembers = Some(state.canViewMembers(clientUserId)), canInvitePeople = Some(state.canInvitePeople(clientUserId)), isSharedHistory = Some(state.isHistoryShared), - isAsyncMembers = Some(state.members.size > 100), + isAsyncMembers = Some(state.isAsyncMembers), members = membersAndCount(state, clientUserId)._1 ) ) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 5844d86389..77ed12fbbf 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -116,6 +116,12 @@ private[group] final case class GroupState( def isCreated = createdAt.nonEmpty //TODO: Maybe val. immutable anyway + def isAsyncMembers = + typ match { + case General | Public ⇒ members.size > 100 + case Channel ⇒ true + } + override def updated(e: Event): GroupState = e match { case evt: Created ⇒ this.copy( From 0115fef10155c24f8a119c63b3cb13897b0953f9 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 14 Jul 2016 22:25:28 +0300 Subject: [PATCH 013/253] fix(server): make history shared in channels by default --- .../scala/im/actor/server/group/GroupCommandHandlers.scala | 7 +++++-- .../src/main/scala/im/actor/server/persist/Group.scala | 5 +---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 9794afaf34..ab0dc2d387 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -62,16 +62,19 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { integrationStorage = new IntegrationTokensKeyValueStorage // Group creation + val groupType = GroupType.fromValue(cmd.typ) //FIXME: make it normal enum + val isHistoryShared = groupType.isChannel + persist(Created( ts = createdAt, groupId, - typ = Some(GroupType.fromValue(cmd.typ)), //FIXME: make it normal enum + typ = Some(groupType), creatorUserId = cmd.creatorUserId, accessHash = accessHash, title = cmd.title, userIds = Seq(cmd.creatorUserId), // only creator user becomes group member. all other users are invited via Invite message isHidden = Some(false), - isHistoryShared = Some(false), + isHistoryShared = Some(isHistoryShared), extensions = Seq.empty )) { evt ⇒ val newState = commit(evt) diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/Group.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/Group.scala index 25eec0a1ff..6d46810bd0 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/Group.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/Group.scala @@ -93,7 +93,7 @@ object GroupRepo { ) } - //??? + @deprecated("Public groups are deprecated in Group V2 API", "2016-06-05") def findPublic = groups.filter(_.isPublic === true).map(_.asGroup).result @@ -122,9 +122,6 @@ object GroupRepo { def updateAbout(id: Int, about: Option[String]) = byIdC.applied(id).map(_.about).update(about) - //??? - def makePublic(id: Int) = byIdC.applied(id).map(_.isPublic).update(true) - @deprecated("Migrations only", "2016-06-05") def makeHidden(id: Int) = byIdC.applied(id).map(_.isHidden).update(true) } From ec0f7a9aa854ba72af29ec54b534ea2ba6c03c8c Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 15 Jul 2016 17:44:15 +0300 Subject: [PATCH 014/253] fix(server): don't write about change service message; push only members count in channels --- .../im/actor/server/cqrs/Processor.scala | 1 + .../server/dialog/DialogCommandHandlers.scala | 1 - .../server/group/GroupCommandHandlers.scala | 190 ++++++++---------- .../im/actor/server/group/GroupState.scala | 12 +- .../im/actor/server/office/PushTexts.scala | 3 +- .../operations/DeliveryOperations.scala | 13 +- 6 files changed, 104 insertions(+), 116 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/cqrs/Processor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/cqrs/Processor.scala index 97ec86eda5..4739346df5 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/cqrs/Processor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/cqrs/Processor.scala @@ -65,6 +65,7 @@ trait ProcessorStateControl[S <: ProcessorState[S]] { protected def getInitialState: S + //TODO: rename to processorState final def state: S = _state def setState(state: S) = this._state = state diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogCommandHandlers.scala index 548cd039ba..e5c093afa0 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogCommandHandlers.scala @@ -62,7 +62,6 @@ trait DialogCommandHandlers extends PeersImplicits with UserAcl { finalPeer = updatedSender getOrElse selfPeer _ ← db.run(writeHistoryMessage(finalPeer, peer, new DateTime(sendDate), sm.randomId, message.header, message.toByteArray)) //_ = dialogExt.updateCounters(peer, userId) - // not sure about sender user id. It could be wrong when we have updatedSender! SeqState(seq, state) ← deliveryExt.senderDelivery(userId, optClientAuthId, peer, sm.randomId, sendDate, message, sm.isFat, sm.deliveryTag) } yield SeqStateDate(seq, state, sendDate), failed = for { diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index ab0dc2d387..0c94feacab 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -8,7 +8,7 @@ import akka.pattern.pipe import im.actor.api.rpc.Update import im.actor.api.rpc.files.ApiAvatar import im.actor.api.rpc.groups._ -import im.actor.api.rpc.messaging.{ ApiMessage, ApiServiceMessage, UpdateMessage } +import im.actor.api.rpc.messaging.{ ApiServiceMessage, UpdateMessage } import im.actor.api.rpc.users.ApiSex import im.actor.concurrent.FutureExt import im.actor.server.CommonErrors @@ -113,7 +113,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val result: Future[CreateAck] = for { /////////////////////////// - // old group api updates // + // Groups V1 API updates // /////////////////////////// _ ← seqUpdExt.deliverUserUpdate( @@ -183,12 +183,13 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val apiMembers = newState.members.values.map(_.asStruct).toVector // if user ever been in this group - we should push these updates, - // but don't push them if user is first time in group. in this case we should push FatSeqUpdate val inviteeUpdatesNew: List[Update] = refreshGroupUpdates(newState, cmd.inviteeUserId) - // send everyone in group, including invitee. - // send `FatSeqUpdate` if this user invited to group for first time. - val membersUpdateNew = UpdateGroupMembersUpdated(groupId, apiMembers) + val membersUpdateNew: Update = + if (newState.typ.isChannel) // if history shared + UpdateGroupMembersCountChanged(groupId, newState.membersCount) + else + UpdateGroupMembersUpdated(groupId, apiMembers) val inviteeUpdateObsolete = UpdateGroupInviteObsolete( groupId, @@ -212,6 +213,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { def inviteGROUPUpdates: Future[SeqStateDate] = for { // push updated members list to inviteeUserId, + // make it `FatSeqUpdate` if this user invited to group for first time. _ ← seqUpdExt.deliverUserUpdate( userId = cmd.inviteeUserId, membersUpdateNew, @@ -246,54 +248,44 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { def inviteCHANNELUpdates: Future[SeqStateDate] = for { - // push `UpdateGroupMembersUpdated` to invitee only if he is admin. - // invitee could be admin, if he created this group, and turning back - _ ← if (newState.isAdmin(cmd.inviteeUserId)) { - seqUpdExt.deliverUserUpdate( - userId = cmd.inviteeUserId, - membersUpdateNew, - pushRules = seqUpdExt.pushRules(isFat = !inviteeIsExUser, Some(PushTexts.Invited)), - deliveryId = s"invite_${groupId}_${cmd.randomId}" - ) - } else { - FastFuture.successful(()) - } + // push updated members count to inviteeUserId + _ ← seqUpdExt.deliverUserUpdate( + userId = cmd.inviteeUserId, + membersUpdateNew, + pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.Invited)), + deliveryId = s"invite_${groupId}_${cmd.randomId}" + ) // push all "refresh group" updates to inviteeUserId _ ← FutureExt.ftraverse(inviteeUpdatesNew) { update ⇒ seqUpdExt.deliverUserUpdate(userId = cmd.inviteeUserId, update) } - // push updated members list to all ADMINS - _ ← seqUpdExt.broadcastPeopleUpdate( - userIds = newState.adminIds, + // push updated members count to all group members + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + userId = cmd.inviterUserId, + authId = cmd.inviterAuthId, + bcastUserIds = (memberIds - cmd.inviterUserId) - cmd.inviteeUserId, update = membersUpdateNew, deliveryId = s"useradded_${groupId}_${cmd.randomId}" ) - // push UpdateGroupMembersCountChanged to all group members - _ ← seqUpdExt.broadcastPeopleUpdate( - newState.memberIds, - UpdateGroupMembersCountChanged(groupId, newState.membersCount) - ) - // push service message to invitee and inviter - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - userId = cmd.inviterUserId, - authId = cmd.inviterAuthId, - Set(cmd.inviteeUserId), + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = Set(cmd.inviterUserId, cmd.inviteeUserId), update = serviceMessageUpdate( cmd.inviterUserId, dateMillis, cmd.randomId, serviceMessage - ) + ), + deliveryTag = Some(Optimization.GroupV2) ) } yield SeqStateDate(seq, state, dateMillis) val result: Future[SeqStateDate] = for { /////////////////////////// - // old group api updates // + // Groups V1 API updates // /////////////////////////// // push "Invited" to invitee @@ -363,7 +355,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val date = evt.ts val dateMillis = date.toEpochMilli val memberIds = newState.memberIds - val members = newState.members.values.map(_.asStruct).toVector + val apiMembers = newState.members.values.map(_.asStruct).toVector val randomId = ACLUtils.randomLong() // If user was never invited to group - he don't have group on devices, @@ -374,12 +366,13 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val joiningUserUpdatesNew: List[Update] = if (wasInvited) List.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId) - // push to everyone, including joining user. - // if joining user wasn't invited - send update as FatSeqUpdate - // update date when member got into group - val membersUpdateNew = UpdateGroupMembersUpdated(groupId, members) + val membersUpdateNew: Update = + if (newState.typ.isChannel) // if history is shared + UpdateGroupMembersCountChanged(groupId, newState.membersCount) + else + UpdateGroupMembersUpdated(groupId, apiMembers) // will update date when member got into group - val membersUpdateObsolete = UpdateGroupMembersUpdateObsolete(groupId, members) + val membersUpdateObsolete = UpdateGroupMembersUpdateObsolete(groupId, apiMembers) val serviceMessage = GroupServiceMessages.userJoined @@ -401,6 +394,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } // push updated members list to joining user, + // make it `FatSeqUpdate` if this user invited to group for first time. // TODO???: isFat = !wasInvited - is it correct? SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( userId = cmd.joiningUserId, @@ -434,34 +428,21 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { seqUpdExt.deliverUserUpdate(userId = cmd.joiningUserId, update) } - // push `UpdateGroupMembersUpdated` to joining user only if he is admin. - // joining user can be admin, if he created this group, and turning back - // TODO???: isFat = !wasInvited - is it correct? - SeqState(seq, state) ← if (newState.isAdmin(cmd.joiningUserId)) { - seqUpdExt.deliverClientUpdate( - userId = cmd.joiningUserId, - authId = cmd.joiningUserAuthId, - update = membersUpdateNew, - pushRules = seqUpdExt.pushRules(isFat = !wasInvited, None), //!wasInvited means that user came for first time here - deliveryId = s"join_${groupId}_${randomId}" - ) - } else { - seqUpdExt.getSeqState(cmd.joiningUserId, cmd.joiningUserAuthId) - } + // push updated members count to joining user + SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( + userId = cmd.joiningUserId, + authId = cmd.joiningUserAuthId, + update = membersUpdateNew, + deliveryId = s"join_${groupId}_${randomId}" + ) - // push updated members list to all ADMINS + // push updated members count to all group members except joining user _ ← seqUpdExt.broadcastPeopleUpdate( - newState.adminIds - cmd.joiningUserId, + memberIds - cmd.joiningUserId, membersUpdateNew, deliveryId = s"userjoined_${groupId}_${randomId}" ) - // push UpdateGroupMembersCountChanged to all group members - _ ← seqUpdExt.broadcastPeopleUpdate( - newState.memberIds, - UpdateGroupMembersCountChanged(groupId, newState.membersCount) - ) - // push service message only to inviter _ ← seqUpdExt.deliverUserUpdate( userId = inviterUserId, @@ -470,14 +451,15 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { dateMillis, randomId, serviceMessage - ) + ), + deliveryTag = Some(Optimization.GroupV2) ) } yield SeqStateDate(seq, state, dateMillis) val result: Future[(SeqStateDate, Vector[Int], Long)] = for { /////////////////////////// - // old group api updates // + // Groups V1 API updates // /////////////////////////// // push update about members to all users, except joining user @@ -514,7 +496,6 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // no commit here. it will be after service message sent val dateMillis = evt.ts.toEpochMilli - val members = state.members.filterNot(_._1 == cmd.userId).values.map(_.asStruct).toVector val updateObsolete = UpdateGroupUserLeaveObsolete(groupId, cmd.userId, dateMillis, cmd.randomId) @@ -528,7 +509,18 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) ) - val membersUpdateNew = UpdateGroupMembersUpdated(groupId, members) + val membersUpdateNew = + if (state.typ.isChannel) { // if history is shared + UpdateGroupMembersCountChanged( + groupId, + membersCount = state.membersCount - 1 + ) + } else { + UpdateGroupMembersUpdated( + groupId, + members = state.members.filterNot(_._1 == cmd.userId).values.map(_.asStruct).toVector + ) + } val serviceMessage = GroupServiceMessages.userLeft @@ -548,6 +540,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { membersUpdateNew ) + // send service message SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( apiGroupPeer, senderUserId = cmd.userId, @@ -574,16 +567,10 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val leaveCHANNELUpdates: Future[SeqStateDate] = for { - // push updated members list to all ADMINS, except userId(if he was there) - _ ← seqUpdExt.broadcastPeopleUpdate( - state.adminIds - cmd.userId, - membersUpdateNew - ) - - // push UpdateGroupMembersCountChanged to all group members + // push updated members count to all group members _ ← seqUpdExt.broadcastPeopleUpdate( state.memberIds - cmd.userId, - UpdateGroupMembersCountChanged(groupId, state.membersCount - 1) + membersUpdateNew ) // push service message to user, who invited leaving user @@ -596,7 +583,8 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { dateMillis, cmd.randomId, serviceMessage - ) + ), + deliveryTag = Some(Optimization.GroupV2) ) } getOrElse FastFuture.successful(()) @@ -607,6 +595,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { update = UpdateGroupMemberChanged(groupId, isMember = false) ) + // push left user updates that he has no group rights _ ← FutureExt.ftraverse(leftUserUpdatesNew) { update ⇒ seqUpdExt.deliverUserUpdate(userId = cmd.userId, update) } @@ -617,7 +606,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val result: Future[SeqStateDate] = for { /////////////////////////// - // old group api updates // + // Groups V1 API updates // /////////////////////////// _ ← seqUpdExt.broadcastClientUpdate( @@ -651,7 +640,6 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val newState = commit(evt) val dateMillis = evt.ts.toEpochMilli - val members = newState.members.values.map(_.asStruct).toVector val updateObsolete = UpdateGroupUserKickObsolete(groupId, cmd.kickedUserId, cmd.kickerUserId, dateMillis, cmd.randomId) @@ -667,7 +655,18 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { UpdateGroupMemberChanged(groupId, isMember = false) ) - val membersUpdateNew = UpdateGroupMembersUpdated(groupId, members) + val membersUpdateNew: Update = + if (newState.typ.isChannel) { // if history is shared + UpdateGroupMembersCountChanged( + groupId, + membersCount = newState.membersCount + ) + } else { + UpdateGroupMembersUpdated( + groupId, + members = newState.members.values.map(_.asStruct).toVector + ) + } val serviceMessage = GroupServiceMessages.userKicked(cmd.kickedUserId) @@ -709,20 +708,14 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val kickCHANNELUpdates: Future[SeqStateDate] = for { - // push updated members list to all ADMINS. Don't push to kicked user! + // push updated members count to all group members. Don't push to kicked user! SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( userId = cmd.kickerUserId, authId = cmd.kickerAuthId, - bcastUserIds = newState.adminIds - cmd.kickerUserId, + bcastUserIds = newState.memberIds - cmd.kickerUserId, update = membersUpdateNew ) - // push UpdateGroupMembersCountChanged to all group members - _ ← seqUpdExt.broadcastPeopleUpdate( - newState.memberIds, - UpdateGroupMembersCountChanged(groupId, newState.membersCount) - ) - // push service message to kicker and kicked users. _ ← seqUpdExt.broadcastPeopleUpdate( userIds = Set(cmd.kickedUserId, cmd.kickerUserId), @@ -731,10 +724,11 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { dateMillis, cmd.randomId, serviceMessage - ) + ), + deliveryTag = Some(Optimization.GroupV2) ) - // push kicked user updates + // push kicked user updates that he has no group rights _ ← FutureExt.ftraverse(kickedUserUpdatesNew) { update ⇒ seqUpdExt.deliverUserUpdate(userId = cmd.kickedUserId, update) } @@ -744,7 +738,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { dialogExt.messageRead(apiGroupPeer, cmd.kickedUserId, 0L, dateMillis) val result: Future[SeqStateDate] = for { /////////////////////////// - // old group api updates // + // Groups V1 API updates // /////////////////////////// _ ← seqUpdExt.broadcastClientUpdate( @@ -788,7 +782,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { db.run(AvatarDataRepo.createOrUpdate(getAvatarData(cmd.avatar))) val result: Future[UpdateAvatarAck] = for { /////////////////////////// - // old group api updates // + // Groups V1 API updates // /////////////////////////// _ ← seqUpdExt.broadcastClientUpdate(cmd.clientUserId, cmd.clientAuthId, memberIds, updateObsolete) @@ -850,7 +844,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val result: Future[SeqStateDate] = for { /////////////////////////// - // old group api updates // + // Groups V1 API updates // /////////////////////////// _ ← seqUpdExt.broadcastClientUpdate( @@ -923,7 +917,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val result: Future[SeqStateDate] = for { /////////////////////////// - // old group api updates // + // Groups V1 API updates // /////////////////////////// _ ← seqUpdExt.broadcastClientUpdate( @@ -987,7 +981,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val result: Future[SeqStateDate] = for { /////////////////////////// - // old group api updates // + // Groups V1 API updates // /////////////////////////// _ ← seqUpdExt.broadcastClientUpdate( @@ -1009,15 +1003,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { update = updateNew, pushRules = pushRules ) - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - senderUserId = cmd.clientUserId, - senderAuthId = cmd.clientAuthId, - randomId = cmd.randomId, - message = serviceMessage, - deliveryTag = Some(Optimization.GroupV2) - ) - } yield SeqStateDate(seq, state, date) + } yield SeqStateDate(seq, state, evt.ts.toEpochMilli) result pipeTo sender() } @@ -1104,7 +1090,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val result: Future[(Vector[ApiMember], SeqStateDate)] = for { /////////////////////////// - // old group api updates // + // Groups V1 API updates // /////////////////////////// _ ← seqUpdExt.broadcastClientUpdate( diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 77ed12fbbf..8251037033 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -70,14 +70,14 @@ private[group] final case class GroupState( //security and etc. accessHash: Long, bot: Option[Bot], - extensions: Map[Int, Array[Byte]] //or should it be sequence??? + extensions: Map[Int, Array[Byte]] ) extends ProcessorState[GroupState] { - def memberIds = members.keySet //TODO: Maybe lazy val. immutable anyway + lazy val memberIds = members.keySet - def adminIds = (members filter (_._2.isAdmin == true)).keySet //TODO: Maybe lazy val. immutable anyway + lazy val adminIds = (members filter (_._2.isAdmin == true)).keySet - def membersCount = members.size //TODO: Maybe lazy val. immutable anyway + lazy val membersCount = members.size def isMember(userId: Int): Boolean = members.contains(userId) @@ -112,9 +112,9 @@ private[group] final case class GroupState( } } || bot.exists(_.userId == clientUserId) - def isNotCreated = createdAt.isEmpty //TODO: Maybe val. immutable anyway + val isNotCreated = createdAt.isEmpty - def isCreated = createdAt.nonEmpty //TODO: Maybe val. immutable anyway + val isCreated = createdAt.nonEmpty def isAsyncMembers = typ match { diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/office/PushTexts.scala b/actor-server/actor-core/src/main/scala/im/actor/server/office/PushTexts.scala index 95603ffe4e..a270327262 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/office/PushTexts.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/office/PushTexts.scala @@ -1,5 +1,6 @@ package im.actor.server.office +//TODO: make up to date with channels object PushTexts { val Added = "User added" val Invited = "You are invited to a group" @@ -8,4 +9,4 @@ object PushTexts { val TitleChanged = "Group title changed" val TopicChanged = "Group topic changed" val AboutChanged = "Group about changed" -} \ No newline at end of file +} diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DeliveryOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DeliveryOperations.scala index 80a199b4d0..38c7c2140e 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DeliveryOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DeliveryOperations.scala @@ -95,14 +95,15 @@ trait DeliveryOperations { this: SeqUpdatesExtension ⇒ * Send update to all devices of users from `userIds` set and return `Unit` */ def broadcastPeopleUpdate( - userIds: Set[Int], - update: Update, - pushRules: PushRules = PushRules(), - reduceKey: Option[String] = None, - deliveryId: String = "" + userIds: Set[Int], + update: Update, + pushRules: PushRules = PushRules(), + reduceKey: Option[String] = None, + deliveryId: String = "", + deliveryTag: Option[String] = None ): Future[Unit] = { val mapping = UpdateMapping(default = Some(serializedUpdate(update))) - val deliver = buildDeliver(0L, mapping, pushRules, reduceKey, deliveryId, deliveryTag = None) // TODO: add deliveryTag when needed + val deliver = buildDeliver(0L, mapping, pushRules, reduceKey, deliveryId, deliveryTag) broadcastUpdate(userIds, deliver) } From 5e38ac9ecc064de52f1450fcb3d9790d0588b73d Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 15 Jul 2016 17:46:09 +0300 Subject: [PATCH 015/253] chore(server): updated actor.json --- .../actor-core/src/main/actor-api/actor.json | 560 +++++++++++++++++- 1 file changed, 557 insertions(+), 3 deletions(-) diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index 4c358dbec1..7219e2b553 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -8140,7 +8140,7 @@ "type": "reference", "argument": "ownerUid", "category": "full", - "description": " Group owner" + "description": " Optional group owner" }, { "type": "reference", @@ -8183,8 +8183,45 @@ "argument": "isSharedHistory", "category": "full", "description": " Is history shared among all users. Default is false." + }, + { + "type": "reference", + "argument": "canEditGroupInfo", + "category": "full", + "description": " If current user can edit group info. Default is true." + }, + { + "type": "reference", + "argument": "shortName", + "category": "full", + "description": " Group's short name" + }, + { + "type": "reference", + "argument": "canEditShortName", + "category": "full", + "description": " If not set only owner can edit group's short name" + }, + { + "type": "reference", + "argument": "canEditAdminList", + "category": "full", + "description": " If not set only owner can edit admin list" + }, + { + "type": "reference", + "argument": "canViewAdminList", + "category": "full", + "description": " If not set only owner and admins can view admin list" + }, + { + "type": "reference", + "argument": "canEditAdminSettings", + "category": "full", + "description": " If not set only owner can edit admin settings" } ], + "expandable": "true", "attributes": [ { "type": { @@ -8204,8 +8241,11 @@ }, { "type": { - "type": "alias", - "childType": "userId" + "type": "opt", + "childType": { + "type": "alias", + "childType": "userId" + } }, "id": 5, "name": "ownerUid" @@ -8279,6 +8319,54 @@ }, "id": 10, "name": "isSharedHistory" + }, + { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 13, + "name": "canEditGroupInfo" + }, + { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 14, + "name": "shortName" + }, + { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 15, + "name": "canEditShortName" + }, + { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 16, + "name": "canEditAdminList" + }, + { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 17, + "name": "canViewAdminList" + }, + { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 18, + "name": "canEditAdminSettings" } ] } @@ -8677,6 +8765,46 @@ ] } }, + { + "type": "update", + "content": { + "name": "GroupShortNameChanged", + "header": 2628, + "doc": [ + "Group's short name changed", + { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, + { + "type": "reference", + "argument": "shortName", + "category": "full", + "description": " Group short name" + } + ], + "attributes": [ + { + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, + { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "shortName" + } + ] + } + }, { "type": "update", "content": { @@ -8854,6 +8982,191 @@ ] } }, + { + "type": "update", + "content": { + "name": "GroupCanEditInfoChanged", + "header": 2631, + "doc": [ + "Update about can edit changed", + { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, + { + "type": "reference", + "argument": "canEditGroup", + "category": "full", + "description": " Can edit group info" + } + ], + "attributes": [ + { + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, + { + "type": "bool", + "id": 2, + "name": "canEditGroup" + } + ] + } + }, + { + "type": "update", + "content": { + "name": "GroupCanEditUsernameChanged", + "header": 2632, + "doc": [ + "Update about can edit username changed", + { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, + { + "type": "reference", + "argument": "canEditUsername", + "category": "full", + "description": " Can edit username" + } + ], + "attributes": [ + { + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, + { + "type": "bool", + "id": 2, + "name": "canEditUsername" + } + ] + } + }, + { + "type": "update", + "content": { + "name": "GroupCanEditAdminsChanged", + "header": 2633, + "doc": [ + "Update about can edit admins changed", + { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, + { + "type": "reference", + "argument": "canAssignAdmins", + "category": "hidden", + "description": " Can assign admins" + } + ], + "attributes": [ + { + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, + { + "type": "bool", + "id": 2, + "name": "canAssignAdmins" + } + ] + } + }, + { + "type": "update", + "content": { + "name": "GroupCanViewAdminsChanged", + "header": 2640, + "doc": [ + "Update about view admings changed", + { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, + { + "type": "reference", + "argument": "canViewAdmins", + "category": "hidden", + "description": " Can view admins" + } + ], + "attributes": [ + { + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, + { + "type": "bool", + "id": 2, + "name": "canViewAdmins" + } + ] + } + }, + { + "type": "update", + "content": { + "name": "GroupCanEditAdminSettingsChanged", + "header": 2641, + "doc": [ + "Update about edit admin settings changed", + { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, + { + "type": "reference", + "argument": "canEditAdminSettings", + "category": "full", + "description": " Can edit admin settings" + } + ], + "attributes": [ + { + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, + { + "type": "bool", + "id": 2, + "name": "canEditAdminSettings" + } + ] + } + }, { "type": "comment", "content": " " @@ -9571,6 +9884,50 @@ ] } }, + { + "type": "rpc", + "content": { + "name": "EditGroupShortName", + "header": 2793, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Edit Group Short Name", + { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, + { + "type": "reference", + "argument": "shortName", + "category": "full", + "description": "New group's short name" + } + ], + "attributes": [ + { + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, + { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "shortName" + } + ] + } + }, { "type": "rpc", "content": { @@ -9932,6 +10289,10 @@ ] } }, + { + "type": "comment", + "content": "Administration" + }, { "type": "rpc", "content": { @@ -9976,6 +10337,50 @@ ] } }, + { + "type": "rpc", + "content": { + "name": "DismissUserAdmin", + "header": 2791, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Dismissing user admin", + { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, + { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + } + ], + "attributes": [ + { + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, + { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 2, + "name": "userPeer" + } + ] + } + }, { "type": "rpc", "content": { @@ -10020,6 +10425,155 @@ ] } }, + { + "type": "struct", + "content": { + "name": "AdminSettings", + "doc": [ + "Admin Settings", + { + "type": "reference", + "argument": "showAdminsToMembers", + "category": "full", + "description": " Show admins in member list" + }, + { + "type": "reference", + "argument": "canMembersInvite", + "category": "full", + "description": " Can members of a group invite people" + }, + { + "type": "reference", + "argument": "canMembersEditGroupInfo", + "category": "full", + "description": " Can members edit group info" + }, + { + "type": "reference", + "argument": "canAdminsEditGroupInfo", + "category": "full", + "description": " Can admins edit group info" + } + ], + "expandable": "true", + "attributes": [ + { + "type": "bool", + "id": 1, + "name": "showAdminsToMembers" + }, + { + "type": "bool", + "id": 2, + "name": "canMembersInvite" + }, + { + "type": "bool", + "id": 3, + "name": "canMembersEditGroupInfo" + }, + { + "type": "bool", + "id": 4, + "name": "canAdminsEditGroupInfo" + } + ] + } + }, + { + "type": "rpc", + "content": { + "name": "LoadAdminSettings", + "header": 2790, + "response": { + "type": "anonymous", + "header": 2794, + "doc": [ + "Loaded settings", + { + "type": "reference", + "argument": "settings", + "category": "full", + "description": " Current group admin settings" + } + ], + "attributes": [ + { + "type": { + "type": "struct", + "childType": "AdminSettings" + }, + "id": 1, + "name": "settings" + } + ] + }, + "doc": [ + "Loading administration settings", + { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + } + ], + "attributes": [ + { + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + } + ] + } + }, + { + "type": "rpc", + "content": { + "name": "SaveAdminSettings", + "header": 2792, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Save administartion settings", + { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's Peer" + }, + { + "type": "reference", + "argument": "settings", + "category": "full", + "description": "Group's settings" + } + ], + "attributes": [ + { + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, + { + "type": { + "type": "struct", + "childType": "AdminSettings" + }, + "id": 2, + "name": "settings" + } + ] + } + }, { "type": "comment", "content": "Invite" From e3994f1963c088b1fd9e243ad651ec9d16fc72b7 Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 18 Jul 2016 02:49:55 +0300 Subject: [PATCH 016/253] feat(server:groups): set short name for groups --- .../src/main/protobuf/globalname.proto | 20 ++++ .../actor-core/src/main/protobuf/group.proto | 7 ++ .../src/main/protobuf/groupV2.proto | 9 ++ .../scala/im/actor/server/CommonErrors.scala | 2 +- .../server/group/GroupCommandHandlers.scala | 61 +++++++++- .../im/actor/server/group/GroupErrors.scala | 6 + .../actor/server/group/GroupOperations.scala | 8 +- .../actor/server/group/GroupProcessor.scala | 11 +- .../server/group/GroupQueryHandlers.scala | 10 +- .../im/actor/server/group/GroupState.scala | 10 ++ .../server/{office => group}/PushTexts.scala | 2 +- .../server/names/GlobalNamesStorage.scala | 110 ++++++++++++++++++ .../server/user/UserCommandHandlers.scala | 7 +- .../im/actor/server/user/UserProcessor.scala | 2 + .../im/actor/server/persist/UserRepo.scala | 14 +-- .../api/rpc/service/auth/AuthHelpers.scala | 14 +-- .../rpc/service/auth/AuthServiceImpl.scala | 16 +-- .../contacts/ContactsServiceImpl.scala | 6 +- .../rpc/service/groups/GroupRpcErrors.scala | 10 +- .../service/groups/GroupsServiceImpl.scala | 73 +++++++++--- .../service/profile/ProfileServiceImpl.scala | 15 ++- .../im/actor/util/misc/StringUtils.scala | 6 +- .../scala/im/actor/util/StringUtilsSpec.scala | 18 +-- 23 files changed, 362 insertions(+), 75 deletions(-) create mode 100644 actor-server/actor-core/src/main/protobuf/globalname.proto rename actor-server/actor-core/src/main/scala/im/actor/server/{office => group}/PushTexts.scala (91%) create mode 100644 actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala diff --git a/actor-server/actor-core/src/main/protobuf/globalname.proto b/actor-server/actor-core/src/main/protobuf/globalname.proto new file mode 100644 index 0000000000..caadea04eb --- /dev/null +++ b/actor-server/actor-core/src/main/protobuf/globalname.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; + +package im.actor.server.names; + +option (scalapb.options) = { + flat_package: true +}; + + +import "scalapb/scalapb.proto"; + +enum OwnerType { + User = 0; + Group = 1; +} + +message GlobalNameOwner { + OwnerType owner_type = 1; + int32 owner_id = 2; +} diff --git a/actor-server/actor-core/src/main/protobuf/group.proto b/actor-server/actor-core/src/main/protobuf/group.proto index 5092545e6a..b4f50d938c 100644 --- a/actor-server/actor-core/src/main/protobuf/group.proto +++ b/actor-server/actor-core/src/main/protobuf/group.proto @@ -98,6 +98,13 @@ message GroupEvents { optional string description = 1; } + message ShortNameUpdated { + option (scalapb.message).extends = "im.actor.server.group.GroupEvent"; + + required int64 ts = 1 [(scalapb.field).type = "java.time.Instant"]; + optional string short_name = 2; + } + message TopicUpdated { option (scalapb.message).extends = "im.actor.server.group.GroupEvent"; diff --git a/actor-server/actor-core/src/main/protobuf/groupV2.proto b/actor-server/actor-core/src/main/protobuf/groupV2.proto index 405a836fa3..297dd7f9f5 100644 --- a/actor-server/actor-core/src/main/protobuf/groupV2.proto +++ b/actor-server/actor-core/src/main/protobuf/groupV2.proto @@ -30,6 +30,7 @@ message GroupEnvelope { GroupCommands.UpdateTitle update_title = 8; GroupCommands.UpdateTopic update_topic = 9; GroupCommands.UpdateAbout update_about = 10; + GroupCommands.UpdateShortName update_short_name = 27; // GroupCommands.MakePublic make_public = 11; GroupCommands.RevokeIntegrationToken revoke_token = 12; GroupCommands.MakeUserAdmin make_user_admin = 13; @@ -152,6 +153,14 @@ message GroupCommands { int64 random_id = 4; } + message UpdateShortName { + option (scalapb.message).extends = "GroupCommand"; + + int32 client_user_id = 1; + int64 client_auth_id = 2; + google.protobuf.StringValue short_name = 3; + } + message MakeUserAdmin { option (scalapb.message).extends = "GroupCommand"; diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/CommonErrors.scala b/actor-server/actor-core/src/main/scala/im/actor/server/CommonErrors.scala index cd654cbebf..b13311bf09 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/CommonErrors.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/CommonErrors.scala @@ -3,4 +3,4 @@ package im.actor.server object CommonErrors { case class Forbidden(message: String) extends RuntimeException(message) object Forbidden extends Forbidden("You are not allowed to do this.") -} \ No newline at end of file +} diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 0c94feacab..16c3ff671e 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -16,19 +16,20 @@ import im.actor.server.acl.ACLUtils import im.actor.server.dialog.UserAcl import im.actor.server.file.{ Avatar, ImageUtils } import im.actor.server.group.GroupErrors._ -import im.actor.server.group.GroupEvents.{ AboutUpdated, AvatarUpdated, BotAdded, Created, IntegrationTokenRevoked, OwnerChanged, TitleUpdated, TopicUpdated, UserBecameAdmin, UserInvited, UserJoined, UserKicked, UserLeft } +import im.actor.server.group.GroupEvents._ import im.actor.server.group.GroupCommands._ import im.actor.server.model.{ AvatarData, Group } -import im.actor.server.office.PushTexts +import im.actor.server.names.{ GlobalNameOwner, OwnerType } import im.actor.server.persist.{ AvatarDataRepo, GroupBotRepo, GroupInviteTokenRepo, GroupRepo, GroupUserRepo } import im.actor.server.sequence.{ Optimization, SeqState, SeqStateDate } import im.actor.util.ThreadLocalSecureRandom -import im.actor.util.misc.IdUtils +import im.actor.util.misc.{ IdUtils, StringUtils } import scala.concurrent.Future +//TODO: spit into MemberCommandHandlers - InfoCommandHandlers - ControlCommandHandlers private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { - self: GroupProcessor ⇒ + this: GroupProcessor ⇒ import im.actor.server.ApiConversions._ @@ -1010,6 +1011,56 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } + protected def updateShortName(cmd: UpdateShortName): Unit = { + def isValidShortName(shortName: Option[String]) = shortName forall StringUtils.validGlobalName + + val oldShortName = state.shortName + val newShortName = trimToEmpty(cmd.shortName) + + if (!state.isOwner(cmd.clientUserId)) { + sender() ! Status.Failure(NotOwner) + } else if (!isValidShortName(newShortName)) { + sender() ! Status.Failure(InvalidShortName) + } else if (oldShortName == newShortName) { + seqUpdExt.getSeqState(cmd.clientUserId, cmd.clientAuthId) pipeTo sender() + } else { + val replyTo = sender() + + val existsFu = newShortName map { name ⇒ + globalNamesStorage.exists(name) + } getOrElse FastFuture.successful(false) + + //TODO: timeout for this + onSuccess(existsFu) { exists ⇒ + if (exists) { + replyTo ! Status.Failure(ShortNameTaken) + } else { + persist(ShortNameUpdated(Instant.now, newShortName)) { evt ⇒ + val newState = commit(evt) + + val memberIds = newState.memberIds + + val result: Future[SeqState] = for { + _ ← globalNamesStorage.updateOrRemove( + oldShortName, + newShortName, + GlobalNameOwner(OwnerType.Group, groupId) + ) + seqState ← seqUpdExt.broadcastClientUpdate( + userId = cmd.clientUserId, + authId = cmd.clientAuthId, + bcastUserIds = memberIds - cmd.clientUserId, + update = UpdateGroupShortNameChanged(groupId, newShortName) + ) + } yield seqState + + result pipeTo replyTo + } + } + } + } + } + protected def revokeIntegrationToken(cmd: RevokeIntegrationToken): Unit = { if (!state.isAdmin(cmd.clientUserId)) { sender() ! notAdmin @@ -1159,7 +1210,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Updates that will be sent to user, when he enters group. // Helps clients that have this group to refresh it's data. - // TODO: review when chanels will be added + // TODO: review when channels will be added private def refreshGroupUpdates(newState: GroupState, userId: Int): List[Update] = List( UpdateGroupMemberChanged(groupId, isMember = true), UpdateGroupAboutChanged(groupId, newState.about), diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala index 4ac0ad30c5..a27657da21 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala @@ -19,10 +19,16 @@ object GroupErrors { case object NotAdmin extends Exception with NoStackTrace + case object NotOwner extends Exception with NoStackTrace + case object InvalidTitle extends Exception with NoStackTrace case object AboutTooLong extends Exception with NoStackTrace + case object InvalidShortName extends Exception with NoStackTrace + + case object ShortNameTaken extends Exception with NoStackTrace + case object TopicTooLong extends Exception with NoStackTrace case object NoBotFound extends Exception with NoStackTrace diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala index adcfb2810a..5ceef50cd9 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala @@ -87,6 +87,11 @@ private[group] sealed trait Commands extends UserAcl { GroupEnvelope(groupId) .withUpdateAbout(UpdateAbout(clientUserId, clientAuthId, about, randomId))).mapTo[SeqStateDate] + def updateShortName(groupId: Int, clientUserId: Int, clientAuthId: Long, shortName: Option[String]): Future[SeqState] = + (processorRegion.ref ? + GroupEnvelope(groupId) + .withUpdateShortName(UpdateShortName(clientUserId, clientAuthId, shortName))).mapTo[SeqState] + def makeUserAdmin(groupId: Int, clientUserId: Int, clientAuthId: Long, candidateId: Int): Future[(Vector[ApiMember], SeqStateDate)] = (processorRegion.ref ? GroupEnvelope(groupId) @@ -148,8 +153,9 @@ private[group] sealed trait Queries { GroupEnvelope(groupId) .withCheckAccessHash(CheckAccessHash(hash))).mapTo[CheckAccessHashResponse] map (_.isCorrect) - //(memberIds, invitedUserIds, botId) // TODO: should be signed as internal API, and become narrowly scoped + // never use it in for client queries + //(memberIds, invitedUserIds, botId) def getMemberIds(groupId: Int): Future[(Seq[Int], Seq[Int], Option[Int])] = //TODO: prepare for channel (viewRegion.ref ? GroupEnvelope(groupId) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index 5d562402f4..f8fcb73183 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -6,6 +6,7 @@ import akka.actor.{ ActorRef, ActorSystem, Props, ReceiveTimeout, Status } import akka.cluster.sharding.ShardRegion import akka.http.scaladsl.util.FastFuture import im.actor.api.rpc.peers.{ ApiPeer, ApiPeerType } +import im.actor.concurrent.ActorFutures import im.actor.serialization.ActorSerializer import im.actor.server.cqrs.{ Processor, TaggedEvent } import im.actor.server.db.DbExtension @@ -13,6 +14,7 @@ import im.actor.server.dialog.{ DialogEnvelope, DialogExtension } import im.actor.server.group.GroupErrors.{ GroupIdAlreadyExists, GroupNotFound } import im.actor.server.group.GroupCommands._ import im.actor.server.group.GroupQueries._ +import im.actor.server.names.GlobalNamesStorageKeyValueStorage import im.actor.server.sequence.SeqUpdatesExtension import im.actor.server.user.UserExtension @@ -37,8 +39,6 @@ object GroupProcessor { 20005 → classOf[GroupCommands.Kick], 20006 → classOf[GroupCommands.Leave], 20010 → classOf[GroupCommands.UpdateAvatar], - // 20011 → classOf[GroupCommands.MakePublic], - // 20012 → classOf[GroupCommands.MakePublicAck], 20013 → classOf[GroupCommands.UpdateTitle], 20015 → classOf[GroupCommands.UpdateTopic], 20016 → classOf[GroupCommands.UpdateAbout], @@ -46,6 +46,7 @@ object GroupProcessor { 20018 → classOf[GroupCommands.RevokeIntegrationToken], 20020 → classOf[GroupCommands.RevokeIntegrationTokenAck], 20021 → classOf[GroupCommands.TransferOwnership], + 20022 → classOf[GroupCommands.UpdateShortName], 21001 → classOf[GroupQueries.GetIntegrationToken], 21002 → classOf[GroupQueries.GetIntegrationTokenResponse], @@ -80,7 +81,8 @@ object GroupProcessor { 22013 → classOf[GroupEvents.TopicUpdated], 22015 → classOf[GroupEvents.UserBecameAdmin], 22016 → classOf[GroupEvents.IntegrationTokenRevoked], - 22017 → classOf[GroupEvents.OwnerChanged] + 22017 → classOf[GroupEvents.OwnerChanged], + 22017 → classOf[GroupEvents.ShortNameUpdated] ) def persistenceIdFor(groupId: Int): String = s"Group-${groupId}" @@ -91,6 +93,7 @@ object GroupProcessor { //FIXME: snapshots!!! private[group] final class GroupProcessor extends Processor[GroupState] + with ActorFutures with GroupCommandHandlers with GroupQueryHandlers { @@ -102,6 +105,7 @@ private[group] final class GroupProcessor protected val userExt = UserExtension(system) protected var integrationStorage: IntegrationTokensWriteOps = _ + protected val globalNamesStorage = new GlobalNamesStorageKeyValueStorage protected val groupId = self.path.name.toInt protected val apiGroupPeer = ApiPeer(ApiPeerType.Group, groupId) @@ -125,6 +129,7 @@ private[group] final class GroupProcessor case u: UpdateTitle ⇒ updateTitle(u) case u: UpdateTopic ⇒ updateTopic(u) case u: UpdateAbout ⇒ updateAbout(u) + case u: UpdateShortName ⇒ updateShortName(u) // admin actions case r: RevokeIntegrationToken ⇒ revokeIntegrationToken(r) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index 2e390f87b0..29bf454304 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -116,14 +116,20 @@ trait GroupQueryHandlers { groupId, theme = state.topic, about = state.about, - ownerUserId = state.creatorUserId, + ownerUserId = state.getShowableOwner(clientUserId), createDate = extractCreatedAtMillis(state), ext = None, canViewMembers = Some(state.canViewMembers(clientUserId)), canInvitePeople = Some(state.canInvitePeople(clientUserId)), isSharedHistory = Some(state.isHistoryShared), isAsyncMembers = Some(state.isAsyncMembers), - members = membersAndCount(state, clientUserId)._1 + members = membersAndCount(state, clientUserId)._1, + shortName = state.shortName, + canEditGroupInfo = None, + canEditShortName = None, + canEditAdminList = None, + canViewAdminList = None, + canEditAdminSettings = None ) ) } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 8251037033..7e5d0a4d31 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -33,6 +33,7 @@ private[group] object GroupState { about = None, avatar = None, topic = None, + shortName = None, typ = GroupType.General, isHidden = false, isHistoryShared = false, @@ -59,6 +60,7 @@ private[group] final case class GroupState( about: Option[String], avatar: Option[Avatar], topic: Option[String], + shortName: Option[String], typ: GroupType, // TODO: rename to groupType isHidden: Boolean, isHistoryShared: Boolean, @@ -122,6 +124,12 @@ private[group] final case class GroupState( case Channel ⇒ true } + def getShowableOwner(clientUserId: Int): Option[Int] = + typ match { + case General | Public ⇒ Some(creatorUserId) + case Channel ⇒ if (isAdmin(clientUserId)) Some(creatorUserId) else None + } + override def updated(e: Event): GroupState = e match { case evt: Created ⇒ this.copy( @@ -218,6 +226,8 @@ private[group] final case class GroupState( ) case OwnerChanged(_, userId) ⇒ this.copy(ownerUserId = userId) + case ShortNameUpdated(_, newShortName) ⇒ + this.copy(shortName = newShortName) } // TODO: real snapshot diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/office/PushTexts.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/PushTexts.scala similarity index 91% rename from actor-server/actor-core/src/main/scala/im/actor/server/office/PushTexts.scala rename to actor-server/actor-core/src/main/scala/im/actor/server/group/PushTexts.scala index a270327262..674d313ea7 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/office/PushTexts.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/PushTexts.scala @@ -1,4 +1,4 @@ -package im.actor.server.office +package im.actor.server.group //TODO: make up to date with channels object PushTexts { diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala b/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala new file mode 100644 index 0000000000..261cf44223 --- /dev/null +++ b/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala @@ -0,0 +1,110 @@ +package im.actor.server.names + +import akka.actor.ActorSystem +import akka.http.scaladsl.util.FastFuture +import im.actor.server.db.DbExtension +import im.actor.server.persist.UserRepo +import im.actor.storage.SimpleStorage +import slick.dbio._ + +import scala.concurrent.Future + +/** + * Stores mapping "Global name" -> "Global name owner(group/user)" + * global name: String + * global name owner: GlobalNameOwner + */ +private object GlobalNamesStorage extends SimpleStorage("global_names") + +/** + * Storage that keeps compatibility between + * storing nicknames in `im.actor.server.persist.UserRepo` + * and storing group and user names in new `im.actor.storage.SimpleStorage` storage + */ +final class GlobalNamesStorageKeyValueStorage(implicit system: ActorSystem) { + import system.dispatcher + + private val (db, conn) = { + val ext = DbExtension(system) + (ext.db, ext.connector) + } + + def getUserOwnerId(name: String): Future[Option[Int]] = + getOwner(name) map (_.collect { + case GlobalNameOwner(OwnerType.User, userId) ⇒ userId + }) + + def getGroupOwnerId(name: String): Future[Option[Int]] = + getOwner(name) map (_.collect { + case GlobalNameOwner(OwnerType.Group, groupId) ⇒ groupId + }) + + /** + * Compatible with storing nicknames in `im.actor.server.persist.UserRepo` + */ + def exists(name: String): Future[Boolean] = { + val existsInKV = conn.run(GlobalNamesStorage.get(name)) map (_.isDefined) + + existsInKV flatMap { + case true ⇒ FastFuture.successful(true) + case false ⇒ db.run(UserRepo.nicknameExists(name)) + } + } + + /** + * `oldGlobalName` = None, `newGlobalName` = Some("name") - insert new name + * `oldGlobalName` = Some("oldName"), `newGlobalName` = Some("name") - update existing name + * `oldGlobalName` = Some("oldName"), `newGlobalName` = None - delete existing name + */ + def updateOrRemove(oldGlobalName: Option[String], newGlobalName: Option[String], owner: GlobalNameOwner): Future[Unit] = { + val deleteFu = (oldGlobalName map delete) getOrElse FastFuture.successful(()) + val upsertFu = (newGlobalName map (n ⇒ upsert(n, owner))) getOrElse FastFuture.successful(()) + for { + _ ← deleteFu + _ ← upsertFu + } yield () + } + + /** + * Compatible with storing nicknames in `im.actor.server.persist.UserRepo` + */ + private def getOwner(name: String): Future[Option[GlobalNameOwner]] = { + val optOwner = conn.run( + GlobalNamesStorage.get(name) + ) map { optBytes ⇒ + optBytes map GlobalNameOwner.parseFrom + } + optOwner flatMap { + case o @ Some(_) ⇒ FastFuture.successful(o) + case None ⇒ db.run(UserRepo.findByNickname(name)) map (_.map(u ⇒ GlobalNameOwner(OwnerType.User, u.id))) + } + } + + private def upsert(name: String, owner: GlobalNameOwner): Future[Unit] = + conn.run( + GlobalNamesStorage.upsert(name, owner.toByteArray) + ) map (_ ⇒ ()) + + /** + * Compatible with storing nicknames in `im.actor.server.persist.UserRepo` + */ + private def delete(name: String): Future[Unit] = { + val kvDelete = conn.run(GlobalNamesStorage.delete(name)) + + kvDelete flatMap { count ⇒ + if (count > 0) { + db.run { + for { + optUser ← UserRepo.findByNickname(name) + _ ← optUser match { + case Some(u) ⇒ UserRepo.setNickname(u.id, None) + case None ⇒ DBIO.successful(0) + } + } yield () + } + } else { + FastFuture.successful(()) + } + } + } +} diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/user/UserCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/user/UserCommandHandlers.scala index e6d1cccdde..811147f640 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/user/UserCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/user/UserCommandHandlers.scala @@ -19,6 +19,7 @@ import im.actor.server.bots.BotCommand import im.actor.server.file.{ Avatar, ImageUtils } import im.actor.server.model.{ AvatarData, Sex, User } import im.actor.server.model.contact.{ UserContact, UserEmailContact, UserPhoneContact } +import im.actor.server.names.{ GlobalNameOwner, OwnerType } import im.actor.server.office.EntityNotFound import im.actor.server.persist.contact._ import im.actor.server.persist._ @@ -217,12 +218,12 @@ private[user] trait UserCommandHandlers { onSuccess(checkNicknameExists(nicknameOpt)) { exists ⇒ if (!exists) { - if (nicknameOpt forall StringUtils.validUsername) { + if (nicknameOpt forall StringUtils.validGlobalName) { persistReply(UserEvents.NicknameChanged(now(), nicknameOpt), user, replyTo) { _ ⇒ val update = UpdateUserNickChanged(userId, nicknameOpt) for { - _ ← db.run(UserRepo.setNickname(userId, nicknameOpt)) + _ ← globalNamesStorage.updateOrRemove(user.nickname, nicknameOpt, GlobalNameOwner(OwnerType.User, userId)) relatedUserIds ← getRelations(userId) seqState ← seqUpdExt.broadcastClientUpdate(userId, authId, relatedUserIds, update) } yield seqState @@ -429,7 +430,7 @@ private[user] trait UserCommandHandlers { private def checkNicknameExists(nicknameOpt: Option[String]): Future[Boolean] = { nicknameOpt match { - case Some(nickname) ⇒ db.run(UserRepo.nicknameExists(nickname)) + case Some(nickname) ⇒ globalNamesStorage.exists(nickname) case None ⇒ FastFuture.successful(false) } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/user/UserProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/user/UserProcessor.scala index a9269035ef..d0c2af3c7c 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/user/UserProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/user/UserProcessor.scala @@ -15,6 +15,7 @@ import im.actor.server.cqrs.TaggedEvent import im.actor.server.db.DbExtension import im.actor.server.dialog._ import im.actor.server.model.{ Peer, PeerType } +import im.actor.server.names.GlobalNamesStorageKeyValueStorage import im.actor.server.office.{ PeerProcessor, StopOffice } import im.actor.server.sequence.SeqUpdatesExtension import im.actor.server.social.{ SocialExtension, SocialManagerRegion } @@ -161,6 +162,7 @@ private[user] final class UserProcessor protected lazy val dialogExt = DialogExtension(system) protected val seqUpdExt: SeqUpdatesExtension = SeqUpdatesExtension(system) protected implicit val socialRegion: SocialManagerRegion = SocialExtension(system).region + protected val globalNamesStorage = new GlobalNamesStorageKeyValueStorage protected implicit val timeout: Timeout = Timeout(10.seconds) diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/UserRepo.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/UserRepo.scala index bc649450e5..efea1aa4e7 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/UserRepo.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/UserRepo.scala @@ -40,11 +40,11 @@ object UserRepo { val byIdC = Compiled(byId _) val nameByIdC = Compiled(nameById _) - def byNickname(nickname: Rep[String]) = users filter (_.nickname.toLowerCase === nickname.toLowerCase) - def idsByNickname(nickname: Rep[String]) = byNickname(nickname).map(_.id) + private def byNickname(nickname: Rep[String]) = users filter (_.nickname.toLowerCase === nickname.toLowerCase) + private def idsByNickname(nickname: Rep[String]) = byNickname(nickname).map(_.id) - val byNicknameC = Compiled(byNickname _) - val idsByNicknameC = Compiled(idsByNickname _) + private val byNicknameC = Compiled(byNickname _) + private val idsByNicknameC = Compiled(idsByNickname _) def byPhone(phone: Rep[Long]) = (for { phones ← UserPhoneRepo.phones.filter(_.number === phone) @@ -106,15 +106,13 @@ object UserRepo { def findSalts(ids: Set[Int]) = users.filter(_.id inSet ids).map(u ⇒ (u.id, u.accessSalt)).result + @deprecated("user GlobalNamesStorageKeyValueStorage instead", "2016-07-17") def findByNickname(query: String) = { val nickname = if (query.startsWith("@")) query.drop(1) else query byNicknameC(nickname).result.headOption } - def findIdsByNickname(nickname: String) = - idsByNicknameC(nickname).result.headOption - def findIdsByEmail(email: String) = idsByEmailC(email).result.headOption @@ -128,12 +126,14 @@ object UserRepo { .getOrElse(DBIO.successful(Nil)) } yield e ++ n ++ p + @deprecated("user GlobalNamesStorageKeyValueStorage instead", "2016-07-17") def setNickname(userId: Int, nickname: Option[String]) = byId(userId).map(_.nickname).update(nickname) def setAbout(userId: Int, about: Option[String]) = byId(userId).map(_.about).update(about) + @deprecated("user GlobalNamesStorageKeyValueStorage instead", "2016-07-17") def nicknameExists(nickname: String) = users.filter(_.nickname.toLowerCase === nickname.toLowerCase).exists.result diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthHelpers.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthHelpers.scala index 01ba65d1b5..4b2dd15804 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthHelpers.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthHelpers.scala @@ -16,7 +16,6 @@ import im.actor.server.model._ import im.actor.server.persist._ import im.actor.server.persist.auth.AuthTransactionRepo import im.actor.server.session._ -import im.actor.util.misc.EmailUtils.isTestEmail import im.actor.util.misc.IdUtils._ import im.actor.util.misc.PhoneNumberUtils._ import im.actor.util.misc.StringUtils.validName @@ -25,7 +24,6 @@ import org.joda.time.DateTime import slick.dbio._ import scala.concurrent.Future -import scala.util.Try trait AuthHelpers extends Helpers { self: AuthServiceImpl ⇒ @@ -69,10 +67,10 @@ trait AuthHelpers extends Helpers { protected def newUsernameSignUp(transaction: AuthUsernameTransaction, name: String, sex: Option[ApiSex]): Result[(Int, String) Xor User] = { val username = transaction.username for { - optUser ← fromDBIO(UserRepo.findByNickname(username)) - result ← optUser match { - case Some(existingUser) ⇒ point(Xor.left((existingUser.id, ""))) - case None ⇒ newUser(name, "", sex, username = Some(username)) + optUserId ← fromFuture(globalNamesStorage.getUserOwnerId(username)) + result ← optUserId match { + case Some(id) ⇒ point(Xor.left((id, ""))) + case None ⇒ newUser(name, "", sex, username = Some(username)) } } yield result } @@ -170,8 +168,8 @@ trait AuthHelpers extends Helpers { } yield (emailModel.userId, "") case u: AuthUsernameTransaction ⇒ for { - userModel ← fromDBIOOption(AuthErrors.UsernameUnoccupied)(UserRepo.findByNickname(u.username)) - } yield (userModel.id, "") + userId ← fromFutureOption(AuthErrors.UsernameUnoccupied)(globalNamesStorage.getUserOwnerId(u.username)) + } yield (userId, "") case _: AuthAnonymousTransaction ⇒ fromEither(Xor.left(AuthErrors.NotValidated)) } diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthServiceImpl.scala index 6c44c5b861..4f49ce914c 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthServiceImpl.scala @@ -21,9 +21,10 @@ import im.actor.server.auth.DeviceInfo import im.actor.server.db.DbExtension import im.actor.server.email.{ EmailConfig, SmtpEmailSender } import im.actor.server.model._ +import im.actor.server.names.GlobalNamesStorageKeyValueStorage import im.actor.server.oauth.GoogleProvider import im.actor.server.persist._ -import im.actor.server.persist.auth.{ AuthUsernameTransactionRepo, AuthPhoneTransactionRepo, AuthTransactionRepo, AuthEmailTransactionRepo } +import im.actor.server.persist.auth.{ AuthEmailTransactionRepo, AuthPhoneTransactionRepo, AuthTransactionRepo, AuthUsernameTransactionRepo } import im.actor.server.session._ import im.actor.server.social.{ SocialExtension, SocialManagerRegion } import im.actor.server.user.{ UserErrors, UserExtension } @@ -59,6 +60,7 @@ final class AuthServiceImpl(val oauth2Service: GoogleProvider)( protected val userExt = UserExtension(actorSystem) protected implicit val socialRegion: SocialManagerRegion = SocialExtension(actorSystem).region protected val activationContext = new ActivationContext + protected val globalNamesStorage = new GlobalNamesStorageKeyValueStorage private implicit val mat = ActorMaterializer() @@ -200,8 +202,8 @@ final class AuthServiceImpl(val oauth2Service: GoogleProvider)( val action = for { normUsername ← fromOption(ProfileRpcErrors.NicknameInvalid)(StringUtils.normalizeUsername(username)) - optUser ← fromDBIO(UserRepo.findByNickname(username)) - _ ← optUser map (u ⇒ forbidDeletedUser(u.id)) getOrElse point(()) + optUserId ← fromFuture(globalNamesStorage.getUserOwnerId(username)) + _ ← optUserId map (id ⇒ forbidDeletedUser(id)) getOrElse point(()) optAuthTransaction ← fromDBIO(AuthUsernameTransactionRepo.find(username, deviceHash)) transactionHash ← optAuthTransaction match { case Some(transaction) ⇒ point(transaction.transactionHash) @@ -210,7 +212,7 @@ final class AuthServiceImpl(val oauth2Service: GoogleProvider)( val transactionHash = ACLUtils.authTransactionHash(accessSalt) val authTransaction = AuthUsernameTransaction( normUsername, - optUser map (_.id), + optUserId, transactionHash, appId, apiKey, @@ -218,11 +220,11 @@ final class AuthServiceImpl(val oauth2Service: GoogleProvider)( deviceTitle, accessSalt, DeviceInfo(timeZone.getOrElse(""), preferredLanguages).toByteArray, - isChecked = optUser.isEmpty // we don't need to check password if user signs up + isChecked = optUserId.isEmpty // we don't need to check password if user signs up ) for (_ ← fromDBIO(AuthUsernameTransactionRepo.create(authTransaction))) yield transactionHash } - } yield ResponseStartUsernameAuth(transactionHash, optUser.isDefined) + } yield ResponseStartUsernameAuth(transactionHash, optUserId.isDefined) db.run(action.value) } @@ -241,7 +243,7 @@ final class AuthServiceImpl(val oauth2Service: GoogleProvider)( for { normUsername ← fromOption(ProfileRpcErrors.NicknameInvalid)(StringUtils.normalizeUsername(username)) accessSalt = ACLUtils.nextAccessSalt() - nicknameExists ← fromDBIO(UserRepo.nicknameExists(normUsername)) + nicknameExists ← fromFuture(globalNamesStorage.exists(normUsername)) _ ← fromBoolean(ProfileRpcErrors.NicknameBusy)(!nicknameExists) transactionHash = ACLUtils.authTransactionHash(accessSalt) transaction = AuthAnonymousTransaction( diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/contacts/ContactsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/contacts/ContactsServiceImpl.scala index 58a6d43240..362e3fc3ac 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/contacts/ContactsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/contacts/ContactsServiceImpl.scala @@ -24,6 +24,7 @@ import im.actor.api.rpc.misc._ import im.actor.api.rpc.sequence.ApiUpdateOptimization import im.actor.api.rpc.users.ApiUser import im.actor.server.db.DbExtension +import im.actor.server.names.GlobalNamesStorageKeyValueStorage import im.actor.server.sequence.{ SeqState, SeqUpdatesExtension } import im.actor.server.social.{ SocialExtension, SocialManager, SocialManagerRegion } import im.actor.server.user._ @@ -49,6 +50,7 @@ class ContactsServiceImpl(implicit actorSystem: ActorSystem) private val userExt = UserExtension(actorSystem) private implicit val seqUpdExt: SeqUpdatesExtension = SeqUpdatesExtension(actorSystem) private implicit val socialRegion: SocialManagerRegion = SocialExtension(actorSystem).region + private val globalNamesStorage = new GlobalNamesStorageKeyValueStorage case class EmailNameUser(email: String, name: Option[String], userId: Int) @@ -170,8 +172,8 @@ class ContactsServiceImpl(implicit actorSystem: ActorSystem) private def findByNickname(nickname: String, client: AuthorizedClientData): Result[Vector[ApiUser]] = { for { - users ← fromDBIO(UserRepo.findByNickname(nickname) map (_.toList)) - structs ← fromFuture(Future.sequence(users map (user ⇒ userExt.getApiStruct(user.id, client.userId, client.authId)))) + optUserId ← fromFuture(globalNamesStorage.getUserOwnerId(nickname)) + structs ← fromFuture(Future.sequence(optUserId.toSeq map (userId ⇒ userExt.getApiStruct(userId, client.userId, client.authId)))) } yield structs.toVector } diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala index d40f68de22..5949a8883a 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala @@ -12,8 +12,14 @@ object GroupRpcErrors { val AboutTooLong = RpcError(400, "GROUP_ABOUT_TOO_LONG", "Group about is too long. It should be no longer then 255 characters", false, None) val UserAlreadyAdmin = RpcError(400, "USER_ALREADY_ADMIN", "User is already admin of this group", false, None) val BlockedByUser = RpcError(403, "BLOCKED_BY_USER", "User blocked you, unable to invite him.", false, None) - val GroupIdAlreadyExists = RpcError(400, "GROUP_ALREADY_EXISTS", "Group with such id already exists", false, None) - val InvalidInviteToken = RpcError(403, "INVALID_INVITE_TOKEN", "No correct token provided.", false, None) + val GroupIdAlreadyExists = RpcError(400, "GROUP_ALREADY_EXISTS", "Group with such id already exists.", false, None) + val InvalidInviteUrl = RpcError(403, "INVALID_INVITE_URL", "Invalid invite url!", false, None) + val InvalidInviteToken = RpcError(403, "INVALID_INVITE_TOKEN", "Invalid invite token!", false, None) + val InvalidInviteGroup = RpcError(403, "INVALID_INVITE_GROUP", "Invalid group name provided!", false, None) val GroupNotPublic = RpcError(400, "GROUP_IS_NOT_PUBLIC", "The group is not public.", false, None) + val InvalidShortName = RpcError(400, "GROUP_SHORT_NAME_INVALID", + "Invalid group short name. Valid short name should contain from 5 to 32 characters, and may consist of latin characters, numbers and underscores", false, None) + val ShortNameTaken = RpcError(400, "GROUP_SHORT_NAME_TAKEN", "This short name already belongs to other user or group, we are sorry!", false, None) + } // format: ON diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index b83512acb5..8b58909a7a 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -4,11 +4,12 @@ import java.time.Instant import akka.actor.ActorSystem import akka.http.scaladsl.util.FastFuture +import cats.data.Xor import im.actor.api.rpc.PeerHelpers._ import im.actor.api.rpc._ import im.actor.api.rpc.files.ApiFileLocation import im.actor.api.rpc.groups._ -import im.actor.api.rpc.misc.ResponseSeqDate +import im.actor.api.rpc.misc.{ ResponseSeq, ResponseSeqDate, ResponseVoid } import im.actor.api.rpc.peers.{ ApiGroupOutPeer, ApiUserOutPeer } import im.actor.api.rpc.sequence.ApiUpdateOptimization import im.actor.api.rpc.users.ApiUser @@ -18,12 +19,13 @@ import im.actor.server.db.DbExtension import im.actor.server.file.{ FileErrors, FileStorageAdapter, FileStorageExtension, ImageUtils } import im.actor.server.group._ import im.actor.server.model.GroupInviteToken +import im.actor.server.names.GlobalNamesStorageKeyValueStorage import im.actor.server.persist.{ GroupInviteTokenRepo, GroupUserRepo } import im.actor.server.presences.GroupPresenceExtension import im.actor.server.sequence.{ SeqState, SeqStateDate, SeqUpdatesExtension } import im.actor.server.user.UserExtension import im.actor.util.ThreadLocalSecureRandom -import im.actor.util.misc.IdUtils +import im.actor.util.misc.{ IdUtils, StringUtils } import slick.dbio.DBIO import slick.driver.PostgresDriver.api._ @@ -44,6 +46,7 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act private val seqUpdExt = SeqUpdatesExtension(actorSystem) private val userExt = UserExtension(actorSystem) private val groupPresenceExt = GroupPresenceExtension(actorSystem) + private val globalNamesStorage = new GlobalNamesStorageKeyValueStorage /** * Loading Full Groups @@ -80,6 +83,15 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act } } + override def doHandleDismissUserAdmin(groupPeer: ApiGroupOutPeer, userPeer: ApiUserOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = + FastFuture.failed(new RuntimeException("Not implemented")) + + override def doHandleLoadAdminSettings(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseLoadAdminSettings]] = + FastFuture.failed(new RuntimeException("Not implemented")) + + override def doHandleSaveAdminSettings(groupPeer: ApiGroupOutPeer, settings: ApiAdminSettings, clientData: ClientData): Future[HandlerResult[ResponseVoid]] = + FastFuture.failed(new RuntimeException("Not implemented")) + /** * Loading group members * @@ -320,26 +332,36 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act } override def doHandleJoinGroup( - urlOrToken: String, - optimizations: IndexedSeq[ApiUpdateOptimization.Value], - clientData: ClientData + joinStringOrUrl: String, + optimizations: IndexedSeq[ApiUpdateOptimization.Value], + clientData: ClientData ): Future[HandlerResult[ResponseJoinGroup]] = authorized(clientData) { implicit client ⇒ addOptimizations(optimizations) - val token = extractInviteToken(urlOrToken) val stripEntities = optimizations.contains(ApiUpdateOptimization.STRIP_ENTITIES) val action = for { - tokenInfo ← fromFutureOption(GroupRpcErrors.InvalidInviteToken)(db.run(GroupInviteTokenRepo.findByToken(token))) + joinSting ← fromOption(GroupRpcErrors.InvalidInviteUrl)(extractJoinString(joinStringOrUrl)) + joinInfo ← joinSting match { + case Xor.Left(token) ⇒ + for { + info ← fromFutureOption(GroupRpcErrors.InvalidInviteToken)(db.run(GroupInviteTokenRepo.findByToken(token))) + } yield info.groupId → Some(info.creatorId) + case Xor.Right(groupName) ⇒ + for { + groupId ← fromFutureOption(GroupRpcErrors.InvalidInviteGroup)(globalNamesStorage.getGroupOwnerId(groupName)) + } yield groupId → None + } + (groupId, optInviter) = joinInfo joinResp ← fromFuture(groupExt.joinGroup( - groupId = tokenInfo.groupId, + groupId = groupId, joiningUserId = client.userId, joiningUserAuthId = client.authId, - invitingUserId = Some(tokenInfo.creatorId) + invitingUserId = optInviter )) ((SeqStateDate(seq, state, date), userIds, randomId)) = joinResp usersPeers ← fromFuture(usersOrPeers(userIds, stripEntities)) - groupStruct ← fromFuture(groupExt.getApiStruct(tokenInfo.groupId, client.userId)) + groupStruct ← fromFuture(groupExt.getApiStruct(groupId, client.userId)) } yield ResponseJoinGroup( groupStruct, seq, @@ -408,6 +430,15 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act } } + override def doHandleEditGroupShortName(groupPeer: ApiGroupOutPeer, shortName: Option[String], clientData: ClientData): Future[HandlerResult[ResponseSeq]] = + authorized(clientData) { client ⇒ + withGroupOutPeer(groupPeer) { + for { + SeqState(seq, state) ← groupExt.updateShortName(groupPeer.groupId, client.userId, client.authId, shortName) + } yield Ok(ResponseSeq(seq, state.toByteArray)) + } + } + private def usersOrPeers(userIds: Vector[Int], stripEntities: Boolean)(implicit client: AuthorizedClientData): Future[(Vector[ApiUser], Vector[ApiUserOutPeer])] = if (stripEntities) { val users = Vector.empty[ApiUser] @@ -427,11 +458,20 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act private def genInviteUrl(token: String) = s"$inviteUriBase$token" - private def extractInviteToken(urlOrToken: String) = - if (urlOrToken.startsWith(groupInviteConfig.baseUrl)) - urlOrToken.drop(inviteUriBase.length).takeWhile(c ⇒ c != '?' && c != '#') + private def extractJoinString(urlOrTokenOrGroupName: String): Option[String Xor String] = { + val extracted = if (urlOrTokenOrGroupName.startsWith(groupInviteConfig.baseUrl)) + urlOrTokenOrGroupName.drop(inviteUriBase.length).takeWhile(c ⇒ c != '?' && c != '#') else - urlOrToken + urlOrTokenOrGroupName + + if (StringUtils.validGroupInviteToken(extracted)) { + Some(Xor.left(extracted)) + } else if (StringUtils.validGlobalName(extracted)) { + Some(Xor.right(extracted)) + } else { + None + } + } private def addOptimizations(opts: IndexedSeq[ApiUpdateOptimization.Value])(implicit client: AuthorizedClientData): Unit = seqUpdExt.addOptimizations(client.userId, client.authId, opts map (_.id)) @@ -515,7 +555,8 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act override def onFailure: PartialFunction[Throwable, RpcError] = recoverCommon orElse { case GroupErrors.NotAMember ⇒ CommonRpcErrors.forbidden("Not a group member!") - case GroupErrors.NotAdmin ⇒ CommonRpcErrors.forbidden("Only admin can perform this action.") + case GroupErrors.NotAdmin ⇒ CommonRpcErrors.forbidden("Only group admin can perform this action.") + case GroupErrors.NotOwner ⇒ CommonRpcErrors.forbidden("Only group owner can perform this action.") case GroupErrors.UserAlreadyAdmin ⇒ GroupRpcErrors.UserAlreadyAdmin case GroupErrors.InvalidTitle ⇒ GroupRpcErrors.InvalidTitle case GroupErrors.AboutTooLong ⇒ GroupRpcErrors.AboutTooLong @@ -525,6 +566,8 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act case GroupErrors.UserAlreadyInvited ⇒ GroupRpcErrors.AlreadyInvited case GroupErrors.UserAlreadyJoined ⇒ GroupRpcErrors.AlreadyJoined case GroupErrors.GroupIdAlreadyExists(_) ⇒ GroupRpcErrors.GroupIdAlreadyExists + case GroupErrors.InvalidShortName ⇒ GroupRpcErrors.InvalidShortName + case GroupErrors.ShortNameTaken ⇒ GroupRpcErrors.ShortNameTaken } } diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/profile/ProfileServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/profile/ProfileServiceImpl.scala index fa9c627bd9..f606f3c410 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/profile/ProfileServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/profile/ProfileServiceImpl.scala @@ -7,17 +7,15 @@ import im.actor.api.rpc.files.ApiFileLocation import im.actor.api.rpc.misc.{ ResponseBool, ResponseSeq } import im.actor.api.rpc.profile.{ ProfileService, ResponseEditAvatar } import im.actor.server.db.DbExtension -import im.actor.server.file.{ FileStorageExtension, FileErrors, FileStorageAdapter, ImageUtils } -import im.actor.server.persist.UserRepo -import im.actor.server.sequence.{ SequenceErrors, SeqState } +import im.actor.server.file.{ FileErrors, FileStorageAdapter, FileStorageExtension, ImageUtils } +import im.actor.server.names.GlobalNamesStorageKeyValueStorage +import im.actor.server.sequence.{ SeqState, SequenceErrors } import im.actor.server.social.{ SocialExtension, SocialManagerRegion } import im.actor.server.user._ -import im.actor.util.ThreadLocalSecureRandom import im.actor.util.misc.StringUtils import slick.driver.PostgresDriver.api._ import scala.concurrent.duration._ -import scala.concurrent.forkjoin.ThreadLocalRandom import scala.concurrent.{ ExecutionContext, Future } object ProfileRpcErrors { @@ -44,6 +42,7 @@ final class ProfileServiceImpl()(implicit system: ActorSystem) extends ProfileSe private val userExt = UserExtension(system) private implicit val socialRegion: SocialManagerRegion = SocialExtension(system).region private implicit val fsAdapter: FileStorageAdapter = FileStorageExtension(system).fsAdapter + private val globalNamesStorage = new GlobalNamesStorageKeyValueStorage // TODO: flatten override def doHandleEditAvatar(fileLocation: ApiFileLocation, clientData: ClientData): Future[HandlerResult[ResponseEditAvatar]] = @@ -90,12 +89,12 @@ final class ProfileServiceImpl()(implicit system: ActorSystem) extends ProfileSe override def doHandleCheckNickName(nickname: String, clientData: ClientData): Future[HandlerResult[ResponseBool]] = authorized(clientData) { implicit client ⇒ (for { - _ ← fromBoolean(ProfileRpcErrors.NicknameInvalid)(StringUtils.validUsername(nickname)) - exists ← fromFuture(db.run(UserRepo.nicknameExists(nickname.trim))) + _ ← fromBoolean(ProfileRpcErrors.NicknameInvalid)(StringUtils.validGlobalName(nickname)) + exists ← fromFuture(globalNamesStorage.exists(nickname.trim)) } yield ResponseBool(!exists)).value } - //todo: move validation inside of UserOffice + //todo: move validation inside of UserProcessor override def doHandleEditAbout(about: Option[String], clientData: ClientData): Future[HandlerResult[ResponseSeq]] = { authorized(clientData) { implicit client ⇒ (for { diff --git a/actor-server/actor-runtime/src/main/scala/im/actor/util/misc/StringUtils.scala b/actor-server/actor-runtime/src/main/scala/im/actor/util/misc/StringUtils.scala index 5f5395ab37..47118e45d2 100644 --- a/actor-server/actor-runtime/src/main/scala/im/actor/util/misc/StringUtils.scala +++ b/actor-server/actor-runtime/src/main/scala/im/actor/util/misc/StringUtils.scala @@ -14,6 +14,8 @@ object StringUtils { private val usernamePattern = Pattern.compile("""^[0-9a-zA-Z_]{5,32}""", Pattern.UNICODE_CHARACTER_CLASS) + private val sha256Pattern = Pattern.compile("^[A-Fa-f0-9]{64}$", Pattern.UNICODE_CHARACTER_CLASS) + private val transliterator = Transliterator.getInstance("Latin; Latin-ASCII") def utfToHexString(s: String): String = { s.map(ch ⇒ f"${ch.toInt}%04X").mkString } @@ -37,7 +39,9 @@ object StringUtils { def validName(n: String): NonEmptyList[String] Xor String = nonEmptyString(n).flatMap(printableString) - def validUsername(username: String): Boolean = usernamePattern.matcher(username.trim).matches + def validGlobalName(username: String): Boolean = usernamePattern.matcher(username.trim).matches + + def validGroupInviteToken(token: String): Boolean = sha256Pattern.matcher(token.trim).matches def normalizeUsername(username: String): Option[String] = { val trimmed = username.trim diff --git a/actor-server/actor-tests/src/test/scala/im/actor/util/StringUtilsSpec.scala b/actor-server/actor-tests/src/test/scala/im/actor/util/StringUtilsSpec.scala index 7b25b68cf5..945e7a17cd 100644 --- a/actor-server/actor-tests/src/test/scala/im/actor/util/StringUtilsSpec.scala +++ b/actor-server/actor-tests/src/test/scala/im/actor/util/StringUtilsSpec.scala @@ -1,6 +1,6 @@ package im.actor.util -import im.actor.util.misc.StringUtils.{ transliterate, validUsername } +import im.actor.util.misc.StringUtils.{ transliterate, validGlobalName } import org.scalatest.{ Matchers, FlatSpecLike } class StringUtilsSpec extends FlatSpecLike with Matchers { @@ -10,19 +10,19 @@ class StringUtilsSpec extends FlatSpecLike with Matchers { "transliterate" should "transform string to lower-cased string with only latin chars" in translit def nicknames() = { - validUsername("rockjam") shouldEqual true - validUsername("abcde") shouldEqual true - validUsername("rock_jam") shouldEqual true - validUsername("r0ck_jaM___") shouldEqual true + validGlobalName("rockjam") shouldEqual true + validGlobalName("abcde") shouldEqual true + validGlobalName("rock_jam") shouldEqual true + validGlobalName("r0ck_jaM___") shouldEqual true //too long val tooLong = 0 to 35 map (e ⇒ ".") mkString "" - validUsername(tooLong) shouldEqual false + validGlobalName(tooLong) shouldEqual false //too short - validUsername("roc") shouldEqual false + validGlobalName("roc") shouldEqual false //wrong symbols - validUsername("rock-jam") shouldEqual false - validUsername("rock&^^jam") shouldEqual false + validGlobalName("rock-jam") shouldEqual false + validGlobalName("rock&^^jam") shouldEqual false } def translit() = { From 97d633b7c39e491307d481d5be45174f1db838c6 Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 18 Jul 2016 03:17:55 +0300 Subject: [PATCH 017/253] fix(server:groups): duplicate id for serializer --- .../src/main/scala/im/actor/server/group/GroupProcessor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index f8fcb73183..a37f813d9d 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -82,7 +82,7 @@ object GroupProcessor { 22015 → classOf[GroupEvents.UserBecameAdmin], 22016 → classOf[GroupEvents.IntegrationTokenRevoked], 22017 → classOf[GroupEvents.OwnerChanged], - 22017 → classOf[GroupEvents.ShortNameUpdated] + 22018 → classOf[GroupEvents.ShortNameUpdated] ) def persistenceIdFor(groupId: Int): String = s"Group-${groupId}" From 62d03da96d3f227454817a47028081b0be8b1b15 Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 18 Jul 2016 03:26:50 +0300 Subject: [PATCH 018/253] fix(server: groups): seq optimization for new updates, remove service messages for inviter in channels --- .../server/group/GroupCommandHandlers.scala | 35 +++---------------- .../actor/server/sequence/Optimization.scala | 9 ++++- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 16c3ff671e..16eb72e539 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -271,9 +271,9 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { deliveryId = s"useradded_${groupId}_${cmd.randomId}" ) - // push service message to invitee and inviter - _ ← seqUpdExt.broadcastPeopleUpdate( - userIds = Set(cmd.inviterUserId, cmd.inviteeUserId), + // push service message to invitee + _ ← seqUpdExt.deliverUserUpdate( + userId = cmd.inviteeUserId, update = serviceMessageUpdate( cmd.inviterUserId, dateMillis, @@ -330,7 +330,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { /** * User can join * • after invite(was invited by other user previously). In this case he already have group on devices - * • via invite ling. In this case he doesn't have group, and we need to deliver it. + * • via invite link. In this case he doesn't have group, and we need to deliver it. */ protected def join(cmd: Join): Unit = { // user is already a member, and should not complete invitation process @@ -443,18 +443,6 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { membersUpdateNew, deliveryId = s"userjoined_${groupId}_${randomId}" ) - - // push service message only to inviter - _ ← seqUpdExt.deliverUserUpdate( - userId = inviterUserId, - update = serviceMessageUpdate( - cmd.joiningUserId, - dateMillis, - randomId, - serviceMessage - ), - deliveryTag = Some(Optimization.GroupV2) - ) } yield SeqStateDate(seq, state, dateMillis) val result: Future[(SeqStateDate, Vector[Int], Long)] = @@ -574,21 +562,6 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { membersUpdateNew ) - // push service message to user, who invited leaving user - optInviter = state.members.get(cmd.userId) map (_.inviterUserId) - _ ← optInviter map { inviter ⇒ - seqUpdExt.deliverUserUpdate( - userId = cmd.userId, - update = serviceMessageUpdate( - cmd.userId, - dateMillis, - cmd.randomId, - serviceMessage - ), - deliveryTag = Some(Optimization.GroupV2) - ) - } getOrElse FastFuture.successful(()) - // push left user that he is no longer a member SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( userId = cmd.userId, diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala index 6ae868af4f..838c33ae16 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala @@ -44,7 +44,14 @@ object Optimization extends MessageParsing { UpdateGroupMembersUpdated.header, UpdateGroupMemberDiff.header, UpdateGroupMembersCountChanged.header, - UpdateGroupMemberAdminChanged.header + UpdateGroupMemberAdminChanged.header, + UpdateGroupCanEditInfoChanged.header, + + UpdateGroupShortNameChanged.header, + UpdateGroupCanEditUsernameChanged.header, + UpdateGroupCanEditAdminsChanged.header, + UpdateGroupCanViewAdminsChanged.header, + UpdateGroupCanEditAdminSettingsChanged.header ) if (deliveryTag == GroupV2) emptyUpdate From e24dcceb5c291089eafc491ced88b1de600b85d2 Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 18 Jul 2016 22:53:42 +0300 Subject: [PATCH 019/253] fix(server:groups): add group admin settings --- .../actor-core/src/main/protobuf/group.proto | 16 ++ .../src/main/protobuf/groupV2.proto | 41 +++- .../im/actor/server/api/TypeMappers.scala | 16 +- .../im/actor/server/dialog/HistoryUtils.scala | 2 +- .../server/group/GroupCommandHandlers.scala | 179 +++++++++++++++++- .../im/actor/server/group/GroupErrors.scala | 2 + .../actor/server/group/GroupOperations.scala | 18 +- .../actor/server/group/GroupProcessor.scala | 10 +- .../server/group/GroupQueryHandlers.scala | 36 +++- .../im/actor/server/group/GroupState.scala | 141 +++++++++++--- .../actor/server/sequence/Optimization.scala | 3 +- .../actor/server/persist/GroupUserRepo.scala | 4 + .../rpc/service/groups/GroupRpcErrors.scala | 27 +-- .../service/groups/GroupsServiceImpl.scala | 27 ++- 14 files changed, 452 insertions(+), 70 deletions(-) diff --git a/actor-server/actor-core/src/main/protobuf/group.proto b/actor-server/actor-core/src/main/protobuf/group.proto index b4f50d938c..cdfc8d94b4 100644 --- a/actor-server/actor-core/src/main/protobuf/group.proto +++ b/actor-server/actor-core/src/main/protobuf/group.proto @@ -112,6 +112,7 @@ message GroupEvents { optional string topic = 1; } + // deprecated in favour of AdminStatusChanged message UserBecameAdmin { option (scalapb.message).extends = "im.actor.server.group.GroupEvent"; @@ -120,6 +121,14 @@ message GroupEvents { required int32 promoter_user_id = 2; } + message AdminStatusChanged { + option (scalapb.message).extends = "im.actor.server.group.GroupEvent"; + + required int64 ts = 1 [(scalapb.field).type = "java.time.Instant"]; + required int32 user_id = 2; + required bool is_admin = 3; + } + message IntegrationTokenRevoked { option (scalapb.message).extends = "im.actor.server.group.GroupEvent"; @@ -133,4 +142,11 @@ message GroupEvents { required int64 ts = 1 [(scalapb.field).type = "java.time.Instant"]; required int32 user_id = 2; } + + message AdminSettingsUpdated { + option (scalapb.message).extends = "im.actor.server.group.GroupEvent"; + + required int64 ts = 1 [(scalapb.field).type = "java.time.Instant"]; + required int32 settings_bit_mask = 2; + } } diff --git a/actor-server/actor-core/src/main/protobuf/groupV2.proto b/actor-server/actor-core/src/main/protobuf/groupV2.proto index 297dd7f9f5..8ca35e184d 100644 --- a/actor-server/actor-core/src/main/protobuf/groupV2.proto +++ b/actor-server/actor-core/src/main/protobuf/groupV2.proto @@ -34,7 +34,9 @@ message GroupEnvelope { // GroupCommands.MakePublic make_public = 11; GroupCommands.RevokeIntegrationToken revoke_token = 12; GroupCommands.MakeUserAdmin make_user_admin = 13; + GroupCommands.DismissUserAdmin dismiss_user_admin = 28; GroupCommands.TransferOwnership transfer_ownership = 14; + GroupCommands.UpdateAdminSettings update_admin_settings = 30; } oneof query { GroupQueries.GetAccessHash get_access_hash = 15; @@ -48,6 +50,7 @@ message GroupEnvelope { GroupQueries.GetApiFullStruct get_api_full_struct = 23; GroupQueries.CheckAccessHash check_access_hash = 24; GroupQueries.CanSendMessage can_send_message = 26; + GroupQueries.LoadAdminSettings load_admin_settings = 29; } DialogEnvelope dialog_envelope = 25; } @@ -125,16 +128,7 @@ message GroupCommands { string title = 3; int64 random_id = 4; } -// -// message MakePublic { -// option (scalapb.message).extends = "im.actor.server.group.GroupCommand"; -// -// required int32 group_id = 1; -// optional string descrption = 2; -// } -// -// message MakePublicAck {} -// + message UpdateTopic { option (scalapb.message).extends = "GroupCommand"; @@ -169,6 +163,14 @@ message GroupCommands { int32 candidate_user_id = 3; } + message DismissUserAdmin { + option (scalapb.message).extends = "GroupCommand"; + + int32 client_user_id = 1; + int64 client_auth_id = 2; + int32 target_user_id = 3; + } + message RevokeIntegrationToken { option (scalapb.message).extends = "GroupCommand"; @@ -186,6 +188,15 @@ message GroupCommands { int64 client_auth_id = 3; int32 new_owner_id = 4; } + + message UpdateAdminSettings { + option (scalapb.message).extends = "GroupCommand"; + + int32 client_user_id = 1; + int32 settings_bit_mask = 2; + } + + message UpdateAdminSettingsAck {} } message GroupQueries { @@ -296,4 +307,14 @@ message GroupQueries { repeated int32 member_ids = 3; google.protobuf.Int32Value bot_id = 4; } + + message LoadAdminSettings { + option (scalapb.message).extends = "GroupQuery"; + + int32 client_user_id = 1; + } + + message LoadAdminSettingsResponse { + bytes settings = 1 [(scalapb.field).type = "im.actor.api.rpc.groups.ApiAdminSettings"]; + } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/api/TypeMappers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/api/TypeMappers.scala index 1c266761fd..b7ab276224 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/api/TypeMappers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/api/TypeMappers.scala @@ -9,7 +9,7 @@ import com.google.protobuf.wrappers.{ BytesValue, Int64Value } import com.google.protobuf.{ ByteString, CodedInputStream } import com.trueaccord.scalapb.TypeMapper import im.actor.api.rpc.files.ApiAvatar -import im.actor.api.rpc.groups.{ ApiGroup, ApiGroupFull } +import im.actor.api.rpc.groups.{ ApiAdminSettings, ApiGroup, ApiGroupFull } import im.actor.api.rpc.messaging.ApiMessage import im.actor.api.rpc.misc.ApiExtension import im.actor.api.rpc.peers.ApiPeer @@ -184,6 +184,18 @@ private[api] trait MessageMapper { def unapplyExtension(ext: ApiExtension): ByteString = ByteString.copyFrom(ext.toByteArray) + private def applyAdminSettings(bytes: ByteString): ApiAdminSettings = { + if (bytes.size() > 0) { + val res = ApiAdminSettings.parseFrom(CodedInputStream.newInstance(bytes.toByteArray)) + get(res) + } else { + null + } + } + + private def unapplyAdminSettings(settings: ApiAdminSettings): ByteString = + ByteString.copyFrom(settings.toByteArray) + implicit val seqUpdMapper: TypeMapper[ByteString, SeqUpdate] = TypeMapper(applySeqUpdate)(unapplySeqUpdate) implicit val anyRefMapper: TypeMapper[ByteString, AnyRef] = TypeMapper(applyAnyRef)(unapplyAnyRef) @@ -216,6 +228,8 @@ private[api] trait MessageMapper { implicit val extensionMapper: TypeMapper[ByteString, ApiExtension] = TypeMapper(applyExtension)(unapplyExtension) + implicit val adminSettingsMapper: TypeMapper[ByteString, ApiAdminSettings] = TypeMapper(applyAdminSettings)(unapplyAdminSettings) + implicit def actorRefMapper(implicit system: ActorSystem): TypeMapper[String, ActorRef] = new ActorSystemMapper[String, ActorRef]() { override def toCustom(base: String): ActorRef = diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/HistoryUtils.scala b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/HistoryUtils.scala index 7a67ff99d9..047631dfee 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/HistoryUtils.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/HistoryUtils.scala @@ -131,6 +131,6 @@ object HistoryUtils { private def requirePrivatePeer(peer: Peer) = { if (peer.typ != PeerType.Private) - throw new Exception("peer should be Private") + throw new RuntimeException("sender should be Private peer") } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 16eb72e539..71bd080d13 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -27,7 +27,7 @@ import im.actor.util.misc.{ IdUtils, StringUtils } import scala.concurrent.Future -//TODO: spit into MemberCommandHandlers - InfoCommandHandlers - ControlCommandHandlers +//TODO: spit into MemberCommandHandlers - InfoCommandHandlers - AdminCommandHandlers private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { this: GroupProcessor ⇒ @@ -488,11 +488,23 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val updateObsolete = UpdateGroupUserLeaveObsolete(groupId, cmd.userId, dateMillis, cmd.randomId) + // TODO: merge, they are almost identical val leftUserUpdatesNew = if (state.typ.isChannel) List( + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), + UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), + UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), + UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), + UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), + UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) ) else List( + UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), + UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), + UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), + UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), + UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), UpdateGroupMembersUpdated(groupId, members = Vector.empty), UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) @@ -617,15 +629,27 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val updateObsolete = UpdateGroupUserKickObsolete(groupId, cmd.kickedUserId, cmd.kickerUserId, dateMillis, cmd.randomId) + // TODO: merge, they are almost identical val kickedUserUpdatesNew: List[Update] = if (state.typ.isChannel) List( + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), + UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), + UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), + UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), + UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), + UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), UpdateGroupMemberChanged(groupId, isMember = false) ) else List( UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupMembersUpdated(groupId, members = Vector.empty), + UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), + UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), + UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), + UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), + UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), + UpdateGroupMembersUpdated(groupId, members = Vector.empty), UpdateGroupMemberChanged(groupId, isMember = false) ) @@ -1066,7 +1090,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } else if (state.isAdmin(cmd.candidateUserId)) { sender() ! Status.Failure(UserAlreadyAdmin) } else { - persist(UserBecameAdmin(Instant.now, cmd.candidateUserId, cmd.clientUserId)) { evt ⇒ + persist(AdminStatusChanged(Instant.now, cmd.candidateUserId, isAdmin = true)) { evt ⇒ val newState = commit(evt) val dateMillis = evt.ts.toEpochMilli @@ -1075,6 +1099,8 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val updateAdmin = UpdateGroupMemberAdminChanged(groupId, cmd.candidateUserId, isAdmin = true) val updateMembers = UpdateGroupMembersUpdated(groupId, members) + // now this user is admin, change edit rules for admins + val updateCanEdit = UpdateGroupCanEditInfoChanged(groupId, canEditGroup = newState.adminSettings.canAdminsEditGroupInfo) val updateObsolete = UpdateGroupMembersUpdateObsolete(groupId, members) @@ -1127,7 +1153,10 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { /////////////////////////// // Groups V2 API updates // /////////////////////////// - + _ ← seqUpdExt.deliverUserUpdate( + userId = cmd.candidateUserId, + update = updateCanEdit + ) seqStateDate ← if (state.typ.isChannel) adminCHANNELUpdates else adminGROUPUpdates } yield (members, seqStateDate) @@ -1137,6 +1166,90 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } + protected def dismissUserAdmin(cmd: DismissUserAdmin): Unit = { + if (!state.permissions.canEditAdmins(cmd.clientUserId)) { + sender() ! Status.Failure(NotAdmin) // Forbidden + } else if (!state.isAdmin(cmd.targetUserId)) { + sender() ! Status.Failure(UserAlreadyNotAdmin) + } else { + persist(AdminStatusChanged(Instant.now, cmd.targetUserId, isAdmin = false)) { evt ⇒ + val newState = commit(evt) + + val dateMillis = evt.ts.toEpochMilli + val memberIds = newState.memberIds + val members = newState.members.values.map(_.asStruct).toVector + + val updateAdmin = UpdateGroupMemberAdminChanged(groupId, cmd.targetUserId, isAdmin = false) + val updateMembers = UpdateGroupMembersUpdated(groupId, members) + // now this user is not admin, change edit rules to plain members + val updateCanEdit = UpdateGroupCanEditInfoChanged(groupId, canEditGroup = newState.adminSettings.canMembersEditGroupInfo) + + val updateObsolete = UpdateGroupMembersUpdateObsolete(groupId, members) + + //TODO: remove deprecated + db.run(GroupUserRepo.dismissAdmin(groupId, cmd.targetUserId)) + + val adminGROUPUpdates: Future[SeqState] = + for { + // push admin changed to all + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = memberIds + cmd.clientUserId, + updateAdmin + ) + // push changed members to all users + seqState ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + memberIds - cmd.clientUserId, + updateMembers + ) + } yield seqState + + val adminCHANNELUpdates: Future[SeqState] = + for { + // push admin changed to all + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = memberIds + cmd.clientUserId, + updateAdmin + ) + // push changed members to admins and fresh admin + seqState ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + newState.adminIds - cmd.clientUserId, + updateMembers + ) + } yield seqState + + val result: Future[SeqState] = for { + + /////////////////////////// + // Groups V1 API updates // + /////////////////////////// + + _ ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + memberIds - cmd.clientUserId, + updateObsolete + ) + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// + _ ← seqUpdExt.deliverUserUpdate( + userId = cmd.targetUserId, + update = updateCanEdit + ) + seqState ← if (state.typ.isChannel) adminCHANNELUpdates else adminGROUPUpdates + + } yield seqState + + result pipeTo sender() + } + } + } + protected def transferOwnership(cmd: TransferOwnership): Unit = { if (!state.isOwner(cmd.clientUserId)) { sender() ! Status.Failure(CommonErrors.Forbidden) @@ -1160,6 +1273,62 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } + protected def updateAdminSettings(cmd: UpdateAdminSettings): Unit = { + if (!state.permissions.canEditAdminSettings(cmd.clientUserId)) { + sender() ! Status.Failure(NotAdmin) + } else { + val settOld = state.adminSettings + + persist(AdminSettingsUpdated(Instant.now, cmd.settingsBitMask)) { evt ⇒ + val newState = commit(evt) + val settNew = newState.adminSettings + + val (membersUpdates, adminsUpdates) = { + // push to all members except admins and owner + val showAdminToMembers = PartialFunction.condOpt(settOld.showAdminsToMembers != settNew.showAdminsToMembers) { + case true ⇒ UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = settNew.showAdminsToMembers) + } + + // push to all members except admins and owner + val canMembersInvite = PartialFunction.condOpt(settOld.canMembersInvite != settNew.canMembersInvite) { + case true ⇒ UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = settNew.canMembersInvite) + } + + // push to all members except admins and owner + val canMembersEditGroupInfo = PartialFunction.condOpt(settOld.canMembersEditGroupInfo != settNew.canMembersEditGroupInfo) { + case true ⇒ UpdateGroupCanEditInfoChanged(groupId, canEditGroup = settNew.canMembersEditGroupInfo) + } + + // push to admins only + val canAdminsEditGroupInfo = PartialFunction.condOpt(settOld.canAdminsEditGroupInfo != settNew.canAdminsEditGroupInfo) { + case true ⇒ UpdateGroupCanEditInfoChanged(groupId, canEditGroup = settNew.canAdminsEditGroupInfo) + } + + ( + List(showAdminToMembers, canMembersInvite, canMembersEditGroupInfo).flatten[Update], + List(canAdminsEditGroupInfo).flatten[Update] + ) + } + + val plainMemberIds = (newState.memberIds - newState.ownerUserId) -- newState.adminIds + val adminsOnlyIds = newState.adminIds - newState.ownerUserId + + val result: Future[UpdateAdminSettingsAck] = for { + // deliver updates about settings changed to plain group members + _ ← FutureExt.ftraverse(membersUpdates) { update ⇒ + seqUpdExt.broadcastPeopleUpdate(userIds = plainMemberIds, update) + } + // deliver updates about settings changed to plain group members + _ ← FutureExt.ftraverse(membersUpdates) { update ⇒ + seqUpdExt.broadcastPeopleUpdate(userIds = adminsOnlyIds, update) + } + } yield UpdateAdminSettingsAck() + + result pipeTo sender() + } + } + } + private def serviceMessageUpdate(senderUserId: Int, date: Long, randomId: Long, message: ApiServiceMessage) = UpdateMessage( peer = apiGroupPeer, @@ -1191,7 +1360,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { UpdateGroupTopicChanged(groupId, newState.topic), UpdateGroupTitleChanged(groupId, newState.title), UpdateGroupOwnerChanged(groupId, newState.ownerUserId), - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = newState.canViewMembers(userId)), + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = newState.permissions.canViewMembers(userId)), UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = true) // TODO: figure out right value // UpdateGroupExtChanged(groupId, newState.extension) //TODO: figure out and fix // if(bigGroup) UpdateGroupMembersCountChanged(groupId, newState.extension) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala index a27657da21..28f2848875 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala @@ -17,6 +17,8 @@ object GroupErrors { case object UserAlreadyAdmin extends Exception with NoStackTrace + case object UserAlreadyNotAdmin extends Exception with NoStackTrace + case object NotAdmin extends Exception with NoStackTrace case object NotOwner extends Exception with NoStackTrace diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala index 5ceef50cd9..6239b0b4f6 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala @@ -5,7 +5,7 @@ import akka.pattern.ask import akka.util.Timeout import com.google.protobuf.ByteString import im.actor.api.rpc.AuthorizedClientData -import im.actor.api.rpc.groups.{ ApiGroup, ApiGroupFull, ApiMember } +import im.actor.api.rpc.groups.{ ApiAdminSettings, ApiGroup, ApiGroupFull, ApiMember } import im.actor.server.dialog.UserAcl import im.actor.server.file.Avatar import im.actor.server.sequence.{ SeqState, SeqStateDate } @@ -97,6 +97,11 @@ private[group] sealed trait Commands extends UserAcl { GroupEnvelope(groupId) .withMakeUserAdmin(MakeUserAdmin(clientUserId, clientAuthId, candidateId))).mapTo[(Vector[ApiMember], SeqStateDate)] + def dismissUserAdmin(groupId: Int, clientUserId: Int, clientAuthId: Long, targetUserId: Int): Future[SeqState] = + (processorRegion.ref ? + GroupEnvelope(groupId) + .withDismissUserAdmin(DismissUserAdmin(clientUserId, clientAuthId, targetUserId))).mapTo[SeqState] + def revokeIntegrationToken(groupId: Int, clientUserId: Int): Future[String] = (processorRegion.ref ? GroupEnvelope(groupId) @@ -107,6 +112,11 @@ private[group] sealed trait Commands extends UserAcl { GroupEnvelope(groupId) .withTransferOwnership(TransferOwnership(clientUserId, clientAuthId, newOwnerId))).mapTo[SeqState] + def updateAdminSettings(groupId: Int, clientUserId: Int, settings: ApiAdminSettings): Future[Unit] = + (processorRegion.ref ? + GroupEnvelope(groupId) + .withUpdateAdminSettings(UpdateAdminSettings(clientUserId, AdminSettings.apiToBitMask(settings)))).mapTo[UpdateAdminSettingsAck] map (_ ⇒ ()) + } private[group] sealed trait Queries { @@ -187,6 +197,12 @@ private[group] sealed trait Queries { (viewRegion.ref ? GroupEnvelope(groupId) .withLoadMembers(LoadMembers(clientUserId, limit, offset map ByteString.copyFrom))).mapTo[LoadMembersResponse] map (r ⇒ r.userIds → r.offset.map(_.toByteArray)) + + def loadAdminSettings(groupId: Int, clientUserId: Int): Future[ApiAdminSettings] = { + (viewRegion.ref ? + GroupEnvelope(groupId) + .withLoadAdminSettings(LoadAdminSettings(clientUserId))).mapTo[LoadAdminSettingsResponse] map (_.settings) + } } final case class CanSendMessageInfo( diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index a37f813d9d..dbf2f948a3 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -47,6 +47,8 @@ object GroupProcessor { 20020 → classOf[GroupCommands.RevokeIntegrationTokenAck], 20021 → classOf[GroupCommands.TransferOwnership], 20022 → classOf[GroupCommands.UpdateShortName], + 20023 → classOf[GroupCommands.DismissUserAdmin], + 20024 → classOf[GroupCommands.UpdateAdminSettings], 21001 → classOf[GroupQueries.GetIntegrationToken], 21002 → classOf[GroupQueries.GetIntegrationTokenResponse], @@ -67,6 +69,8 @@ object GroupProcessor { 21018 → classOf[GroupQueries.GetApiFullStruct], 21019 → classOf[GroupQueries.CanSendMessage], 21020 → classOf[GroupQueries.CanSendMessageResponse], + 21021 → classOf[GroupQueries.LoadAdminSettings], + 21022 → classOf[GroupQueries.LoadAdminSettingsResponse], 22003 → classOf[GroupEvents.UserInvited], 22004 → classOf[GroupEvents.UserJoined], @@ -82,7 +86,8 @@ object GroupProcessor { 22015 → classOf[GroupEvents.UserBecameAdmin], 22016 → classOf[GroupEvents.IntegrationTokenRevoked], 22017 → classOf[GroupEvents.OwnerChanged], - 22018 → classOf[GroupEvents.ShortNameUpdated] + 22018 → classOf[GroupEvents.ShortNameUpdated], + 22019 → classOf[GroupEvents.AdminSettingsUpdated] ) def persistenceIdFor(groupId: Int): String = s"Group-${groupId}" @@ -134,7 +139,9 @@ private[group] final class GroupProcessor // admin actions case r: RevokeIntegrationToken ⇒ revokeIntegrationToken(r) case m: MakeUserAdmin ⇒ makeUserAdmin(m) + case d: DismissUserAdmin ⇒ dismissUserAdmin(d) case t: TransferOwnership ⇒ transferOwnership(t) + case s: UpdateAdminSettings ⇒ updateAdminSettings(s) // termination actions case StopProcessor ⇒ context stop self @@ -165,6 +172,7 @@ private[group] final class GroupProcessor case GetApiFullStruct(clientUserId) ⇒ getApiFullStruct(clientUserId) case CheckAccessHash(accessHash) ⇒ checkAccessHash(accessHash) case CanSendMessage(clientUserId) ⇒ canSendMessage(clientUserId) + case LoadAdminSettings(clientUserId) ⇒ loadAdminSettings(clientUserId) } def persistenceId: String = GroupProcessor.persistenceIdFor(groupId) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index 29bf454304..0f13f3694e 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -5,7 +5,8 @@ import akka.stream.ActorMaterializer import akka.stream.scaladsl.Source import com.google.protobuf.ByteString import com.google.protobuf.wrappers.Int32Value -import im.actor.api.rpc.groups.{ ApiGroup, ApiGroupFull, ApiGroupType, ApiMember } +import im.actor.api.rpc.groups._ +import im.actor.server.group.GroupErrors.NotOwner import im.actor.server.group.GroupQueries._ import im.actor.server.group.GroupType.{ Channel, General, Public } @@ -102,7 +103,7 @@ trait GroupQueryHandlers { case GroupType.Channel ⇒ ApiGroupType.CHANNEL case GroupType.General | GroupType.Public | GroupType.Unrecognized(_) ⇒ ApiGroupType.GROUP }), - canSendMessage = Some(state.canSendMessage(clientUserId)) + canSendMessage = Some(state.permissions.canSendMessage(clientUserId)) ) ) } @@ -119,17 +120,17 @@ trait GroupQueryHandlers { ownerUserId = state.getShowableOwner(clientUserId), createDate = extractCreatedAtMillis(state), ext = None, - canViewMembers = Some(state.canViewMembers(clientUserId)), - canInvitePeople = Some(state.canInvitePeople(clientUserId)), + canViewMembers = Some(state.permissions.canViewMembers(clientUserId)), + canInvitePeople = Some(state.permissions.canInvitePeople(clientUserId)), isSharedHistory = Some(state.isHistoryShared), isAsyncMembers = Some(state.isAsyncMembers), members = membersAndCount(state, clientUserId)._1, shortName = state.shortName, - canEditGroupInfo = None, - canEditShortName = None, - canEditAdminList = None, - canViewAdminList = None, - canEditAdminSettings = None + canEditGroupInfo = Some(state.permissions.canEditInfo(clientUserId)), + canEditShortName = Some(state.permissions.canEditShortName(clientUserId)), + canEditAdminList = Some(state.permissions.canEditAdmins(clientUserId)), + canViewAdminList = Some(state.permissions.canViewAdmins(clientUserId)), + canEditAdminSettings = Some(state.permissions.canEditAdminSettings(clientUserId)) ) ) } @@ -153,6 +154,23 @@ trait GroupQueryHandlers { ) } + protected def loadAdminSettings(clientUserId: Int): Future[LoadAdminSettingsResponse] = { + if (state.permissions.canEditAdminSettings(clientUserId)) { + FastFuture.successful { + LoadAdminSettingsResponse( + ApiAdminSettings( + showAdminsToMembers = state.adminSettings.showAdminsToMembers, + canMembersInvite = state.adminSettings.canMembersInvite, + canMembersEditGroupInfo = state.adminSettings.canMembersEditGroupInfo, + canAdminsEditGroupInfo = state.adminSettings.canAdminsEditGroupInfo + ) + ) + } + } else { + FastFuture.failed(NotOwner) + } + } + private def extractCreatedAtMillis(group: GroupState): Long = group.createdAt.map(_.toEpochMilli).getOrElse(throw new RuntimeException("No date created provided for group!")) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 7e5d0a4d31..aff4d25f1c 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -3,6 +3,7 @@ package im.actor.server.group import java.time.Instant import akka.persistence.SnapshotMetadata +import im.actor.api.rpc.groups.ApiAdminSettings import im.actor.api.rpc.misc.ApiExtension import im.actor.server.cqrs.{ Event, ProcessorState } import im.actor.server.file.Avatar @@ -13,7 +14,7 @@ private[group] final case class Member( userId: Int, inviterUserId: Int, invitedAt: Instant, - isAdmin: Boolean + isAdmin: Boolean // TODO: remove, use separate admins list instead ) private[group] final case class Bot( @@ -21,6 +22,44 @@ private[group] final case class Bot( token: String ) +object AdminSettings { + val Default = AdminSettings( + showAdminsToMembers = true, + canMembersInvite = true, + canMembersEditGroupInfo = true, + canAdminsEditGroupInfo = false + ) + + // format: OFF + def apiToBitMask(settings: ApiAdminSettings): Int = { + def toInt(b: Boolean) = if(b) 1 else 0 + + List( + toInt(settings.showAdminsToMembers) << 0, + toInt(settings.canMembersInvite) << 1, + toInt(settings.canMembersEditGroupInfo) << 2, + toInt(settings.canAdminsEditGroupInfo) << 3 + ).sum + } + + def fromBitMask(mask: Int): AdminSettings = { + AdminSettings( + showAdminsToMembers = (mask & (1 << 0)) != 0, + canMembersInvite = (mask & (1 << 1)) != 0, + canMembersEditGroupInfo = (mask & (1 << 2)) != 0, + canAdminsEditGroupInfo = (mask & (1 << 3)) != 0 + ) + } + // format: ON +} + +private[group] final case class AdminSettings( + showAdminsToMembers: Boolean, // 1 + canMembersInvite: Boolean, // 2 + canMembersEditGroupInfo: Boolean, // 4 + canAdminsEditGroupInfo: Boolean // 8 +) + private[group] object GroupState { def empty: GroupState = GroupState( @@ -40,6 +79,7 @@ private[group] object GroupState { members = Map.empty, invitedUserIds = Set.empty, accessHash = 0L, + adminSettings = AdminSettings.Default, bot = None, //??? @@ -70,9 +110,10 @@ private[group] final case class GroupState( invitedUserIds: Set[Int], //security and etc. - accessHash: Long, - bot: Option[Bot], - extensions: Map[Int, Array[Byte]] + accessHash: Long, + adminSettings: AdminSettings, + bot: Option[Bot], + extensions: Map[Int, Array[Byte]] ) extends ProcessorState[GroupState] { lazy val memberIds = members.keySet @@ -96,24 +137,6 @@ private[group] final case class GroupState( def isExUser(userId: Int): Boolean = exUserIds.contains(userId) - // in case of general/public can view members if user is member - // in case of channel can view members only if clientUserId is admin - def canViewMembers(clientUserId: Int) = - isMember(clientUserId) && ((typ.isGeneral || typ.isPublic) || (typ.isChannel && isAdmin(clientUserId))) - - /** - * For now, all members can invite other users to group - */ - def canInvitePeople(clientUserId: Int) = isMember(clientUserId) - - def canSendMessage(clientUserId: Int) = - { - typ match { - case General | Public ⇒ isMember(clientUserId) - case Channel ⇒ isAdmin(clientUserId) - } - } || bot.exists(_.userId == clientUserId) - val isNotCreated = createdAt.isEmpty val isCreated = createdAt.nonEmpty @@ -216,9 +239,9 @@ private[group] final case class GroupState( this.copy(about = newAbout) case TopicUpdated(_, newTopic) ⇒ this.copy(topic = newTopic) - case UserBecameAdmin(_, userId, _) ⇒ + case AdminStatusChanged(_, userId, isAdmin) ⇒ this.copy( - members = members.updated(userId, members(userId).copy(isAdmin = true)) + members = members.updated(userId, members(userId).copy(isAdmin = isAdmin)) ) case IntegrationTokenRevoked(_, newToken) ⇒ this.copy( @@ -228,8 +251,78 @@ private[group] final case class GroupState( this.copy(ownerUserId = userId) case ShortNameUpdated(_, newShortName) ⇒ this.copy(shortName = newShortName) + case AdminSettingsUpdated(_, bitMask) ⇒ + this.copy(adminSettings = AdminSettings.fromBitMask(bitMask)) + + // deprecated event + case UserBecameAdmin(_, userId, _) ⇒ + this.copy( + members = members.updated(userId, members(userId).copy(isAdmin = true)) + ) } // TODO: real snapshot def withSnapshot(metadata: SnapshotMetadata, snapshot: Any): GroupState = this + + object permissions { + + /** + * bot can send messages in all groups + * in general/public group only members can send messages + * in channels only owner and admins can send messages + */ + def canSendMessage(clientUserId: Int) = + { + typ match { + case General | Public ⇒ isMember(clientUserId) + case Channel ⇒ isAdmin(clientUserId) || isOwner(clientUserId) + } + } || bot.exists(_.userId == clientUserId) + + /** + * in general/public group, all members can view members + * in channels, owner and admins can view members + */ + def canViewMembers(clientUserId: Int) = + typ match { + case General | Public ⇒ isMember(clientUserId) + case Channel ⇒ isAdmin(clientUserId) || isOwner(clientUserId) + } + + /** + * owner and admins always can invite new people + * members can invite new people if canMembersInvite is true + */ + def canInvitePeople(clientUserId: Int) = + isOwner(clientUserId) || + isAdmin(clientUserId) || + (isMember(clientUserId) && adminSettings.canMembersInvite) + + /** + * owner always can edit group info + * admin can edit group info, if canAdminsEditGroupInfo is true in admin settings + * any member can edit group info, if canMembersEditGroupInfo is true in admin settings + */ + def canEditInfo(clientUserId: Int): Boolean = + isOwner(clientUserId) || + (isAdmin(clientUserId) && adminSettings.canAdminsEditGroupInfo) || + (isMember(clientUserId) && adminSettings.canMembersEditGroupInfo) + + // only owner can change short name + def canEditShortName(clientUserId: Int): Boolean = isOwner(clientUserId) + + // only owner and other admins can edit admins list + def canEditAdmins(clientUserId: Int): Boolean = + isOwner(clientUserId) || isAdmin(clientUserId) + + /** + * admins list is always visible to owner and admins + * admins list is visible to any member if showAdminsToMembers = true + */ + def canViewAdmins(clientUserId: Int): Boolean = + isOwner(clientUserId) || isAdmin(clientUserId) || adminSettings.showAdminsToMembers + + // only owner can change admin settings + def canEditAdminSettings(clientUserId: Int): Boolean = isOwner(clientUserId) + } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala index 838c33ae16..7f517876c4 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala @@ -45,9 +45,8 @@ object Optimization extends MessageParsing { UpdateGroupMemberDiff.header, UpdateGroupMembersCountChanged.header, UpdateGroupMemberAdminChanged.header, - UpdateGroupCanEditInfoChanged.header, - UpdateGroupShortNameChanged.header, + UpdateGroupCanEditInfoChanged.header, UpdateGroupCanEditUsernameChanged.header, UpdateGroupCanEditAdminsChanged.header, UpdateGroupCanViewAdminsChanged.header, diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/GroupUserRepo.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/GroupUserRepo.scala index 8953c2cc1c..f195941789 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/GroupUserRepo.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/GroupUserRepo.scala @@ -72,4 +72,8 @@ object GroupUserRepo { def makeAdmin(groupId: Int, userId: Int) = byPKC.applied((groupId, userId)).map(_.isAdmin).update(true) + @deprecated("Duplication of event-sourced groups logic", "2016-06-05") + def dismissAdmin(groupId: Int, userId: Int) = + byPKC.applied((groupId, userId)).map(_.isAdmin).update(false) + } diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala index 5949a8883a..ab08be3d57 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala @@ -4,19 +4,20 @@ import im.actor.api.rpc.RpcError // format: OFF object GroupRpcErrors { - val AlreadyInvited = RpcError(400, "USER_ALREADY_INVITED", "You are already invited to this group.", false, None) - val AlreadyJoined = RpcError(400, "USER_ALREADY_JOINED", "You are already a member of this group.", false, None) - val NotAMember = RpcError(403, "FORBIDDEN", "You are not a group member.", false, None) - val InvalidTitle = RpcError(400, "GROUP_TITLE_INVALID", "Invalid group title.", false, None) - val TopicTooLong = RpcError(400, "GROUP_TOPIC_TOO_LONG", "Group topic is too long. It should be no longer then 255 characters", false, None) - val AboutTooLong = RpcError(400, "GROUP_ABOUT_TOO_LONG", "Group about is too long. It should be no longer then 255 characters", false, None) - val UserAlreadyAdmin = RpcError(400, "USER_ALREADY_ADMIN", "User is already admin of this group", false, None) - val BlockedByUser = RpcError(403, "BLOCKED_BY_USER", "User blocked you, unable to invite him.", false, None) - val GroupIdAlreadyExists = RpcError(400, "GROUP_ALREADY_EXISTS", "Group with such id already exists.", false, None) - val InvalidInviteUrl = RpcError(403, "INVALID_INVITE_URL", "Invalid invite url!", false, None) - val InvalidInviteToken = RpcError(403, "INVALID_INVITE_TOKEN", "Invalid invite token!", false, None) - val InvalidInviteGroup = RpcError(403, "INVALID_INVITE_GROUP", "Invalid group name provided!", false, None) - val GroupNotPublic = RpcError(400, "GROUP_IS_NOT_PUBLIC", "The group is not public.", false, None) + val AlreadyInvited = RpcError(400, "USER_ALREADY_INVITED", "You are already invited to this group.", false, None) + val AlreadyJoined = RpcError(400, "USER_ALREADY_JOINED", "You are already a member of this group.", false, None) + val NotAMember = RpcError(403, "FORBIDDEN", "You are not a group member.", false, None) + val InvalidTitle = RpcError(400, "GROUP_TITLE_INVALID", "Invalid group title.", false, None) + val TopicTooLong = RpcError(400, "GROUP_TOPIC_TOO_LONG", "Group topic is too long. It should be no longer then 255 characters", false, None) + val AboutTooLong = RpcError(400, "GROUP_ABOUT_TOO_LONG", "Group about is too long. It should be no longer then 255 characters", false, None) + val UserAlreadyAdmin = RpcError(400, "USER_ALREADY_ADMIN", "User is already admin of this group", false, None) + val UserAlreadyNotAdmin = RpcError(400, "USER_ALREADY_NOT_ADMIN", "User is already notadmin of this group", false, None) + val BlockedByUser = RpcError(403, "BLOCKED_BY_USER", "User blocked you, unable to invite him.", false, None) + val GroupIdAlreadyExists = RpcError(400, "GROUP_ALREADY_EXISTS", "Group with such id already exists.", false, None) + val InvalidInviteUrl = RpcError(403, "INVALID_INVITE_URL", "Invalid invite url!", false, None) + val InvalidInviteToken = RpcError(403, "INVALID_INVITE_TOKEN", "Invalid invite token!", false, None) + val InvalidInviteGroup = RpcError(403, "INVALID_INVITE_GROUP", "Invalid group name provided!", false, None) + val GroupNotPublic = RpcError(400, "GROUP_IS_NOT_PUBLIC", "The group is not public.", false, None) val InvalidShortName = RpcError(400, "GROUP_SHORT_NAME_INVALID", "Invalid group short name. Valid short name should contain from 5 to 32 characters, and may consist of latin characters, numbers and underscores", false, None) val ShortNameTaken = RpcError(400, "GROUP_SHORT_NAME_TAKEN", "This short name already belongs to other user or group, we are sorry!", false, None) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index 8b58909a7a..245c3ae591 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -84,13 +84,33 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act } override def doHandleDismissUserAdmin(groupPeer: ApiGroupOutPeer, userPeer: ApiUserOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = - FastFuture.failed(new RuntimeException("Not implemented")) + authorized(clientData) { implicit client ⇒ + withGroupOutPeer(groupPeer) { + withUserOutPeer(userPeer) { + for { + SeqState(seq, state) ← groupExt.dismissUserAdmin(groupPeer.groupId, client.userId, client.authId, userPeer.userId) + } yield Ok(ResponseSeq(seq, state.toByteArray)) + } + } + } override def doHandleLoadAdminSettings(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseLoadAdminSettings]] = - FastFuture.failed(new RuntimeException("Not implemented")) + authorized(clientData) { client ⇒ + withGroupOutPeer(groupPeer) { + for { + settings ← groupExt.loadAdminSettings(groupPeer.groupId, client.userId) + } yield Ok(ResponseLoadAdminSettings(settings)) + } + } override def doHandleSaveAdminSettings(groupPeer: ApiGroupOutPeer, settings: ApiAdminSettings, clientData: ClientData): Future[HandlerResult[ResponseVoid]] = - FastFuture.failed(new RuntimeException("Not implemented")) + authorized(clientData) { client ⇒ + withGroupOutPeer(groupPeer) { + for { + _ ← groupExt.updateAdminSettings(groupPeer.groupId, client.userId, settings) + } yield Ok(ResponseVoid) + } + } /** * Loading group members @@ -558,6 +578,7 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act case GroupErrors.NotAdmin ⇒ CommonRpcErrors.forbidden("Only group admin can perform this action.") case GroupErrors.NotOwner ⇒ CommonRpcErrors.forbidden("Only group owner can perform this action.") case GroupErrors.UserAlreadyAdmin ⇒ GroupRpcErrors.UserAlreadyAdmin + case GroupErrors.UserAlreadyNotAdmin ⇒ GroupRpcErrors.UserAlreadyNotAdmin case GroupErrors.InvalidTitle ⇒ GroupRpcErrors.InvalidTitle case GroupErrors.AboutTooLong ⇒ GroupRpcErrors.AboutTooLong case GroupErrors.TopicTooLong ⇒ GroupRpcErrors.TopicTooLong From 348213f63173a95f2e7f29209d830de843cb9a31 Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 01:31:52 +0300 Subject: [PATCH 020/253] fix(server:groups): add permission checks to command handling --- .../server/group/GroupCommandHandlers.scala | 47 ++++++++++--------- .../im/actor/server/group/GroupErrors.scala | 2 + .../im/actor/server/group/GroupState.scala | 6 +++ .../rpc/service/groups/GroupRpcErrors.scala | 1 + .../service/groups/GroupsServiceImpl.scala | 1 + 5 files changed, 34 insertions(+), 23 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 71bd080d13..5f7531bb34 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -35,6 +35,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { private val notMember = Status.Failure(NotAMember) private val notAdmin = Status.Failure(NotAdmin) + private val noPermission = Status.Failure(NoPermission) protected def create(cmd: Create): Unit = { if (!isValidTitle(cmd.title)) { @@ -169,7 +170,9 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } protected def invite(cmd: Invite): Unit = { - if (state.isInvited(cmd.inviteeUserId)) { + if (!state.permissions.canInvitePeople(cmd.inviterUserId)) { + sender() ! noPermission + } else if (state.isInvited(cmd.inviteeUserId)) { sender() ! Status.Failure(GroupErrors.UserAlreadyInvited) } else if (state.isMember(cmd.inviteeUserId)) { sender() ! Status.Failure(GroupErrors.UserAlreadyJoined) @@ -617,9 +620,9 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } protected def kick(cmd: Kick): Unit = { - if (state.typ.isChannel && !state.isAdmin(cmd.kickedUserId)) { - sender() ! notAdmin - } else if (state.nonMember(cmd.kickerUserId) || state.nonMember(cmd.kickedUserId)) { + if (!state.permissions.canKickMember(cmd.kickerUserId)) { + sender() ! noPermission + } else if (state.nonMember(cmd.kickedUserId)) { sender() ! notMember } else { persist(UserKicked(Instant.now, cmd.kickedUserId, cmd.kickerUserId)) { evt ⇒ @@ -761,10 +764,8 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } protected def updateAvatar(cmd: UpdateAvatar): Unit = { - if (state.typ.isChannel && !state.isAdmin(cmd.clientUserId)) { - sender() ! notAdmin - } else if (state.nonMember(cmd.clientUserId)) { - sender() ! notMember + if (!state.permissions.canEditInfo(cmd.clientUserId)) { + sender() ! noPermission } else { persist(AvatarUpdated(Instant.now, cmd.avatar)) { evt ⇒ val newState = commit(evt) @@ -812,10 +813,8 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { protected def updateTitle(cmd: UpdateTitle): Unit = { val title = cmd.title - if (state.typ.isChannel && !state.isAdmin(cmd.clientUserId)) { - sender() ! notAdmin - } else if (state.nonMember(cmd.clientUserId)) { - sender() ! notMember + if (!state.permissions.canEditInfo(cmd.clientUserId)) { + sender() ! noPermission } else if (!isValidTitle(title)) { sender() ! Status.Failure(InvalidTitle) } else { @@ -885,10 +884,8 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val topic = trimToEmpty(cmd.topic) - if (state.typ.isChannel && !state.isAdmin(cmd.clientUserId)) { - sender() ! notAdmin - } else if (state.nonMember(cmd.clientUserId)) { - sender() ! notMember + if (!state.permissions.canEditInfo(cmd.clientUserId)) { + sender() ! noPermission } else if (!isValidTopic(topic)) { sender() ! Status.Failure(TopicTooLong) } else { @@ -957,8 +954,8 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val about = trimToEmpty(cmd.about) - if (!state.isAdmin(cmd.clientUserId)) { - sender() ! notAdmin + if (!state.permissions.canEditInfo(cmd.clientUserId)) { + sender() ! noPermission } else if (!isValidAbout(about)) { sender() ! Status.Failure(AboutTooLong) } else { @@ -1014,7 +1011,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val oldShortName = state.shortName val newShortName = trimToEmpty(cmd.shortName) - if (!state.isOwner(cmd.clientUserId)) { + if (!state.permissions.canEditShortName(cmd.clientUserId)) { sender() ! Status.Failure(NotOwner) } else if (!isValidShortName(newShortName)) { sender() ! Status.Failure(InvalidShortName) @@ -1059,7 +1056,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } protected def revokeIntegrationToken(cmd: RevokeIntegrationToken): Unit = { - if (!state.isAdmin(cmd.clientUserId)) { + if (!(state.isAdmin(cmd.clientUserId) || state.isOwner(cmd.clientUserId))) { sender() ! notAdmin } else { val oldToken = state.bot.map(_.token) @@ -1085,8 +1082,10 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } protected def makeUserAdmin(cmd: MakeUserAdmin): Unit = { - if (!state.isAdmin(cmd.clientUserId) || state.nonMember(cmd.candidateUserId)) { - sender() ! Status.Failure(NotAdmin) + if (!state.permissions.canEditAdmins(cmd.clientUserId)) { + sender() ! noPermission + } else if (state.nonMember(cmd.candidateUserId)) { + sender() ! Status.Failure(NotAMember) } else if (state.isAdmin(cmd.candidateUserId)) { sender() ! Status.Failure(UserAlreadyAdmin) } else { @@ -1168,7 +1167,9 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { protected def dismissUserAdmin(cmd: DismissUserAdmin): Unit = { if (!state.permissions.canEditAdmins(cmd.clientUserId)) { - sender() ! Status.Failure(NotAdmin) // Forbidden + sender() ! noPermission + } else if (state.nonMember(cmd.targetUserId)) { + sender() ! Status.Failure(NotAMember) } else if (!state.isAdmin(cmd.targetUserId)) { sender() ! Status.Failure(UserAlreadyNotAdmin) } else { diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala index 28f2848875..06174a95c5 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala @@ -36,4 +36,6 @@ object GroupErrors { case object NoBotFound extends Exception with NoStackTrace case object BlockedByUser extends Exception with NoStackTrace + + case object NoPermission extends Exception with NoStackTrace } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index aff4d25f1c..a14cdf8c86 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -298,6 +298,12 @@ private[group] final case class GroupState( isAdmin(clientUserId) || (isMember(clientUserId) && adminSettings.canMembersInvite) + /** + * owner and admins can kick members + */ + def canKickMember(clientUserId: Int) = + isOwner(clientUserId) || isAdmin(clientUserId) + /** * owner always can edit group info * admin can edit group info, if canAdminsEditGroupInfo is true in admin settings diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala index ab08be3d57..8505b3ba81 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala @@ -18,6 +18,7 @@ object GroupRpcErrors { val InvalidInviteToken = RpcError(403, "INVALID_INVITE_TOKEN", "Invalid invite token!", false, None) val InvalidInviteGroup = RpcError(403, "INVALID_INVITE_GROUP", "Invalid group name provided!", false, None) val GroupNotPublic = RpcError(400, "GROUP_IS_NOT_PUBLIC", "The group is not public.", false, None) + val NoPermission = RpcError(403, "NO_PERMISSION", "You have no permission to execute this action", false, None) val InvalidShortName = RpcError(400, "GROUP_SHORT_NAME_INVALID", "Invalid group short name. Valid short name should contain from 5 to 32 characters, and may consist of latin characters, numbers and underscores", false, None) val ShortNameTaken = RpcError(400, "GROUP_SHORT_NAME_TAKEN", "This short name already belongs to other user or group, we are sorry!", false, None) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index 245c3ae591..1e86f599a5 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -589,6 +589,7 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act case GroupErrors.GroupIdAlreadyExists(_) ⇒ GroupRpcErrors.GroupIdAlreadyExists case GroupErrors.InvalidShortName ⇒ GroupRpcErrors.InvalidShortName case GroupErrors.ShortNameTaken ⇒ GroupRpcErrors.ShortNameTaken + case GroupErrors.NoPermission ⇒ GroupRpcErrors.NoPermission } } From e5a6822e4e91a3d17f4682edf588841def71192c Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 01:40:24 +0300 Subject: [PATCH 021/253] fix(server:groups): rename typ -> groupType in GroupState --- .../server/group/GroupCommandHandlers.scala | 28 +++++++++---------- .../server/group/GroupQueryHandlers.scala | 12 ++++---- .../im/actor/server/group/GroupState.scala | 16 +++++------ 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 5f7531bb34..6b8e259e7c 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -65,7 +65,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Group creation val groupType = GroupType.fromValue(cmd.typ) //FIXME: make it normal enum - val isHistoryShared = groupType.isChannel + val isHistoryShared = groupType.isChannel || groupType.isPublic persist(Created( ts = createdAt, @@ -101,7 +101,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { creatorUserId = newState.creatorUserId, accessHash = newState.accessHash, title = newState.title, - isPublic = newState.typ == GroupType.Public, + isPublic = isHistoryShared, createdAt = evt.ts, about = None, topic = None @@ -190,7 +190,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { val inviteeUpdatesNew: List[Update] = refreshGroupUpdates(newState, cmd.inviteeUserId) val membersUpdateNew: Update = - if (newState.typ.isChannel) // if history shared + if (newState.groupType.isChannel) // if channel, or group is big enough UpdateGroupMembersCountChanged(groupId, newState.membersCount) else UpdateGroupMembersUpdated(groupId, apiMembers) @@ -321,7 +321,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Groups V2 API updates // /////////////////////////// - seqStateDate ← if (newState.typ.isChannel) inviteCHANNELUpdates else inviteGROUPUpdates + seqStateDate ← if (newState.groupType.isChannel) inviteCHANNELUpdates else inviteGROUPUpdates } yield seqStateDate @@ -371,7 +371,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { if (wasInvited) List.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId) val membersUpdateNew: Update = - if (newState.typ.isChannel) // if history is shared + if (newState.groupType.isChannel) // if channel, or group is big enough UpdateGroupMembersCountChanged(groupId, newState.membersCount) else UpdateGroupMembersUpdated(groupId, apiMembers) // will update date when member got into group @@ -466,7 +466,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Groups V2 API updates // /////////////////////////// - seqStateDate ← if (newState.typ.isChannel) joinCHANNELUpdates else joinGROUPUpdates + seqStateDate ← if (newState.groupType.isChannel) joinCHANNELUpdates else joinGROUPUpdates } yield (seqStateDate, memberIds.toVector :+ inviterUserId, randomId) @@ -493,7 +493,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // TODO: merge, they are almost identical val leftUserUpdatesNew = - if (state.typ.isChannel) List( + if (state.groupType.isChannel) List( UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), @@ -514,7 +514,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { ) val membersUpdateNew = - if (state.typ.isChannel) { // if history is shared + if (state.groupType.isChannel) { // if channel, or group is big enough UpdateGroupMembersCountChanged( groupId, membersCount = state.membersCount - 1 @@ -610,7 +610,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Groups V2 API updates // /////////////////////////// - seqStateDate ← if (state.typ.isChannel) leaveCHANNELUpdates else leaveGROUPUpdates + seqStateDate ← if (state.groupType.isChannel) leaveCHANNELUpdates else leaveGROUPUpdates } yield seqStateDate @@ -634,7 +634,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // TODO: merge, they are almost identical val kickedUserUpdatesNew: List[Update] = - if (state.typ.isChannel) List( + if (state.groupType.isChannel) List( UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), @@ -657,7 +657,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { ) val membersUpdateNew: Update = - if (newState.typ.isChannel) { // if history is shared + if (newState.groupType.isChannel) { // if channel, or group is big enough UpdateGroupMembersCountChanged( groupId, membersCount = newState.membersCount @@ -754,7 +754,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { // Groups V2 API updates // /////////////////////////// - seqStateDate ← if (state.typ.isChannel) kickCHANNELUpdates else kickGROUPUpdates + seqStateDate ← if (state.groupType.isChannel) kickCHANNELUpdates else kickGROUPUpdates } yield seqStateDate @@ -1156,7 +1156,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { userId = cmd.candidateUserId, update = updateCanEdit ) - seqStateDate ← if (state.typ.isChannel) adminCHANNELUpdates else adminGROUPUpdates + seqStateDate ← if (state.groupType.isChannel) adminCHANNELUpdates else adminGROUPUpdates } yield (members, seqStateDate) @@ -1242,7 +1242,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { userId = cmd.targetUserId, update = updateCanEdit ) - seqState ← if (state.typ.isChannel) adminCHANNELUpdates else adminGROUPUpdates + seqState ← if (state.groupType.isChannel) adminCHANNELUpdates else adminGROUPUpdates } yield seqState diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index 0f13f3694e..78cf3dfe76 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -62,7 +62,7 @@ trait GroupQueryHandlers { ) } - state.typ match { + state.groupType match { case General | Public ⇒ load case Channel ⇒ if (state.isAdmin(clientUserId)) load @@ -71,7 +71,7 @@ trait GroupQueryHandlers { } protected def isPublic = - FastFuture.successful(IsPublicResponse(isPublic = state.typ == GroupType.Public)) + FastFuture.successful(IsPublicResponse(isPublic = state.groupType == GroupType.Public)) protected def isHistoryShared = FastFuture.successful(IsHistorySharedResponse(state.isHistoryShared)) @@ -99,7 +99,7 @@ trait GroupQueryHandlers { isHidden = Some(state.isHidden), ext = None, membersCount = Some(count), - groupType = Some(state.typ match { + groupType = Some(state.groupType match { case GroupType.Channel ⇒ ApiGroupType.CHANNEL case GroupType.General | GroupType.Public | GroupType.Unrecognized(_) ⇒ ApiGroupType.GROUP }), @@ -141,14 +141,14 @@ trait GroupQueryHandlers { protected def canSendMessage(clientUserId: Int): Future[CanSendMessageResponse] = FastFuture.successful { val canSend = state.bot.exists(_.userId == clientUserId) || { - state.typ match { + state.groupType match { case General | Public ⇒ state.isMember(clientUserId) case Channel ⇒ state.isAdmin(clientUserId) } } CanSendMessageResponse( canSend = canSend, - isChannel = state.typ.isChannel, + isChannel = state.groupType.isChannel, memberIds = state.memberIds.toSeq, botId = state.bot.map(_.userId) ) @@ -187,7 +187,7 @@ trait GroupQueryHandlers { } if (state.isMember(clientUserId)) { - state.typ match { + state.groupType match { case General | Public ⇒ apiMembers → group.membersCount case Channel ⇒ diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index a14cdf8c86..094895cc55 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -73,7 +73,7 @@ private[group] object GroupState { avatar = None, topic = None, shortName = None, - typ = GroupType.General, + groupType = GroupType.General, isHidden = false, isHistoryShared = false, members = Map.empty, @@ -101,7 +101,7 @@ private[group] final case class GroupState( avatar: Option[Avatar], topic: Option[String], shortName: Option[String], - typ: GroupType, // TODO: rename to groupType + groupType: GroupType, // TODO: rename to groupType isHidden: Boolean, isHistoryShared: Boolean, @@ -142,13 +142,13 @@ private[group] final case class GroupState( val isCreated = createdAt.nonEmpty def isAsyncMembers = - typ match { + groupType match { case General | Public ⇒ members.size > 100 case Channel ⇒ true } def getShowableOwner(clientUserId: Int): Option[Int] = - typ match { + groupType match { case General | Public ⇒ Some(creatorUserId) case Channel ⇒ if (isAdmin(clientUserId)) Some(creatorUserId) else None } @@ -164,7 +164,7 @@ private[group] final case class GroupState( about = None, avatar = None, topic = None, - typ = evt.typ.getOrElse(GroupType.General), + groupType = evt.typ.getOrElse(GroupType.General), isHidden = evt.isHidden getOrElse false, isHistoryShared = evt.isHistoryShared getOrElse false, members = ( @@ -232,7 +232,7 @@ private[group] final case class GroupState( this.copy(title = newTitle) case BecamePublic(_) ⇒ this.copy( - typ = GroupType.Public, + groupType = GroupType.Public, isHistoryShared = true ) case AboutUpdated(_, newAbout) ⇒ @@ -273,7 +273,7 @@ private[group] final case class GroupState( */ def canSendMessage(clientUserId: Int) = { - typ match { + groupType match { case General | Public ⇒ isMember(clientUserId) case Channel ⇒ isAdmin(clientUserId) || isOwner(clientUserId) } @@ -284,7 +284,7 @@ private[group] final case class GroupState( * in channels, owner and admins can view members */ def canViewMembers(clientUserId: Int) = - typ match { + groupType match { case General | Public ⇒ isMember(clientUserId) case Channel ⇒ isAdmin(clientUserId) || isOwner(clientUserId) } From 48c5c853ca1ca52cea3bc16e6f08349aad3da944 Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 03:14:48 +0300 Subject: [PATCH 022/253] fix(server:groups): delete messages in channels --- .../im/actor/server/dialog/HistoryUtils.scala | 17 ----- .../actor/server/group/GroupOperations.scala | 1 + .../server/group/GroupQueryHandlers.scala | 2 +- .../service/messaging/HistoryHandlers.scala | 67 ++++++++++--------- 4 files changed, 39 insertions(+), 48 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/HistoryUtils.scala b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/HistoryUtils.scala index 047631dfee..c4f800d492 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/HistoryUtils.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/HistoryUtils.scala @@ -98,23 +98,6 @@ object HistoryUtils { } yield () } - // todo: remove this in favor of getHistoryOwner - def withHistoryOwner[A](peer: Peer, clientUserId: Int)(f: Int ⇒ DBIO[A])(implicit system: ActorSystem): DBIO[A] = { - import system.dispatcher - (peer.typ match { - case PeerType.Private ⇒ DBIO.successful(clientUserId) - case PeerType.Group ⇒ - DBIO.from(GroupExtension(system).isHistoryShared(peer.id)) flatMap { isHistoryShared ⇒ - if (isHistoryShared) { - DBIO.successful(SharedUserId) - } else { - DBIO.successful(clientUserId) - } - } - case _ ⇒ throw new RuntimeException(s"Unknown peer type ${peer.typ}") - }) flatMap f - } - def getHistoryOwner(peer: Peer, clientUserId: Int)(implicit system: ActorSystem): Future[Int] = { import system.dispatcher peer.typ match { diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala index 6239b0b4f6..dc56f1a0fd 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala @@ -171,6 +171,7 @@ private[group] sealed trait Queries { GroupEnvelope(groupId) .withGetMembers(GetMembers())).mapTo[GetMembersResponse] map (r ⇒ (r.memberIds, r.invitedUserIds, r.botId)) + // TODO: better name maybe def canSendMessage(groupId: Int, clientUserId: Int): Future[CanSendMessageInfo] = (viewRegion.ref ? GroupEnvelope(groupId) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index 78cf3dfe76..3b2599df5a 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -71,7 +71,7 @@ trait GroupQueryHandlers { } protected def isPublic = - FastFuture.successful(IsPublicResponse(isPublic = state.groupType == GroupType.Public)) + FastFuture.successful(IsPublicResponse(state.groupType.isPublic)) protected def isHistoryShared = FastFuture.successful(IsHistorySharedResponse(state.isHistoryShared)) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala index 67b4d7a80b..18008066e3 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala @@ -2,7 +2,7 @@ package im.actor.server.api.rpc.service.messaging import java.time.Instant -import com.google.protobuf.wrappers.Int32Value +import akka.http.scaladsl.util.FastFuture import im.actor.api.rpc.PeerHelpers._ import im.actor.api.rpc._ import im.actor.api.rpc.messaging.{ ApiEmptyMessage, _ } @@ -10,7 +10,8 @@ import im.actor.api.rpc.misc.{ ResponseSeq, ResponseVoid } import im.actor.api.rpc.peers.{ ApiGroupOutPeer, ApiOutPeer, ApiPeerType, ApiUserOutPeer } import im.actor.api.rpc.sequence.ApiUpdateOptimization import im.actor.server.dialog.HistoryUtils -import im.actor.server.group.GroupUtils +import im.actor.server.group.GroupQueries.CanSendMessageResponse +import im.actor.server.group.{ CanSendMessageInfo, GroupUtils } import im.actor.server.model.{ DialogObsolete, HistoryMessage, Peer, PeerType } import im.actor.server.persist.contact.UserContactRepo import im.actor.server.persist.dialog.DialogRepo @@ -31,6 +32,8 @@ trait HistoryHandlers { import HistoryUtils._ import Implicits._ + private val CantDelete = Error(CommonRpcErrors.forbidden("You can't delete these messages")) + override def doHandleMessageReceived(peer: ApiOutPeer, date: Long, clientData: im.actor.api.rpc.ClientData): Future[HandlerResult[ResponseVoid]] = { authorized(clientData) { client ⇒ dialogExt.messageReceived(peer.asPeer, client.userId, date) map (_ ⇒ Ok(ResponseVoid)) @@ -238,43 +241,47 @@ trait HistoryHandlers { override def doHandleDeleteMessage(outPeer: ApiOutPeer, randomIds: IndexedSeq[Long], clientData: ClientData): Future[HandlerResult[ResponseSeq]] = authorized(clientData) { implicit client ⇒ - val action = withOutPeerDBIO(outPeer) { + withOutPeer(outPeer) { val peer = outPeer.asModel - withHistoryOwner(peer, client.userId) { historyOwner ⇒ + getHistoryOwner(peer, client.userId) flatMap { historyOwner ⇒ if (isSharedUser(historyOwner)) { - HistoryMessageRepo.find(historyOwner, peer, randomIds.toSet) flatMap { messages ⇒ - if (messages.exists(_.senderUserId != client.userId)) { - DBIO.successful(Error(CommonRpcErrors.forbidden("You can only delete your own messages"))) - } else { - for { - _ ← HistoryMessageRepo.delete(historyOwner, peer, randomIds.toSet) - groupUserIds ← GroupUserRepo.findUserIds(peer.id) map (_.toSet) - SeqState(seq, state) ← DBIO.from(seqUpdExt.broadcastClientUpdate( - client.userId, - client.authId, - bcastUserIds = groupUserIds, - update = UpdateMessageDelete(outPeer.asPeer, randomIds), - pushRules = seqUpdExt.pushRules(isFat = false, None, Seq(client.authId)) - )) - } yield Ok(ResponseSeq(seq, state.toByteArray)) + for { + CanSendMessageInfo(canSend, isChannel, memberIds, _) ← groupExt.canSendMessage(peer.id, client.userId) + result ← (isChannel, canSend) match { + case (true, true) ⇒ // channel, client user is one of those who can send messages, thus he can also delete them. + deleteMessages(peer, historyOwner, randomIds, memberIds) + case (true, false) ⇒ // channel, client user can't send messages, thus he can't delete them. + FastFuture.successful(CantDelete) + case (false, _) ⇒ // not a channel group. Must check if user deletes only messages he sent. + for { + messages ← db.run(HistoryMessageRepo.find(historyOwner, peer, randomIds.toSet)) // TODO: rewrite to ids check only + res ← if (messages.forall(_.senderUserId == client.userId)) { + deleteMessages(peer, historyOwner, randomIds, memberIds) + } else { + FastFuture.successful(CantDelete) + } + } yield res } - } + } yield result } else { - for { - _ ← HistoryMessageRepo.delete(client.userId, peer, randomIds.toSet) - SeqState(seq, state) ← DBIO.from(seqUpdExt.deliverClientUpdate( - client.userId, - client.authId, - update = UpdateMessageDelete(outPeer.asPeer, randomIds), - pushRules = seqUpdExt.pushRules(isFat = false, None) - )) - } yield Ok(ResponseSeq(seq, state.toByteArray)) + deleteMessages(peer, historyOwner, randomIds, otherUsersIds = Set.empty) } } } - db.run(action) } + private def deleteMessages(peer: Peer, historyOwner: Int, randomIds: IndexedSeq[Long], otherUsersIds: Set[Int])(implicit client: AuthorizedClientData) = + for { + _ ← db.run(HistoryMessageRepo.delete(historyOwner, peer, randomIds.toSet)) + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + client.userId, + client.authId, + bcastUserIds = otherUsersIds, + update = UpdateMessageDelete(peer.asStruct, randomIds), + pushRules = seqUpdExt.pushRules(isFat = false, None, excludeAuthIds = Seq(client.authId)) + ) + } yield Ok(ResponseSeq(seq, state.toByteArray)) + private val MaxDateTime = new DateTime(294276, 1, 1, 0, 0) private val MaxDate = MaxDateTime.getMillis From 6d16387aaec93654d3fc4d91a999cd679575ea5b Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 04:02:16 +0300 Subject: [PATCH 023/253] fix(server:groups): edit messages in channels; change edit messages rules: can change any own messages in last hour --- .../server/messaging/MessageUpdating.scala | 17 +++++++--- .../server/persist/HistoryMessageRepo.scala | 11 +------ .../service/messaging/MessagingHandlers.scala | 32 ++++++++++++++++--- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/messaging/MessageUpdating.scala b/actor-server/actor-core/src/main/scala/im/actor/server/messaging/MessageUpdating.scala index 84ec97e2f7..d2744e80e7 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/messaging/MessageUpdating.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/messaging/MessageUpdating.scala @@ -51,10 +51,17 @@ trait MessageUpdating extends PeersImplicits { } yield seqState } - private def updateContentGroup(userId: Int, clientAuthId: Long, peer: Peer, randomId: Long, updatedMessage: ApiMessage, date: Long)(implicit system: ActorSystem): Future[SeqState] = { + private def updateContentGroup( + userId: Int, + clientAuthId: Long, + groupPeer: Peer, + randomId: Long, + updatedMessage: ApiMessage, + date: Long + )(implicit system: ActorSystem): Future[SeqState] = { import system.dispatcher val seqUpdExt = SeqUpdatesExtension(system) - val update = UpdateMessageContentChanged(peer.asStruct, randomId, updatedMessage) + val update = UpdateMessageContentChanged(groupPeer.asStruct, randomId, updatedMessage) for { // update for client user seqState ← seqUpdExt.deliverClientUpdate( @@ -64,8 +71,8 @@ trait MessageUpdating extends PeersImplicits { pushRules = seqUpdExt.pushRules(isFat = false, None), deliveryId = s"msgcontent_${randomId}_${date}" ) - (memberIds, _, _) ← GroupExtension(system).getMemberIds(peer.id) - membersSet = memberIds.toSet + (memberIds, _, optBotId) ← GroupExtension(system).getMemberIds(groupPeer.id) + membersSet = (memberIds ++ optBotId.toSeq).toSet // update for other group members _ ← seqUpdExt.broadcastPeopleUpdate( membersSet - userId, @@ -77,7 +84,7 @@ trait MessageUpdating extends PeersImplicits { userIds = membersSet + userId, randomId = randomId, peerType = PeerType.Group, - peerIds = Set(peer.id), + peerIds = Set(groupPeer.id), messageContentHeader = updatedMessage.header, messageContentData = updatedMessage.toByteArray )) diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/HistoryMessageRepo.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/HistoryMessageRepo.scala index d8aef50029..4ce5087c68 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/HistoryMessageRepo.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/HistoryMessageRepo.scala @@ -158,15 +158,6 @@ object HistoryMessageRepo { findNewestFilter(userId, peer, filter) } - def findNewestSentBy(userId: Int, peer: Peer): SqlAction[Option[HistoryMessage], NoStream, Read] = { - val filter = { m: HistoryMessageTable ⇒ - m.senderUserId === userId && - m.peerType === peer.typ.value && - m.peerId === peer.id - } - findNewestFilter(userId, peer, filter) - } - private def findNewestFilter(userId: Int, peer: Peer, filterClause: HistoryMessageTable ⇒ Rep[Boolean]) = { notDeletedMessages .filter(filterClause) @@ -246,4 +237,4 @@ object HistoryMessageRepo { .filter(_.randomId inSet randomIds) .map(_.deletedAt) .update(Some(new DateTime)) -} \ No newline at end of file +} diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/MessagingHandlers.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/MessagingHandlers.scala index 898c83f25b..7715069165 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/MessagingHandlers.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/MessagingHandlers.scala @@ -9,17 +9,19 @@ import im.actor.api.rpc.messaging._ import im.actor.api.rpc.misc._ import im.actor.api.rpc.peers._ import im.actor.config.ActorConfig +import im.actor.server.group.CanSendMessageInfo import im.actor.server.messaging.{ MessageParsing, MessageUpdating } +import im.actor.server.model.{ Peer, PeerType } import im.actor.server.persist.HistoryMessageRepo import scala.concurrent._ import scala.concurrent.duration._ object MessagingRpcErors { - val NotLastMessage = RpcError(400, "NOT_LAST_MESSAGE", "You are trying to edit not last message.", false, None) val NotInTimeWindow = RpcError(400, "NOT_IN_TIME_WINDOW", "You can't edit message sent more than 5 minutes age.", false, None) val NotTextMessage = RpcError(400, "NOT_TEXT_MESSAGE", "You can edit only text messages.", false, None) val NotUniqueRandomId = RpcError(400, "RANDOM_ID_NOT_UNIQUE", "", false, None) + val NotAllowedToEdit = CommonRpcErrors.forbidden("You are not allowed to edit this message") } private[messaging] trait MessagingHandlers extends PeersImplicits @@ -35,7 +37,7 @@ private[messaging] trait MessagingHandlers extends PeersImplicits private implicit val timeout: Timeout = ActorConfig.defaultTimeout // TODO: configurable - private val editTimeWindow: Long = 5.minutes.toMillis + private val editTimeWindow: Long = 1.hour.toMillis override def doHandleSendMessage( outPeer: ApiOutPeer, @@ -67,8 +69,7 @@ private[messaging] trait MessagingHandlers extends PeersImplicits withOutPeer(outPeer) { val peer = outPeer.asModel (for { - histMessage ← fromFutureOption(CommonRpcErrors.forbidden("Not allowed"))(db.run(HistoryMessageRepo.findNewestSentBy(client.userId, peer))) - _ ← fromBoolean(NotLastMessage)(histMessage.randomId == randomId) + histMessage ← fromFutureOption(NotAllowedToEdit)(getEditableHistoryMessage(peer, randomId)) _ ← fromBoolean(NotInTimeWindow)(inTimeWindow(histMessage.date.getMillis)) apiMessage ← fromXor((e: Any) ⇒ IntenalError)(Xor.fromEither(parseMessage(histMessage.messageContentData))) _ ← fromBoolean(NotTextMessage)(apiMessage match { @@ -82,6 +83,29 @@ private[messaging] trait MessagingHandlers extends PeersImplicits } } + private def getEditableHistoryMessage(peer: Peer, randomId: Long)(implicit client: AuthorizedClientData) = { + def findBySender(senderId: Int) = db.run(HistoryMessageRepo.findBySender(senderId, peer, randomId).headOption) + + for { + optMessage ← peer match { + case Peer(PeerType.Private, _) ⇒ + findBySender(client.userId) + case Peer(PeerType.Group, groupId) ⇒ + for { + CanSendMessageInfo(canSend, isChannel, _, optBotId) ← groupExt.canSendMessage(groupId, client.userId) + mess ← (isChannel, canSend) match { + case (true, true) ⇒ // channel, client user is one of those who can send messages, thus he can also edit message. + (optBotId map findBySender) getOrElse FastFuture.successful(None) + case (true, false) ⇒ // channel, client user can't send messages, thus he can't edit message. + FastFuture.successful(None) + case (false, _) ⇒ // not a channel group. regular, as in case of private peer + findBySender(client.userId) + } + } yield mess + } + } yield optMessage + } + private def inTimeWindow(messageDateMillis: Long): Boolean = { (messageDateMillis + editTimeWindow) > System.currentTimeMillis } From 0f74b76c5220a6affffd7bd35c3822af1f843f6d Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 04:24:00 +0300 Subject: [PATCH 024/253] fix(server:rpc,groups): disable typings for channels --- .../actor/server/group/GroupOperations.scala | 1 + .../server/group/GroupQueryHandlers.scala | 2 +- .../rpc/service/weak/WeakServiceImpl.scala | 25 +++++++++++++------ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala index dc56f1a0fd..f905ede15b 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala @@ -171,6 +171,7 @@ private[group] sealed trait Queries { GroupEnvelope(groupId) .withGetMembers(GetMembers())).mapTo[GetMembersResponse] map (r ⇒ (r.memberIds, r.invitedUserIds, r.botId)) + // TODO: should be signed as internal API // TODO: better name maybe def canSendMessage(groupId: Int, clientUserId: Int): Future[CanSendMessageInfo] = (viewRegion.ref ? diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index 3b2599df5a..09ce2d4ccb 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -35,7 +35,7 @@ trait GroupQueryHandlers { protected def getMembers: Future[GetMembersResponse] = FastFuture.successful { GetMembersResponse( - memberIds = state.members.keySet.toSeq, + memberIds = state.memberIds.toSeq, invitedUserIds = state.invitedUserIds.toSeq, botId = state.bot.map(_.userId) ) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/weak/WeakServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/weak/WeakServiceImpl.scala index 0ece36d6a8..08fb4fc9ae 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/weak/WeakServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/weak/WeakServiceImpl.scala @@ -8,7 +8,7 @@ import im.actor.api.rpc.peers.{ ApiOutPeer, ApiPeer, ApiPeerType } import im.actor.api.rpc.weak._ import im.actor.concurrent.FutureExt import im.actor.server.db.DbExtension -import im.actor.server.group.GroupExtension +import im.actor.server.group.{ CanSendMessageInfo, GroupExtension } import im.actor.server.presences.PresenceExtension import im.actor.server.sequence.WeakUpdatesExtension import slick.driver.PostgresDriver.api._ @@ -28,7 +28,6 @@ class WeakServiceImpl(implicit actorSystem: ActorSystem) extends WeakService { authorized(clientData) { client ⇒ peer.`type` match { case ApiPeerType.EncryptedPrivate ⇒ - val update = UpdateTyping(ApiPeer(ApiPeerType.EncryptedPrivate, client.userId), client.userId, typingType) val reduceKey = weakUpdatesExt.reduceKey(update.header, update.peer) @@ -43,8 +42,11 @@ class WeakServiceImpl(implicit actorSystem: ActorSystem) extends WeakService { val reduceKey = weakUpdatesExt.reduceKey(update.header, update.peer, client.userId) for { - (memberIds, _, _) ← groupExt.getMemberIds(peer.id) - _ ← FutureExt.ftraverse(memberIds filterNot (_ == client.userId))(weakUpdatesExt.broadcastUserWeakUpdate(_, update, Some(reduceKey))) + CanSendMessageInfo(_, isChannel, memberIds, _) ← groupExt.canSendMessage(peer.id, client.userId) + _ ← if (isChannel) + FastFuture.successful(()) + else + FutureExt.ftraverse((memberIds - client.userId).toSeq)(weakUpdatesExt.broadcastUserWeakUpdate(_, update, Some(reduceKey))) } yield () } @@ -80,17 +82,26 @@ class WeakServiceImpl(implicit actorSystem: ActorSystem) extends WeakService { override def doHandleStopTyping(peer: ApiOutPeer, typingType: ApiTypingType.ApiTypingType, clientData: ClientData): Future[HandlerResult[ResponseVoid]] = { authorized(clientData) { client ⇒ peer.`type` match { + case ApiPeerType.EncryptedPrivate ⇒ + val update = UpdateTypingStop(ApiPeer(ApiPeerType.EncryptedPrivate, client.userId), client.userId, typingType) + val reduceKey = weakUpdatesExt.reduceKey(update.header, update.peer) + + weakUpdatesExt.broadcastUserWeakUpdate(peer.id, update, reduceKey = Some(reduceKey)) case ApiPeerType.Private ⇒ val update = UpdateTypingStop(ApiPeer(ApiPeerType.Private, client.userId), client.userId, typingType) val reduceKey = weakUpdatesExt.reduceKey(update.header, update.peer) - weakUpdatesExt.broadcastUserWeakUpdate(peer.id, update, Some(reduceKey)) + + weakUpdatesExt.broadcastUserWeakUpdate(peer.id, update, reduceKey = Some(reduceKey)) case ApiPeerType.Group ⇒ val update = UpdateTypingStop(ApiPeer(ApiPeerType.Group, peer.id), client.userId, typingType) val reduceKey = weakUpdatesExt.reduceKey(update.header, update.peer) for { - (memberIds, _, _) ← groupExt.getMemberIds(peer.id) - _ ← FutureExt.ftraverse(memberIds filterNot (_ == client.userId))(weakUpdatesExt.broadcastUserWeakUpdate(_, update, Some(reduceKey))) + CanSendMessageInfo(_, isChannel, memberIds, _) ← groupExt.canSendMessage(peer.id, client.userId) + _ ← if (isChannel) + FastFuture.successful(()) + else + FutureExt.ftraverse((memberIds - client.userId).toSeq)(weakUpdatesExt.broadcastUserWeakUpdate(_, update, Some(reduceKey))) } yield () } From f92a7b5c50abcf340326eb00ec241ddddc3b8f3e Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 04:56:34 +0300 Subject: [PATCH 025/253] fix(server:groups): tests, group permissions, let users of plain groups to change group topic --- .../scala/im/actor/server/group/GroupCommandHandlers.scala | 7 +++++-- .../main/scala/im/actor/server/group/GroupProcessor.scala | 3 ++- .../src/main/scala/im/actor/server/group/GroupState.scala | 4 ++-- .../actor/server/api/rpc/service/GroupsServiceSpec.scala | 4 ++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 6b8e259e7c..d07382bcab 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -879,13 +879,16 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } + //TODO: who can update topic??? protected def updateTopic(cmd: UpdateTopic): Unit = { def isValidTopic(topic: Option[String]) = topic.forall(_.length < 255) val topic = trimToEmpty(cmd.topic) - if (!state.permissions.canEditInfo(cmd.clientUserId)) { - sender() ! noPermission + if (state.groupType.isChannel && !state.isAdmin(cmd.clientUserId)) { + sender() ! notAdmin + } else if (state.nonMember(cmd.clientUserId)) { + sender() ! notMember } else if (!isValidTopic(topic)) { sender() ! Status.Failure(TopicTooLong) } else { diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index dbf2f948a3..cea7d2dc66 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -87,7 +87,8 @@ object GroupProcessor { 22016 → classOf[GroupEvents.IntegrationTokenRevoked], 22017 → classOf[GroupEvents.OwnerChanged], 22018 → classOf[GroupEvents.ShortNameUpdated], - 22019 → classOf[GroupEvents.AdminSettingsUpdated] + 22019 → classOf[GroupEvents.AdminSettingsUpdated], + 22020 → classOf[GroupEvents.AdminStatusChanged] ) def persistenceIdFor(groupId: Int): String = s"Group-${groupId}" diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 094895cc55..3404476df4 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -26,8 +26,8 @@ object AdminSettings { val Default = AdminSettings( showAdminsToMembers = true, canMembersInvite = true, - canMembersEditGroupInfo = true, - canAdminsEditGroupInfo = false + canMembersEditGroupInfo = false, + canAdminsEditGroupInfo = true ) // format: OFF diff --git a/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/GroupsServiceSpec.scala b/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/GroupsServiceSpec.scala index 5d070d51ea..2a78c860e4 100644 --- a/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/GroupsServiceSpec.scala +++ b/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/GroupsServiceSpec.scala @@ -703,7 +703,7 @@ final class GroupsServiceSpec } whenReady(service.handleMakeUserAdmin(groupOutPeer, user3OutPeer)(clientData2)) { resp ⇒ - resp shouldEqual Error(CommonRpcErrors.forbidden("Only admin can perform this action.")) + resp shouldEqual Error(GroupRpcErrors.NoPermission) } } @@ -761,7 +761,7 @@ final class GroupsServiceSpec } whenReady(service.handleEditGroupAbout(groupOutPeer, 1L, Some("It is group for fun"), Vector.empty)(clientData2)) { resp ⇒ - resp shouldEqual Error(CommonRpcErrors.forbidden("Only admin can perform this action.")) + resp shouldEqual Error(GroupRpcErrors.NoPermission) } } From a168c343cd56563b4a580988b456473a61139f7d Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 05:59:01 +0300 Subject: [PATCH 026/253] fix(server:groups): don't subscribe to channels onlines, change permissions check for GetIntegrationToken --- .../src/main/protobuf/groupV2.proto | 9 ++++ .../actor/server/group/GroupOperations.scala | 5 +++ .../actor/server/group/GroupProcessor.scala | 3 ++ .../server/group/GroupQueryHandlers.scala | 16 +++++-- .../presences/GroupPresenceManager.scala | 8 ++-- .../rpc/service/groups/GroupRpcErrors.scala | 5 +-- .../sequence/SequenceServiceImpl.scala | 45 ++++++++++++------- .../webhooks/IntegrationsServiceImpl.scala | 7 +-- 8 files changed, 70 insertions(+), 28 deletions(-) diff --git a/actor-server/actor-core/src/main/protobuf/groupV2.proto b/actor-server/actor-core/src/main/protobuf/groupV2.proto index 8ca35e184d..e5c725e071 100644 --- a/actor-server/actor-core/src/main/protobuf/groupV2.proto +++ b/actor-server/actor-core/src/main/protobuf/groupV2.proto @@ -45,6 +45,7 @@ message GroupEnvelope { GroupQueries.GetMembers get_members = 18; // internalGetMembers GroupQueries.LoadMembers load_members = 19; GroupQueries.IsPublic is_public = 20; + GroupQueries.IsChannel is_channel = 31; GroupQueries.IsHistoryShared is_history_shared = 21; GroupQueries.GetApiStruct get_api_struct = 22; GroupQueries.GetApiFullStruct get_api_full_struct = 23; @@ -258,6 +259,14 @@ message GroupQueries { bool is_public = 1; } + message IsChannel { + option (scalapb.message).extends = "GroupQuery"; + } + + message IsChannelResponse { + bool is_channel = 1; + } + message IsHistoryShared { option (scalapb.message).extends = "GroupQuery"; } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala index f905ede15b..627adf3aff 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala @@ -153,6 +153,11 @@ private[group] sealed trait Queries { GroupEnvelope(groupId) .withIsPublic(IsPublic())).mapTo[IsPublicResponse] map (_.isPublic) + def isChannel(groupId: Int): Future[Boolean] = + (viewRegion.ref ? + GroupEnvelope(groupId) + .withIsChannel(IsChannel())).mapTo[IsChannelResponse] map (_.isChannel) + def isHistoryShared(groupId: Int): Future[Boolean] = (viewRegion.ref ? GroupEnvelope(groupId) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index cea7d2dc66..46dc0dea6a 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -71,6 +71,8 @@ object GroupProcessor { 21020 → classOf[GroupQueries.CanSendMessageResponse], 21021 → classOf[GroupQueries.LoadAdminSettings], 21022 → classOf[GroupQueries.LoadAdminSettingsResponse], + 21023 → classOf[GroupQueries.IsChannel], + 21024 → classOf[GroupQueries.IsChannelResponse], 22003 → classOf[GroupEvents.UserInvited], 22004 → classOf[GroupEvents.UserJoined], @@ -168,6 +170,7 @@ private[group] final class GroupProcessor case GetMembers() ⇒ getMembers case LoadMembers(clientUserId, limit, offset) ⇒ loadMembers(clientUserId, limit, offset) case IsPublic() ⇒ isPublic + case IsChannel() ⇒ isChannel case IsHistoryShared() ⇒ isHistoryShared case GetApiStruct(clientUserId) ⇒ getApiStruct(clientUserId) case GetApiFullStruct(clientUserId) ⇒ getApiFullStruct(clientUserId) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index 09ce2d4ccb..f92db7fa2e 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -6,7 +6,7 @@ import akka.stream.scaladsl.Source import com.google.protobuf.ByteString import com.google.protobuf.wrappers.Int32Value import im.actor.api.rpc.groups._ -import im.actor.server.group.GroupErrors.NotOwner +import im.actor.server.group.GroupErrors.{ NoPermission, NotOwner } import im.actor.server.group.GroupQueries._ import im.actor.server.group.GroupType.{ Channel, General, Public } @@ -25,9 +25,14 @@ trait GroupQueryHandlers { protected def getIntegrationToken(optUserId: Option[Int]): Future[GetIntegrationTokenResponse] = { val canViewToken = optUserId.forall(state.isAdmin) - FastFuture.successful(GetIntegrationTokenResponse( - if (canViewToken) state.bot.map(_.token) else None - )) + val allowedToView = optUserId.forall(state.isMember) + if (allowedToView) { + FastFuture.successful(GetIntegrationTokenResponse( + if (canViewToken) state.bot.map(_.token) else None + )) + } else { + FastFuture.failed(NoPermission) + } } //TODO: do something with this method. Will this method used in "client" context. @@ -73,6 +78,9 @@ trait GroupQueryHandlers { protected def isPublic = FastFuture.successful(IsPublicResponse(state.groupType.isPublic)) + protected def isChannel = + FastFuture.successful(IsChannelResponse(state.groupType.isChannel)) + protected def isHistoryShared = FastFuture.successful(IsHistorySharedResponse(state.isHistoryShared)) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/presences/GroupPresenceManager.scala b/actor-server/actor-core/src/main/scala/im/actor/server/presences/GroupPresenceManager.scala index 2d2142d4bc..a785898b13 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/presences/GroupPresenceManager.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/presences/GroupPresenceManager.scala @@ -5,6 +5,7 @@ import akka.cluster.sharding.ShardRegion.Passivate import akka.pattern.pipe import akka.util.Timeout import im.actor.server.db.DbExtension +import im.actor.server.group.GroupExtension import im.actor.server.persist.GroupUserRepo import slick.driver.PostgresDriver.api._ @@ -54,6 +55,7 @@ class GroupPresenceManager extends Actor with ActorLogging with Stash { implicit val timeout = Timeout(5.seconds) private val db: Database = DbExtension(context.system).db + private lazy val groupExt = GroupExtension(context.system) private val presenceExt = PresenceExtension(context.system) private val receiveTimeout = 15.minutes // TODO: configurable @@ -67,8 +69,8 @@ class GroupPresenceManager extends Actor with ActorLogging with Stash { def receive = { case env @ Envelope(groupId, _) ⇒ stash() - db.run(GroupUserRepo.findUserIds(groupId)) - .map(ids ⇒ Initialized(groupId, ids.toSet)) + groupExt.getMemberIds(groupId) + .map { case (ids, _, _) ⇒ Initialized(groupId, ids.toSet) } .pipeTo(self) .onFailure { case e ⇒ @@ -146,4 +148,4 @@ class GroupPresenceManager extends Actor with ActorLogging with Stash { private def deliverState(groupId: Int, consumer: ActorRef): Unit = consumer ! GroupPresenceState(groupId, onlineUserIds.size) -} \ No newline at end of file +} diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala index 8505b3ba81..83e425bab7 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala @@ -1,6 +1,6 @@ package im.actor.server.api.rpc.service.groups -import im.actor.api.rpc.RpcError +import im.actor.api.rpc.{ CommonRpcErrors, RpcError } // format: OFF object GroupRpcErrors { @@ -18,10 +18,9 @@ object GroupRpcErrors { val InvalidInviteToken = RpcError(403, "INVALID_INVITE_TOKEN", "Invalid invite token!", false, None) val InvalidInviteGroup = RpcError(403, "INVALID_INVITE_GROUP", "Invalid group name provided!", false, None) val GroupNotPublic = RpcError(400, "GROUP_IS_NOT_PUBLIC", "The group is not public.", false, None) - val NoPermission = RpcError(403, "NO_PERMISSION", "You have no permission to execute this action", false, None) val InvalidShortName = RpcError(400, "GROUP_SHORT_NAME_INVALID", "Invalid group short name. Valid short name should contain from 5 to 32 characters, and may consist of latin characters, numbers and underscores", false, None) val ShortNameTaken = RpcError(400, "GROUP_SHORT_NAME_TAKEN", "This short name already belongs to other user or group, we are sorry!", false, None) - + val NoPermission = CommonRpcErrors.forbidden("You have no permission to execute this action") } // format: ON diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/sequence/SequenceServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/sequence/SequenceServiceImpl.scala index 96728a2905..4c15592915 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/sequence/SequenceServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/sequence/SequenceServiceImpl.scala @@ -14,6 +14,7 @@ import akka.http.scaladsl.util.FastFuture import im.actor.api.rpc._ import im.actor.api.rpc.misc.{ ResponseSeq, ResponseVoid } import im.actor.api.rpc.peers.{ ApiGroupOutPeer, ApiUserOutPeer } +import im.actor.concurrent.FutureExt import im.actor.server.db.DbExtension import im.actor.server.group.{ GroupExtension, GroupUtils } import im.actor.server.sequence.{ Difference, SeqState, SeqUpdatesExtension } @@ -27,12 +28,14 @@ final class SequenceServiceImpl(config: SequenceServiceConfig)( actorSystem: ActorSystem ) extends SequenceService { import FutureResultRpc._ + import PeerHelpers._ protected override implicit val ec: ExecutionContext = actorSystem.dispatcher private val log = Logging(actorSystem, getClass) private val db: Database = DbExtension(actorSystem).db - private implicit val seqUpdExt: SeqUpdatesExtension = SeqUpdatesExtension(actorSystem) + private val seqUpdExt = SeqUpdatesExtension(actorSystem) + private val groupExt = GroupExtension(actorSystem) private val maxDifferenceSize: Long = config.maxDifferenceSize @@ -135,22 +138,34 @@ final class SequenceServiceImpl(config: SequenceServiceConfig)( } } - override def doHandleSubscribeToGroupOnline(groups: IndexedSeq[ApiGroupOutPeer], clientData: ClientData): Future[HandlerResult[ResponseVoid]] = { - FastFuture.successful(Ok(ResponseVoid)) andThen { - case _ ⇒ - // FIXME: #security check access hashes - sessionRegion.ref ! SessionEnvelope(clientData.authId, clientData.sessionId) - .withSubscribeToGroupOnline(SubscribeToGroupOnline(groups.map(_.groupId))) + override def doHandleSubscribeToGroupOnline(groups: IndexedSeq[ApiGroupOutPeer], clientData: ClientData): Future[HandlerResult[ResponseVoid]] = + withGroupOutPeers(groups) { + FastFuture.successful(Ok(ResponseVoid)) andThen { + case _ ⇒ + getNonChannelsIds(groups) foreach { groupIds ⇒ + sessionRegion.ref ! SessionEnvelope(clientData.authId, clientData.sessionId) + .withSubscribeToGroupOnline(SubscribeToGroupOnline(groupIds)) + } + } } - } - override def doHandleSubscribeFromGroupOnline(groups: IndexedSeq[ApiGroupOutPeer], clientData: ClientData): Future[HandlerResult[ResponseVoid]] = { - FastFuture.successful(Ok(ResponseVoid)) andThen { - case _ ⇒ - // FIXME: #security check access hashes - sessionRegion.ref ! SessionEnvelope(clientData.authId, clientData.sessionId) - .withSubscribeFromGroupOnline(SubscribeFromGroupOnline(groups.map(_.groupId))) + override def doHandleSubscribeFromGroupOnline(groups: IndexedSeq[ApiGroupOutPeer], clientData: ClientData): Future[HandlerResult[ResponseVoid]] = + withGroupOutPeers(groups) { + FastFuture.successful(Ok(ResponseVoid)) andThen { + case _ ⇒ + getNonChannelsIds(groups) foreach { groupIds ⇒ + sessionRegion.ref ! SessionEnvelope(clientData.authId, clientData.sessionId) + .withSubscribeFromGroupOnline(SubscribeFromGroupOnline(groupIds)) + } + + } } + + private def getNonChannelsIds(groups: Seq[ApiGroupOutPeer]): Future[Seq[Int]] = { + FutureExt.ftraverse(groups) { + case ApiGroupOutPeer(groupId, _) ⇒ + groupExt.isChannel(groupId) map (isChannel ⇒ if (isChannel) None else Some(groupId)) + } map (_.flatten) } //TODO: remove @@ -185,7 +200,7 @@ final class SequenceServiceImpl(config: SequenceServiceConfig)( FastFuture.successful((Vector.empty, Vector.empty)) else for { - groups ← Future.sequence(groupIds.toVector map (GroupExtension(actorSystem).getApiStruct(_, client.userId))) + groups ← Future.sequence(groupIds.toVector map (groupExt.getApiStruct(_, client.userId))) // TODO: #perf optimize collection operations allUserIds = userIds ++ groups.foldLeft(Vector.empty[Int]) { (ids, g) ⇒ ids ++ g.members.flatMap(m ⇒ Vector(m.userId, m.inviterUserId)) :+ g.creatorUserId } users ← Future.sequence(allUserIds.toVector map (UserUtils.safeGetUser(_, client.userId, client.authId))) map (_.flatten) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/webhooks/IntegrationsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/webhooks/IntegrationsServiceImpl.scala index cfa1ca5f71..ddaec3d85a 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/webhooks/IntegrationsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/webhooks/IntegrationsServiceImpl.scala @@ -9,7 +9,7 @@ import im.actor.api.rpc.integrations.{ IntegrationsService, ResponseIntegrationT import im.actor.api.rpc.peers.{ ApiOutPeer, ApiPeerType } import im.actor.server.api.rpc.service.webhooks.IntegrationServiceHelpers._ import im.actor.server.db.DbExtension -import im.actor.server.group.GroupErrors.{ NotAMember, NotAdmin } +import im.actor.server.group.GroupErrors.{ NoPermission, NotAMember, NotAdmin } import im.actor.server.group.GroupExtension import slick.driver.PostgresDriver.api._ @@ -55,8 +55,9 @@ class IntegrationsServiceImpl(baseUri: String)(implicit actorSystem: ActorSystem } override def onFailure: PartialFunction[Throwable, RpcError] = { - case NotAdmin ⇒ CommonRpcErrors.forbidden("Only admin can perform this action.") - case NotAMember ⇒ CommonRpcErrors.forbidden("You are not a group member.") + case NotAdmin ⇒ CommonRpcErrors.forbidden("Only admin can perform this action.") + case NotAMember ⇒ CommonRpcErrors.forbidden("You are not a group member.") + case NoPermission ⇒ CommonRpcErrors.forbidden("You have no permission to execute this action") } } From 762392ff12c51be7e7403ee28b2696bbe23874a9 Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 06:02:37 +0300 Subject: [PATCH 027/253] refactor(rpc): remove deprecated PubGroup service --- .../actor/server/persist/GroupUserRepo.scala | 8 -- .../pubgroups/PubgroupsServiceImpl.scala | 46 ------- .../scala/im/actor/server/ActorServer.scala | 5 - .../rpc/service/PubgroupsServiceSpec.scala | 129 ------------------ 4 files changed, 188 deletions(-) delete mode 100644 actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/pubgroups/PubgroupsServiceImpl.scala delete mode 100644 actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/PubgroupsServiceSpec.scala diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/GroupUserRepo.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/GroupUserRepo.scala index f195941789..ad018f0433 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/GroupUserRepo.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/GroupUserRepo.scala @@ -56,14 +56,6 @@ object GroupUserRepo { def find(groupId: Int, userId: Int) = byPKC((groupId, userId)).result.headOption - //TODO: remove - def exists(groupId: Int, userId: Int) = - byPKC.applied((groupId, userId)).exists.result - - //TODO: revisit later - def findUserIds(groupId: Int) = - userIdByGroupIdC(groupId).result - @deprecated("Duplication of event-sourced groups logic", "2016-06-05") def delete(groupId: Int, userId: Int): FixedSqlAction[Int, NoStream, Write] = byPKC.applied((groupId, userId)).delete diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/pubgroups/PubgroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/pubgroups/PubgroupsServiceImpl.scala deleted file mode 100644 index 4a81f7e148..0000000000 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/pubgroups/PubgroupsServiceImpl.scala +++ /dev/null @@ -1,46 +0,0 @@ -package im.actor.server.api.rpc.service.pubgroups - -import im.actor.server.group.GroupUtils -import im.actor.server.persist.{ AvatarDataRepo, GroupRepo, GroupUserRepo } - -import scala.concurrent.{ ExecutionContext, Future } -import akka.actor.ActorSystem -import slick.driver.PostgresDriver.api._ -import im.actor.api.rpc._ -import im.actor.api.rpc.pubgroups.{ ApiPublicGroup, PubgroupsService, ResponseGetPublicGroups } -import im.actor.server.ApiConversions -import im.actor.server.db.DbExtension -import im.actor.server.file.ImageUtils -import im.actor.server.model.Group -import im.actor.server.persist.contact.UserContactRepo - -class PubgroupsServiceImpl(implicit actorSystem: ActorSystem) extends PubgroupsService { - import ApiConversions._ - import ImageUtils._ - - override implicit val ec: ExecutionContext = actorSystem.dispatcher - - override def doHandleGetPublicGroups(clientData: ClientData): Future[HandlerResult[ResponseGetPublicGroups]] = { - authorized(clientData) { implicit client ⇒ - val action = for { - groups ← GroupRepo.findPublic - pubGroupStructs ← DBIO.sequence(groups map (g ⇒ getPubgroupStruct(g, client.userId))) - sorted = pubGroupStructs.sortWith((g1, g2) ⇒ g1.friendsCount >= g2.friendsCount && g1.membersCount >= g2.membersCount) - } yield Ok(ResponseGetPublicGroups(sorted.toVector)) - DbExtension(actorSystem).db.run(action) - } - } - - def getPubgroupStruct(group: Group, userId: Int)(implicit ec: ExecutionContext): DBIO[ApiPublicGroup] = { - for { - membersIds ← GroupUserRepo.findUserIds(group.id) - userContactsIds ← UserContactRepo.findNotDeletedIds(userId) - friendsCount = (membersIds intersect userContactsIds).length - groupAvatarModelOpt ← AvatarDataRepo.findByGroupId(group.id) - } yield { - ApiPublicGroup(group.id, group.accessHash, group.title, membersIds.length, friendsCount, group.about.getOrElse(""), groupAvatarModelOpt map getAvatar) - } - } - -} - diff --git a/actor-server/actor-server-sdk/src/main/scala/im/actor/server/ActorServer.scala b/actor-server/actor-server-sdk/src/main/scala/im/actor/server/ActorServer.scala index 230caa9d38..10a1a5c10b 100644 --- a/actor-server/actor-server-sdk/src/main/scala/im/actor/server/ActorServer.scala +++ b/actor-server/actor-server-sdk/src/main/scala/im/actor/server/ActorServer.scala @@ -22,7 +22,6 @@ import im.actor.server.api.rpc.service.groups.{ GroupInviteConfig, GroupsService import im.actor.server.api.rpc.service.messaging.MessagingServiceImpl import im.actor.server.api.rpc.service.privacy.PrivacyServiceImpl import im.actor.server.api.rpc.service.profile.ProfileServiceImpl -import im.actor.server.api.rpc.service.pubgroups.PubgroupsServiceImpl import im.actor.server.api.rpc.service.push.PushServiceImpl import im.actor.server.api.rpc.service.sequence.{ SequenceServiceConfig, SequenceServiceImpl } import im.actor.server.api.rpc.service.stickers.StickersServiceImpl @@ -195,9 +194,6 @@ final case class ActorServerBuilder(defaultConfig: Config = ConfigFactory.empty( system.log.debug("Starting GroupsService") val groupsService = new GroupsServiceImpl(groupInviteConfig) - system.log.debug("Starting PubgroupsService") - val pubgroupsService = new PubgroupsServiceImpl - system.log.debug("Starting SequenceService") val sequenceService = new SequenceServiceImpl(sequenceConfig) @@ -251,7 +247,6 @@ final case class ActorServerBuilder(defaultConfig: Config = ConfigFactory.empty( contactsService, messagingService, groupsService, - pubgroupsService, sequenceService, weakService, usersService, diff --git a/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/PubgroupsServiceSpec.scala b/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/PubgroupsServiceSpec.scala deleted file mode 100644 index ae1f6ac6a5..0000000000 --- a/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/PubgroupsServiceSpec.scala +++ /dev/null @@ -1,129 +0,0 @@ -package im.actor.server.api.rpc.service - -import im.actor.api.rpc._ -import im.actor.api.rpc.pubgroups.ResponseGetPublicGroups -import im.actor.server._ -import im.actor.server.acl.ACLUtils -import im.actor.server.acl.ACLUtils.userAccessHash -import im.actor.server.api.rpc.service.contacts.ContactsServiceImpl -import im.actor.server.api.rpc.service.groups.{ GroupInviteConfig, GroupsServiceImpl } -import im.actor.server.api.rpc.service.pubgroups.PubgroupsServiceImpl -import im.actor.server.api.rpc.service.sequence.{ SequenceServiceConfig, SequenceServiceImpl } -import org.scalatest.Inside._ - -final class PubgroupsServiceSpec - extends BaseAppSuite - with GroupsServiceHelpers - with MessageParsing - with ImplicitSessionRegion - with ImplicitAuthService { - behavior of "PubgroupsService" - - it should "include number of friends in PubGroup" in pendingUntilFixed(t.e1) - - it should "list all public groups with descrition" in pendingUntilFixed(t.e2) - - it should "sort pubgroups by friends count and members count" in pendingUntilFixed(t.e3) - - it should "show number of members and friends to any non-member" in pendingUntilFixed(t.e4) - - val groupInviteConfig = GroupInviteConfig("http://actor.im") - val sequenceConfig = SequenceServiceConfig.load().toOption.get - - val sequenceService = new SequenceServiceImpl(sequenceConfig) - val messagingService = messaging.MessagingServiceImpl() - implicit val groupService = new GroupsServiceImpl(groupInviteConfig) - val pubGroupService = new PubgroupsServiceImpl - val contactService = new ContactsServiceImpl() - - object t { - val (user1, authId1, authSid1, _) = createUser() - val (user2, _, _, _) = createUser() - val (user3, _, _, _) = createUser() - val (user4, _, _, _) = createUser() - val (user5, _, _, _) = createUser() - val (user6, _, _, _) = createUser() - val (user7, _, _, _) = createUser() - val (user8, authId8, authSid8, _) = createUser() - - val sessionId = createSessionId() - implicit val clientData = ClientData(authId1, sessionId, Some(AuthData(user1.id, authSid1, 42))) - - val descriptions = List("Marvelous group for android developers group", "Group for iOS users", "You know it") - - val androidGroup = createPubGroup("Android group", descriptions(0), Set(user2.id, user4.id)).groupPeer - val iosGroup = createPubGroup("iOS group", descriptions(1), Set(user2.id, user3.id, user4.id, user5.id, user6.id, user7.id)).groupPeer - val scalaGroup = createPubGroup("Scala group", descriptions(2), Set(user2.id, user5.id, user6.id, user7.id, user8.id)).groupPeer - val floodGroup = createPubGroup("Flood group", descriptions(2), Set(user2.id, user3.id, user5.id, user6.id, user7.id)).groupPeer - - def e1() = { - whenReady(contactService.handleAddContact(user2.id, userAccessHash(clientData.authId, user2.id, getUserModel(user2.id).accessSalt)))(_ ⇒ ()) - whenReady(pubGroupService.handleGetPublicGroups()) { resp ⇒ - inside(resp) { - case Ok(ResponseGetPublicGroups(groups)) ⇒ - val group = groups.find(_.id == androidGroup.groupId) - group shouldBe defined - group.get.friendsCount shouldEqual 1 - } - } - - whenReady(contactService.handleAddContact(user3.id, userAccessHash(clientData.authId, user3.id, getUserModel(user3.id).accessSalt)))(_ ⇒ ()) //not in group. should not be in friends - whenReady(contactService.handleAddContact(user4.id, userAccessHash(clientData.authId, user4.id, getUserModel(user4.id).accessSalt)))(_ ⇒ ()) - - whenReady(pubGroupService.handleGetPublicGroups()) { resp ⇒ - inside(resp) { - case Ok(ResponseGetPublicGroups(groups)) ⇒ - val group = groups.find(_.id == androidGroup.groupId) - group shouldBe defined - group.get.friendsCount shouldEqual 2 - } - } - } - - def e2() = { - whenReady(pubGroupService.handleGetPublicGroups()) { resp ⇒ - inside(resp) { - case Ok(ResponseGetPublicGroups(groups)) ⇒ - groups should have length 4 - groups.map(_.description).toSet shouldEqual descriptions.toSet - } - } - } - - def e3() = { - /** - * Sorting according number of friends and members - * ios - friends = 3; members = 7 - * flood - friends = 2; members = 6 - * android - friends = 2; members = 3 - * scala - friends = 1; members = 6 - */ - whenReady(pubGroupService.handleGetPublicGroups()) { resp ⇒ - inside(resp) { - case Ok(ResponseGetPublicGroups(groups)) ⇒ - groups.map(_.id) shouldEqual List(iosGroup, floodGroup, androidGroup, scalaGroup).map(_.groupId) - } - } - } - - def e4() = { - implicit val clientData = ClientData(authId8, sessionId, Some(AuthData(user8.id, authSid8, 42))) - whenReady(contactService.handleAddContact(user2.id, userAccessHash(clientData.authId, user2.id, getUserModel(user2.id).accessSalt)))(_ ⇒ ()) - whenReady(contactService.handleAddContact(user3.id, userAccessHash(clientData.authId, user3.id, getUserModel(user3.id).accessSalt)))(_ ⇒ ()) - whenReady(contactService.handleAddContact(user4.id, userAccessHash(clientData.authId, user4.id, getUserModel(user4.id).accessSalt)))(_ ⇒ ()) - - whenReady(pubGroupService.handleGetPublicGroups()) { resp ⇒ - inside(resp) { - case Ok(ResponseGetPublicGroups(groups)) ⇒ - groups.find(_.id == floodGroup.groupId) foreach { g ⇒ - g.friendsCount shouldEqual 2 - g.membersCount shouldEqual 6 - } - //sorting should be the same as in previous example cause we got same contacts - groups.map(_.id) shouldEqual List(iosGroup, floodGroup, androidGroup, scalaGroup).map(_.groupId) - } - } - } - } - -} From da401a1f62a35b0ba4ed454b6454b905d5d94374 Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 06:18:34 +0300 Subject: [PATCH 028/253] chore(server): update actor.json --- .../actor-core/src/main/actor-api/actor.json | 82 ++++++++++--------- 1 file changed, 45 insertions(+), 37 deletions(-) diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index 7219e2b553..6246ebdfc2 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -19620,7 +19620,7 @@ { "type": "reference", "argument": "keyGroupId", - "category": "hidden", + "category": "full", "description": " Key Group Id" } ], @@ -19644,6 +19644,45 @@ ] } }, + { + "type": "struct", + "content": { + "name": "KeyGroupHolder", + "doc": [ + "Key Group Holder", + { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, + { + "type": "reference", + "argument": "keyGroup", + "category": "full", + "description": " Key Group" + } + ], + "attributes": [ + { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, + { + "type": { + "type": "struct", + "childType": "EncryptionKeyGroup" + }, + "id": 2, + "name": "keyGroup" + } + ] + } + }, { "type": "rpc", "content": { @@ -19653,18 +19692,6 @@ "type": "anonymous", "header": 2664, "doc": [ - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " seq" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " state" - }, { "type": "reference", "argument": "date", @@ -19675,7 +19702,7 @@ "type": "reference", "argument": "obsoleteKeyGroups", "category": "full", - "description": " obsolete key groups" + "description": " obsolete key group ids" }, { "type": "reference", @@ -19685,25 +19712,6 @@ } ], "attributes": [ - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "seq_state" - } - }, - "id": 2, - "name": "state" - }, { "type": { "type": "opt", @@ -19712,7 +19720,7 @@ "childType": "date" } }, - "id": 3, + "id": 1, "name": "date" }, { @@ -19723,7 +19731,7 @@ "childType": "KeyGroupId" } }, - "id": 4, + "id": 2, "name": "obsoleteKeyGroups" }, { @@ -19731,10 +19739,10 @@ "type": "list", "childType": { "type": "struct", - "childType": "KeyGroupId" + "childType": "KeyGroupHolder" } }, - "id": 5, + "id": 3, "name": "missedKeyGroups" } ] From 52b0298563205435e2fa46f4860746da3636afc0 Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 06:24:18 +0300 Subject: [PATCH 029/253] fix(server:rpc): respond with missing key group instead of key group id --- .../im/actor/server/encryption/EncryptionExtension.scala | 9 ++++----- .../rpc/service/encryption/EncryptionServiceImpl.scala | 4 ---- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/encryption/EncryptionExtension.scala b/actor-server/actor-core/src/main/scala/im/actor/server/encryption/EncryptionExtension.scala index 8393bd8db9..3a68237efe 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/encryption/EncryptionExtension.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/encryption/EncryptionExtension.scala @@ -6,7 +6,6 @@ import akka.http.scaladsl.util.FastFuture import cats.std.all._ import cats.syntax.all._ import cats.data.{ Xor, XorT } -import com.google.protobuf.wrappers.Int32Value import im.actor.api.rpc.encryption._ import im.actor.cats.dbio._ import im.actor.server.db.DbExtension @@ -212,8 +211,8 @@ final class EncryptionExtension(system: ActorSystem) extends Extension { def checkBox( box: ApiEncryptedBox, ignoredKeyGroups: Map[Int, Set[Int]] - ): Future[Either[(Vector[ApiKeyGroupId], Vector[ApiKeyGroupId]), Map[Int, Vector[(Long, ApiEncryptedBox)]]]] = { - val userChecksFu: Iterable[Future[(Seq[ApiKeyGroupId], Seq[ApiKeyGroupId], Seq[EncryptionKeyGroup])]] = + ): Future[Either[(Vector[ApiKeyGroupHolder], Vector[ApiKeyGroupId]), Map[Int, Vector[(Long, ApiEncryptedBox)]]]] = { + val userChecksFu: Iterable[Future[(Seq[ApiKeyGroupHolder], Seq[ApiKeyGroupId], Seq[EncryptionKeyGroup])]] = box.keys.groupBy(_.usersId) map { case (userId, keys) ⇒ db.run(EncryptionKeyGroupRepo.fetch(userId)) map { kgs ⇒ @@ -223,7 +222,7 @@ final class EncryptionExtension(system: ActorSystem) extends Extension { val missingKgs = kgs.view .filterNot(kg ⇒ keys.exists(_.keyGroupId == kg.id)) .filterNot(kg ⇒ ignored.contains(kg.id)) - .map(kg ⇒ ApiKeyGroupId(userId, kg.id)) + .flatMap(kg ⇒ toApi(kg).toOption map (ApiKeyGroupHolder(userId, _))) .force // kgs presented in box but deleted by receiver @@ -237,7 +236,7 @@ final class EncryptionExtension(system: ActorSystem) extends Extension { Future.sequence(userChecksFu) map { checks ⇒ val (missing, obs, kgs) = - checks.foldLeft((Vector.empty[ApiKeyGroupId], Vector.empty[ApiKeyGroupId], Vector.empty[EncryptionKeyGroup])) { + checks.foldLeft((Vector.empty[ApiKeyGroupHolder], Vector.empty[ApiKeyGroupId], Vector.empty[EncryptionKeyGroup])) { case ((macc, oacc, kgacc), (m, o, kg)) ⇒ (macc ++ m, oacc ++ o, kgacc ++ kg) } diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/encryption/EncryptionServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/encryption/EncryptionServiceImpl.scala index 37be9d987e..24fe5a5732 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/encryption/EncryptionServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/encryption/EncryptionServiceImpl.scala @@ -121,8 +121,6 @@ final class EncryptionServiceImpl(implicit system: ActorSystem) extends Encrypti encExt.checkBox(encryptedBox, ignoredKeyGroups.groupBy(_.userId).mapValues(_.map(_.keyGroupId).toSet)) flatMap { case Left((missing, obs)) ⇒ FastFuture.successful(Ok(ResponseSendEncryptedPackage( - seq = None, - state = None, date = None, obsoleteKeyGroups = obs, missedKeyGroups = missing @@ -159,8 +157,6 @@ final class EncryptionServiceImpl(implicit system: ActorSystem) extends Encrypti case None ⇒ updExt.deliverClientUpdate(client.userId, client.authId, UpdateEmptyUpdate) } } yield Ok(ResponseSendEncryptedPackage( - seq = Some(seqState.seq), - state = Some(seqState.state.toByteArray), date = Some(date), Vector.empty, Vector.empty From 0cebc0dd15af534590cc54ebdcbe884b1917f9ec Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 07:28:51 +0300 Subject: [PATCH 030/253] fix(server:presence): return back deprecated method --- .../im/actor/server/presences/GroupPresenceManager.scala | 6 ++---- .../main/scala/im/actor/server/persist/GroupUserRepo.scala | 4 ++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/presences/GroupPresenceManager.scala b/actor-server/actor-core/src/main/scala/im/actor/server/presences/GroupPresenceManager.scala index a785898b13..c4041aed4d 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/presences/GroupPresenceManager.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/presences/GroupPresenceManager.scala @@ -5,7 +5,6 @@ import akka.cluster.sharding.ShardRegion.Passivate import akka.pattern.pipe import akka.util.Timeout import im.actor.server.db.DbExtension -import im.actor.server.group.GroupExtension import im.actor.server.persist.GroupUserRepo import slick.driver.PostgresDriver.api._ @@ -55,7 +54,6 @@ class GroupPresenceManager extends Actor with ActorLogging with Stash { implicit val timeout = Timeout(5.seconds) private val db: Database = DbExtension(context.system).db - private lazy val groupExt = GroupExtension(context.system) private val presenceExt = PresenceExtension(context.system) private val receiveTimeout = 15.minutes // TODO: configurable @@ -69,8 +67,8 @@ class GroupPresenceManager extends Actor with ActorLogging with Stash { def receive = { case env @ Envelope(groupId, _) ⇒ stash() - groupExt.getMemberIds(groupId) - .map { case (ids, _, _) ⇒ Initialized(groupId, ids.toSet) } + db.run(GroupUserRepo.findUserIds(groupId)) + .map(ids ⇒ Initialized(groupId, ids.toSet)) .pipeTo(self) .onFailure { case e ⇒ diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/GroupUserRepo.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/GroupUserRepo.scala index ad018f0433..1a828f9827 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/GroupUserRepo.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/GroupUserRepo.scala @@ -52,6 +52,10 @@ object GroupUserRepo { def find(groupId: Int) = byGroupIdC(groupId).result + //TODO: revisit later + def findUserIds(groupId: Int) = + userIdByGroupIdC(groupId).result + @deprecated("Compatibility with old group API, remove when possible", "2016-06-05") def find(groupId: Int, userId: Int) = byPKC((groupId, userId)).result.headOption From 770ced6f7ce1aefe0a7018aa61e490b142b39dc2 Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 14:18:27 +0300 Subject: [PATCH 031/253] fix(server:persist): ignore case for nickname storage --- .../server/names/GlobalNamesStorage.scala | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala b/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala index 261cf44223..a24cc6b529 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala @@ -10,9 +10,9 @@ import slick.dbio._ import scala.concurrent.Future /** - * Stores mapping "Global name" -> "Global name owner(group/user)" - * global name: String - * global name owner: GlobalNameOwner + * Stores mapping "Normalized global name" -> "Global name owner(group/user)" + * normalized global name: String + * global name owner: im.actor.server.names.GlobalNameOwner */ private object GlobalNamesStorage extends SimpleStorage("global_names") @@ -43,7 +43,7 @@ final class GlobalNamesStorageKeyValueStorage(implicit system: ActorSystem) { * Compatible with storing nicknames in `im.actor.server.persist.UserRepo` */ def exists(name: String): Future[Boolean] = { - val existsInKV = conn.run(GlobalNamesStorage.get(name)) map (_.isDefined) + val existsInKV = conn.run(GlobalNamesStorage.get(normalized(name))) map (_.isDefined) existsInKV flatMap { case true ⇒ FastFuture.successful(true) @@ -70,10 +70,9 @@ final class GlobalNamesStorageKeyValueStorage(implicit system: ActorSystem) { */ private def getOwner(name: String): Future[Option[GlobalNameOwner]] = { val optOwner = conn.run( - GlobalNamesStorage.get(name) - ) map { optBytes ⇒ - optBytes map GlobalNameOwner.parseFrom - } + GlobalNamesStorage.get(normalized(name)) + ) map { _ map GlobalNameOwner.parseFrom } + optOwner flatMap { case o @ Some(_) ⇒ FastFuture.successful(o) case None ⇒ db.run(UserRepo.findByNickname(name)) map (_.map(u ⇒ GlobalNameOwner(OwnerType.User, u.id))) @@ -82,17 +81,17 @@ final class GlobalNamesStorageKeyValueStorage(implicit system: ActorSystem) { private def upsert(name: String, owner: GlobalNameOwner): Future[Unit] = conn.run( - GlobalNamesStorage.upsert(name, owner.toByteArray) + GlobalNamesStorage.upsert(normalized(name), owner.toByteArray) ) map (_ ⇒ ()) /** * Compatible with storing nicknames in `im.actor.server.persist.UserRepo` */ private def delete(name: String): Future[Unit] = { - val kvDelete = conn.run(GlobalNamesStorage.delete(name)) + val kvDelete = conn.run(GlobalNamesStorage.delete(normalized(name))) kvDelete flatMap { count ⇒ - if (count > 0) { + if (count == 0) { db.run { for { optUser ← UserRepo.findByNickname(name) @@ -107,4 +106,7 @@ final class GlobalNamesStorageKeyValueStorage(implicit system: ActorSystem) { } } } + + private def normalized(name: String) = name.toLowerCase + } From 364a30dd248da40038b6e9b3f962d3d940bcf60b Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 17:52:01 +0300 Subject: [PATCH 032/253] feat,fix(groups): make group with shared history when short name set; allow group members to change group info by default --- .../actor-core/src/main/protobuf/group.proto | 8 +- .../src/main/protobuf/groupV2.proto | 18 +- .../server/group/AdminCommandHandlers.scala | 322 +++++ .../server/group/GroupCommandHandlers.scala | 1241 +---------------- .../actor/server/group/GroupOperations.scala | 10 +- .../actor/server/group/GroupProcessor.scala | 6 +- .../server/group/GroupQueryHandlers.scala | 17 +- .../im/actor/server/group/GroupState.scala | 48 +- .../server/group/InfoCommandHandlers.scala | 337 +++++ .../server/group/MemberCommandHandlers.scala | 645 +++++++++ .../service/groups/GroupsServiceImpl.scala | 6 +- .../service/search/SearchServiceImpl.scala | 11 +- .../src/main/scala/im/actor/server/Main.scala | 2 +- 13 files changed, 1391 insertions(+), 1280 deletions(-) create mode 100644 actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala create mode 100644 actor-server/actor-core/src/main/scala/im/actor/server/group/InfoCommandHandlers.scala create mode 100644 actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala diff --git a/actor-server/actor-core/src/main/protobuf/group.proto b/actor-server/actor-core/src/main/protobuf/group.proto index cdfc8d94b4..bfc8566ae2 100644 --- a/actor-server/actor-core/src/main/protobuf/group.proto +++ b/actor-server/actor-core/src/main/protobuf/group.proto @@ -12,7 +12,6 @@ import "file.proto"; enum GroupType { General = 1; - Public = 2; Channel = 3; } @@ -149,4 +148,11 @@ message GroupEvents { required int64 ts = 1 [(scalapb.field).type = "java.time.Instant"]; required int32 settings_bit_mask = 2; } + + message HistoryBecameShared { + option (scalapb.message).extends = "im.actor.server.group.GroupEvent"; + + required int64 ts = 1 [(scalapb.field).type = "java.time.Instant"]; + required int32 executor_user_id = 2; + } } diff --git a/actor-server/actor-core/src/main/protobuf/groupV2.proto b/actor-server/actor-core/src/main/protobuf/groupV2.proto index e5c725e071..2f8eaee56c 100644 --- a/actor-server/actor-core/src/main/protobuf/groupV2.proto +++ b/actor-server/actor-core/src/main/protobuf/groupV2.proto @@ -31,7 +31,7 @@ message GroupEnvelope { GroupCommands.UpdateTopic update_topic = 9; GroupCommands.UpdateAbout update_about = 10; GroupCommands.UpdateShortName update_short_name = 27; -// GroupCommands.MakePublic make_public = 11; + GroupCommands.MakeHistoryShared make_history_shared = 32; GroupCommands.RevokeIntegrationToken revoke_token = 12; GroupCommands.MakeUserAdmin make_user_admin = 13; GroupCommands.DismissUserAdmin dismiss_user_admin = 28; @@ -44,7 +44,6 @@ message GroupEnvelope { GroupQueries.GetIntegrationToken get_integration_token = 17; GroupQueries.GetMembers get_members = 18; // internalGetMembers GroupQueries.LoadMembers load_members = 19; - GroupQueries.IsPublic is_public = 20; GroupQueries.IsChannel is_channel = 31; GroupQueries.IsHistoryShared is_history_shared = 21; GroupQueries.GetApiStruct get_api_struct = 22; @@ -198,6 +197,13 @@ message GroupCommands { } message UpdateAdminSettingsAck {} + + message MakeHistoryShared { + option (scalapb.message).extends = "GroupCommand"; + + int32 client_user_id = 1; + int64 client_auth_id = 2; + } } message GroupQueries { @@ -251,14 +257,6 @@ message GroupQueries { google.protobuf.Int32Value bot_id = 3; } - message IsPublic { - option (scalapb.message).extends = "GroupQuery"; - } - - message IsPublicResponse { - bool is_public = 1; - } - message IsChannel { option (scalapb.message).extends = "GroupQuery"; } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala new file mode 100644 index 0000000000..33d1833f89 --- /dev/null +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala @@ -0,0 +1,322 @@ +package im.actor.server.group + +import java.time.Instant + +import akka.actor.Status +import akka.pattern.pipe +import akka.http.scaladsl.util.FastFuture +import im.actor.api.rpc.{ PeersImplicits, Update } +import im.actor.api.rpc.groups._ +import im.actor.concurrent.FutureExt +import im.actor.server.CommonErrors +import im.actor.server.acl.ACLUtils +import im.actor.server.group.GroupCommands.{ DismissUserAdmin, MakeHistoryShared, MakeUserAdmin, RevokeIntegrationToken, RevokeIntegrationTokenAck, TransferOwnership, UpdateAdminSettings, UpdateAdminSettingsAck } +import im.actor.server.group.GroupErrors.{ NotAMember, NotAdmin, UserAlreadyAdmin, UserAlreadyNotAdmin } +import im.actor.server.group.GroupEvents.{ AdminSettingsUpdated, AdminStatusChanged, HistoryBecameShared, IntegrationTokenRevoked, OwnerChanged } +import im.actor.server.persist.{ GroupBotRepo, GroupUserRepo } +import im.actor.server.sequence.{ SeqState, SeqStateDate } + +import scala.concurrent.Future + +private[group] trait AdminCommandHandlers extends GroupsImplicits { + this: GroupProcessor ⇒ + + protected def revokeIntegrationToken(cmd: RevokeIntegrationToken): Unit = { + if (!(state.isAdmin(cmd.clientUserId) || state.isOwner(cmd.clientUserId))) { + sender() ! notAdmin + } else { + val oldToken = state.bot.map(_.token) + val newToken = ACLUtils.accessToken() + + persist(IntegrationTokenRevoked(Instant.now, newToken)) { evt ⇒ + val newState = commit(evt) + + //TODO: remove deprecated + db.run(GroupBotRepo.updateToken(groupId, newToken)) + + val result: Future[RevokeIntegrationTokenAck] = for { + _ ← oldToken match { + case Some(token) ⇒ integrationStorage.deleteToken(token) + case None ⇒ FastFuture.successful(()) + } + _ ← integrationStorage.upsertToken(newToken, groupId) + } yield RevokeIntegrationTokenAck(newToken) + + result pipeTo sender() + } + } + } + + protected def makeUserAdmin(cmd: MakeUserAdmin): Unit = { + if (!state.permissions.canEditAdmins(cmd.clientUserId)) { + sender() ! noPermission + } else if (state.nonMember(cmd.candidateUserId)) { + sender() ! Status.Failure(NotAMember) + } else if (state.isAdmin(cmd.candidateUserId)) { + sender() ! Status.Failure(UserAlreadyAdmin) + } else { + persist(AdminStatusChanged(Instant.now, cmd.candidateUserId, isAdmin = true)) { evt ⇒ + val newState = commit(evt) + + val dateMillis = evt.ts.toEpochMilli + val memberIds = newState.memberIds + val members = newState.members.values.map(_.asStruct).toVector + + val updateAdmin = UpdateGroupMemberAdminChanged(groupId, cmd.candidateUserId, isAdmin = true) + val updateMembers = UpdateGroupMembersUpdated(groupId, members) + // now this user is admin, change edit rules for admins + val updateCanEdit = UpdateGroupCanEditInfoChanged(groupId, canEditGroup = newState.adminSettings.canAdminsEditGroupInfo) + + val updateObsolete = UpdateGroupMembersUpdateObsolete(groupId, members) + + //TODO: remove deprecated + db.run(GroupUserRepo.makeAdmin(groupId, cmd.candidateUserId)) + + val adminGROUPUpdates: Future[SeqStateDate] = + for { + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = memberIds + cmd.clientUserId, + updateAdmin + ) + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + memberIds - cmd.clientUserId, + updateMembers + ) + } yield SeqStateDate(seq, state, dateMillis) + + val adminCHANNELUpdates: Future[SeqStateDate] = + for { + // push admin changed to all + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = memberIds + cmd.clientUserId, + updateAdmin + ) + // push changed members to admins and fresh admin + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + (newState.adminIds - cmd.clientUserId) + cmd.candidateUserId, + updateMembers + ) + } yield SeqStateDate(seq, state, dateMillis) + + val result: Future[(Vector[ApiMember], SeqStateDate)] = for { + + /////////////////////////// + // Groups V1 API updates // + /////////////////////////// + + _ ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + memberIds - cmd.clientUserId, + updateObsolete + ) + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// + _ ← seqUpdExt.deliverUserUpdate( + userId = cmd.candidateUserId, + update = updateCanEdit + ) + seqStateDate ← if (state.groupType.isChannel) adminCHANNELUpdates else adminGROUPUpdates + + } yield (members, seqStateDate) + + result pipeTo sender() + } + } + } + + protected def dismissUserAdmin(cmd: DismissUserAdmin): Unit = { + if (!state.permissions.canEditAdmins(cmd.clientUserId)) { + sender() ! noPermission + } else if (state.nonMember(cmd.targetUserId)) { + sender() ! Status.Failure(NotAMember) + } else if (!state.isAdmin(cmd.targetUserId)) { + sender() ! Status.Failure(UserAlreadyNotAdmin) + } else { + persist(AdminStatusChanged(Instant.now, cmd.targetUserId, isAdmin = false)) { evt ⇒ + val newState = commit(evt) + + val dateMillis = evt.ts.toEpochMilli + val memberIds = newState.memberIds + val members = newState.members.values.map(_.asStruct).toVector + + val updateAdmin = UpdateGroupMemberAdminChanged(groupId, cmd.targetUserId, isAdmin = false) + val updateMembers = UpdateGroupMembersUpdated(groupId, members) + // now this user is not admin, change edit rules to plain members + val updateCanEdit = UpdateGroupCanEditInfoChanged(groupId, canEditGroup = newState.adminSettings.canMembersEditGroupInfo) + + val updateObsolete = UpdateGroupMembersUpdateObsolete(groupId, members) + + //TODO: remove deprecated + db.run(GroupUserRepo.dismissAdmin(groupId, cmd.targetUserId)) + + val adminGROUPUpdates: Future[SeqState] = + for { + // push admin changed to all + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = memberIds + cmd.clientUserId, + updateAdmin + ) + // push changed members to all users + seqState ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + memberIds - cmd.clientUserId, + updateMembers + ) + } yield seqState + + val adminCHANNELUpdates: Future[SeqState] = + for { + // push admin changed to all + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = memberIds + cmd.clientUserId, + updateAdmin + ) + // push changed members to admins and fresh admin + seqState ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + newState.adminIds - cmd.clientUserId, + updateMembers + ) + } yield seqState + + val result: Future[SeqState] = for { + + /////////////////////////// + // Groups V1 API updates // + /////////////////////////// + + _ ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + memberIds - cmd.clientUserId, + updateObsolete + ) + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// + _ ← seqUpdExt.deliverUserUpdate( + userId = cmd.targetUserId, + update = updateCanEdit + ) + seqState ← if (state.groupType.isChannel) adminCHANNELUpdates else adminGROUPUpdates + + } yield seqState + + result pipeTo sender() + } + } + } + + protected def transferOwnership(cmd: TransferOwnership): Unit = { + if (!state.isOwner(cmd.clientUserId)) { + sender() ! Status.Failure(CommonErrors.Forbidden) + } else { + persist(OwnerChanged(Instant.now, cmd.newOwnerId)) { evt ⇒ + val newState = commit(evt) + val memberIds = newState.memberIds + + val result: Future[SeqState] = for { + seqState ← seqUpdExt.broadcastClientUpdate( + userId = cmd.clientUserId, + authId = cmd.clientAuthId, + bcastUserIds = memberIds - cmd.clientUserId, + update = UpdateGroupOwnerChanged(groupId, cmd.newOwnerId), + pushRules = seqUpdExt.pushRules(isFat = false, None) + ) + } yield seqState + + result pipeTo sender() + } + } + } + + protected def updateAdminSettings(cmd: UpdateAdminSettings): Unit = { + if (!state.permissions.canEditAdminSettings(cmd.clientUserId)) { + sender() ! Status.Failure(NotAdmin) + } else { + val settOld = state.adminSettings + + persist(AdminSettingsUpdated(Instant.now, cmd.settingsBitMask)) { evt ⇒ + val newState = commit(evt) + val settNew = newState.adminSettings + + val (membersUpdates, adminsUpdates) = { + // push to all members except admins and owner + val showAdminToMembers = PartialFunction.condOpt(settOld.showAdminsToMembers != settNew.showAdminsToMembers) { + case true ⇒ UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = settNew.showAdminsToMembers) + } + + // push to all members except admins and owner + val canMembersInvite = PartialFunction.condOpt(settOld.canMembersInvite != settNew.canMembersInvite) { + case true ⇒ UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = settNew.canMembersInvite) + } + + // push to all members except admins and owner + val canMembersEditGroupInfo = PartialFunction.condOpt(settOld.canMembersEditGroupInfo != settNew.canMembersEditGroupInfo) { + case true ⇒ UpdateGroupCanEditInfoChanged(groupId, canEditGroup = settNew.canMembersEditGroupInfo) + } + + // push to admins only + val canAdminsEditGroupInfo = PartialFunction.condOpt(settOld.canAdminsEditGroupInfo != settNew.canAdminsEditGroupInfo) { + case true ⇒ UpdateGroupCanEditInfoChanged(groupId, canEditGroup = settNew.canAdminsEditGroupInfo) + } + + ( + List(showAdminToMembers, canMembersInvite, canMembersEditGroupInfo).flatten[Update], + List(canAdminsEditGroupInfo).flatten[Update] + ) + } + + val plainMemberIds = (newState.memberIds - newState.ownerUserId) -- newState.adminIds + val adminsOnlyIds = newState.adminIds - newState.ownerUserId + + val result: Future[UpdateAdminSettingsAck] = for { + // deliver updates about settings changed to plain group members + _ ← FutureExt.ftraverse(membersUpdates) { update ⇒ + seqUpdExt.broadcastPeopleUpdate(userIds = plainMemberIds, update) + } + // deliver updates about settings changed to plain group members + _ ← FutureExt.ftraverse(membersUpdates) { update ⇒ + seqUpdExt.broadcastPeopleUpdate(userIds = adminsOnlyIds, update) + } + } yield UpdateAdminSettingsAck() + + result pipeTo sender() + } + } + } + + protected def makeHistoryShared(cmd: MakeHistoryShared): Unit = { + if (!state.permissions.canMakeHistoryShared(cmd.clientUserId)) { + sender() ! noPermission + } else { + persist(HistoryBecameShared(Instant.now, cmd.clientUserId)) { evt ⇒ + val newState = commit(evt) + + val memberIds = newState.memberIds + + val result: Future[SeqState] = for { + seqState ← seqUpdExt.broadcastClientUpdate( + userId = cmd.clientUserId, + authId = cmd.clientAuthId, + bcastUserIds = memberIds - cmd.clientUserId, + update = UpdateGroupHistoryShared(groupId) + ) + } yield seqState + + result pipeTo sender() + } + } + } + +} diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index d07382bcab..86fd4d7541 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -1,41 +1,36 @@ package im.actor.server.group -import java.time.{ Instant, LocalDateTime, ZoneOffset } +import java.time.Instant import akka.actor.Status import akka.http.scaladsl.util.FastFuture import akka.pattern.pipe -import im.actor.api.rpc.Update -import im.actor.api.rpc.files.ApiAvatar import im.actor.api.rpc.groups._ -import im.actor.api.rpc.messaging.{ ApiServiceMessage, UpdateMessage } import im.actor.api.rpc.users.ApiSex import im.actor.concurrent.FutureExt -import im.actor.server.CommonErrors import im.actor.server.acl.ACLUtils import im.actor.server.dialog.UserAcl -import im.actor.server.file.{ Avatar, ImageUtils } +import im.actor.server.group.GroupCommands._ import im.actor.server.group.GroupErrors._ import im.actor.server.group.GroupEvents._ -import im.actor.server.group.GroupCommands._ -import im.actor.server.model.{ AvatarData, Group } -import im.actor.server.names.{ GlobalNameOwner, OwnerType } -import im.actor.server.persist.{ AvatarDataRepo, GroupBotRepo, GroupInviteTokenRepo, GroupRepo, GroupUserRepo } -import im.actor.server.sequence.{ Optimization, SeqState, SeqStateDate } +import im.actor.server.model.Group +import im.actor.server.persist.{ GroupBotRepo, GroupRepo, GroupUserRepo } +import im.actor.server.sequence.Optimization import im.actor.util.ThreadLocalSecureRandom -import im.actor.util.misc.{ IdUtils, StringUtils } +import im.actor.util.misc.IdUtils import scala.concurrent.Future -//TODO: spit into MemberCommandHandlers - InfoCommandHandlers - AdminCommandHandlers -private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { +private[group] trait GroupCommandHandlers + extends MemberCommandHandlers + with InfoCommandHandlers + with AdminCommandHandlers + with UserAcl { this: GroupProcessor ⇒ - import im.actor.server.ApiConversions._ - - private val notMember = Status.Failure(NotAMember) - private val notAdmin = Status.Failure(NotAdmin) - private val noPermission = Status.Failure(NoPermission) + protected val notMember = Status.Failure(NotAMember) + protected val notAdmin = Status.Failure(NotAdmin) + protected val noPermission = Status.Failure(NoPermission) protected def create(cmd: Create): Unit = { if (!isValidTitle(cmd.title)) { @@ -64,8 +59,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { integrationStorage = new IntegrationTokensKeyValueStorage // Group creation - val groupType = GroupType.fromValue(cmd.typ) //FIXME: make it normal enum - val isHistoryShared = groupType.isChannel || groupType.isPublic + val groupType = GroupType.fromValue(cmd.typ) persist(Created( ts = createdAt, @@ -76,7 +70,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { title = cmd.title, userIds = Seq(cmd.creatorUserId), // only creator user becomes group member. all other users are invited via Invite message isHidden = Some(false), - isHistoryShared = Some(isHistoryShared), + isHistoryShared = Some(groupType.isChannel), extensions = Seq.empty )) { evt ⇒ val newState = commit(evt) @@ -101,7 +95,7 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { creatorUserId = newState.creatorUserId, accessHash = newState.accessHash, title = newState.title, - isPublic = isHistoryShared, + isPublic = false, createdAt = evt.ts, about = None, topic = None @@ -169,1205 +163,6 @@ private[group] trait GroupCommandHandlers extends GroupsImplicits with UserAcl { } } - protected def invite(cmd: Invite): Unit = { - if (!state.permissions.canInvitePeople(cmd.inviterUserId)) { - sender() ! noPermission - } else if (state.isInvited(cmd.inviteeUserId)) { - sender() ! Status.Failure(GroupErrors.UserAlreadyInvited) - } else if (state.isMember(cmd.inviteeUserId)) { - sender() ! Status.Failure(GroupErrors.UserAlreadyJoined) - } else { - val inviteeIsExUser = state.isExUser(cmd.inviteeUserId) - - persist(UserInvited(Instant.now, cmd.inviteeUserId, cmd.inviterUserId)) { evt ⇒ - val newState = commit(evt) - - val dateMillis = evt.ts.toEpochMilli - val memberIds = newState.memberIds - val apiMembers = newState.members.values.map(_.asStruct).toVector - - // if user ever been in this group - we should push these updates, - val inviteeUpdatesNew: List[Update] = refreshGroupUpdates(newState, cmd.inviteeUserId) - - val membersUpdateNew: Update = - if (newState.groupType.isChannel) // if channel, or group is big enough - UpdateGroupMembersCountChanged(groupId, newState.membersCount) - else - UpdateGroupMembersUpdated(groupId, apiMembers) - - val inviteeUpdateObsolete = UpdateGroupInviteObsolete( - groupId, - inviteUserId = cmd.inviterUserId, - date = dateMillis, - randomId = cmd.randomId - ) - - val membersUpdateObsolete = UpdateGroupUserInvitedObsolete( - groupId, - userId = cmd.inviteeUserId, - inviterUserId = cmd.inviterUserId, - date = dateMillis, - randomId = cmd.randomId - ) - val serviceMessage = GroupServiceMessages.userInvited(cmd.inviteeUserId) - - //TODO: remove deprecated - db.run(GroupUserRepo.create(groupId, cmd.inviteeUserId, cmd.inviterUserId, evt.ts, None, isAdmin = false)) - - def inviteGROUPUpdates: Future[SeqStateDate] = - for { - // push updated members list to inviteeUserId, - // make it `FatSeqUpdate` if this user invited to group for first time. - _ ← seqUpdExt.deliverUserUpdate( - userId = cmd.inviteeUserId, - membersUpdateNew, - pushRules = seqUpdExt.pushRules(isFat = !inviteeIsExUser, Some(PushTexts.Invited)), - deliveryId = s"invite_${groupId}_${cmd.randomId}" - ) - - // push all "refresh group" updates to inviteeUserId - _ ← FutureExt.ftraverse(inviteeUpdatesNew) { update ⇒ - seqUpdExt.deliverUserUpdate(userId = cmd.inviteeUserId, update) - } - - // push updated members list to all group members except inviteeUserId - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - userId = cmd.inviterUserId, - authId = cmd.inviterAuthId, - bcastUserIds = (memberIds - cmd.inviterUserId) - cmd.inviteeUserId, - update = membersUpdateNew, - deliveryId = s"useradded_${groupId}_${cmd.randomId}" - ) - - // explicitly send service message - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - cmd.inviterUserId, - cmd.inviterAuthId, - cmd.randomId, - serviceMessage, - deliveryTag = Some(Optimization.GroupV2) - ) - } yield SeqStateDate(seq, state, date) - - def inviteCHANNELUpdates: Future[SeqStateDate] = - for { - // push updated members count to inviteeUserId - _ ← seqUpdExt.deliverUserUpdate( - userId = cmd.inviteeUserId, - membersUpdateNew, - pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.Invited)), - deliveryId = s"invite_${groupId}_${cmd.randomId}" - ) - - // push all "refresh group" updates to inviteeUserId - _ ← FutureExt.ftraverse(inviteeUpdatesNew) { update ⇒ - seqUpdExt.deliverUserUpdate(userId = cmd.inviteeUserId, update) - } - - // push updated members count to all group members - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - userId = cmd.inviterUserId, - authId = cmd.inviterAuthId, - bcastUserIds = (memberIds - cmd.inviterUserId) - cmd.inviteeUserId, - update = membersUpdateNew, - deliveryId = s"useradded_${groupId}_${cmd.randomId}" - ) - - // push service message to invitee - _ ← seqUpdExt.deliverUserUpdate( - userId = cmd.inviteeUserId, - update = serviceMessageUpdate( - cmd.inviterUserId, - dateMillis, - cmd.randomId, - serviceMessage - ), - deliveryTag = Some(Optimization.GroupV2) - ) - } yield SeqStateDate(seq, state, dateMillis) - - val result: Future[SeqStateDate] = for { - /////////////////////////// - // Groups V1 API updates // - /////////////////////////// - - // push "Invited" to invitee - _ ← seqUpdExt.deliverUserUpdate( - userId = cmd.inviteeUserId, - inviteeUpdateObsolete, - pushRules = seqUpdExt.pushRules(isFat = true, Some(PushTexts.Invited)), - deliveryId = s"invite_obsolete_${groupId}_${cmd.randomId}" - ) - - // push "User added" to all group members except for `inviterUserId` - _ ← seqUpdExt.broadcastPeopleUpdate( - (memberIds - cmd.inviteeUserId) - cmd.inviterUserId, // is it right? - membersUpdateObsolete, - pushRules = seqUpdExt.pushRules(isFat = true, Some(PushTexts.Added)), - deliveryId = s"useradded_obsolete_${groupId}_${cmd.randomId}" - ) - - // push "User added" to `inviterUserId` - _ ← seqUpdExt.deliverClientUpdate( - cmd.inviterUserId, - cmd.inviterAuthId, - membersUpdateObsolete, - pushRules = seqUpdExt.pushRules(isFat = true, None), - deliveryId = s"useradded_obsolete_${groupId}_${cmd.randomId}" - ) - - /////////////////////////// - // Groups V2 API updates // - /////////////////////////// - - seqStateDate ← if (newState.groupType.isChannel) inviteCHANNELUpdates else inviteGROUPUpdates - - } yield seqStateDate - - result pipeTo sender() - } - } - } - - /** - * User can join - * • after invite(was invited by other user previously). In this case he already have group on devices - * • via invite link. In this case he doesn't have group, and we need to deliver it. - */ - protected def join(cmd: Join): Unit = { - // user is already a member, and should not complete invitation process - if (state.isMember(cmd.joiningUserId) && !state.isInvited(cmd.joiningUserId)) { - sender() ! Status.Failure(GroupErrors.UserAlreadyJoined) - } else { - // user was invited in group by other group user - val wasInvited = state.isInvited(cmd.joiningUserId) - - // trying to figure out who invited joining user. - // Descdending priority: - // • inviter defined in `Join` command (when invited via token) - // • inviter from members list (when invited by other user) - // • group creator (safe fallback) - val optMember = state.members.get(cmd.joiningUserId) - val inviterUserId = cmd.invitingUserId - .orElse(optMember.map(_.inviterUserId)) - .getOrElse(state.creatorUserId) - - persist(UserJoined(Instant.now, cmd.joiningUserId, inviterUserId)) { evt ⇒ - val newState = commit(evt) - - val date = evt.ts - val dateMillis = date.toEpochMilli - val memberIds = newState.memberIds - val apiMembers = newState.members.values.map(_.asStruct).toVector - val randomId = ACLUtils.randomLong() - - // If user was never invited to group - he don't have group on devices, - // that means we need to push all group-info related updates - // - // If user was invited to group by other member - we don't need to push group updates, - // cause they we pushed already on invite step - val joiningUserUpdatesNew: List[Update] = - if (wasInvited) List.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId) - - val membersUpdateNew: Update = - if (newState.groupType.isChannel) // if channel, or group is big enough - UpdateGroupMembersCountChanged(groupId, newState.membersCount) - else - UpdateGroupMembersUpdated(groupId, apiMembers) // will update date when member got into group - - val membersUpdateObsolete = UpdateGroupMembersUpdateObsolete(groupId, apiMembers) - - val serviceMessage = GroupServiceMessages.userJoined - - //TODO: remove deprecated - db.run(GroupUserRepo.create( - groupId, - userId = cmd.joiningUserId, - inviterUserId = inviterUserId, - invitedAt = optMember.map(_.invitedAt).getOrElse(date), - joinedAt = Some(LocalDateTime.now(ZoneOffset.UTC)), - isAdmin = false - )) - - def joinGROUPUpdates: Future[SeqStateDate] = - for { - // push all group updates to joiningUserId - _ ← FutureExt.ftraverse(joiningUserUpdatesNew) { update ⇒ - seqUpdExt.deliverUserUpdate(userId = cmd.joiningUserId, update) - } - - // push updated members list to joining user, - // make it `FatSeqUpdate` if this user invited to group for first time. - // TODO???: isFat = !wasInvited - is it correct? - SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( - userId = cmd.joiningUserId, - authId = cmd.joiningUserAuthId, - update = membersUpdateNew, - pushRules = seqUpdExt.pushRules(isFat = !wasInvited, None), //!wasInvited means that user came for first time here - deliveryId = s"join_${groupId}_${randomId}" - - ) - - // push updated members list to all group members except joiningUserId - _ ← seqUpdExt.broadcastPeopleUpdate( - memberIds - cmd.joiningUserId, - membersUpdateNew, - deliveryId = s"userjoined_${groupId}_${randomId}" - ) - - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - senderUserId = cmd.joiningUserId, - senderAuthId = cmd.joiningUserAuthId, - randomId = randomId, - serviceMessage // no delivery tag. This updated handled this way in Groups V1 - ) - } yield SeqStateDate(seq, state, date) - - def joinCHANNELUpdates: Future[SeqStateDate] = - for { - // push all group updates to joiningUserId - _ ← FutureExt.ftraverse(joiningUserUpdatesNew) { update ⇒ - seqUpdExt.deliverUserUpdate(userId = cmd.joiningUserId, update) - } - - // push updated members count to joining user - SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( - userId = cmd.joiningUserId, - authId = cmd.joiningUserAuthId, - update = membersUpdateNew, - deliveryId = s"join_${groupId}_${randomId}" - ) - - // push updated members count to all group members except joining user - _ ← seqUpdExt.broadcastPeopleUpdate( - memberIds - cmd.joiningUserId, - membersUpdateNew, - deliveryId = s"userjoined_${groupId}_${randomId}" - ) - } yield SeqStateDate(seq, state, dateMillis) - - val result: Future[(SeqStateDate, Vector[Int], Long)] = - for { - /////////////////////////// - // Groups V1 API updates // - /////////////////////////// - - // push update about members to all users, except joining user - _ ← seqUpdExt.broadcastPeopleUpdate( - memberIds - cmd.joiningUserId, - membersUpdateObsolete, - pushRules = seqUpdExt.pushRules(isFat = true, None), - deliveryId = s"userjoined_obsolete_${groupId}_${randomId}" - ) - - /////////////////////////// - // Groups V2 API updates // - /////////////////////////// - - seqStateDate ← if (newState.groupType.isChannel) joinCHANNELUpdates else joinGROUPUpdates - - } yield (seqStateDate, memberIds.toVector :+ inviterUserId, randomId) - - result pipeTo sender() - } - } - } - - /** - * This case handled in other manner, so we change state in the end - * cause user that left, should send service message. And we don't allow non-members - * to send message. So we keep him as member until message sent, and remove him from members - */ - protected def leave(cmd: Leave): Unit = { - if (state.nonMember(cmd.userId)) { - sender() ! notMember - } else { - persist(UserLeft(Instant.now, cmd.userId)) { evt ⇒ - // no commit here. it will be after service message sent - - val dateMillis = evt.ts.toEpochMilli - - val updateObsolete = UpdateGroupUserLeaveObsolete(groupId, cmd.userId, dateMillis, cmd.randomId) - - // TODO: merge, they are almost identical - val leftUserUpdatesNew = - if (state.groupType.isChannel) List( - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), - UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), - UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), - UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), - UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) - ) - else List( - UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), - UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), - UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), - UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), - UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupMembersUpdated(groupId, members = Vector.empty), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) - ) - - val membersUpdateNew = - if (state.groupType.isChannel) { // if channel, or group is big enough - UpdateGroupMembersCountChanged( - groupId, - membersCount = state.membersCount - 1 - ) - } else { - UpdateGroupMembersUpdated( - groupId, - members = state.members.filterNot(_._1 == cmd.userId).values.map(_.asStruct).toVector - ) - } - - val serviceMessage = GroupServiceMessages.userLeft - - //TODO: remove deprecated. GroupInviteTokenRepo don't have replacement yet. - db.run( - for { - _ ← GroupUserRepo.delete(groupId, cmd.userId) - _ ← GroupInviteTokenRepo.revoke(groupId, cmd.userId) - } yield () - ) - - val leaveGROUPUpdates: Future[SeqStateDate] = - for { - // push updated members list to all group members - _ ← seqUpdExt.broadcastPeopleUpdate( - state.memberIds - cmd.userId, - membersUpdateNew - ) - - // send service message - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - senderUserId = cmd.userId, - senderAuthId = cmd.authId, - randomId = cmd.randomId, - message = serviceMessage, - deliveryTag = Some(Optimization.GroupV2) - ) - - // push left user that he is no longer a member - SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( - userId = cmd.userId, - authId = cmd.authId, - update = UpdateGroupMemberChanged(groupId, isMember = false) - ) - - // push left user updates - // • with empty group members - // • that he can't view and invite members - _ ← FutureExt.ftraverse(leftUserUpdatesNew) { update ⇒ - seqUpdExt.deliverUserUpdate(userId = cmd.userId, update) - } - } yield SeqStateDate(seq, state, date) - - val leaveCHANNELUpdates: Future[SeqStateDate] = - for { - // push updated members count to all group members - _ ← seqUpdExt.broadcastPeopleUpdate( - state.memberIds - cmd.userId, - membersUpdateNew - ) - - // push left user that he is no longer a member - SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( - userId = cmd.userId, - authId = cmd.authId, - update = UpdateGroupMemberChanged(groupId, isMember = false) - ) - - // push left user updates that he has no group rights - _ ← FutureExt.ftraverse(leftUserUpdatesNew) { update ⇒ - seqUpdExt.deliverUserUpdate(userId = cmd.userId, update) - } - } yield SeqStateDate(seq, state, dateMillis) - - // read this dialog by user that leaves group. don't wait for ack - dialogExt.messageRead(apiGroupPeer, cmd.userId, 0L, dateMillis) - val result: Future[SeqStateDate] = for { - - /////////////////////////// - // Groups V1 API updates // - /////////////////////////// - - _ ← seqUpdExt.broadcastClientUpdate( - userId = cmd.userId, - authId = cmd.authId, - bcastUserIds = state.memberIds + cmd.userId, // push this to other user's devices too. actually cmd.userId is still in state.memberIds - update = updateObsolete, - pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.Left), Seq(cmd.authId)) - ) - - /////////////////////////// - // Groups V2 API updates // - /////////////////////////// - - seqStateDate ← if (state.groupType.isChannel) leaveCHANNELUpdates else leaveGROUPUpdates - - } yield seqStateDate - - result andThen { case _ ⇒ commit(evt) } pipeTo sender() - } - } - } - - protected def kick(cmd: Kick): Unit = { - if (!state.permissions.canKickMember(cmd.kickerUserId)) { - sender() ! noPermission - } else if (state.nonMember(cmd.kickedUserId)) { - sender() ! notMember - } else { - persist(UserKicked(Instant.now, cmd.kickedUserId, cmd.kickerUserId)) { evt ⇒ - val newState = commit(evt) - - val dateMillis = evt.ts.toEpochMilli - - val updateObsolete = UpdateGroupUserKickObsolete(groupId, cmd.kickedUserId, cmd.kickerUserId, dateMillis, cmd.randomId) - - // TODO: merge, they are almost identical - val kickedUserUpdatesNew: List[Update] = - if (state.groupType.isChannel) List( - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), - UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), - UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), - UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), - UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), - UpdateGroupMemberChanged(groupId, isMember = false) - ) - else List( - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), - UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), - UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), - UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), - UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), - UpdateGroupMembersUpdated(groupId, members = Vector.empty), - UpdateGroupMemberChanged(groupId, isMember = false) - ) - - val membersUpdateNew: Update = - if (newState.groupType.isChannel) { // if channel, or group is big enough - UpdateGroupMembersCountChanged( - groupId, - membersCount = newState.membersCount - ) - } else { - UpdateGroupMembersUpdated( - groupId, - members = newState.members.values.map(_.asStruct).toVector - ) - } - - val serviceMessage = GroupServiceMessages.userKicked(cmd.kickedUserId) - - //TODO: remove deprecated. GroupInviteTokenRepo don't have replacement yet. - db.run( - for { - _ ← GroupUserRepo.delete(groupId, cmd.kickedUserId) - _ ← GroupInviteTokenRepo.revoke(groupId, cmd.kickedUserId) - } yield () - ) - - val kickGROUPUpdates: Future[SeqStateDate] = - for { - // push updated members list to all group members. Don't push to kicked user! - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - userId = cmd.kickerUserId, - authId = cmd.kickerAuthId, - bcastUserIds = newState.memberIds - cmd.kickerUserId, - update = membersUpdateNew - ) - - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - senderUserId = cmd.kickerUserId, - senderAuthId = cmd.kickerAuthId, - randomId = cmd.randomId, - message = serviceMessage, - deliveryTag = Some(Optimization.GroupV2) - ) - - // push kicked user updates - // • with empty group members - // • that he is no longer a member of group - // • that he can't view and invite members - _ ← FutureExt.ftraverse(kickedUserUpdatesNew) { update ⇒ - seqUpdExt.deliverUserUpdate(userId = cmd.kickedUserId, update) - } - } yield SeqStateDate(seq, state, date) - - val kickCHANNELUpdates: Future[SeqStateDate] = - for { - // push updated members count to all group members. Don't push to kicked user! - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - userId = cmd.kickerUserId, - authId = cmd.kickerAuthId, - bcastUserIds = newState.memberIds - cmd.kickerUserId, - update = membersUpdateNew - ) - - // push service message to kicker and kicked users. - _ ← seqUpdExt.broadcastPeopleUpdate( - userIds = Set(cmd.kickedUserId, cmd.kickerUserId), - update = serviceMessageUpdate( - cmd.kickerUserId, - dateMillis, - cmd.randomId, - serviceMessage - ), - deliveryTag = Some(Optimization.GroupV2) - ) - - // push kicked user updates that he has no group rights - _ ← FutureExt.ftraverse(kickedUserUpdatesNew) { update ⇒ - seqUpdExt.deliverUserUpdate(userId = cmd.kickedUserId, update) - } - } yield SeqStateDate(seq, state, dateMillis) - - // read this dialog by kicked user. don't wait for ack - dialogExt.messageRead(apiGroupPeer, cmd.kickedUserId, 0L, dateMillis) - val result: Future[SeqStateDate] = for { - /////////////////////////// - // Groups V1 API updates // - /////////////////////////// - - _ ← seqUpdExt.broadcastClientUpdate( - userId = cmd.kickerUserId, - authId = cmd.kickerAuthId, - bcastUserIds = newState.memberIds, - update = updateObsolete, - pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.Kicked), Seq(cmd.kickerAuthId)) - ) - - /////////////////////////// - // Groups V2 API updates // - /////////////////////////// - - seqStateDate ← if (state.groupType.isChannel) kickCHANNELUpdates else kickGROUPUpdates - - } yield seqStateDate - - result pipeTo sender() - } - } - } - - protected def updateAvatar(cmd: UpdateAvatar): Unit = { - if (!state.permissions.canEditInfo(cmd.clientUserId)) { - sender() ! noPermission - } else { - persist(AvatarUpdated(Instant.now, cmd.avatar)) { evt ⇒ - val newState = commit(evt) - - val dateMillis = evt.ts.toEpochMilli - val apiAvatar: Option[ApiAvatar] = cmd.avatar - val memberIds = newState.memberIds - - val updateNew = UpdateGroupAvatarChanged(groupId, apiAvatar) - val updateObsolete = UpdateGroupAvatarChangedObsolete(groupId, cmd.clientUserId, apiAvatar, dateMillis, cmd.randomId) - val serviceMessage = GroupServiceMessages.changedAvatar(apiAvatar) - - db.run(AvatarDataRepo.createOrUpdate(getAvatarData(cmd.avatar))) - val result: Future[UpdateAvatarAck] = for { - /////////////////////////// - // Groups V1 API updates // - /////////////////////////// - - _ ← seqUpdExt.broadcastClientUpdate(cmd.clientUserId, cmd.clientAuthId, memberIds, updateObsolete) - - /////////////////////////// - // Groups V2 API updates // - /////////////////////////// - - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - userId = cmd.clientUserId, - authId = cmd.clientAuthId, - bcastUserIds = memberIds - cmd.clientUserId, - update = updateNew - ) - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - senderUserId = cmd.clientUserId, - senderAuthId = cmd.clientAuthId, - randomId = cmd.randomId, - message = serviceMessage, - deliveryTag = Some(Optimization.GroupV2) - ) - } yield UpdateAvatarAck(apiAvatar).withSeqStateDate(SeqStateDate(seq, state, date)) - - result pipeTo sender() - } - } - } - - protected def updateTitle(cmd: UpdateTitle): Unit = { - val title = cmd.title - if (!state.permissions.canEditInfo(cmd.clientUserId)) { - sender() ! noPermission - } else if (!isValidTitle(title)) { - sender() ! Status.Failure(InvalidTitle) - } else { - persist(TitleUpdated(Instant.now(), title)) { evt ⇒ - val newState = commit(evt) - - val dateMillis = evt.ts.toEpochMilli - val memberIds = newState.memberIds - - val updateNew = UpdateGroupTitleChanged(groupId, title) - val updateObsolete = UpdateGroupTitleChangedObsolete( - groupId, - userId = cmd.clientUserId, - title = title, - date = dateMillis, - randomId = cmd.randomId - ) - val serviceMessage = GroupServiceMessages.changedTitle(title) - val pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.TitleChanged)) - - //TODO: remove deprecated - db.run(GroupRepo.updateTitle(groupId, title, cmd.clientUserId, cmd.randomId, date = evt.ts)) - - val result: Future[SeqStateDate] = for { - - /////////////////////////// - // Groups V1 API updates // - /////////////////////////// - - _ ← seqUpdExt.broadcastClientUpdate( - cmd.clientUserId, - cmd.clientAuthId, - memberIds - cmd.clientUserId, - updateObsolete, - pushRules - ) - - /////////////////////////// - // Groups V2 API updates // - /////////////////////////// - - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - userId = cmd.clientUserId, - authId = cmd.clientAuthId, - bcastUserIds = memberIds - cmd.clientUserId, - update = updateNew, - pushRules = pushRules - ) - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - senderUserId = cmd.clientUserId, - senderAuthId = cmd.clientAuthId, - randomId = cmd.randomId, - message = serviceMessage, - deliveryTag = Some(Optimization.GroupV2) - ) - } yield SeqStateDate(seq, state, date) - - result pipeTo sender() - } - - } - } - - //TODO: who can update topic??? - protected def updateTopic(cmd: UpdateTopic): Unit = { - def isValidTopic(topic: Option[String]) = topic.forall(_.length < 255) - - val topic = trimToEmpty(cmd.topic) - - if (state.groupType.isChannel && !state.isAdmin(cmd.clientUserId)) { - sender() ! notAdmin - } else if (state.nonMember(cmd.clientUserId)) { - sender() ! notMember - } else if (!isValidTopic(topic)) { - sender() ! Status.Failure(TopicTooLong) - } else { - persist(TopicUpdated(Instant.now, topic)) { evt ⇒ - val newState = commit(evt) - - val dateMillis = evt.ts.toEpochMilli - val memberIds = newState.memberIds - - val updateNew = UpdateGroupTopicChanged(groupId, topic) - val updateObsolete = UpdateGroupTopicChangedObsolete( - groupId, - randomId = cmd.randomId, - userId = cmd.clientUserId, - topic = topic, - date = dateMillis - ) - val serviceMessage = GroupServiceMessages.changedTopic(topic) - val pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.TopicChanged)) - - //TODO: remove deprecated - db.run(GroupRepo.updateTopic(groupId, topic)) - - val result: Future[SeqStateDate] = for { - - /////////////////////////// - // Groups V1 API updates // - /////////////////////////// - - _ ← seqUpdExt.broadcastClientUpdate( - cmd.clientUserId, - cmd.clientAuthId, - memberIds - cmd.clientUserId, - updateObsolete, - pushRules - ) - - /////////////////////////// - // Groups V2 API updates // - /////////////////////////// - - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - userId = cmd.clientUserId, - authId = cmd.clientAuthId, - bcastUserIds = memberIds - cmd.clientUserId, - update = updateNew, - pushRules = pushRules - ) - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - senderUserId = cmd.clientUserId, - senderAuthId = cmd.clientAuthId, - randomId = cmd.randomId, - message = serviceMessage, - deliveryTag = Some(Optimization.GroupV2) - ) - } yield SeqStateDate(seq, state, date) - - result pipeTo sender() - } - } - } - - protected def updateAbout(cmd: UpdateAbout): Unit = { - def isValidAbout(about: Option[String]) = about.forall(_.length < 255) - - val about = trimToEmpty(cmd.about) - - if (!state.permissions.canEditInfo(cmd.clientUserId)) { - sender() ! noPermission - } else if (!isValidAbout(about)) { - sender() ! Status.Failure(AboutTooLong) - } else { - - persist(AboutUpdated(Instant.now, about)) { evt ⇒ - val newState = commit(evt) - - val memberIds = newState.memberIds - - val updateNew = UpdateGroupAboutChanged(groupId, about) - val updateObsolete = UpdateGroupAboutChangedObsolete(groupId, about) - val serviceMessage = GroupServiceMessages.changedAbout(about) - val pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.TopicChanged)) - - //TODO: remove deprecated - db.run(GroupRepo.updateAbout(groupId, about)) - - val result: Future[SeqStateDate] = for { - - /////////////////////////// - // Groups V1 API updates // - /////////////////////////// - - _ ← seqUpdExt.broadcastClientUpdate( - cmd.clientUserId, - cmd.clientAuthId, - memberIds - cmd.clientUserId, - updateObsolete, - pushRules - ) - - /////////////////////////// - // Groups V2 API updates // - /////////////////////////// - - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - userId = cmd.clientUserId, - authId = cmd.clientAuthId, - bcastUserIds = memberIds - cmd.clientUserId, - update = updateNew, - pushRules = pushRules - ) - } yield SeqStateDate(seq, state, evt.ts.toEpochMilli) - - result pipeTo sender() - } - } - } - - protected def updateShortName(cmd: UpdateShortName): Unit = { - def isValidShortName(shortName: Option[String]) = shortName forall StringUtils.validGlobalName - - val oldShortName = state.shortName - val newShortName = trimToEmpty(cmd.shortName) - - if (!state.permissions.canEditShortName(cmd.clientUserId)) { - sender() ! Status.Failure(NotOwner) - } else if (!isValidShortName(newShortName)) { - sender() ! Status.Failure(InvalidShortName) - } else if (oldShortName == newShortName) { - seqUpdExt.getSeqState(cmd.clientUserId, cmd.clientAuthId) pipeTo sender() - } else { - val replyTo = sender() - - val existsFu = newShortName map { name ⇒ - globalNamesStorage.exists(name) - } getOrElse FastFuture.successful(false) - - //TODO: timeout for this - onSuccess(existsFu) { exists ⇒ - if (exists) { - replyTo ! Status.Failure(ShortNameTaken) - } else { - persist(ShortNameUpdated(Instant.now, newShortName)) { evt ⇒ - val newState = commit(evt) - - val memberIds = newState.memberIds - - val result: Future[SeqState] = for { - _ ← globalNamesStorage.updateOrRemove( - oldShortName, - newShortName, - GlobalNameOwner(OwnerType.Group, groupId) - ) - seqState ← seqUpdExt.broadcastClientUpdate( - userId = cmd.clientUserId, - authId = cmd.clientAuthId, - bcastUserIds = memberIds - cmd.clientUserId, - update = UpdateGroupShortNameChanged(groupId, newShortName) - ) - } yield seqState - - result pipeTo replyTo - } - } - } - } - } - - protected def revokeIntegrationToken(cmd: RevokeIntegrationToken): Unit = { - if (!(state.isAdmin(cmd.clientUserId) || state.isOwner(cmd.clientUserId))) { - sender() ! notAdmin - } else { - val oldToken = state.bot.map(_.token) - val newToken = ACLUtils.accessToken() - - persist(IntegrationTokenRevoked(Instant.now, newToken)) { evt ⇒ - val newState = commit(evt) - - //TODO: remove deprecated - db.run(GroupBotRepo.updateToken(groupId, newToken)) - - val result: Future[RevokeIntegrationTokenAck] = for { - _ ← oldToken match { - case Some(token) ⇒ integrationStorage.deleteToken(token) - case None ⇒ FastFuture.successful(()) - } - _ ← integrationStorage.upsertToken(newToken, groupId) - } yield RevokeIntegrationTokenAck(newToken) - - result pipeTo sender() - } - } - } - - protected def makeUserAdmin(cmd: MakeUserAdmin): Unit = { - if (!state.permissions.canEditAdmins(cmd.clientUserId)) { - sender() ! noPermission - } else if (state.nonMember(cmd.candidateUserId)) { - sender() ! Status.Failure(NotAMember) - } else if (state.isAdmin(cmd.candidateUserId)) { - sender() ! Status.Failure(UserAlreadyAdmin) - } else { - persist(AdminStatusChanged(Instant.now, cmd.candidateUserId, isAdmin = true)) { evt ⇒ - val newState = commit(evt) - - val dateMillis = evt.ts.toEpochMilli - val memberIds = newState.memberIds - val members = newState.members.values.map(_.asStruct).toVector - - val updateAdmin = UpdateGroupMemberAdminChanged(groupId, cmd.candidateUserId, isAdmin = true) - val updateMembers = UpdateGroupMembersUpdated(groupId, members) - // now this user is admin, change edit rules for admins - val updateCanEdit = UpdateGroupCanEditInfoChanged(groupId, canEditGroup = newState.adminSettings.canAdminsEditGroupInfo) - - val updateObsolete = UpdateGroupMembersUpdateObsolete(groupId, members) - - //TODO: remove deprecated - db.run(GroupUserRepo.makeAdmin(groupId, cmd.candidateUserId)) - - val adminGROUPUpdates: Future[SeqStateDate] = - for { - _ ← seqUpdExt.broadcastPeopleUpdate( - userIds = memberIds + cmd.clientUserId, - updateAdmin - ) - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - cmd.clientUserId, - cmd.clientAuthId, - memberIds - cmd.clientUserId, - updateMembers - ) - } yield SeqStateDate(seq, state, dateMillis) - - val adminCHANNELUpdates: Future[SeqStateDate] = - for { - // push admin changed to all - _ ← seqUpdExt.broadcastPeopleUpdate( - userIds = memberIds + cmd.clientUserId, - updateAdmin - ) - // push changed members to admins and fresh admin - SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( - cmd.clientUserId, - cmd.clientAuthId, - (newState.adminIds - cmd.clientUserId) + cmd.candidateUserId, - updateMembers - ) - } yield SeqStateDate(seq, state, dateMillis) - - val result: Future[(Vector[ApiMember], SeqStateDate)] = for { - - /////////////////////////// - // Groups V1 API updates // - /////////////////////////// - - _ ← seqUpdExt.broadcastClientUpdate( - cmd.clientUserId, - cmd.clientAuthId, - memberIds - cmd.clientUserId, - updateObsolete - ) - - /////////////////////////// - // Groups V2 API updates // - /////////////////////////// - _ ← seqUpdExt.deliverUserUpdate( - userId = cmd.candidateUserId, - update = updateCanEdit - ) - seqStateDate ← if (state.groupType.isChannel) adminCHANNELUpdates else adminGROUPUpdates - - } yield (members, seqStateDate) - - result pipeTo sender() - } - } - } - - protected def dismissUserAdmin(cmd: DismissUserAdmin): Unit = { - if (!state.permissions.canEditAdmins(cmd.clientUserId)) { - sender() ! noPermission - } else if (state.nonMember(cmd.targetUserId)) { - sender() ! Status.Failure(NotAMember) - } else if (!state.isAdmin(cmd.targetUserId)) { - sender() ! Status.Failure(UserAlreadyNotAdmin) - } else { - persist(AdminStatusChanged(Instant.now, cmd.targetUserId, isAdmin = false)) { evt ⇒ - val newState = commit(evt) - - val dateMillis = evt.ts.toEpochMilli - val memberIds = newState.memberIds - val members = newState.members.values.map(_.asStruct).toVector - - val updateAdmin = UpdateGroupMemberAdminChanged(groupId, cmd.targetUserId, isAdmin = false) - val updateMembers = UpdateGroupMembersUpdated(groupId, members) - // now this user is not admin, change edit rules to plain members - val updateCanEdit = UpdateGroupCanEditInfoChanged(groupId, canEditGroup = newState.adminSettings.canMembersEditGroupInfo) - - val updateObsolete = UpdateGroupMembersUpdateObsolete(groupId, members) - - //TODO: remove deprecated - db.run(GroupUserRepo.dismissAdmin(groupId, cmd.targetUserId)) - - val adminGROUPUpdates: Future[SeqState] = - for { - // push admin changed to all - _ ← seqUpdExt.broadcastPeopleUpdate( - userIds = memberIds + cmd.clientUserId, - updateAdmin - ) - // push changed members to all users - seqState ← seqUpdExt.broadcastClientUpdate( - cmd.clientUserId, - cmd.clientAuthId, - memberIds - cmd.clientUserId, - updateMembers - ) - } yield seqState - - val adminCHANNELUpdates: Future[SeqState] = - for { - // push admin changed to all - _ ← seqUpdExt.broadcastPeopleUpdate( - userIds = memberIds + cmd.clientUserId, - updateAdmin - ) - // push changed members to admins and fresh admin - seqState ← seqUpdExt.broadcastClientUpdate( - cmd.clientUserId, - cmd.clientAuthId, - newState.adminIds - cmd.clientUserId, - updateMembers - ) - } yield seqState - - val result: Future[SeqState] = for { - - /////////////////////////// - // Groups V1 API updates // - /////////////////////////// - - _ ← seqUpdExt.broadcastClientUpdate( - cmd.clientUserId, - cmd.clientAuthId, - memberIds - cmd.clientUserId, - updateObsolete - ) - - /////////////////////////// - // Groups V2 API updates // - /////////////////////////// - _ ← seqUpdExt.deliverUserUpdate( - userId = cmd.targetUserId, - update = updateCanEdit - ) - seqState ← if (state.groupType.isChannel) adminCHANNELUpdates else adminGROUPUpdates - - } yield seqState - - result pipeTo sender() - } - } - } - - protected def transferOwnership(cmd: TransferOwnership): Unit = { - if (!state.isOwner(cmd.clientUserId)) { - sender() ! Status.Failure(CommonErrors.Forbidden) - } else { - persist(OwnerChanged(Instant.now, cmd.newOwnerId)) { evt ⇒ - val newState = commit(evt) - val memberIds = newState.memberIds - - val result: Future[SeqState] = for { - seqState ← seqUpdExt.broadcastClientUpdate( - userId = cmd.clientUserId, - authId = cmd.clientAuthId, - bcastUserIds = memberIds - cmd.clientUserId, - update = UpdateGroupOwnerChanged(groupId, cmd.newOwnerId), - pushRules = seqUpdExt.pushRules(isFat = false, None) - ) - } yield seqState - - result pipeTo sender() - } - } - } - - protected def updateAdminSettings(cmd: UpdateAdminSettings): Unit = { - if (!state.permissions.canEditAdminSettings(cmd.clientUserId)) { - sender() ! Status.Failure(NotAdmin) - } else { - val settOld = state.adminSettings - - persist(AdminSettingsUpdated(Instant.now, cmd.settingsBitMask)) { evt ⇒ - val newState = commit(evt) - val settNew = newState.adminSettings - - val (membersUpdates, adminsUpdates) = { - // push to all members except admins and owner - val showAdminToMembers = PartialFunction.condOpt(settOld.showAdminsToMembers != settNew.showAdminsToMembers) { - case true ⇒ UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = settNew.showAdminsToMembers) - } - - // push to all members except admins and owner - val canMembersInvite = PartialFunction.condOpt(settOld.canMembersInvite != settNew.canMembersInvite) { - case true ⇒ UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = settNew.canMembersInvite) - } - - // push to all members except admins and owner - val canMembersEditGroupInfo = PartialFunction.condOpt(settOld.canMembersEditGroupInfo != settNew.canMembersEditGroupInfo) { - case true ⇒ UpdateGroupCanEditInfoChanged(groupId, canEditGroup = settNew.canMembersEditGroupInfo) - } - - // push to admins only - val canAdminsEditGroupInfo = PartialFunction.condOpt(settOld.canAdminsEditGroupInfo != settNew.canAdminsEditGroupInfo) { - case true ⇒ UpdateGroupCanEditInfoChanged(groupId, canEditGroup = settNew.canAdminsEditGroupInfo) - } - - ( - List(showAdminToMembers, canMembersInvite, canMembersEditGroupInfo).flatten[Update], - List(canAdminsEditGroupInfo).flatten[Update] - ) - } - - val plainMemberIds = (newState.memberIds - newState.ownerUserId) -- newState.adminIds - val adminsOnlyIds = newState.adminIds - newState.ownerUserId - - val result: Future[UpdateAdminSettingsAck] = for { - // deliver updates about settings changed to plain group members - _ ← FutureExt.ftraverse(membersUpdates) { update ⇒ - seqUpdExt.broadcastPeopleUpdate(userIds = plainMemberIds, update) - } - // deliver updates about settings changed to plain group members - _ ← FutureExt.ftraverse(membersUpdates) { update ⇒ - seqUpdExt.broadcastPeopleUpdate(userIds = adminsOnlyIds, update) - } - } yield UpdateAdminSettingsAck() - - result pipeTo sender() - } - } - } - - private def serviceMessageUpdate(senderUserId: Int, date: Long, randomId: Long, message: ApiServiceMessage) = - UpdateMessage( - peer = apiGroupPeer, - senderUserId = senderUserId, - date = date, - randomId = randomId, - message = message, - attributes = None, - quotedMessage = None - ) - - private def trimToEmpty(s: Option[String]): Option[String] = - s map (_.trim) filter (_.nonEmpty) - - private def getAvatarData(avatar: Option[Avatar]): AvatarData = - avatar - .map(ImageUtils.getAvatarData(AvatarData.OfGroup, groupId, _)) - .getOrElse(AvatarData.empty(AvatarData.OfGroup, groupId.toLong)) - - private def isValidTitle(title: String) = title.nonEmpty && title.length < 255 - - // Updates that will be sent to user, when he enters group. - // Helps clients that have this group to refresh it's data. - // TODO: review when channels will be added - private def refreshGroupUpdates(newState: GroupState, userId: Int): List[Update] = List( - UpdateGroupMemberChanged(groupId, isMember = true), - UpdateGroupAboutChanged(groupId, newState.about), - UpdateGroupAvatarChanged(groupId, newState.avatar), - UpdateGroupTopicChanged(groupId, newState.topic), - UpdateGroupTitleChanged(groupId, newState.title), - UpdateGroupOwnerChanged(groupId, newState.ownerUserId), - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = newState.permissions.canViewMembers(userId)), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = true) // TODO: figure out right value - // UpdateGroupExtChanged(groupId, newState.extension) //TODO: figure out and fix - // if(bigGroup) UpdateGroupMembersCountChanged(groupId, newState.extension) - ) + protected def isValidTitle(title: String) = title.nonEmpty && title.length < 255 } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala index 627adf3aff..f9cca5f8c7 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala @@ -117,6 +117,11 @@ private[group] sealed trait Commands extends UserAcl { GroupEnvelope(groupId) .withUpdateAdminSettings(UpdateAdminSettings(clientUserId, AdminSettings.apiToBitMask(settings)))).mapTo[UpdateAdminSettingsAck] map (_ ⇒ ()) + def makeHistoryShared(groupId: Int, clientUserId: Int, clientAuthId: Long): Future[SeqState] = + (processorRegion.ref ? + GroupEnvelope(groupId) + .withMakeHistoryShared(MakeHistoryShared(clientUserId, clientAuthId))).mapTo[SeqState] + } private[group] sealed trait Queries { @@ -148,11 +153,6 @@ private[group] sealed trait Queries { GroupEnvelope(groupId) .withGetApiFullStruct(GetApiFullStruct(clientUserId))).mapTo[GetApiFullStructResponse] map (_.struct) - def isPublic(groupId: Int): Future[Boolean] = - (viewRegion.ref ? - GroupEnvelope(groupId) - .withIsPublic(IsPublic())).mapTo[IsPublicResponse] map (_.isPublic) - def isChannel(groupId: Int): Future[Boolean] = (viewRegion.ref ? GroupEnvelope(groupId) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index 46dc0dea6a..fc7b92117d 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -11,7 +11,7 @@ import im.actor.serialization.ActorSerializer import im.actor.server.cqrs.{ Processor, TaggedEvent } import im.actor.server.db.DbExtension import im.actor.server.dialog.{ DialogEnvelope, DialogExtension } -import im.actor.server.group.GroupErrors.{ GroupIdAlreadyExists, GroupNotFound } +import im.actor.server.group.GroupErrors._ import im.actor.server.group.GroupCommands._ import im.actor.server.group.GroupQueries._ import im.actor.server.names.GlobalNamesStorageKeyValueStorage @@ -58,8 +58,6 @@ object GroupProcessor { 21006 → classOf[GroupQueries.GetMembersResponse], 21007 → classOf[GroupQueries.GetApiStruct], 21008 → classOf[GroupQueries.GetApiStructResponse], - 21009 → classOf[GroupQueries.IsPublic], - 21010 → classOf[GroupQueries.IsPublicResponse], 21012 → classOf[GroupQueries.GetAccessHash], 21013 → classOf[GroupQueries.GetAccessHashResponse], 21014 → classOf[GroupQueries.IsHistoryShared], @@ -145,6 +143,7 @@ private[group] final class GroupProcessor case d: DismissUserAdmin ⇒ dismissUserAdmin(d) case t: TransferOwnership ⇒ transferOwnership(t) case s: UpdateAdminSettings ⇒ updateAdminSettings(s) + case m: MakeHistoryShared ⇒ makeHistoryShared(m) // termination actions case StopProcessor ⇒ context stop self @@ -169,7 +168,6 @@ private[group] final class GroupProcessor case GetIntegrationToken(optClient) ⇒ getIntegrationToken(optClient) case GetMembers() ⇒ getMembers case LoadMembers(clientUserId, limit, offset) ⇒ loadMembers(clientUserId, limit, offset) - case IsPublic() ⇒ isPublic case IsChannel() ⇒ isChannel case IsHistoryShared() ⇒ isHistoryShared case GetApiStruct(clientUserId) ⇒ getApiStruct(clientUserId) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index f92db7fa2e..534134b0e7 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -8,7 +8,7 @@ import com.google.protobuf.wrappers.Int32Value import im.actor.api.rpc.groups._ import im.actor.server.group.GroupErrors.{ NoPermission, NotOwner } import im.actor.server.group.GroupQueries._ -import im.actor.server.group.GroupType.{ Channel, General, Public } +import im.actor.server.group.GroupType.{ Channel, General, Unrecognized } import scala.concurrent.Future @@ -68,16 +68,13 @@ trait GroupQueryHandlers { } state.groupType match { - case General | Public ⇒ load + case General ⇒ load case Channel ⇒ if (state.isAdmin(clientUserId)) load else FastFuture.successful(LoadMembersResponse(Seq.empty, offsetBs)) } } - protected def isPublic = - FastFuture.successful(IsPublicResponse(state.groupType.isPublic)) - protected def isChannel = FastFuture.successful(IsChannelResponse(state.groupType.isChannel)) @@ -108,8 +105,8 @@ trait GroupQueryHandlers { ext = None, membersCount = Some(count), groupType = Some(state.groupType match { - case GroupType.Channel ⇒ ApiGroupType.CHANNEL - case GroupType.General | GroupType.Public | GroupType.Unrecognized(_) ⇒ ApiGroupType.GROUP + case Channel ⇒ ApiGroupType.CHANNEL + case General | Unrecognized(_) ⇒ ApiGroupType.GROUP }), canSendMessage = Some(state.permissions.canSendMessage(clientUserId)) ) @@ -150,8 +147,8 @@ trait GroupQueryHandlers { FastFuture.successful { val canSend = state.bot.exists(_.userId == clientUserId) || { state.groupType match { - case General | Public ⇒ state.isMember(clientUserId) - case Channel ⇒ state.isAdmin(clientUserId) + case General ⇒ state.isMember(clientUserId) + case Channel ⇒ state.isAdmin(clientUserId) } } CanSendMessageResponse( @@ -196,7 +193,7 @@ trait GroupQueryHandlers { if (state.isMember(clientUserId)) { state.groupType match { - case General | Public ⇒ + case General ⇒ apiMembers → group.membersCount case Channel ⇒ if (state.isAdmin(clientUserId)) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 3404476df4..80b6fb0da0 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -8,7 +8,7 @@ import im.actor.api.rpc.misc.ApiExtension import im.actor.server.cqrs.{ Event, ProcessorState } import im.actor.server.file.Avatar import im.actor.server.group.GroupEvents._ -import im.actor.server.group.GroupType.{ Channel, General, Public } +import im.actor.server.group.GroupType.{ Channel, General } private[group] final case class Member( userId: Int, @@ -23,9 +23,16 @@ private[group] final case class Bot( ) object AdminSettings { - val Default = AdminSettings( + val PlainDefault = AdminSettings( showAdminsToMembers = true, canMembersInvite = true, + canMembersEditGroupInfo = true, + canAdminsEditGroupInfo = true + ) + + val ChannelsDefault = AdminSettings( + showAdminsToMembers = false, + canMembersInvite = false, canMembersEditGroupInfo = false, canAdminsEditGroupInfo = true ) @@ -79,7 +86,7 @@ private[group] object GroupState { members = Map.empty, invitedUserIds = Set.empty, accessHash = 0L, - adminSettings = AdminSettings.Default, + adminSettings = AdminSettings.PlainDefault, bot = None, //??? @@ -141,16 +148,17 @@ private[group] final case class GroupState( val isCreated = createdAt.nonEmpty + //TODO: add on commit(not during recovery!) hook to make group with async members, when more than 100 def isAsyncMembers = groupType match { - case General | Public ⇒ members.size > 100 - case Channel ⇒ true + case General ⇒ members.size > 100 + case Channel ⇒ true } def getShowableOwner(clientUserId: Int): Option[Int] = groupType match { - case General | Public ⇒ Some(creatorUserId) - case Channel ⇒ if (isAdmin(clientUserId)) Some(creatorUserId) else None + case General ⇒ Some(creatorUserId) + case Channel ⇒ if (isAdmin(clientUserId)) Some(creatorUserId) else None } override def updated(e: Event): GroupState = e match { @@ -164,6 +172,7 @@ private[group] final case class GroupState( about = None, avatar = None, topic = None, + shortName = None, groupType = evt.typ.getOrElse(GroupType.General), isHidden = evt.isHidden getOrElse false, isHistoryShared = evt.isHistoryShared getOrElse false, @@ -180,6 +189,9 @@ private[group] final case class GroupState( ).toMap, invitedUserIds = evt.userIds.filterNot(_ == evt.creatorUserId).toSet, accessHash = evt.accessHash, + adminSettings = + if (groupType.isChannel) AdminSettings.ChannelsDefault + else AdminSettings.PlainDefault, bot = None, extensions = (evt.extensions map { //TODO: validate is it right? case ApiExtension(extId, data) ⇒ @@ -230,11 +242,6 @@ private[group] final case class GroupState( this.copy(avatar = newAvatar) case TitleUpdated(_, newTitle) ⇒ this.copy(title = newTitle) - case BecamePublic(_) ⇒ - this.copy( - groupType = GroupType.Public, - isHistoryShared = true - ) case AboutUpdated(_, newAbout) ⇒ this.copy(about = newAbout) case TopicUpdated(_, newTopic) ⇒ @@ -253,12 +260,16 @@ private[group] final case class GroupState( this.copy(shortName = newShortName) case AdminSettingsUpdated(_, bitMask) ⇒ this.copy(adminSettings = AdminSettings.fromBitMask(bitMask)) + case HistoryBecameShared(_, _) ⇒ + this.copy(isHistoryShared = true) - // deprecated event + // deprecated events case UserBecameAdmin(_, userId, _) ⇒ this.copy( members = members.updated(userId, members(userId).copy(isAdmin = true)) ) + case BecamePublic(_) ⇒ + this.copy(isHistoryShared = true) } // TODO: real snapshot @@ -274,8 +285,8 @@ private[group] final case class GroupState( def canSendMessage(clientUserId: Int) = { groupType match { - case General | Public ⇒ isMember(clientUserId) - case Channel ⇒ isAdmin(clientUserId) || isOwner(clientUserId) + case General ⇒ isMember(clientUserId) + case Channel ⇒ isAdmin(clientUserId) || isOwner(clientUserId) } } || bot.exists(_.userId == clientUserId) @@ -285,8 +296,8 @@ private[group] final case class GroupState( */ def canViewMembers(clientUserId: Int) = groupType match { - case General | Public ⇒ isMember(clientUserId) - case Channel ⇒ isAdmin(clientUserId) || isOwner(clientUserId) + case General ⇒ isMember(clientUserId) + case Channel ⇒ isAdmin(clientUserId) || isOwner(clientUserId) } /** @@ -317,6 +328,9 @@ private[group] final case class GroupState( // only owner can change short name def canEditShortName(clientUserId: Int): Boolean = isOwner(clientUserId) + // only owner can make history shared + def canMakeHistoryShared(clientUserId: Int): Boolean = isOwner(clientUserId) + // only owner and other admins can edit admins list def canEditAdmins(clientUserId: Int): Boolean = isOwner(clientUserId) || isAdmin(clientUserId) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/InfoCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/InfoCommandHandlers.scala new file mode 100644 index 0000000000..7072283b75 --- /dev/null +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/InfoCommandHandlers.scala @@ -0,0 +1,337 @@ +package im.actor.server.group + +import java.time.Instant + +import akka.actor.Status +import akka.pattern.pipe +import akka.http.scaladsl.util.FastFuture +import im.actor.api.rpc.files.ApiAvatar +import im.actor.api.rpc.groups._ +import im.actor.server.file.{ Avatar, ImageUtils } +import im.actor.server.group.GroupCommands.{ MakeHistoryShared, UpdateAbout, UpdateAvatar, UpdateAvatarAck, UpdateShortName, UpdateTitle, UpdateTopic } +import im.actor.server.group.GroupErrors._ +import im.actor.server.group.GroupEvents.{ AboutUpdated, AvatarUpdated, ShortNameUpdated, TitleUpdated, TopicUpdated } +import im.actor.server.model.AvatarData +import im.actor.server.names.{ GlobalNameOwner, OwnerType } +import im.actor.server.persist.{ AvatarDataRepo, GroupRepo } +import im.actor.server.sequence.{ Optimization, SeqState, SeqStateDate } +import im.actor.util.misc.StringUtils + +import scala.concurrent.Future + +private[group] trait InfoCommandHandlers { + this: GroupProcessor ⇒ + + import im.actor.server.ApiConversions._ + + protected def updateAvatar(cmd: UpdateAvatar): Unit = { + if (!state.permissions.canEditInfo(cmd.clientUserId)) { + sender() ! noPermission + } else { + persist(AvatarUpdated(Instant.now, cmd.avatar)) { evt ⇒ + val newState = commit(evt) + + val dateMillis = evt.ts.toEpochMilli + val apiAvatar: Option[ApiAvatar] = cmd.avatar + val memberIds = newState.memberIds + + val updateNew = UpdateGroupAvatarChanged(groupId, apiAvatar) + val updateObsolete = UpdateGroupAvatarChangedObsolete(groupId, cmd.clientUserId, apiAvatar, dateMillis, cmd.randomId) + val serviceMessage = GroupServiceMessages.changedAvatar(apiAvatar) + + db.run(AvatarDataRepo.createOrUpdate(getAvatarData(cmd.avatar))) + val result: Future[UpdateAvatarAck] = for { + /////////////////////////// + // Groups V1 API updates // + /////////////////////////// + + _ ← seqUpdExt.broadcastClientUpdate(cmd.clientUserId, cmd.clientAuthId, memberIds, updateObsolete) + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// + + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + userId = cmd.clientUserId, + authId = cmd.clientAuthId, + bcastUserIds = memberIds - cmd.clientUserId, + update = updateNew + ) + SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( + apiGroupPeer, + senderUserId = cmd.clientUserId, + senderAuthId = cmd.clientAuthId, + randomId = cmd.randomId, + message = serviceMessage, + deliveryTag = Some(Optimization.GroupV2) + ) + } yield UpdateAvatarAck(apiAvatar).withSeqStateDate(SeqStateDate(seq, state, date)) + + result pipeTo sender() + } + } + } + + protected def updateTitle(cmd: UpdateTitle): Unit = { + val title = cmd.title + if (!state.permissions.canEditInfo(cmd.clientUserId)) { + sender() ! noPermission + } else if (!isValidTitle(title)) { + sender() ! Status.Failure(InvalidTitle) + } else { + persist(TitleUpdated(Instant.now(), title)) { evt ⇒ + val newState = commit(evt) + + val dateMillis = evt.ts.toEpochMilli + val memberIds = newState.memberIds + + val updateNew = UpdateGroupTitleChanged(groupId, title) + val updateObsolete = UpdateGroupTitleChangedObsolete( + groupId, + userId = cmd.clientUserId, + title = title, + date = dateMillis, + randomId = cmd.randomId + ) + val serviceMessage = GroupServiceMessages.changedTitle(title) + val pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.TitleChanged)) + + //TODO: remove deprecated + db.run(GroupRepo.updateTitle(groupId, title, cmd.clientUserId, cmd.randomId, date = evt.ts)) + + val result: Future[SeqStateDate] = for { + + /////////////////////////// + // Groups V1 API updates // + /////////////////////////// + + _ ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + memberIds - cmd.clientUserId, + updateObsolete, + pushRules + ) + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// + + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + userId = cmd.clientUserId, + authId = cmd.clientAuthId, + bcastUserIds = memberIds - cmd.clientUserId, + update = updateNew, + pushRules = pushRules + ) + SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( + apiGroupPeer, + senderUserId = cmd.clientUserId, + senderAuthId = cmd.clientAuthId, + randomId = cmd.randomId, + message = serviceMessage, + deliveryTag = Some(Optimization.GroupV2) + ) + } yield SeqStateDate(seq, state, date) + + result pipeTo sender() + } + + } + } + + //TODO: who can update topic??? + protected def updateTopic(cmd: UpdateTopic): Unit = { + def isValidTopic(topic: Option[String]) = topic.forall(_.length < 255) + + val topic = trimToEmpty(cmd.topic) + + if (state.groupType.isChannel && !state.isAdmin(cmd.clientUserId)) { + sender() ! notAdmin + } else if (state.nonMember(cmd.clientUserId)) { + sender() ! notMember + } else if (!isValidTopic(topic)) { + sender() ! Status.Failure(TopicTooLong) + } else { + persist(TopicUpdated(Instant.now, topic)) { evt ⇒ + val newState = commit(evt) + + val dateMillis = evt.ts.toEpochMilli + val memberIds = newState.memberIds + + val updateNew = UpdateGroupTopicChanged(groupId, topic) + val updateObsolete = UpdateGroupTopicChangedObsolete( + groupId, + randomId = cmd.randomId, + userId = cmd.clientUserId, + topic = topic, + date = dateMillis + ) + val serviceMessage = GroupServiceMessages.changedTopic(topic) + val pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.TopicChanged)) + + //TODO: remove deprecated + db.run(GroupRepo.updateTopic(groupId, topic)) + + val result: Future[SeqStateDate] = for { + + /////////////////////////// + // Groups V1 API updates // + /////////////////////////// + + _ ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + memberIds - cmd.clientUserId, + updateObsolete, + pushRules + ) + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// + + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + userId = cmd.clientUserId, + authId = cmd.clientAuthId, + bcastUserIds = memberIds - cmd.clientUserId, + update = updateNew, + pushRules = pushRules + ) + SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( + apiGroupPeer, + senderUserId = cmd.clientUserId, + senderAuthId = cmd.clientAuthId, + randomId = cmd.randomId, + message = serviceMessage, + deliveryTag = Some(Optimization.GroupV2) + ) + } yield SeqStateDate(seq, state, date) + + result pipeTo sender() + } + } + } + + protected def updateAbout(cmd: UpdateAbout): Unit = { + def isValidAbout(about: Option[String]) = about.forall(_.length < 255) + + val about = trimToEmpty(cmd.about) + + if (!state.permissions.canEditInfo(cmd.clientUserId)) { + sender() ! noPermission + } else if (!isValidAbout(about)) { + sender() ! Status.Failure(AboutTooLong) + } else { + + persist(AboutUpdated(Instant.now, about)) { evt ⇒ + val newState = commit(evt) + + val memberIds = newState.memberIds + + val updateNew = UpdateGroupAboutChanged(groupId, about) + val updateObsolete = UpdateGroupAboutChangedObsolete(groupId, about) + val serviceMessage = GroupServiceMessages.changedAbout(about) + val pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.TopicChanged)) + + //TODO: remove deprecated + db.run(GroupRepo.updateAbout(groupId, about)) + + val result: Future[SeqStateDate] = for { + + /////////////////////////// + // Groups V1 API updates // + /////////////////////////// + + _ ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + memberIds - cmd.clientUserId, + updateObsolete, + pushRules + ) + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// + + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + userId = cmd.clientUserId, + authId = cmd.clientAuthId, + bcastUserIds = memberIds - cmd.clientUserId, + update = updateNew, + pushRules = pushRules + ) + } yield SeqStateDate(seq, state, evt.ts.toEpochMilli) + + result pipeTo sender() + } + } + } + + protected def updateShortName(cmd: UpdateShortName): Unit = { + def isValidShortName(shortName: Option[String]) = shortName forall StringUtils.validGlobalName + + val oldShortName = state.shortName + val newShortName = trimToEmpty(cmd.shortName) + + if (!state.permissions.canEditShortName(cmd.clientUserId)) { + sender() ! noPermission + } else if (!isValidShortName(newShortName)) { + sender() ! Status.Failure(InvalidShortName) + } else if (oldShortName == newShortName) { + seqUpdExt.getSeqState(cmd.clientUserId, cmd.clientAuthId) pipeTo sender() + } else { + val replyTo = sender() + + val existsFu = newShortName map { name ⇒ + globalNamesStorage.exists(name) + } getOrElse FastFuture.successful(false) + + //TODO: timeout for this + onSuccess(existsFu) { exists ⇒ + if (exists) { + replyTo ! Status.Failure(ShortNameTaken) + } else { + // when user sets short name first time - we making group history shared + if (state.shortName.isEmpty && newShortName.nonEmpty && !state.isHistoryShared) { + context.parent ! + GroupEnvelope(groupId) + .withMakeHistoryShared(MakeHistoryShared(cmd.clientUserId, cmd.clientAuthId)) + } + + persist(ShortNameUpdated(Instant.now, newShortName)) { evt ⇒ + val newState = commit(evt) + + val memberIds = newState.memberIds + + val result: Future[SeqState] = for { + _ ← globalNamesStorage.updateOrRemove( + oldShortName, + newShortName, + GlobalNameOwner(OwnerType.Group, groupId) + ) + seqState ← seqUpdExt.broadcastClientUpdate( + userId = cmd.clientUserId, + authId = cmd.clientAuthId, + bcastUserIds = memberIds - cmd.clientUserId, + update = UpdateGroupShortNameChanged(groupId, newShortName) + ) + } yield seqState + + result pipeTo replyTo + } + } + } + } + } + + private def getAvatarData(avatar: Option[Avatar]): AvatarData = + avatar + .map(ImageUtils.getAvatarData(AvatarData.OfGroup, groupId, _)) + .getOrElse(AvatarData.empty(AvatarData.OfGroup, groupId.toLong)) + + private def trimToEmpty(s: Option[String]): Option[String] = + s map (_.trim) filter (_.nonEmpty) + +} diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala new file mode 100644 index 0000000000..3eeecb9cd0 --- /dev/null +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala @@ -0,0 +1,645 @@ +package im.actor.server.group + +import java.time.{ Instant, LocalDateTime, ZoneOffset } + +import akka.actor.Status +import akka.pattern.pipe +import im.actor.api.rpc.Update +import im.actor.api.rpc.groups._ +import im.actor.api.rpc.messaging.{ ApiServiceMessage, UpdateMessage } +import im.actor.concurrent.FutureExt +import im.actor.server.acl.ACLUtils +import im.actor.server.group.GroupCommands.{ Invite, Join, Kick, Leave } +import im.actor.server.group.GroupEvents.{ UserInvited, UserJoined, UserKicked, UserLeft } +import im.actor.server.persist.{ GroupInviteTokenRepo, GroupUserRepo } +import im.actor.server.sequence.{ Optimization, SeqState, SeqStateDate } + +import scala.concurrent.Future + +private[group] trait MemberCommandHandlers extends GroupsImplicits { + this: GroupProcessor ⇒ + + import im.actor.server.ApiConversions._ + + protected def invite(cmd: Invite): Unit = { + if (!state.permissions.canInvitePeople(cmd.inviterUserId)) { + sender() ! noPermission + } else if (state.isInvited(cmd.inviteeUserId)) { + sender() ! Status.Failure(GroupErrors.UserAlreadyInvited) + } else if (state.isMember(cmd.inviteeUserId)) { + sender() ! Status.Failure(GroupErrors.UserAlreadyJoined) + } else { + val inviteeIsExUser = state.isExUser(cmd.inviteeUserId) + + persist(UserInvited(Instant.now, cmd.inviteeUserId, cmd.inviterUserId)) { evt ⇒ + val newState = commit(evt) + + val dateMillis = evt.ts.toEpochMilli + val memberIds = newState.memberIds + val apiMembers = newState.members.values.map(_.asStruct).toVector + + // if user ever been in this group - we should push these updates, + val inviteeUpdatesNew: List[Update] = refreshGroupUpdates(newState, cmd.inviteeUserId) + + val membersUpdateNew: Update = + if (newState.groupType.isChannel) // if channel, or group is big enough + UpdateGroupMembersCountChanged(groupId, newState.membersCount) + else + UpdateGroupMembersUpdated(groupId, apiMembers) + + val inviteeUpdateObsolete = UpdateGroupInviteObsolete( + groupId, + inviteUserId = cmd.inviterUserId, + date = dateMillis, + randomId = cmd.randomId + ) + + val membersUpdateObsolete = UpdateGroupUserInvitedObsolete( + groupId, + userId = cmd.inviteeUserId, + inviterUserId = cmd.inviterUserId, + date = dateMillis, + randomId = cmd.randomId + ) + val serviceMessage = GroupServiceMessages.userInvited(cmd.inviteeUserId) + + //TODO: remove deprecated + db.run(GroupUserRepo.create(groupId, cmd.inviteeUserId, cmd.inviterUserId, evt.ts, None, isAdmin = false)) + + def inviteGROUPUpdates: Future[SeqStateDate] = + for { + // push updated members list to inviteeUserId, + // make it `FatSeqUpdate` if this user invited to group for first time. + _ ← seqUpdExt.deliverUserUpdate( + userId = cmd.inviteeUserId, + membersUpdateNew, + pushRules = seqUpdExt.pushRules(isFat = !inviteeIsExUser, Some(PushTexts.Invited)), + deliveryId = s"invite_${groupId}_${cmd.randomId}" + ) + + // push all "refresh group" updates to inviteeUserId + _ ← FutureExt.ftraverse(inviteeUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.inviteeUserId, update) + } + + // push updated members list to all group members except inviteeUserId + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + userId = cmd.inviterUserId, + authId = cmd.inviterAuthId, + bcastUserIds = (memberIds - cmd.inviterUserId) - cmd.inviteeUserId, + update = membersUpdateNew, + deliveryId = s"useradded_${groupId}_${cmd.randomId}" + ) + + // explicitly send service message + SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( + apiGroupPeer, + cmd.inviterUserId, + cmd.inviterAuthId, + cmd.randomId, + serviceMessage, + deliveryTag = Some(Optimization.GroupV2) + ) + } yield SeqStateDate(seq, state, date) + + def inviteCHANNELUpdates: Future[SeqStateDate] = + for { + // push updated members count to inviteeUserId + _ ← seqUpdExt.deliverUserUpdate( + userId = cmd.inviteeUserId, + membersUpdateNew, + pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.Invited)), + deliveryId = s"invite_${groupId}_${cmd.randomId}" + ) + + // push all "refresh group" updates to inviteeUserId + _ ← FutureExt.ftraverse(inviteeUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.inviteeUserId, update) + } + + // push updated members count to all group members + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + userId = cmd.inviterUserId, + authId = cmd.inviterAuthId, + bcastUserIds = (memberIds - cmd.inviterUserId) - cmd.inviteeUserId, + update = membersUpdateNew, + deliveryId = s"useradded_${groupId}_${cmd.randomId}" + ) + + // push service message to invitee + _ ← seqUpdExt.deliverUserUpdate( + userId = cmd.inviteeUserId, + update = serviceMessageUpdate( + cmd.inviterUserId, + dateMillis, + cmd.randomId, + serviceMessage + ), + deliveryTag = Some(Optimization.GroupV2) + ) + } yield SeqStateDate(seq, state, dateMillis) + + val result: Future[SeqStateDate] = for { + /////////////////////////// + // Groups V1 API updates // + /////////////////////////// + + // push "Invited" to invitee + _ ← seqUpdExt.deliverUserUpdate( + userId = cmd.inviteeUserId, + inviteeUpdateObsolete, + pushRules = seqUpdExt.pushRules(isFat = true, Some(PushTexts.Invited)), + deliveryId = s"invite_obsolete_${groupId}_${cmd.randomId}" + ) + + // push "User added" to all group members except for `inviterUserId` + _ ← seqUpdExt.broadcastPeopleUpdate( + (memberIds - cmd.inviteeUserId) - cmd.inviterUserId, // is it right? + membersUpdateObsolete, + pushRules = seqUpdExt.pushRules(isFat = true, Some(PushTexts.Added)), + deliveryId = s"useradded_obsolete_${groupId}_${cmd.randomId}" + ) + + // push "User added" to `inviterUserId` + _ ← seqUpdExt.deliverClientUpdate( + cmd.inviterUserId, + cmd.inviterAuthId, + membersUpdateObsolete, + pushRules = seqUpdExt.pushRules(isFat = true, None), + deliveryId = s"useradded_obsolete_${groupId}_${cmd.randomId}" + ) + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// + + seqStateDate ← if (newState.groupType.isChannel) inviteCHANNELUpdates else inviteGROUPUpdates + + } yield seqStateDate + + result pipeTo sender() + } + } + } + + /** + * User can join + * • after invite(was invited by other user previously). In this case he already have group on devices + * • via invite link. In this case he doesn't have group, and we need to deliver it. + */ + protected def join(cmd: Join): Unit = { + // user is already a member, and should not complete invitation process + if (state.isMember(cmd.joiningUserId) && !state.isInvited(cmd.joiningUserId)) { + sender() ! Status.Failure(GroupErrors.UserAlreadyJoined) + } else { + // user was invited in group by other group user + val wasInvited = state.isInvited(cmd.joiningUserId) + + // trying to figure out who invited joining user. + // Descdending priority: + // • inviter defined in `Join` command (when invited via token) + // • inviter from members list (when invited by other user) + // • group creator (safe fallback) + val optMember = state.members.get(cmd.joiningUserId) + val inviterUserId = cmd.invitingUserId + .orElse(optMember.map(_.inviterUserId)) + .getOrElse(state.ownerUserId) + + persist(UserJoined(Instant.now, cmd.joiningUserId, inviterUserId)) { evt ⇒ + val newState = commit(evt) + + val date = evt.ts + val dateMillis = date.toEpochMilli + val memberIds = newState.memberIds + val apiMembers = newState.members.values.map(_.asStruct).toVector + val randomId = ACLUtils.randomLong() + + // If user was never invited to group - he don't have group on devices, + // that means we need to push all group-info related updates + // + // If user was invited to group by other member - we don't need to push group updates, + // cause they we pushed already on invite step + val joiningUserUpdatesNew: List[Update] = + if (wasInvited) List.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId) + + val membersUpdateNew: Update = + if (newState.groupType.isChannel) // if channel, or group is big enough + UpdateGroupMembersCountChanged(groupId, newState.membersCount) + else + UpdateGroupMembersUpdated(groupId, apiMembers) // will update date when member got into group + + val membersUpdateObsolete = UpdateGroupMembersUpdateObsolete(groupId, apiMembers) + + val serviceMessage = GroupServiceMessages.userJoined + + //TODO: remove deprecated + db.run(GroupUserRepo.create( + groupId, + userId = cmd.joiningUserId, + inviterUserId = inviterUserId, + invitedAt = optMember.map(_.invitedAt).getOrElse(date), + joinedAt = Some(LocalDateTime.now(ZoneOffset.UTC)), + isAdmin = false + )) + + def joinGROUPUpdates: Future[SeqStateDate] = + for { + // push all group updates to joiningUserId + _ ← FutureExt.ftraverse(joiningUserUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.joiningUserId, update) + } + + // push updated members list to joining user, + // make it `FatSeqUpdate` if this user invited to group for first time. + // TODO???: isFat = !wasInvited - is it correct? + SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( + userId = cmd.joiningUserId, + authId = cmd.joiningUserAuthId, + update = membersUpdateNew, + pushRules = seqUpdExt.pushRules(isFat = !wasInvited, None), //!wasInvited means that user came for first time here + deliveryId = s"join_${groupId}_${randomId}" + + ) + + // push updated members list to all group members except joiningUserId + _ ← seqUpdExt.broadcastPeopleUpdate( + memberIds - cmd.joiningUserId, + membersUpdateNew, + deliveryId = s"userjoined_${groupId}_${randomId}" + ) + + SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( + apiGroupPeer, + senderUserId = cmd.joiningUserId, + senderAuthId = cmd.joiningUserAuthId, + randomId = randomId, + serviceMessage // no delivery tag. This updated handled this way in Groups V1 + ) + } yield SeqStateDate(seq, state, date) + + def joinCHANNELUpdates: Future[SeqStateDate] = + for { + // push all group updates to joiningUserId + _ ← FutureExt.ftraverse(joiningUserUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.joiningUserId, update) + } + + // push updated members count to joining user + SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( + userId = cmd.joiningUserId, + authId = cmd.joiningUserAuthId, + update = membersUpdateNew, + deliveryId = s"join_${groupId}_${randomId}" + ) + + // push updated members count to all group members except joining user + _ ← seqUpdExt.broadcastPeopleUpdate( + memberIds - cmd.joiningUserId, + membersUpdateNew, + deliveryId = s"userjoined_${groupId}_${randomId}" + ) + } yield SeqStateDate(seq, state, dateMillis) + + val result: Future[(SeqStateDate, Vector[Int], Long)] = + for { + /////////////////////////// + // Groups V1 API updates // + /////////////////////////// + + // push update about members to all users, except joining user + _ ← seqUpdExt.broadcastPeopleUpdate( + memberIds - cmd.joiningUserId, + membersUpdateObsolete, + pushRules = seqUpdExt.pushRules(isFat = true, None), + deliveryId = s"userjoined_obsolete_${groupId}_${randomId}" + ) + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// + + seqStateDate ← if (newState.groupType.isChannel) joinCHANNELUpdates else joinGROUPUpdates + + } yield (seqStateDate, memberIds.toVector :+ inviterUserId, randomId) + + result pipeTo sender() + } + } + } + + /** + * This case handled in other manner, so we change state in the end + * cause user that left, should send service message. And we don't allow non-members + * to send message. So we keep him as member until message sent, and remove him from members + */ + protected def leave(cmd: Leave): Unit = { + if (state.nonMember(cmd.userId)) { + sender() ! notMember + } else { + persist(UserLeft(Instant.now, cmd.userId)) { evt ⇒ + // no commit here. it will be after service message sent + + val dateMillis = evt.ts.toEpochMilli + + val updateObsolete = UpdateGroupUserLeaveObsolete(groupId, cmd.userId, dateMillis, cmd.randomId) + + // TODO: merge, they are almost identical + val leftUserUpdatesNew = + if (state.groupType.isChannel) List( + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), + UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), + UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), + UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), + UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), + UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) + ) + else List( + UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), + UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), + UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), + UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), + UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), + UpdateGroupMembersUpdated(groupId, members = Vector.empty), + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) + ) + + val membersUpdateNew = + if (state.groupType.isChannel) { // if channel, or group is big enough + UpdateGroupMembersCountChanged( + groupId, + membersCount = state.membersCount - 1 + ) + } else { + UpdateGroupMembersUpdated( + groupId, + members = state.members.filterNot(_._1 == cmd.userId).values.map(_.asStruct).toVector + ) + } + + val serviceMessage = GroupServiceMessages.userLeft + + //TODO: remove deprecated. GroupInviteTokenRepo don't have replacement yet. + db.run( + for { + _ ← GroupUserRepo.delete(groupId, cmd.userId) + _ ← GroupInviteTokenRepo.revoke(groupId, cmd.userId) + } yield () + ) + + val leaveGROUPUpdates: Future[SeqStateDate] = + for { + // push updated members list to all group members + _ ← seqUpdExt.broadcastPeopleUpdate( + state.memberIds - cmd.userId, + membersUpdateNew + ) + + // send service message + SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( + apiGroupPeer, + senderUserId = cmd.userId, + senderAuthId = cmd.authId, + randomId = cmd.randomId, + message = serviceMessage, + deliveryTag = Some(Optimization.GroupV2) + ) + + // push left user that he is no longer a member + SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( + userId = cmd.userId, + authId = cmd.authId, + update = UpdateGroupMemberChanged(groupId, isMember = false) + ) + + // push left user updates + // • with empty group members + // • that he can't view and invite members + _ ← FutureExt.ftraverse(leftUserUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.userId, update) + } + } yield SeqStateDate(seq, state, date) + + val leaveCHANNELUpdates: Future[SeqStateDate] = + for { + // push updated members count to all group members + _ ← seqUpdExt.broadcastPeopleUpdate( + state.memberIds - cmd.userId, + membersUpdateNew + ) + + // push left user that he is no longer a member + SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( + userId = cmd.userId, + authId = cmd.authId, + update = UpdateGroupMemberChanged(groupId, isMember = false) + ) + + // push left user updates that he has no group rights + _ ← FutureExt.ftraverse(leftUserUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.userId, update) + } + } yield SeqStateDate(seq, state, dateMillis) + + // read this dialog by user that leaves group. don't wait for ack + dialogExt.messageRead(apiGroupPeer, cmd.userId, 0L, dateMillis) + val result: Future[SeqStateDate] = for { + + /////////////////////////// + // Groups V1 API updates // + /////////////////////////// + + _ ← seqUpdExt.broadcastClientUpdate( + userId = cmd.userId, + authId = cmd.authId, + bcastUserIds = state.memberIds + cmd.userId, // push this to other user's devices too. actually cmd.userId is still in state.memberIds + update = updateObsolete, + pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.Left), Seq(cmd.authId)) + ) + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// + + seqStateDate ← if (state.groupType.isChannel) leaveCHANNELUpdates else leaveGROUPUpdates + + } yield seqStateDate + + result andThen { case _ ⇒ commit(evt) } pipeTo sender() + } + } + } + + protected def kick(cmd: Kick): Unit = { + if (!state.permissions.canKickMember(cmd.kickerUserId)) { + sender() ! noPermission + } else if (state.nonMember(cmd.kickedUserId)) { + sender() ! notMember + } else { + persist(UserKicked(Instant.now, cmd.kickedUserId, cmd.kickerUserId)) { evt ⇒ + val newState = commit(evt) + + val dateMillis = evt.ts.toEpochMilli + + val updateObsolete = UpdateGroupUserKickObsolete(groupId, cmd.kickedUserId, cmd.kickerUserId, dateMillis, cmd.randomId) + + // TODO: merge, they are almost identical + val kickedUserUpdatesNew: List[Update] = + if (state.groupType.isChannel) List( + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), + UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), + UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), + UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), + UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), + UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), + UpdateGroupMemberChanged(groupId, isMember = false) + ) + else List( + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), + UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), + UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), + UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), + UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), + UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), + UpdateGroupMembersUpdated(groupId, members = Vector.empty), + UpdateGroupMemberChanged(groupId, isMember = false) + ) + + val membersUpdateNew: Update = + if (newState.groupType.isChannel) { // if channel, or group is big enough + UpdateGroupMembersCountChanged( + groupId, + membersCount = newState.membersCount + ) + } else { + UpdateGroupMembersUpdated( + groupId, + members = newState.members.values.map(_.asStruct).toVector + ) + } + + val serviceMessage = GroupServiceMessages.userKicked(cmd.kickedUserId) + + //TODO: remove deprecated. GroupInviteTokenRepo don't have replacement yet. + db.run( + for { + _ ← GroupUserRepo.delete(groupId, cmd.kickedUserId) + _ ← GroupInviteTokenRepo.revoke(groupId, cmd.kickedUserId) + } yield () + ) + + val kickGROUPUpdates: Future[SeqStateDate] = + for { + // push updated members list to all group members. Don't push to kicked user! + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + userId = cmd.kickerUserId, + authId = cmd.kickerAuthId, + bcastUserIds = newState.memberIds - cmd.kickerUserId, + update = membersUpdateNew + ) + + SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( + apiGroupPeer, + senderUserId = cmd.kickerUserId, + senderAuthId = cmd.kickerAuthId, + randomId = cmd.randomId, + message = serviceMessage, + deliveryTag = Some(Optimization.GroupV2) + ) + + // push kicked user updates + // • with empty group members + // • that he is no longer a member of group + // • that he can't view and invite members + _ ← FutureExt.ftraverse(kickedUserUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.kickedUserId, update) + } + } yield SeqStateDate(seq, state, date) + + val kickCHANNELUpdates: Future[SeqStateDate] = + for { + // push updated members count to all group members. Don't push to kicked user! + SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( + userId = cmd.kickerUserId, + authId = cmd.kickerAuthId, + bcastUserIds = newState.memberIds - cmd.kickerUserId, + update = membersUpdateNew + ) + + // push service message to kicker and kicked users. + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = Set(cmd.kickedUserId, cmd.kickerUserId), + update = serviceMessageUpdate( + cmd.kickerUserId, + dateMillis, + cmd.randomId, + serviceMessage + ), + deliveryTag = Some(Optimization.GroupV2) + ) + + // push kicked user updates that he has no group rights + _ ← FutureExt.ftraverse(kickedUserUpdatesNew) { update ⇒ + seqUpdExt.deliverUserUpdate(userId = cmd.kickedUserId, update) + } + } yield SeqStateDate(seq, state, dateMillis) + + // read this dialog by kicked user. don't wait for ack + dialogExt.messageRead(apiGroupPeer, cmd.kickedUserId, 0L, dateMillis) + val result: Future[SeqStateDate] = for { + /////////////////////////// + // Groups V1 API updates // + /////////////////////////// + + _ ← seqUpdExt.broadcastClientUpdate( + userId = cmd.kickerUserId, + authId = cmd.kickerAuthId, + bcastUserIds = newState.memberIds, + update = updateObsolete, + pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.Kicked), Seq(cmd.kickerAuthId)) + ) + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// + + seqStateDate ← if (state.groupType.isChannel) kickCHANNELUpdates else kickGROUPUpdates + + } yield seqStateDate + + result pipeTo sender() + } + } + } + + // Updates that will be sent to user, when he enters group. + // Helps clients that have this group to refresh it's data. + // TODO: review when channels will be added + private def refreshGroupUpdates(newState: GroupState, userId: Int): List[Update] = List( + UpdateGroupMemberChanged(groupId, isMember = true), + UpdateGroupAboutChanged(groupId, newState.about), + UpdateGroupAvatarChanged(groupId, newState.avatar), + UpdateGroupTopicChanged(groupId, newState.topic), + UpdateGroupTitleChanged(groupId, newState.title), + UpdateGroupOwnerChanged(groupId, newState.ownerUserId), + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = newState.permissions.canViewMembers(userId)), + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = true) // TODO: figure out right value + // UpdateGroupExtChanged(groupId, newState.extension) //TODO: figure out and fix + // if(bigGroup) UpdateGroupMembersCountChanged(groupId, newState.extension) + ) + + private def serviceMessageUpdate(senderUserId: Int, date: Long, randomId: Long, message: ApiServiceMessage) = + UpdateMessage( + peer = apiGroupPeer, + senderUserId = senderUserId, + date = date, + randomId = randomId, + message = message, + attributes = None, + quotedMessage = None + ) + +} diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index 1e86f599a5..89f4ce821c 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -527,8 +527,10 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act authorized(clientData) { implicit client ⇒ withGroupOutPeer(groupPeer) { for { - isPublic ← groupExt.isPublic(groupPeer.groupId) - result ← if (isPublic) { + // TODO: what should it be? was + // isPublic ← groupExt.isPublic(groupPeer.groupId) + isHistoryShared ← groupExt.isHistoryShared(groupPeer.groupId) + result ← if (isHistoryShared) { db.run( for { member ← GroupUserRepo.find(groupPeer.groupId, client.userId) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala index c64c39571b..82c3f34db7 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala @@ -149,18 +149,15 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { private def searchGroups(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[ApiGroup]] = { for { ids ← DialogExtension(system).fetchGroupedDialogs(client.userId) map (_.filter(_.typ.isGroups).flatMap(_.dialogs.map(_.getPeer.id))) - groupOpts ← FutureExt.ftraverse(ids) { id ⇒ - groupExt.isPublic(id) flatMap { isPublic ⇒ - if (isPublic) FastFuture.successful(None) - else groupExt.getApiStruct(id, client.userId).map(Some(_)) - } + groups ← FutureExt.ftraverse(ids) { id ⇒ + groupExt.getApiStruct(id, client.userId) } - } yield filterGroups(groupOpts.flatten.toVector, text) + } yield filterGroups(groups.toVector, text) } private def searchPublic(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[ApiGroup]] = { for { - groups ← db.run(GroupRepo.findPublic) + groups ← db.run(GroupRepo.findPublic) // FIXME: isPublic flag is deprecated and will not appear for new groups groups ← FutureExt.ftraverse(groups)(g ⇒ groupExt.getApiStruct(g.id, client.userId)) } yield filterGroups(groups.toVector, text) } diff --git a/actor-server/src/main/scala/im/actor/server/Main.scala b/actor-server/src/main/scala/im/actor/server/Main.scala index 261b5dab2d..11185c5fbc 100644 --- a/actor-server/src/main/scala/im/actor/server/Main.scala +++ b/actor-server/src/main/scala/im/actor/server/Main.scala @@ -5,4 +5,4 @@ import scala.concurrent.duration.Duration object Main extends App { Await.result(ActorServer.newBuilder.start().system.whenTerminated, Duration.Inf) -} \ No newline at end of file +} From b3bf53602f5854d822144abb715a0799d7a8ec0a Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 18:10:37 +0300 Subject: [PATCH 033/253] fix(server:groups): return current user as member of channel in group queries(Group V1 API) --- .../main/scala/im/actor/server/group/GroupQueryHandlers.scala | 2 +- .../scala/im/actor/server/group/MemberCommandHandlers.scala | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index 534134b0e7..e1ed6e7cec 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -199,7 +199,7 @@ trait GroupQueryHandlers { if (state.isAdmin(clientUserId)) apiMembers → group.membersCount else - Vector.empty[ApiMember] → group.membersCount + apiMembers.find(_.userId == clientUserId).toVector → group.membersCount } } else { Vector.empty[ApiMember] → 0 diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala index 3eeecb9cd0..e974152fbb 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala @@ -228,6 +228,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { else UpdateGroupMembersUpdated(groupId, apiMembers) // will update date when member got into group + // TODO: not sure how it should be in old API val membersUpdateObsolete = UpdateGroupMembersUpdateObsolete(groupId, apiMembers) val serviceMessage = GroupServiceMessages.userJoined From 3254973175891c2f2e33d8642365cde05c03a998 Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 18:12:27 +0300 Subject: [PATCH 034/253] test(server): mark group info spec as pending --- .../im/actor/server/api/rpc/service/GroupsServiceSpec.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/GroupsServiceSpec.scala b/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/GroupsServiceSpec.scala index 2a78c860e4..f9548596d9 100644 --- a/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/GroupsServiceSpec.scala +++ b/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/GroupsServiceSpec.scala @@ -68,7 +68,7 @@ final class GroupsServiceSpec "EditGroupAbout" should "allow group admin to change 'about'" in e18 - it should "forbid to change 'about' by non-admin" in e19 + it should "forbid to change 'about' by non-admin" in pendingUntilFixed(e19) it should "set 'about' to empty when None comes" in e20 From 23d69f9161a053d74a544c60c18c9f3c79714526 Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 21:05:15 +0300 Subject: [PATCH 035/253] chore(server): update actor.json --- .../actor-core/src/main/actor-api/actor.json | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index 6246ebdfc2..7ab1ecbfe9 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -8219,6 +8219,24 @@ "argument": "canEditAdminSettings", "category": "full", "description": " If not set only owner can edit admin settings" + }, + { + "type": "reference", + "argument": "canInviteViaLink", + "category": "full", + "description": " If user can invite via link, default is false" + }, + { + "type": "reference", + "argument": "canDelete", + "category": "full", + "description": " If user can delete this group, default is false" + }, + { + "type": "reference", + "argument": "canLeave", + "category": "hidden", + "description": " If user can leave this group, default is true" } ], "expandable": "true", @@ -8367,6 +8385,30 @@ }, "id": 18, "name": "canEditAdminSettings" + }, + { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 19, + "name": "canInviteViaLink" + }, + { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 20, + "name": "canDelete" + }, + { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 21, + "name": "canLeave" } ] } @@ -9130,6 +9172,117 @@ ] } }, + { + "type": "update", + "content": { + "name": "GroupCanInviteViaLink", + "header": 2646, + "doc": [ + "Update about can invite via link changed", + { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, + { + "type": "reference", + "argument": "canInviteViaLink", + "category": "full", + "description": " Can Invite Via link" + } + ], + "attributes": [ + { + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, + { + "type": "bool", + "id": 2, + "name": "canInviteViaLink" + } + ] + } + }, + { + "type": "update", + "content": { + "name": "GroupCanLeaveChanged", + "header": 2647, + "doc": [ + "Update about can leave changed", + { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, + { + "type": "reference", + "argument": "canLeaveChanged", + "category": "full", + "description": " Can leave changed" + } + ], + "attributes": [ + { + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, + { + "type": "bool", + "id": 2, + "name": "canLeaveChanged" + } + ] + } + }, + { + "type": "update", + "content": { + "name": "GroupCanDeleteChanged", + "header": 2648, + "doc": [ + "Update about can delete changed", + { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, + { + "type": "reference", + "argument": "canDeleteChanged", + "category": "full", + "description": " Can delete changed" + } + ], + "attributes": [ + { + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, + { + "type": "bool", + "id": 2, + "name": "canDeleteChanged" + } + ] + } + }, { "type": "update", "content": { @@ -10574,6 +10727,36 @@ ] } }, + { + "type": "rpc", + "content": { + "name": "DeleteGroup", + "header": 2795, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Delete Group", + { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + } + ], + "attributes": [ + { + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + } + ] + } + }, { "type": "comment", "content": "Invite" From bd9dbc5eb48248baa5eed7ce2f942ec53a2a099a Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 21:07:26 +0300 Subject: [PATCH 036/253] fix(server:groups): show invite info for groups with short name --- .../server/group/AdminCommandHandlers.scala | 1 + .../server/group/GroupQueryHandlers.scala | 5 +- .../im/actor/server/group/GroupState.scala | 2 +- .../server/group/http/GroupsHttpHandler.scala | 58 +++++++++++-------- .../server/names/GlobalNamesStorage.scala | 4 +- .../file/local/FileStorageOperations.scala | 8 +-- .../server/api/http/json/JsonFormatters.scala | 6 +- .../actor/server/api/http/json/models.scala | 8 +-- .../scala/im/actor/server/persist/Group.scala | 1 - .../api/rpc/service/auth/AuthHelpers.scala | 4 +- .../rpc/service/auth/AuthServiceImpl.scala | 2 +- .../contacts/ContactsServiceImpl.scala | 2 +- .../service/groups/GroupsServiceImpl.scala | 4 +- .../server/api/http/HttpApiFrontendSpec.scala | 18 ++++++ 14 files changed, 77 insertions(+), 46 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala index 33d1833f89..6d304eaa74 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala @@ -302,6 +302,7 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { } else { persist(HistoryBecameShared(Instant.now, cmd.clientUserId)) { evt ⇒ val newState = commit(evt) + log.debug("History of group {} became shared", groupId) val memberIds = newState.memberIds diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index e1ed6e7cec..e6de46c236 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -135,7 +135,10 @@ trait GroupQueryHandlers { canEditShortName = Some(state.permissions.canEditShortName(clientUserId)), canEditAdminList = Some(state.permissions.canEditAdmins(clientUserId)), canViewAdminList = Some(state.permissions.canViewAdmins(clientUserId)), - canEditAdminSettings = Some(state.permissions.canEditAdminSettings(clientUserId)) + canEditAdminSettings = Some(state.permissions.canEditAdminSettings(clientUserId)), + canInviteViaLink = None, + canDelete = None, + canLeave = None ) ) } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 80b6fb0da0..77ec5178ab 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -108,7 +108,7 @@ private[group] final case class GroupState( avatar: Option[Avatar], topic: Option[String], shortName: Option[String], - groupType: GroupType, // TODO: rename to groupType + groupType: GroupType, isHidden: Boolean, isHistoryShared: Boolean, diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/http/GroupsHttpHandler.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/http/GroupsHttpHandler.scala index 0e64b70c2a..e8d3b80506 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/http/GroupsHttpHandler.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/http/GroupsHttpHandler.scala @@ -6,36 +6,33 @@ import akka.http.scaladsl.model.StatusCodes._ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import akka.http.scaladsl.util.FastFuture -import im.actor.server.api.http.{ HttpHandler, json } import im.actor.server.api.http.json.JsonFormatters.{ errorsFormat, groupInviteInfoFormat } +import im.actor.server.api.http.{ HttpHandler, json } import im.actor.server.db.DbExtension -import im.actor.server.file.ImageUtils.getAvatar import im.actor.server.file.{ Avatar, FileLocation, FileStorageExtension } import im.actor.server.group.GroupExtension -import im.actor.server.model.AvatarData +import im.actor.server.names.GlobalNamesStorageKeyValueStorage import im.actor.server.persist._ import im.actor.server.persist.files.FileRepo import im.actor.server.user.UserExtension import play.api.libs.json.Json -import slick.driver.PostgresDriver.api._ import scala.concurrent.Future -import scala.concurrent.duration._ import scala.util.{ Failure, Success } private[group] final class GroupsHttpHandler()(implicit system: ActorSystem) extends HttpHandler { import im.actor.server.ApiConversions._ - import system.dispatcher private val db = DbExtension(system).db private val fsAdapter = FileStorageExtension(system).fsAdapter + private val globalNamesStorage = new GlobalNamesStorageKeyValueStorage override def routes: Route = defaultVersion { - path("groups" / "invites" / Segment) { token ⇒ + path("groups" / "invites" / Segment) { tokenOrShortName ⇒ get { - onComplete(retrieve(token)) { + onComplete(retrieve(tokenOrShortName)) { case Success(Right(result)) ⇒ complete(HttpResponse( status = OK, @@ -52,25 +49,36 @@ private[group] final class GroupsHttpHandler()(implicit system: ActorSystem) ext } } - private def retrieve(token: String): Future[Either[json.Errors, json.GroupInviteInfo]] = for { - optTokenInfo ← db.run(GroupInviteTokenRepo.findByToken(token)) - result ← optTokenInfo map { tokenInfo ⇒ - for { - groupInfo ← GroupExtension(system).getApiStruct(tokenInfo.groupId, 0) - groupTitle = groupInfo.title - groupAvatar = groupInfo.avatar - groupAvatarUrls ← avatarUrls(groupAvatar) + private def retrieve(tokenOrShortName: String): Future[Either[json.Errors, json.GroupInviteInfo]] = for { + byToken ← db.run(GroupInviteTokenRepo.findByToken(tokenOrShortName)) + byGroupId ← globalNamesStorage.getGroupId(tokenOrShortName) + optInviteData = (byToken, byGroupId) match { + case (Some(tokenInfo), _) ⇒ Some(tokenInfo.groupId → Some(tokenInfo.creatorId)) + case (_, Some(groupId)) ⇒ Some(groupId → None) + case _ ⇒ None + } + result ← optInviteData map { + case (groupId, optInviterId) ⇒ + for { + groupInfo ← GroupExtension(system).getApiStruct(groupId, 0) + groupTitle = groupInfo.title + groupAvatar = groupInfo.avatar + groupAvatarUrls ← avatarUrls(groupAvatar) - inviterInfo ← UserExtension(system).getApiStruct(tokenInfo.creatorId, 0, 0L) - inviterName = inviterInfo.name - inviterAvatar = inviterInfo.avatar - inviterAvatarUrls ← avatarUrls(inviterAvatar) - } yield Right( - json.GroupInviteInfo( - group = json.Group(groupTitle, groupAvatarUrls), - inviter = json.User(inviterName, inviterAvatarUrls) + optInviterInfo ← optInviterId match { + case Some(inviterId) ⇒ + for { + user ← UserExtension(system).getApiStruct(inviterId, 0, 0L) + avatars ← avatarUrls(user.avatar) + } yield Some(json.InviterInfo(user.name, avatars)) + case None ⇒ FastFuture.successful(None) + } + } yield Right( + json.GroupInviteInfo( + group = json.GroupInfo(groupTitle, groupAvatarUrls), + inviter = optInviterInfo + ) ) - ) } getOrElse FastFuture.successful(Left(json.Errors("Expired or invalid token"))) } yield result diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala b/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala index a24cc6b529..d6cae1bc9e 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala @@ -29,12 +29,12 @@ final class GlobalNamesStorageKeyValueStorage(implicit system: ActorSystem) { (ext.db, ext.connector) } - def getUserOwnerId(name: String): Future[Option[Int]] = + def getUserId(name: String): Future[Option[Int]] = getOwner(name) map (_.collect { case GlobalNameOwner(OwnerType.User, userId) ⇒ userId }) - def getGroupOwnerId(name: String): Future[Option[Int]] = + def getGroupId(name: String): Future[Option[Int]] = getOwner(name) map (_.collect { case GlobalNameOwner(OwnerType.Group, groupId) ⇒ groupId }) diff --git a/actor-server/actor-fs-adapters/src/main/scala/im/actor/server/file/local/FileStorageOperations.scala b/actor-server/actor-fs-adapters/src/main/scala/im/actor/server/file/local/FileStorageOperations.scala index 7d1d341d82..c1d593176a 100644 --- a/actor-server/actor-fs-adapters/src/main/scala/im/actor/server/file/local/FileStorageOperations.scala +++ b/actor-server/actor-fs-adapters/src/main/scala/im/actor/server/file/local/FileStorageOperations.scala @@ -6,15 +6,15 @@ import akka.actor.ActorSystem import akka.event.Logging import akka.http.scaladsl.util.FastFuture import akka.stream.Materializer -import akka.stream.scaladsl.{FileIO, Source} +import akka.stream.scaladsl.{ FileIO, Source } import akka.util.ByteString -import better.files.{File, _} +import better.files.{ File, _ } import im.actor.server.db.DbExtension import im.actor.server.file.UnsafeFileName import im.actor.server.persist.files.FileRepo -import scala.concurrent.{ExecutionContext, Future, blocking} -import scala.util.{Failure, Success} +import scala.concurrent.{ ExecutionContext, Future, blocking } +import scala.util.{ Failure, Success } trait FileStorageOperations extends LocalUploadKeyImplicits { diff --git a/actor-server/actor-http-api/src/main/scala/im/actor/server/api/http/json/JsonFormatters.scala b/actor-server/actor-http-api/src/main/scala/im/actor/server/api/http/json/JsonFormatters.scala index 348aaa1f84..1c203836de 100644 --- a/actor-server/actor-http-api/src/main/scala/im/actor/server/api/http/json/JsonFormatters.scala +++ b/actor-server/actor-http-api/src/main/scala/im/actor/server/api/http/json/JsonFormatters.scala @@ -11,8 +11,8 @@ object JsonFormatters { (JsPath \ "image_url").read[String].map[Content] { Image } implicit val avatarUrlsFormat: Format[AvatarUrls] = Json.format[AvatarUrls] - implicit val userFormat: Format[User] = Json.format[User] - implicit val groupFormat: Format[Group] = Json.format[Group] + implicit val userFormat: Format[InviterInfo] = Json.format[InviterInfo] + implicit val groupFormat: Format[GroupInfo] = Json.format[GroupInfo] implicit val groupInviteInfoFormat: Format[GroupInviteInfo] = Json.format[GroupInviteInfo] implicit val errorsFormat: Format[Errors] = Json.format[Errors] @@ -22,4 +22,4 @@ object JsonFormatters { implicit val reverseHookResponseFormat: Format[ReverseHookResponse] = Json.format[ReverseHookResponse] implicit val statusFormat: Format[Status] = Json.format[Status] -} \ No newline at end of file +} diff --git a/actor-server/actor-http-api/src/main/scala/im/actor/server/api/http/json/models.scala b/actor-server/actor-http-api/src/main/scala/im/actor/server/api/http/json/models.scala index 2758eba68a..fc84bec8a4 100644 --- a/actor-server/actor-http-api/src/main/scala/im/actor/server/api/http/json/models.scala +++ b/actor-server/actor-http-api/src/main/scala/im/actor/server/api/http/json/models.scala @@ -5,9 +5,9 @@ case class Text(text: String) extends Content case class Image(imageUrl: String) extends Content case class Document(documentUrl: String) extends Content -case class Group(title: String, avatars: Option[AvatarUrls]) -case class User(name: String, avatars: Option[AvatarUrls]) -case class GroupInviteInfo(group: Group, inviter: User) +case class GroupInfo(title: String, avatars: Option[AvatarUrls]) +case class InviterInfo(name: String, avatars: Option[AvatarUrls]) +case class GroupInviteInfo(group: GroupInfo, inviter: Option[InviterInfo]) case class AvatarUrls(small: Option[String], large: Option[String], full: Option[String]) case class Errors(message: String) @@ -17,4 +17,4 @@ case class ReverseHook(url: String) case class Status(status: String) case class ReverseHookResponse(id: Int, url: Option[String]) -final case class ServerInfo(projectName: String, endpoints: List[String]) \ No newline at end of file +final case class ServerInfo(projectName: String, endpoints: List[String]) diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/Group.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/Group.scala index 6d46810bd0..e5aeda7470 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/Group.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/Group.scala @@ -93,7 +93,6 @@ object GroupRepo { ) } - @deprecated("Public groups are deprecated in Group V2 API", "2016-06-05") def findPublic = groups.filter(_.isPublic === true).map(_.asGroup).result diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthHelpers.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthHelpers.scala index 4b2dd15804..4a8471313c 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthHelpers.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthHelpers.scala @@ -67,7 +67,7 @@ trait AuthHelpers extends Helpers { protected def newUsernameSignUp(transaction: AuthUsernameTransaction, name: String, sex: Option[ApiSex]): Result[(Int, String) Xor User] = { val username = transaction.username for { - optUserId ← fromFuture(globalNamesStorage.getUserOwnerId(username)) + optUserId ← fromFuture(globalNamesStorage.getUserId(username)) result ← optUserId match { case Some(id) ⇒ point(Xor.left((id, ""))) case None ⇒ newUser(name, "", sex, username = Some(username)) @@ -168,7 +168,7 @@ trait AuthHelpers extends Helpers { } yield (emailModel.userId, "") case u: AuthUsernameTransaction ⇒ for { - userId ← fromFutureOption(AuthErrors.UsernameUnoccupied)(globalNamesStorage.getUserOwnerId(u.username)) + userId ← fromFutureOption(AuthErrors.UsernameUnoccupied)(globalNamesStorage.getUserId(u.username)) } yield (userId, "") case _: AuthAnonymousTransaction ⇒ fromEither(Xor.left(AuthErrors.NotValidated)) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthServiceImpl.scala index 4f49ce914c..bfa32c52a8 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/auth/AuthServiceImpl.scala @@ -202,7 +202,7 @@ final class AuthServiceImpl(val oauth2Service: GoogleProvider)( val action = for { normUsername ← fromOption(ProfileRpcErrors.NicknameInvalid)(StringUtils.normalizeUsername(username)) - optUserId ← fromFuture(globalNamesStorage.getUserOwnerId(username)) + optUserId ← fromFuture(globalNamesStorage.getUserId(username)) _ ← optUserId map (id ⇒ forbidDeletedUser(id)) getOrElse point(()) optAuthTransaction ← fromDBIO(AuthUsernameTransactionRepo.find(username, deviceHash)) transactionHash ← optAuthTransaction match { diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/contacts/ContactsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/contacts/ContactsServiceImpl.scala index 362e3fc3ac..5ac43701dc 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/contacts/ContactsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/contacts/ContactsServiceImpl.scala @@ -172,7 +172,7 @@ class ContactsServiceImpl(implicit actorSystem: ActorSystem) private def findByNickname(nickname: String, client: AuthorizedClientData): Result[Vector[ApiUser]] = { for { - optUserId ← fromFuture(globalNamesStorage.getUserOwnerId(nickname)) + optUserId ← fromFuture(globalNamesStorage.getUserId(nickname)) structs ← fromFuture(Future.sequence(optUserId.toSeq map (userId ⇒ userExt.getApiStruct(userId, client.userId, client.authId)))) } yield structs.toVector } diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index 89f4ce821c..fc654f9019 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -369,7 +369,7 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act } yield info.groupId → Some(info.creatorId) case Xor.Right(groupName) ⇒ for { - groupId ← fromFutureOption(GroupRpcErrors.InvalidInviteGroup)(globalNamesStorage.getGroupOwnerId(groupName)) + groupId ← fromFutureOption(GroupRpcErrors.InvalidInviteGroup)(globalNamesStorage.getGroupId(groupName)) } yield groupId → None } (groupId, optInviter) = joinInfo @@ -459,6 +459,8 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act } } + protected def doHandleDeleteGroup(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = ??? + private def usersOrPeers(userIds: Vector[Int], stripEntities: Boolean)(implicit client: AuthorizedClientData): Future[(Vector[ApiUser], Vector[ApiUserOutPeer])] = if (stripEntities) { val users = Vector.empty[ApiUser] diff --git a/actor-server/actor-tests/src/test/scala/im/actor/server/api/http/HttpApiFrontendSpec.scala b/actor-server/actor-tests/src/test/scala/im/actor/server/api/http/HttpApiFrontendSpec.scala index 031d453358..bb5ad0d311 100644 --- a/actor-server/actor-tests/src/test/scala/im/actor/server/api/http/HttpApiFrontendSpec.scala +++ b/actor-server/actor-tests/src/test/scala/im/actor/server/api/http/HttpApiFrontendSpec.scala @@ -56,6 +56,8 @@ final class HttpApiFrontendSpec "Groups handler" should "respond with JSON message to group invite info with correct invite token" in t.groupInvitesOk() + it should "respond with JSON message without inviter, when we join via group short name" in t.groupInvitesShortName() + it should "respond with JSON message with avatar full links to group invite info with correct invite token" in t.groupInvitesAvatars1() it should "respond with JSON message with avatar partial links to group invite info with correct invite token" in t.groupInvitesAvatars2() @@ -316,6 +318,22 @@ final class HttpApiFrontendSpec } } + def groupInvitesShortName() = { + val shortName = "division" + whenReady(groupExt.updateShortName(groupOutPeer.groupId, user1.id, authId1, Some(shortName))) { _ ⇒ + val request = HttpRequest( + method = GET, + uri = s"${config.baseUri}/v1/groups/invites/$shortName" + ) + val resp = singleRequest(request).futureValue + resp.status shouldEqual OK + val body = resp.entity.asString + val response = Json.parse(body) + (response \ "group" \ "title").as[String] shouldEqual groupName + (response \ "inviter" \ "name").toOption shouldEqual None + } + } + def groupInvitesAvatars1() = { val avatarData = Files.readAllBytes(Paths.get(getClass.getResource("/valid-avatar.jpg").toURI)) val fileLocation = db.run(fsAdapter.uploadFile(UnsafeFileName("avatar"), avatarData)).futureValue From efbffe39c79c4076b658789907192bf260b3b85f Mon Sep 17 00:00:00 2001 From: rockjam Date: Tue, 19 Jul 2016 22:23:30 +0300 Subject: [PATCH 037/253] fix(server:groups): add missing serializer ids --- .../src/main/scala/im/actor/server/group/GroupProcessor.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index fc7b92117d..b6c9c45594 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -49,6 +49,7 @@ object GroupProcessor { 20022 → classOf[GroupCommands.UpdateShortName], 20023 → classOf[GroupCommands.DismissUserAdmin], 20024 → classOf[GroupCommands.UpdateAdminSettings], + 20025 → classOf[GroupCommands.MakeHistoryShared], 21001 → classOf[GroupQueries.GetIntegrationToken], 21002 → classOf[GroupQueries.GetIntegrationTokenResponse], @@ -88,7 +89,8 @@ object GroupProcessor { 22017 → classOf[GroupEvents.OwnerChanged], 22018 → classOf[GroupEvents.ShortNameUpdated], 22019 → classOf[GroupEvents.AdminSettingsUpdated], - 22020 → classOf[GroupEvents.AdminStatusChanged] + 22020 → classOf[GroupEvents.AdminStatusChanged], + 22021 → classOf[GroupEvents.HistoryBecameShared] ) def persistenceIdFor(groupId: Int): String = s"Group-${groupId}" From ea324ca1e6285b75ae46465505b3fb659dde99ea Mon Sep 17 00:00:00 2001 From: rockjam Date: Wed, 20 Jul 2016 02:09:47 +0300 Subject: [PATCH 038/253] chore(server): update actor.json --- .../actor-core/src/main/actor-api/actor.json | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index 7ab1ecbfe9..2fe4b769ee 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -10757,6 +10757,36 @@ ] } }, + { + "type": "rpc", + "content": { + "name": "ShareHistory", + "header": 2796, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Share History", + { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + } + ], + "attributes": [ + { + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + } + ] + } + }, { "type": "comment", "content": "Invite" From 983c5bc9122da7e00b3ca9b24299a59be87559f7 Mon Sep 17 00:00:00 2001 From: rockjam Date: Wed, 20 Jul 2016 04:10:21 +0300 Subject: [PATCH 039/253] feat(server:groups): delete group, make group with shared history, correct push updates on join/leave, more FullGroup flags --- .../actor-core/src/main/protobuf/group.proto | 7 ++ .../src/main/protobuf/groupV2.proto | 8 ++ .../src/main/scala/im/actor/api/rpc.scala | 10 ++- .../server/group/AdminCommandHandlers.scala | 70 +++++++++++++++- .../im/actor/server/group/GroupErrors.scala | 4 + .../actor/server/group/GroupOperations.scala | 5 ++ .../actor/server/group/GroupProcessor.scala | 14 ++-- .../server/group/GroupQueryHandlers.scala | 6 +- .../im/actor/server/group/GroupState.scala | 23 ++++++ .../server/group/MemberCommandHandlers.scala | 82 +++++++++++-------- .../actor/server/sequence/Optimization.scala | 5 +- .../scala/im/actor/api/rpc/PeerHelpers.scala | 9 +- .../rpc/service/files/FilesServiceImpl.scala | 2 +- .../rpc/service/groups/GroupRpcErrors.scala | 1 + .../service/groups/GroupsServiceImpl.scala | 21 ++++- .../service/messaging/HistoryHandlers.scala | 1 + .../service/messaging/MessagingHandlers.scala | 4 +- 17 files changed, 214 insertions(+), 58 deletions(-) diff --git a/actor-server/actor-core/src/main/protobuf/group.proto b/actor-server/actor-core/src/main/protobuf/group.proto index bfc8566ae2..654125b819 100644 --- a/actor-server/actor-core/src/main/protobuf/group.proto +++ b/actor-server/actor-core/src/main/protobuf/group.proto @@ -155,4 +155,11 @@ message GroupEvents { required int64 ts = 1 [(scalapb.field).type = "java.time.Instant"]; required int32 executor_user_id = 2; } + + message GroupDeleted { + option (scalapb.message).extends = "im.actor.server.group.GroupEvent"; + + required int64 ts = 1 [(scalapb.field).type = "java.time.Instant"]; + required int32 executor_user_id = 2; + } } diff --git a/actor-server/actor-core/src/main/protobuf/groupV2.proto b/actor-server/actor-core/src/main/protobuf/groupV2.proto index 2f8eaee56c..3d524d5339 100644 --- a/actor-server/actor-core/src/main/protobuf/groupV2.proto +++ b/actor-server/actor-core/src/main/protobuf/groupV2.proto @@ -37,6 +37,7 @@ message GroupEnvelope { GroupCommands.DismissUserAdmin dismiss_user_admin = 28; GroupCommands.TransferOwnership transfer_ownership = 14; GroupCommands.UpdateAdminSettings update_admin_settings = 30; + GroupCommands.DeleteGroup delete_group = 33; } oneof query { GroupQueries.GetAccessHash get_access_hash = 15; @@ -204,6 +205,13 @@ message GroupCommands { int32 client_user_id = 1; int64 client_auth_id = 2; } + + message DeleteGroup { + option (scalapb.message).extends = "GroupCommand"; + + int32 client_user_id = 1; + int64 client_auth_id = 2; + } } message GroupQueries { diff --git a/actor-server/actor-core/src/main/scala/im/actor/api/rpc.scala b/actor-server/actor-core/src/main/scala/im/actor/api/rpc.scala index 66cb42fe6d..3647567cd9 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/api/rpc.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/api/rpc.scala @@ -3,7 +3,7 @@ package im.actor.api import akka.http.scaladsl.util.FastFuture import cats.data.Xor import im.actor.server.CommonErrors -import im.actor.server.group.GroupErrors.GroupNotFound +import im.actor.server.group.GroupErrors.{ GroupAlreadyDeleted, GroupNotFound } import im.actor.server.office.EntityNotFoundError import im.actor.server.user.UserErrors.UserNotFound @@ -16,6 +16,7 @@ package object rpc extends PeersImplicits with HistoryImplicits with DialogConve object CommonRpcErrors { val GroupNotFound = RpcError(404, "GROUP_NOT_FOUND", "", false, None) + val GroupDeleted = RpcError(404, "GROUP_DELETED", "", false, None) val InvalidAccessHash = RpcError(403, "INVALID_ACCESS_HASH", "", false, None) val UnsupportedRequest = RpcError(400, "REQUEST_NOT_SUPPORTED", "Operation not supported.", false, None) val UserNotAuthorized = RpcError(403, "USER_NOT_AUTHORIZED", "", false, None) @@ -23,14 +24,15 @@ package object rpc extends PeersImplicits with HistoryImplicits with DialogConve val UserPhoneNotFound = RpcError(404, "USER_PHONE_NOT_FOUND", "", false, None) val EntityNotFound = RpcError(404, "ENTITY_NOT_FOUND", "", false, None) val NotSupportedInOss = RpcError(400, "NOT_SUPPORTED_IN_OSS", "Feature is not supported in the Open-Source version.", canTryAgain = false, None) - val IntenalError = RpcError(500, "INTERNAL_ERROR", "", false, None) + val InternalError = RpcError(500, "INTERNAL_ERROR", "", false, None) def forbidden(userMessage: String = "You are not allowed to do this.") = RpcError(403, "FORBIDDEN", userMessage, false, None) } def recoverCommon: PartialFunction[Throwable, RpcError] = { - case UserNotFound(_) ⇒ CommonRpcErrors.UserNotFound - case GroupNotFound(_) ⇒ CommonRpcErrors.GroupNotFound + case _: UserNotFound ⇒ CommonRpcErrors.UserNotFound + case _: GroupNotFound ⇒ CommonRpcErrors.GroupNotFound + case _: GroupAlreadyDeleted ⇒ CommonRpcErrors.GroupDeleted case EntityNotFoundError ⇒ CommonRpcErrors.EntityNotFound case CommonErrors.Forbidden(message) ⇒ CommonRpcErrors.forbidden(message) } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala index 6d304eaa74..e3dda1402f 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala @@ -7,13 +7,14 @@ import akka.pattern.pipe import akka.http.scaladsl.util.FastFuture import im.actor.api.rpc.{ PeersImplicits, Update } import im.actor.api.rpc.groups._ +import im.actor.api.rpc.messaging.UpdateChatClear import im.actor.concurrent.FutureExt import im.actor.server.CommonErrors import im.actor.server.acl.ACLUtils -import im.actor.server.group.GroupCommands.{ DismissUserAdmin, MakeHistoryShared, MakeUserAdmin, RevokeIntegrationToken, RevokeIntegrationTokenAck, TransferOwnership, UpdateAdminSettings, UpdateAdminSettingsAck } +import im.actor.server.group.GroupCommands.{ DeleteGroup, DismissUserAdmin, MakeHistoryShared, MakeUserAdmin, RevokeIntegrationToken, RevokeIntegrationTokenAck, TransferOwnership, UpdateAdminSettings, UpdateAdminSettingsAck } import im.actor.server.group.GroupErrors.{ NotAMember, NotAdmin, UserAlreadyAdmin, UserAlreadyNotAdmin } -import im.actor.server.group.GroupEvents.{ AdminSettingsUpdated, AdminStatusChanged, HistoryBecameShared, IntegrationTokenRevoked, OwnerChanged } -import im.actor.server.persist.{ GroupBotRepo, GroupUserRepo } +import im.actor.server.group.GroupEvents.{ AdminSettingsUpdated, AdminStatusChanged, GroupDeleted, HistoryBecameShared, IntegrationTokenRevoked, OwnerChanged } +import im.actor.server.persist.{ GroupBotRepo, GroupUserRepo, HistoryMessageRepo } import im.actor.server.sequence.{ SeqState, SeqStateDate } import scala.concurrent.Future @@ -225,7 +226,25 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { val newState = commit(evt) val memberIds = newState.memberIds + val prevOwnerUpdates = List( + UpdateGroupCanLeaveChanged(groupId, canLeaveChanged = true), + UpdateGroupCanDeleteChanged(groupId, canDeleteChanged = false) + ) + + val newOwnerUpdates = List( + UpdateGroupCanLeaveChanged(groupId, canLeaveChanged = false), + UpdateGroupCanDeleteChanged(groupId, canDeleteChanged = true) + ) + val result: Future[SeqState] = for { + // push updates to previous owner + _ ← FutureExt.ftraverse(prevOwnerUpdates) { update ⇒ + seqUpdExt.deliverUserUpdate(cmd.clientUserId, update) + } + // push updates to new owner + _ ← FutureExt.ftraverse(newOwnerUpdates) { update ⇒ + seqUpdExt.deliverUserUpdate(cmd.newOwnerId, update) + } seqState ← seqUpdExt.broadcastClientUpdate( userId = cmd.clientUserId, authId = cmd.clientAuthId, @@ -320,4 +339,49 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { } } + protected def deleteGroup(cmd: DeleteGroup): Unit = { + if (!state.permissions.canDelete(cmd.clientUserId)) { + sender() ! noPermission + } else { + persist(GroupDeleted(Instant.now, cmd.clientUserId)) { evt ⇒ + val newState = commit(evt) + + val deleteGroupMembersUpdates: Vector[Update] = Vector( + UpdateGroupCanSendMessagesChanged(groupId, canSendMessages = false), + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), + UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), + UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), + UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), + UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), + UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), + UpdateGroupCanInviteViaLink(groupId, canInviteViaLink = false), + UpdateGroupCanLeaveChanged(groupId, canLeaveChanged = false), + UpdateGroupCanDeleteChanged(groupId, canDeleteChanged = false), + UpdateGroupMemberChanged(groupId, isMember = false), + // if channel, or group is big enough + if (newState.groupType.isChannel) + UpdateGroupMembersCountChanged(groupId, membersCount = 0) + else + UpdateGroupMembersUpdated(groupId, members = Vector.empty) + ) + + val result: Future[SeqState] = for { + _ ← db.run(HistoryMessageRepo.deleteAll(cmd.clientUserId, apiGroupPeer.asModel)) + _ ← Future.traverse(deleteGroupMembersUpdates) { update ⇒ + seqUpdExt.broadcastPeopleUpdate(newState.memberIds, update) + } + seqState ← seqUpdExt.broadcastClientUpdate( + cmd.clientUserId, + cmd.clientAuthId, + bcastUserIds = state.memberIds - cmd.clientUserId, + update = UpdateChatClear(apiGroupPeer) + ) + } yield seqState + + result pipeTo sender() + } + } + } + } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala index 06174a95c5..d2e06a8c18 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupErrors.scala @@ -7,6 +7,8 @@ import scala.util.control.NoStackTrace object GroupErrors { final case class GroupNotFound(id: Int) extends EntityNotFound(s"Group $id not found") + final case class GroupAlreadyDeleted(id: Int) extends EntityNotFound(s"Group $id deleted") + final case class GroupIdAlreadyExists(id: Int) extends Exception with NoStackTrace object NotAMember extends Exception("Not a group member") with NoStackTrace @@ -38,4 +40,6 @@ object GroupErrors { case object BlockedByUser extends Exception with NoStackTrace case object NoPermission extends Exception with NoStackTrace + + case object CantLeaveGroup extends Exception with NoStackTrace } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala index f9cca5f8c7..fdbb22efc5 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala @@ -122,6 +122,11 @@ private[group] sealed trait Commands extends UserAcl { GroupEnvelope(groupId) .withMakeHistoryShared(MakeHistoryShared(clientUserId, clientAuthId))).mapTo[SeqState] + def deleteGroup(groupId: Int, clientUserId: Int, clientAuthId: Long): Future[SeqState] = + (processorRegion.ref ? + GroupEnvelope(groupId) + .withDeleteGroup(DeleteGroup(clientUserId, clientAuthId))).mapTo[SeqState] + } private[group] sealed trait Queries { diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index b6c9c45594..3e24dc56f1 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -50,6 +50,7 @@ object GroupProcessor { 20023 → classOf[GroupCommands.DismissUserAdmin], 20024 → classOf[GroupCommands.UpdateAdminSettings], 20025 → classOf[GroupCommands.MakeHistoryShared], + 20026 → classOf[GroupCommands.DeleteGroup], 21001 → classOf[GroupQueries.GetIntegrationToken], 21002 → classOf[GroupQueries.GetIntegrationTokenResponse], @@ -90,7 +91,8 @@ object GroupProcessor { 22018 → classOf[GroupEvents.ShortNameUpdated], 22019 → classOf[GroupEvents.AdminSettingsUpdated], 22020 → classOf[GroupEvents.AdminStatusChanged], - 22021 → classOf[GroupEvents.HistoryBecameShared] + 22021 → classOf[GroupEvents.HistoryBecameShared], + 22022 → classOf[GroupEvents.GroupDeleted] ) def persistenceIdFor(groupId: Int): String = s"Group-${groupId}" @@ -125,6 +127,7 @@ private[group] final class GroupProcessor case c: Create if state.isNotCreated ⇒ create(c) case _: Create ⇒ sender() ! Status.Failure(GroupIdAlreadyExists(groupId)) case _: GroupCommand if state.isNotCreated ⇒ sender() ! Status.Failure(GroupNotFound(groupId)) + case _: GroupCommand if state.isDeleted ⇒ sender() ! Status.Failure(GroupAlreadyDeleted(groupId)) // members actions case i: Invite ⇒ invite(i) @@ -146,15 +149,15 @@ private[group] final class GroupProcessor case t: TransferOwnership ⇒ transferOwnership(t) case s: UpdateAdminSettings ⇒ updateAdminSettings(s) case m: MakeHistoryShared ⇒ makeHistoryShared(m) - - // termination actions - case StopProcessor ⇒ context stop self - case ReceiveTimeout ⇒ context.parent ! ShardRegion.Passivate(stopMessage = StopProcessor) + case d: DeleteGroup ⇒ deleteGroup(d) // dialogs envelopes coming through group. case de: DialogEnvelope ⇒ groupPeerActor forward de.getAllFields.values.head + // actor's lifecycle + case StopProcessor ⇒ context stop self + case ReceiveTimeout ⇒ context.parent ! ShardRegion.Passivate(stopMessage = StopProcessor) } // TODO: add backoff @@ -165,6 +168,7 @@ private[group] final class GroupProcessor protected def handleQuery: PartialFunction[Any, Future[Any]] = { case _: GroupQuery if state.isNotCreated ⇒ FastFuture.failed(GroupNotFound(groupId)) + case _: GroupQuery if state.isDeleted ⇒ FastFuture.failed(GroupAlreadyDeleted(groupId)) case GetAccessHash() ⇒ getAccessHash case GetTitle() ⇒ getTitle case GetIntegrationToken(optClient) ⇒ getIntegrationToken(optClient) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index e6de46c236..b6527fbbac 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -136,9 +136,9 @@ trait GroupQueryHandlers { canEditAdminList = Some(state.permissions.canEditAdmins(clientUserId)), canViewAdminList = Some(state.permissions.canViewAdmins(clientUserId)), canEditAdminSettings = Some(state.permissions.canEditAdminSettings(clientUserId)), - canInviteViaLink = None, - canDelete = None, - canLeave = None + canInviteViaLink = Some(state.permissions.canInviteViaLink(clientUserId)), + canDelete = Some(state.permissions.canDelete(clientUserId)), + canLeave = Some(state.permissions.canLeave(clientUserId)) ) ) } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 77ec5178ab..fa51af8ce9 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -88,6 +88,7 @@ private[group] object GroupState { accessHash = 0L, adminSettings = AdminSettings.PlainDefault, bot = None, + deletedAt = None, //??? extensions = Map.empty @@ -120,6 +121,7 @@ private[group] final case class GroupState( accessHash: Long, adminSettings: AdminSettings, bot: Option[Bot], + deletedAt: Option[Instant], extensions: Map[Int, Array[Byte]] ) extends ProcessorState[GroupState] { @@ -148,6 +150,8 @@ private[group] final case class GroupState( val isCreated = createdAt.nonEmpty + val isDeleted = deletedAt.nonEmpty + //TODO: add on commit(not during recovery!) hook to make group with async members, when more than 100 def isAsyncMembers = groupType match { @@ -262,6 +266,8 @@ private[group] final case class GroupState( this.copy(adminSettings = AdminSettings.fromBitMask(bitMask)) case HistoryBecameShared(_, _) ⇒ this.copy(isHistoryShared = true) + case GroupDeleted(ts, _) ⇒ + this.copy(deletedAt = Some(ts)) // deprecated events case UserBecameAdmin(_, userId, _) ⇒ @@ -309,6 +315,12 @@ private[group] final case class GroupState( isAdmin(clientUserId) || (isMember(clientUserId) && adminSettings.canMembersInvite) + /** + * only owner and admins can invite via link + */ + def canInviteViaLink(clientUserId: Int) = + isOwner(clientUserId) || isAdmin(clientUserId) + /** * owner and admins can kick members */ @@ -344,5 +356,16 @@ private[group] final case class GroupState( // only owner can change admin settings def canEditAdminSettings(clientUserId: Int): Boolean = isOwner(clientUserId) + + // only owner can delete group + def canDelete(clientUserId: Int): Boolean = isOwner(clientUserId) + + /** + * for now, owner can't leave group. + * He can either transfer ownership and leave group + * or delete group completely. + */ + def canLeave(clientUserId: Int): Boolean = !isOwner(clientUserId) + } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala index e974152fbb..b4df43f301 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala @@ -10,6 +10,7 @@ import im.actor.api.rpc.messaging.{ ApiServiceMessage, UpdateMessage } import im.actor.concurrent.FutureExt import im.actor.server.acl.ACLUtils import im.actor.server.group.GroupCommands.{ Invite, Join, Kick, Leave } +import im.actor.server.group.GroupErrors.CantLeaveGroup import im.actor.server.group.GroupEvents.{ UserInvited, UserJoined, UserKicked, UserLeft } import im.actor.server.persist.{ GroupInviteTokenRepo, GroupUserRepo } import im.actor.server.sequence.{ Optimization, SeqState, SeqStateDate } @@ -336,6 +337,8 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { protected def leave(cmd: Leave): Unit = { if (state.nonMember(cmd.userId)) { sender() ! notMember + } else if (!state.permissions.canLeave(cmd.userId)) { + sender() ! Status.Failure(CantLeaveGroup) } else { persist(UserLeft(Instant.now, cmd.userId)) { evt ⇒ // no commit here. it will be after service message sent @@ -344,28 +347,32 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { val updateObsolete = UpdateGroupUserLeaveObsolete(groupId, cmd.userId, dateMillis, cmd.randomId) - // TODO: merge, they are almost identical - val leftUserUpdatesNew = - if (state.groupType.isChannel) List( - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), - UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), - UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), - UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), - UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) - ) - else List( + val leftUserUpdatesNew: Vector[Update] = { + val commonUpdates = Vector( + UpdateGroupCanSendMessagesChanged(groupId, canSendMessages = false), UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupMembersUpdated(groupId, members = Vector.empty), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) + UpdateGroupCanInviteViaLink(groupId, canInviteViaLink = false), + UpdateGroupCanLeaveChanged(groupId, canLeaveChanged = false), + UpdateGroupCanDeleteChanged(groupId, canDeleteChanged = false) ) + if (state.groupType.isChannel) { + (UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false) +: + commonUpdates) :+ + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) + } else { + commonUpdates ++ Vector( + UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), + UpdateGroupMembersUpdated(groupId, members = Vector.empty), + UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) + ) + } + } + val membersUpdateNew = if (state.groupType.isChannel) { // if channel, or group is big enough UpdateGroupMembersCountChanged( @@ -485,30 +492,31 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { val updateObsolete = UpdateGroupUserKickObsolete(groupId, cmd.kickedUserId, cmd.kickerUserId, dateMillis, cmd.randomId) - // TODO: merge, they are almost identical - val kickedUserUpdatesNew: List[Update] = - if (state.groupType.isChannel) List( + val kickedUserUpdatesNew: Vector[Update] = { + val commonUpdates = Vector( UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), + UpdateGroupCanSendMessagesChanged(groupId, canSendMessages = false), UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), - UpdateGroupMemberChanged(groupId, isMember = false) - ) - else List( - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), - UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), - UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), - UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), - UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), - UpdateGroupMembersUpdated(groupId, members = Vector.empty), - UpdateGroupMemberChanged(groupId, isMember = false) + UpdateGroupCanInviteViaLink(groupId, canInviteViaLink = false), + UpdateGroupCanLeaveChanged(groupId, canLeaveChanged = false), + UpdateGroupCanDeleteChanged(groupId, canDeleteChanged = false) ) + if (state.groupType.isChannel) { + commonUpdates :+ UpdateGroupMemberChanged(groupId, isMember = false) + } else { + commonUpdates ++ Vector( + UpdateGroupMembersUpdated(groupId, members = Vector.empty), + UpdateGroupMemberChanged(groupId, isMember = false) + ) + } + } + val membersUpdateNew: Update = if (newState.groupType.isChannel) { // if channel, or group is big enough UpdateGroupMembersCountChanged( @@ -618,7 +626,6 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // Updates that will be sent to user, when he enters group. // Helps clients that have this group to refresh it's data. - // TODO: review when channels will be added private def refreshGroupUpdates(newState: GroupState, userId: Int): List[Update] = List( UpdateGroupMemberChanged(groupId, isMember = true), UpdateGroupAboutChanged(groupId, newState.about), @@ -626,8 +633,17 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { UpdateGroupTopicChanged(groupId, newState.topic), UpdateGroupTitleChanged(groupId, newState.title), UpdateGroupOwnerChanged(groupId, newState.ownerUserId), - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = newState.permissions.canViewMembers(userId)), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = true) // TODO: figure out right value + UpdateGroupCanSendMessagesChanged(groupId, newState.permissions.canSendMessage(userId)), + UpdateGroupCanViewMembersChanged(groupId, newState.permissions.canViewMembers(userId)), + UpdateGroupCanInviteMembersChanged(groupId, newState.permissions.canInvitePeople(userId)), + UpdateGroupCanEditInfoChanged(groupId, newState.permissions.canEditInfo(userId)), + UpdateGroupCanEditUsernameChanged(groupId, newState.permissions.canEditShortName(userId)), + UpdateGroupCanEditAdminsChanged(groupId, newState.permissions.canEditAdmins(userId)), + UpdateGroupCanViewAdminsChanged(groupId, newState.permissions.canViewAdmins(userId)), + UpdateGroupCanInviteViaLink(groupId, newState.permissions.canInviteViaLink(userId)), + UpdateGroupCanLeaveChanged(groupId, newState.permissions.canLeave(userId)), + UpdateGroupCanDeleteChanged(groupId, newState.permissions.canDelete(userId)), + UpdateGroupCanEditAdminSettingsChanged(groupId, newState.permissions.canEditAdminSettings(userId)) // UpdateGroupExtChanged(groupId, newState.extension) //TODO: figure out and fix // if(bigGroup) UpdateGroupMembersCountChanged(groupId, newState.extension) ) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala index 7f517876c4..e74b725349 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala @@ -50,7 +50,10 @@ object Optimization extends MessageParsing { UpdateGroupCanEditUsernameChanged.header, UpdateGroupCanEditAdminsChanged.header, UpdateGroupCanViewAdminsChanged.header, - UpdateGroupCanEditAdminSettingsChanged.header + UpdateGroupCanEditAdminSettingsChanged.header, + UpdateGroupCanInviteViaLink.header, + UpdateGroupCanLeaveChanged.header, + UpdateGroupCanDeleteChanged.header ) if (deliveryTag == GroupV2) emptyUpdate diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/api/rpc/PeerHelpers.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/api/rpc/PeerHelpers.scala index 6d67738c4e..af4797e4d9 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/api/rpc/PeerHelpers.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/api/rpc/PeerHelpers.scala @@ -7,7 +7,7 @@ import im.actor.api.rpc.CommonRpcErrors.InvalidAccessHash import im.actor.api.rpc.peers._ import im.actor.server.acl.ACLUtils._ import im.actor.server.db.DbExtension -import im.actor.server.group.GroupErrors.GroupNotFound +import im.actor.server.group.GroupErrors.{ GroupAlreadyDeleted, GroupNotFound } import im.actor.server.user.UserErrors.UserNotFound import slick.dbio.DBIO @@ -83,8 +83,9 @@ object PeerHelpers { } private def handleNotFound: PartialFunction[Throwable, RpcError] = { - case _: UserNotFound ⇒ CommonRpcErrors.UserNotFound - case _: GroupNotFound ⇒ CommonRpcErrors.GroupNotFound - case e ⇒ throw e + case _: UserNotFound ⇒ CommonRpcErrors.UserNotFound + case _: GroupNotFound ⇒ CommonRpcErrors.GroupNotFound + case _: GroupAlreadyDeleted ⇒ CommonRpcErrors.GroupDeleted + case e ⇒ throw e } } diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/files/FilesServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/files/FilesServiceImpl.scala index ec63b7cd32..f75bfaf914 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/files/FilesServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/files/FilesServiceImpl.scala @@ -6,7 +6,7 @@ import java.time.temporal.ChronoUnit import akka.actor._ import akka.http.scaladsl.util.FastFuture import cats.data.Xor -import im.actor.api.rpc.CommonRpcErrors.IntenalError +import im.actor.api.rpc.CommonRpcErrors.InternalError import im.actor.api.rpc.FileRpcErrors.UnsupportedSignatureAlgorithm import im.actor.api.rpc._ import im.actor.api.rpc.files._ diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala index 83e425bab7..ecf61be123 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala @@ -18,6 +18,7 @@ object GroupRpcErrors { val InvalidInviteToken = RpcError(403, "INVALID_INVITE_TOKEN", "Invalid invite token!", false, None) val InvalidInviteGroup = RpcError(403, "INVALID_INVITE_GROUP", "Invalid group name provided!", false, None) val GroupNotPublic = RpcError(400, "GROUP_IS_NOT_PUBLIC", "The group is not public.", false, None) + val CantLeaveGroup = RpcError(403, "CANT_LEAVE_GROUP", "You can't leave this group!", false, None) val InvalidShortName = RpcError(400, "GROUP_SHORT_NAME_INVALID", "Invalid group short name. Valid short name should contain from 5 to 32 characters, and may consist of latin characters, numbers and underscores", false, None) val ShortNameTaken = RpcError(400, "GROUP_SHORT_NAME_TAKEN", "This short name already belongs to other user or group, we are sorry!", false, None) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index fc654f9019..7e03397d99 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -16,7 +16,7 @@ import im.actor.api.rpc.users.ApiUser import im.actor.concurrent.FutureExt import im.actor.server.acl.ACLUtils import im.actor.server.db.DbExtension -import im.actor.server.file.{ FileErrors, FileStorageAdapter, FileStorageExtension, ImageUtils } +import im.actor.server.file.{ FileErrors, ImageUtils } import im.actor.server.group._ import im.actor.server.model.GroupInviteToken import im.actor.server.names.GlobalNamesStorageKeyValueStorage @@ -459,7 +459,23 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act } } - protected def doHandleDeleteGroup(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = ??? + protected def doHandleDeleteGroup(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = + authorized(clientData) { client ⇒ + withGroupOutPeer(groupPeer) { + for { + SeqState(seq, state) ← groupExt.deleteGroup(groupPeer.groupId, client.userId, client.authId) + } yield Ok(ResponseSeq(seq, state.toByteArray)) + } + } + + protected def doHandleShareHistory(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = + authorized(clientData) { client ⇒ + withGroupOutPeer(groupPeer) { + for { + SeqState(seq, state) ← groupExt.makeHistoryShared(groupPeer.groupId, client.userId, client.authId) + } yield Ok(ResponseSeq(seq, state.toByteArray)) + } + } private def usersOrPeers(userIds: Vector[Int], stripEntities: Boolean)(implicit client: AuthorizedClientData): Future[(Vector[ApiUser], Vector[ApiUserOutPeer])] = if (stripEntities) { @@ -594,6 +610,7 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act case GroupErrors.InvalidShortName ⇒ GroupRpcErrors.InvalidShortName case GroupErrors.ShortNameTaken ⇒ GroupRpcErrors.ShortNameTaken case GroupErrors.NoPermission ⇒ GroupRpcErrors.NoPermission + case GroupErrors.CantLeaveGroup ⇒ GroupRpcErrors.CantLeaveGroup } } diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala index 18008066e3..affe506234 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala @@ -46,6 +46,7 @@ trait HistoryHandlers { } } + // FIXME: handle clear chat for groups with shared history override def doHandleClearChat(peer: ApiOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = authorized(clientData) { implicit client ⇒ val update = UpdateChatClear(peer.asPeer) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/MessagingHandlers.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/MessagingHandlers.scala index 7715069165..83a27e0f76 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/MessagingHandlers.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/MessagingHandlers.scala @@ -3,7 +3,7 @@ package im.actor.server.api.rpc.service.messaging import akka.http.scaladsl.util.FastFuture import akka.util.Timeout import cats.data.Xor -import im.actor.api.rpc.CommonRpcErrors.IntenalError +import im.actor.api.rpc.CommonRpcErrors.InternalError import im.actor.api.rpc.{ CommonRpcErrors, _ } import im.actor.api.rpc.messaging._ import im.actor.api.rpc.misc._ @@ -71,7 +71,7 @@ private[messaging] trait MessagingHandlers extends PeersImplicits (for { histMessage ← fromFutureOption(NotAllowedToEdit)(getEditableHistoryMessage(peer, randomId)) _ ← fromBoolean(NotInTimeWindow)(inTimeWindow(histMessage.date.getMillis)) - apiMessage ← fromXor((e: Any) ⇒ IntenalError)(Xor.fromEither(parseMessage(histMessage.messageContentData))) + apiMessage ← fromXor((e: Any) ⇒ InternalError)(Xor.fromEither(parseMessage(histMessage.messageContentData))) _ ← fromBoolean(NotTextMessage)(apiMessage match { case _: ApiTextMessage ⇒ true case _ ⇒ false From 5f964ae463d49eab694d18846f18cfd5ef0dd2cd Mon Sep 17 00:00:00 2001 From: rockjam Date: Wed, 20 Jul 2016 18:14:30 +0300 Subject: [PATCH 040/253] fix(server:groups): take group type from event --- .../scala/im/actor/server/group/AdminCommandHandlers.scala | 3 +++ .../src/main/scala/im/actor/server/group/GroupState.scala | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala index e3dda1402f..566d29f3c9 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala @@ -366,6 +366,9 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { UpdateGroupMembersUpdated(groupId, members = Vector.empty) ) + // TODO: add UpdateIsDeleted + // TODO: for old API updates as in leacve + val result: Future[SeqState] = for { _ ← db.run(HistoryMessageRepo.deleteAll(cmd.clientUserId, apiGroupPeer.asModel)) _ ← Future.traverse(deleteGroupMembersUpdates) { update ⇒ diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index fa51af8ce9..c289fdd382 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -167,6 +167,7 @@ private[group] final case class GroupState( override def updated(e: Event): GroupState = e match { case evt: Created ⇒ + val typeOfGroup = evt.typ.getOrElse(GroupType.General) this.copy( id = evt.groupId, createdAt = Some(evt.ts), @@ -177,7 +178,7 @@ private[group] final case class GroupState( avatar = None, topic = None, shortName = None, - groupType = evt.typ.getOrElse(GroupType.General), + groupType = typeOfGroup, isHidden = evt.isHidden getOrElse false, isHistoryShared = evt.isHistoryShared getOrElse false, members = ( @@ -194,7 +195,7 @@ private[group] final case class GroupState( invitedUserIds = evt.userIds.filterNot(_ == evt.creatorUserId).toSet, accessHash = evt.accessHash, adminSettings = - if (groupType.isChannel) AdminSettings.ChannelsDefault + if (typeOfGroup.isChannel) AdminSettings.ChannelsDefault else AdminSettings.PlainDefault, bot = None, extensions = (evt.extensions map { //TODO: validate is it right? From 14ea10e038e443ed3d6e881dd37ebb7608e83de1 Mon Sep 17 00:00:00 2001 From: rockjam Date: Wed, 20 Jul 2016 22:48:09 +0300 Subject: [PATCH 041/253] fix(server:groups): forbid to clear chats with shared history --- .../service/messaging/HistoryHandlers.scala | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala index affe506234..1735f482cd 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala @@ -46,28 +46,30 @@ trait HistoryHandlers { } } - // FIXME: handle clear chat for groups with shared history override def doHandleClearChat(peer: ApiOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = - authorized(clientData) { implicit client ⇒ - val update = UpdateChatClear(peer.asPeer) + authorized(clientData) { client ⇒ + val canClearChat = peer.`type` match { + case ApiPeerType.Private | ApiPeerType.EncryptedPrivate ⇒ + FastFuture.successful(true) + case ApiPeerType.Group ⇒ + groupExt.isHistoryShared(peer.id) map (!_) + } - val action = (for { - _ ← fromDBIOBoolean(CommonRpcErrors.forbidden("Clearing of public chats is forbidden")) { - if (peer.`type` == ApiPeerType.Private) { - DBIO.successful(true) - } else { - DBIO.from(groupExt.isHistoryShared(peer.id)) flatMap (isHistoryShared ⇒ DBIO.successful(!isHistoryShared)) - } + for { + canDelete ← canClearChat + SeqState(seq, state) ← if (canDelete) { + for { + _ ← db.run(HistoryMessageRepo.deleteAll(client.userId, peer.asModel)) + seqState ← seqUpdExt.deliverClientUpdate( + client.userId, + client.authId, + update = UpdateChatClear(peer.asPeer) + ) + } yield seqState + } else { + FastFuture.successful(Error(CommonRpcErrors.forbidden("Can't clear chat with shared history"))) } - _ ← fromDBIO(HistoryMessageRepo.deleteAll(client.userId, peer.asModel)) - seqState ← fromFuture(seqUpdExt.deliverClientUpdate( - client.userId, - client.authId, - update, - pushRules = seqUpdExt.pushRules(isFat = false, None) - )) - } yield ResponseSeq(seqState.seq, seqState.state.toByteArray)).value - db.run(action) + } yield Ok(ResponseSeq(seq, state.toByteArray)) } override def doHandleDeleteChat(peer: ApiOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = { From 4058846c023376147b82cbf74b17e6a1396ceee7 Mon Sep 17 00:00:00 2001 From: rockjam Date: Wed, 20 Jul 2016 23:02:31 +0300 Subject: [PATCH 042/253] fix(server:groups): push leave update to client with old group API --- .../server/group/AdminCommandHandlers.scala | 33 +++++++++++++++++-- .../actor/server/group/GroupProcessor.scala | 1 + 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala index 566d29f3c9..50fb910bff 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala @@ -14,7 +14,7 @@ import im.actor.server.acl.ACLUtils import im.actor.server.group.GroupCommands.{ DeleteGroup, DismissUserAdmin, MakeHistoryShared, MakeUserAdmin, RevokeIntegrationToken, RevokeIntegrationTokenAck, TransferOwnership, UpdateAdminSettings, UpdateAdminSettingsAck } import im.actor.server.group.GroupErrors.{ NotAMember, NotAdmin, UserAlreadyAdmin, UserAlreadyNotAdmin } import im.actor.server.group.GroupEvents.{ AdminSettingsUpdated, AdminStatusChanged, GroupDeleted, HistoryBecameShared, IntegrationTokenRevoked, OwnerChanged } -import im.actor.server.persist.{ GroupBotRepo, GroupUserRepo, HistoryMessageRepo } +import im.actor.server.persist.{ GroupBotRepo, GroupInviteTokenRepo, GroupUserRepo, HistoryMessageRepo } import im.actor.server.sequence.{ SeqState, SeqStateDate } import scala.concurrent.Future @@ -346,6 +346,10 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { persist(GroupDeleted(Instant.now, cmd.clientUserId)) { evt ⇒ val newState = commit(evt) + val dateMillis = evt.ts.toEpochMilli + val randomId = ACLUtils.randomLong() + + // TODO: add UpdateIsDeleted val deleteGroupMembersUpdates: Vector[Update] = Vector( UpdateGroupCanSendMessagesChanged(groupId, canSendMessages = false), UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), @@ -366,11 +370,34 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { UpdateGroupMembersUpdated(groupId, members = Vector.empty) ) - // TODO: add UpdateIsDeleted - // TODO: for old API updates as in leacve + //TODO: remove deprecated. GroupInviteTokenRepo don't have replacement yet. + newState.memberIds foreach { userId ⇒ + db.run( + for { + _ ← GroupUserRepo.delete(groupId, userId) + _ ← GroupInviteTokenRepo.revoke(groupId, userId) + } yield () + ) + } val result: Future[SeqState] = for { _ ← db.run(HistoryMessageRepo.deleteAll(cmd.clientUserId, apiGroupPeer.asModel)) + + /////////////////////////// + // Groups V1 API updates // + /////////////////////////// + + // push all members updates about other members left group + _ ← FutureExt.ftraverse(newState.memberIds.toSeq) { userId ⇒ + seqUpdExt.broadcastPeopleUpdate( + userIds = newState.memberIds - userId, + update = UpdateGroupUserLeaveObsolete(groupId, userId, dateMillis, randomId) + ) + } + + /////////////////////////// + // Groups V2 API updates // + /////////////////////////// _ ← Future.traverse(deleteGroupMembersUpdates) { update ⇒ seqUpdExt.broadcastPeopleUpdate(newState.memberIds, update) } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index 3e24dc56f1..faf98a19a5 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -21,6 +21,7 @@ import im.actor.server.user.UserExtension import scala.concurrent.duration._ import scala.concurrent.{ ExecutionContext, Future } +//TODO: maybe add dateMillis trait GroupEvent extends TaggedEvent { val ts: Instant From ee530970f8de2096063534e644df9d64a33a97e4 Mon Sep 17 00:00:00 2001 From: rockjam Date: Wed, 20 Jul 2016 23:08:20 +0300 Subject: [PATCH 043/253] chore(server): update actor.json --- .../actor-core/src/main/actor-api/actor.json | 122 ++++++------------ 1 file changed, 42 insertions(+), 80 deletions(-) diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index 2fe4b769ee..30da5aee54 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -7936,6 +7936,12 @@ "category": "full", "description": " Can user send messages. Default is equals isMember for Group and false for others." }, + { + "type": "reference", + "argument": "isDeleted", + "category": "full", + "description": " Is this group deleted" + }, { "type": "reference", "argument": "ext", @@ -8053,6 +8059,14 @@ "id": 26, "name": "canSendMessage" }, + { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 27, + "name": "isDeleted" + }, { "type": { "type": "opt", @@ -9320,6 +9334,32 @@ ] } }, + { + "type": "update", + "content": { + "name": "GroupDeleted", + "header": 2658, + "doc": [ + "Update about group deleted", + { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + } + ], + "attributes": [ + { + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + } + ] + } + }, { "type": "comment", "content": " " @@ -12693,39 +12733,9 @@ }, { "type": "reference", - "argument": "title", - "category": "full", - "description": " Peer title" - }, - { - "type": "reference", - "argument": "description", + "argument": "optMatchString", "category": "full", "description": " Description" - }, - { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Members count" - }, - { - "type": "reference", - "argument": "dateCreated", - "category": "full", - "description": " Group Creation Date" - }, - { - "type": "reference", - "argument": "creator", - "category": "full", - "description": " Group Creator uid" - }, - { - "type": "reference", - "argument": "isPublic", - "category": "full", - "description": " Is group public" } ], "attributes": [ @@ -12737,61 +12747,13 @@ "id": 1, "name": "peer" }, - { - "type": "string", - "id": 2, - "name": "title" - }, { "type": { "type": "opt", "childType": "string" }, "id": 3, - "name": "description" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 4, - "name": "membersCount" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "date" - } - }, - "id": 5, - "name": "dateCreated" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 6, - "name": "creator" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 7, - "name": "isPublic" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 8, - "name": "isJoined" + "name": "optMatchString" } ] } From fcde16e097cac77f4c9e6541cbbf851287ae6110 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 21 Jul 2016 02:18:38 +0300 Subject: [PATCH 044/253] feat(server:groups,search): isDeleted and update in groups; search users and groups by global name prefix --- .../server/group/AdminCommandHandlers.scala | 3 +- .../server/group/GroupQueryHandlers.scala | 3 +- .../server/names/GlobalNamesStorage.scala | 35 +++++ .../im/actor/server/user/UserOperations.scala | 8 +- .../im/actor/server/persist/UserRepo.scala | 20 ++- .../service/search/SearchServiceImpl.scala | 120 +++++++++++++----- 6 files changed, 146 insertions(+), 43 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala index 50fb910bff..0dbd1666bf 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala @@ -367,7 +367,8 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { if (newState.groupType.isChannel) UpdateGroupMembersCountChanged(groupId, membersCount = 0) else - UpdateGroupMembersUpdated(groupId, members = Vector.empty) + UpdateGroupMembersUpdated(groupId, members = Vector.empty), + UpdateGroupDeleted(groupId) ) //TODO: remove deprecated. GroupInviteTokenRepo don't have replacement yet. diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index b6527fbbac..cfde4c1f59 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -108,7 +108,8 @@ trait GroupQueryHandlers { case Channel ⇒ ApiGroupType.CHANNEL case General | Unrecognized(_) ⇒ ApiGroupType.GROUP }), - canSendMessage = Some(state.permissions.canSendMessage(clientUserId)) + canSendMessage = Some(state.permissions.canSendMessage(clientUserId)), + isDeleted = Some(state.isDeleted) ) ) } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala b/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala index d6cae1bc9e..dc766a5ef7 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala @@ -34,6 +34,41 @@ final class GlobalNamesStorageKeyValueStorage(implicit system: ActorSystem) { case GlobalNameOwner(OwnerType.User, userId) ⇒ userId }) + /** + * Search groups(id -> global name) by global name prefix + * Looks only in GlobalNamesStorage + */ + def groupIdsByPrefix(namePrefix: String): Future[IndexedSeq[(Int, String)]] = { + conn.run(GlobalNamesStorage.getByPrefix(namePrefix)) map { searchResults ⇒ + searchResults flatMap { + case (fullName, bytes) ⇒ + Some(GlobalNameOwner.parseFrom(bytes)) filter (_.ownerType.isGroup) map (o ⇒ o.ownerId → fullName) + } + } + } + + /** + * Search users(id -> global name) by global name prefix + * Looks in both GlobalNamesStorage and UserRepo(compatibility mode) + */ + def userIdsByPrefix(namePrefix: String): Future[IndexedSeq[(Int, String)]] = { + val kvSearch = conn.run(GlobalNamesStorage.getByPrefix(namePrefix)) map { searchResults ⇒ + searchResults flatMap { + case (fullName, bytes) ⇒ + Some(GlobalNameOwner.parseFrom(bytes)) filter (_.ownerType.isUser) map (o ⇒ o.ownerId → fullName) + } + } + val compatSearch = db.run(UserRepo.findByNicknamePrefix(namePrefix)) map { users ⇒ + users flatMap { user ⇒ + user.nickname map (user.id → _) + } + } + for { + kv ← kvSearch + compat ← compatSearch + } yield kv ++ compat + } + def getGroupId(name: String): Future[Option[Int]] = getOwner(name) map (_.collect { case GlobalNameOwner(OwnerType.Group, groupId) ⇒ groupId diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/user/UserOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/user/UserOperations.scala index a8ca2f0903..56cd6bb307 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/user/UserOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/user/UserOperations.scala @@ -11,6 +11,7 @@ import im.actor.server.auth.DeviceInfo import im.actor.server.bots.BotCommand import im.actor.server.db.DbExtension import im.actor.server.file.Avatar +import im.actor.server.names.GlobalNamesStorageKeyValueStorage import im.actor.server.persist.UserRepo import im.actor.server.pubsub.PubSubExtension import im.actor.server.sequence.{ SeqState, SeqUpdatesExtension } @@ -144,6 +145,7 @@ private[user] sealed trait Queries { implicit val system: ActorSystem import system.dispatcher val log: LoggingAdapter + private lazy val globalNamesStorage = new GlobalNamesStorageKeyValueStorage implicit val timeout: Timeout @@ -192,7 +194,11 @@ private[user] sealed trait Queries { def isAdmin(userId: Int): Future[Boolean] = (viewRegion.ref ? IsAdmin(userId)).mapTo[IsAdminResponse].map(_.isAdmin) - def findUserIds(query: String): Future[Seq[Int]] = DbExtension(system).db.run(UserRepo.findIds(query)) + def findUserIds(query: String): Future[Seq[Int]] = + for { + byPhoneAndEmail ← DbExtension(system).db.run(UserRepo.findIds(query)) + byNickname ← globalNamesStorage.getUserId(query) + } yield byPhoneAndEmail ++ byNickname } private[user] sealed trait AuthCommands { diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/UserRepo.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/UserRepo.scala index efea1aa4e7..35391e0661 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/UserRepo.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/UserRepo.scala @@ -40,11 +40,13 @@ object UserRepo { val byIdC = Compiled(byId _) val nameByIdC = Compiled(nameById _) - private def byNickname(nickname: Rep[String]) = users filter (_.nickname.toLowerCase === nickname.toLowerCase) - private def idsByNickname(nickname: Rep[String]) = byNickname(nickname).map(_.id) + private def byNickname(nickname: Rep[String]) = + users filter (_.nickname.toLowerCase === nickname.toLowerCase) + private def byNicknamePrefix(nickPrefix: Rep[String]) = + users filter (_.nickname.toLowerCase.like(nickPrefix.toLowerCase)) private val byNicknameC = Compiled(byNickname _) - private val idsByNicknameC = Compiled(idsByNickname _) + private val byNicknamePrefixC = Compiled(byNicknamePrefix _) def byPhone(phone: Rep[Long]) = (for { phones ← UserPhoneRepo.phones.filter(_.number === phone) @@ -107,24 +109,30 @@ object UserRepo { users.filter(_.id inSet ids).map(u ⇒ (u.id, u.accessSalt)).result @deprecated("user GlobalNamesStorageKeyValueStorage instead", "2016-07-17") - def findByNickname(query: String) = { + def findByNickname(query: String): DBIO[Option[User]] = { val nickname = if (query.startsWith("@")) query.drop(1) else query byNicknameC(nickname).result.headOption } + @deprecated("user GlobalNamesStorageKeyValueStorage instead", "2016-07-17") + def findByNicknamePrefix(query: String): DBIO[Seq[User]] = { + val nickname: String = + if (query.startsWith("@")) query.drop(1) else query + byNicknamePrefixC(nickname).result + } + def findIdsByEmail(email: String) = idsByEmailC(email).result.headOption def findIds(query: String)(implicit ec: ExecutionContext) = for { e ← idsByEmailC(query).result - n ← idsByNicknameC(query).result p ← PhoneNumberUtils.normalizeStr(query) .headOption .map(idByPhoneC(_).result) .getOrElse(DBIO.successful(Nil)) - } yield e ++ n ++ p + } yield e ++ p @deprecated("user GlobalNamesStorageKeyValueStorage instead", "2016-07-17") def setNickname(userId: Int, nickname: Option[String]) = diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala index 82c3f34db7..1bff78bb62 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala @@ -12,8 +12,8 @@ import im.actor.concurrent.FutureExt import im.actor.server.db.DbExtension import im.actor.server.dialog.DialogExtension import im.actor.server.group.{ GroupExtension, GroupUtils } +import im.actor.server.names.GlobalNamesStorageKeyValueStorage import im.actor.server.persist.contact.UserContactRepo -import im.actor.server.persist.GroupRepo import im.actor.server.user.UserExtension import scala.concurrent.{ ExecutionContext, Future } @@ -21,9 +21,12 @@ import scala.concurrent.{ ExecutionContext, Future } class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { override implicit protected val ec: ExecutionContext = system.dispatcher - protected val db = DbExtension(system).db - protected val userExt = UserExtension(system) - protected val groupExt = GroupExtension(system) + private val db = DbExtension(system).db + private val userExt = UserExtension(system) + private val groupExt = GroupExtension(system) + private val globalNamesStorage = new GlobalNamesStorageKeyValueStorage + + private val EmptySearch = ResponsePeerSearch(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty) override def doHandlePeerSearch( query: IndexedSeq[ApiSearchCondition], @@ -38,9 +41,16 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { } texts.toList match { - case text :: Nil ⇒ searchResult(peerTypes.toVector, Some(text), optimizations) - case Nil ⇒ searchResult(peerTypes.toVector, None, optimizations) - case _ ⇒ FastFuture.successful(Error(RpcError(400, "INVALID_QUERY", "Invalid query.", canTryAgain = false, None))) + case text :: Nil if text.length < 3 ⇒ + FastFuture.successful(Ok(EmptySearch)) + case text :: Nil ⇒ + val tps = if (peerTypes.isEmpty) + Set(ApiSearchPeerType.Public, ApiSearchPeerType.Contacts, ApiSearchPeerType.Groups) + else + peerTypes + searchResult(tps.toVector, Some(text), optimizations) + case Nil ⇒ searchResult(peerTypes.toVector, None, optimizations) + case _ ⇒ FastFuture.successful(Error(RpcError(400, "INVALID_QUERY", "Invalid query.", canTryAgain = false, None))) } } } @@ -73,6 +83,7 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { case ApiPeerType.Group ⇒ (gids :+ pid, uids) } } + // TODO: make like here: im.actor.server.api.rpc.service.groups.GroupsServiceImpl.usersOrPeers (groups, users) ← GroupUtils.getGroupsUsers(groupIds, userIds, client.userId, client.authId) } yield { val stripEntities = optimizations.contains(ApiUpdateOptimization.STRIP_ENTITIES) @@ -86,6 +97,8 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { } } + type PeerAndMatchString = (ApiPeer, String) + private def search(pt: ApiSearchPeerType.Value, text: Option[String])(implicit clientData: AuthorizedClientData): Future[IndexedSeq[ApiPeerSearchResult]] = { pt match { case ApiSearchPeerType.Contacts ⇒ @@ -94,39 +107,85 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { } yield users map result case ApiSearchPeerType.Groups ⇒ for { - groups ← searchGroups(text) - } yield groups map (result(_, isPublic = false)) + groups ← searchLocalGroups(text) + } yield groups map result + // global search case ApiSearchPeerType.Public ⇒ + val usersFull = searchGlobalUsers(text) + val usersPrefix = searchGlobalUsersPrefix(text) + val groupsPrefix = searchGlobalGroupsPrefix(text) for { - groups ← searchPublic(text) - } yield groups map (result(_, isPublic = true)) + uf ← usersFull + up ← usersPrefix + gp ← groupsPrefix + } yield (uf map result) ++ (up map result) ++ (gp map result) } } + // from contacts private def result(apiUser: ApiUser): ApiPeerSearchResult = ApiPeerSearchResult( peer = ApiPeer(ApiPeerType.Private, apiUser.id), - title = apiUser.localName.getOrElse(apiUser.name), - description = None, - membersCount = None, - dateCreated = None, - creator = None, - isPublic = None, - isJoined = None + optMatchString = None ) - private def result(apiGroup: ApiGroup, isPublic: Boolean): ApiPeerSearchResult = + // from local groups + private def result(apiGroup: ApiGroup): ApiPeerSearchResult = ApiPeerSearchResult( peer = ApiPeer(ApiPeerType.Group, apiGroup.id), - title = apiGroup.title, - description = apiGroup.about, - membersCount = Some(apiGroup.members.size), - dateCreated = Some(apiGroup.createDate), - creator = Some(apiGroup.creatorUserId), - isPublic = Some(isPublic), - isJoined = apiGroup.isMember + optMatchString = None + ) + + // from global peer + private def result(peer: ApiPeer): ApiPeerSearchResult = + ApiPeerSearchResult( + peer = peer, + optMatchString = None + ) + + // from global peer with nickname match + private def result(peerAndMatch: PeerAndMatchString): ApiPeerSearchResult = + ApiPeerSearchResult( + peer = peerAndMatch._1, + optMatchString = Some(peerAndMatch._2) ) + private def userPeersWithoutSelf(userIds: Seq[Int])(implicit client: AuthorizedClientData): Vector[ApiPeer] = + (userIds collect { + case userId if userId != client.userId ⇒ ApiPeer(ApiPeerType.Private, userId) + }).toVector + + // search users by full phone number, email or nickname + private def searchGlobalUsers(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[ApiPeer]] = { + text map { query ⇒ + userExt.findUserIds(query) map userPeersWithoutSelf + } getOrElse FastFuture.successful(Vector.empty) + } + + // search users by nickname prefix + private def searchGlobalUsersPrefix(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[PeerAndMatchString]] = { + text map { query ⇒ + globalNamesStorage.userIdsByPrefix(query) map { results ⇒ + results collect { + case (userId, nickName) if userId != client.userId ⇒ + ApiPeer(ApiPeerType.Private, userId) → nickName + } + } + } getOrElse FastFuture.successful(Vector.empty) + } + + // find groups by global name prefix + private def searchGlobalGroupsPrefix(text: Option[String]): Future[IndexedSeq[PeerAndMatchString]] = { + text map { query ⇒ + globalNamesStorage.groupIdsByPrefix(query) map { results ⇒ + results map { + case (groupId, globalName) ⇒ + ApiPeer(ApiPeerType.Group, groupId) → globalName + } + } + } getOrElse FastFuture.successful(Vector.empty) + } + private def searchContacts(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[ApiUser]] = { for { userIds ← db.run(UserContactRepo.findContactIdsActive(client.userId)) @@ -146,7 +205,7 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { } // TODO: rewrite it using async - private def searchGroups(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[ApiGroup]] = { + private def searchLocalGroups(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[ApiGroup]] = { for { ids ← DialogExtension(system).fetchGroupedDialogs(client.userId) map (_.filter(_.typ.isGroups).flatMap(_.dialogs.map(_.getPeer.id))) groups ← FutureExt.ftraverse(ids) { id ⇒ @@ -155,13 +214,6 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { } yield filterGroups(groups.toVector, text) } - private def searchPublic(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[ApiGroup]] = { - for { - groups ← db.run(GroupRepo.findPublic) // FIXME: isPublic flag is deprecated and will not appear for new groups - groups ← FutureExt.ftraverse(groups)(g ⇒ groupExt.getApiStruct(g.id, client.userId)) - } yield filterGroups(groups.toVector, text) - } - private def filterGroups(groups: IndexedSeq[ApiGroup], textOpt: Option[String]): IndexedSeq[ApiGroup] = { textOpt match { case Some(text) ⇒ From b89c9f9a15b588b966bd108cdd49b36d72006d30 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 21 Jul 2016 02:29:26 +0300 Subject: [PATCH 045/253] refactor(server): unify search results to ApiPeer --- .../service/search/SearchServiceImpl.scala | 42 +++++++------------ 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala index 1bff78bb62..c3647ec323 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala @@ -26,7 +26,7 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { private val groupExt = GroupExtension(system) private val globalNamesStorage = new GlobalNamesStorageKeyValueStorage - private val EmptySearch = ResponsePeerSearch(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty) + private val EmptyResult = ResponsePeerSearch(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty) override def doHandlePeerSearch( query: IndexedSeq[ApiSearchCondition], @@ -42,7 +42,7 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { texts.toList match { case text :: Nil if text.length < 3 ⇒ - FastFuture.successful(Ok(EmptySearch)) + FastFuture.successful(Ok(EmptyResult)) case text :: Nil ⇒ val tps = if (peerTypes.isEmpty) Set(ApiSearchPeerType.Public, ApiSearchPeerType.Contacts, ApiSearchPeerType.Groups) @@ -109,7 +109,6 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { for { groups ← searchLocalGroups(text) } yield groups map result - // global search case ApiSearchPeerType.Public ⇒ val usersFull = searchGlobalUsers(text) val usersPrefix = searchGlobalUsersPrefix(text) @@ -122,28 +121,12 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { } } - // from contacts - private def result(apiUser: ApiUser): ApiPeerSearchResult = - ApiPeerSearchResult( - peer = ApiPeer(ApiPeerType.Private, apiUser.id), - optMatchString = None - ) - - // from local groups - private def result(apiGroup: ApiGroup): ApiPeerSearchResult = - ApiPeerSearchResult( - peer = ApiPeer(ApiPeerType.Group, apiGroup.id), - optMatchString = None - ) - - // from global peer private def result(peer: ApiPeer): ApiPeerSearchResult = ApiPeerSearchResult( peer = peer, optMatchString = None ) - // from global peer with nickname match private def result(peerAndMatch: PeerAndMatchString): ApiPeerSearchResult = ApiPeerSearchResult( peer = peerAndMatch._1, @@ -186,26 +169,27 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { } getOrElse FastFuture.successful(Vector.empty) } - private def searchContacts(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[ApiUser]] = { + private def searchContacts(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[ApiPeer]] = { for { userIds ← db.run(UserContactRepo.findContactIdsActive(client.userId)) users ← FutureExt.ftraverse(userIds)(userExt.getApiStruct(_, client.userId, client.authId)) } yield filterUsers(users.toVector, text) } - private def filterUsers(users: IndexedSeq[ApiUser], textOpt: Option[String]): IndexedSeq[ApiUser] = + private def filterUsers(users: IndexedSeq[ApiUser], textOpt: Option[String]): IndexedSeq[ApiPeer] = textOpt match { case Some(text) ⇒ val lotext = text.toLowerCase users filter { user ⇒ user.name.toLowerCase.contains(lotext) || user.localName.exists(_.toLowerCase.contains(lotext)) + } map { u ⇒ + ApiPeer(ApiPeerType.Private, u.id) } - case None ⇒ users + case None ⇒ users map { u ⇒ ApiPeer(ApiPeerType.Private, u.id) } } - // TODO: rewrite it using async - private def searchLocalGroups(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[ApiGroup]] = { + private def searchLocalGroups(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[ApiPeer]] = { for { ids ← DialogExtension(system).fetchGroupedDialogs(client.userId) map (_.filter(_.typ.isGroups).flatMap(_.dialogs.map(_.getPeer.id))) groups ← FutureExt.ftraverse(ids) { id ⇒ @@ -214,16 +198,18 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { } yield filterGroups(groups.toVector, text) } - private def filterGroups(groups: IndexedSeq[ApiGroup], textOpt: Option[String]): IndexedSeq[ApiGroup] = { + private def filterGroups(groups: IndexedSeq[ApiGroup], textOpt: Option[String]): IndexedSeq[ApiPeer] = { textOpt match { case Some(text) ⇒ - groups.view.filter { group ⇒ + groups filter { group ⇒ val lotext = text.toLowerCase group.title.toLowerCase.contains(lotext) || group.about.exists(_.toLowerCase.contains(lotext)) || group.theme.exists(_.toLowerCase.contains(lotext)) - }.force - case None ⇒ groups + } map { g ⇒ + ApiPeer(ApiPeerType.Group, g.id) + } + case None ⇒ groups map { g ⇒ ApiPeer(ApiPeerType.Group, g.id) } } } } From 9b1d8566681d2d6ed963333c3cbd9385d019ae84 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 21 Jul 2016 04:03:01 +0300 Subject: [PATCH 046/253] fix(server:groups): write dummy data to state of deleted group --- .../im/actor/server/group/GroupProcessor.scala | 2 +- .../scala/im/actor/server/group/GroupState.scala | 15 ++++++++++++++- .../rpc/service/messaging/HistoryHandlers.scala | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index faf98a19a5..fd54c7dfc8 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -169,7 +169,7 @@ private[group] final class GroupProcessor protected def handleQuery: PartialFunction[Any, Future[Any]] = { case _: GroupQuery if state.isNotCreated ⇒ FastFuture.failed(GroupNotFound(groupId)) - case _: GroupQuery if state.isDeleted ⇒ FastFuture.failed(GroupAlreadyDeleted(groupId)) + // case _: GroupQuery if state.isDeleted ⇒ FastFuture.failed(GroupAlreadyDeleted(groupId)) // TODO: figure out how to propperly handle group deletion case GetAccessHash() ⇒ getAccessHash case GetTitle() ⇒ getTitle case GetIntegrationToken(optClient) ⇒ getIntegrationToken(optClient) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index c289fdd382..7ee9b0da92 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -268,8 +268,21 @@ private[group] final case class GroupState( case HistoryBecameShared(_, _) ⇒ this.copy(isHistoryShared = true) case GroupDeleted(ts, _) ⇒ - this.copy(deletedAt = Some(ts)) + // FIXME: don't implement snapshots, before figure out deleted groups behavior + this.copy( + deletedAt = Some(ts), + members = Map.empty, + invitedUserIds = Set.empty, + exUserIds = Set.empty, + bot = None, + topic = None, + about = None, + avatar = None, + adminSettings = + if (groupType.isChannel) AdminSettings.ChannelsDefault + else AdminSettings.PlainDefault + ) // deprecated events case UserBecameAdmin(_, userId, _) ⇒ this.copy( diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala index 1735f482cd..4223d3ed4d 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala @@ -140,6 +140,7 @@ trait HistoryHandlers { case ApiPeerType.Private ⇒ (uids :+ dialog.peer.id, gids) } } + // TODO: make like here: im.actor.server.api.rpc.service.groups.GroupsServiceImpl.usersOrPeers (groups, users) ← GroupUtils.getGroupsUsers(groupIds, userIds, client.userId, client.authId) archivedExist ← dialogExt.fetchArchivedDialogs(client.userId, None, 1) map (_._1.nonEmpty) showInvite ← db.run(UserContactRepo.count(client.userId)) map (_ < 5) From 58596523f853d568a9088740f2fadf7ac7f6e27f Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 21 Jul 2016 04:04:10 +0300 Subject: [PATCH 047/253] fix(server:test): compilation error --- .../im/actor/server/api/rpc/service/SearchServiceSpec.scala | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/SearchServiceSpec.scala b/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/SearchServiceSpec.scala index e4956cd936..83249eab0b 100644 --- a/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/SearchServiceSpec.scala +++ b/actor-server/actor-tests/src/test/scala/im/actor/server/api/rpc/service/SearchServiceSpec.scala @@ -40,9 +40,6 @@ final class SearchServiceSpec groups shouldBe empty users.map(_.id) shouldBe Seq(user2.id) results.length shouldBe 1 - val result = results.head - - result.title shouldBe user2.name } } } @@ -84,4 +81,4 @@ final class SearchServiceSpec } } } -} \ No newline at end of file +} From 5c357df3032a404074d9534be46ea640ae8b9b88 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 21 Jul 2016 04:35:49 +0300 Subject: [PATCH 048/253] fix(server:dialogs): load last message for peers with shared history --- .../actor/server/dialog/DialogExtension.scala | 17 +++++++++-------- .../server/persist/HistoryMessageRepo.scala | 14 ++------------ 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogExtension.scala b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogExtension.scala index 69a2611377..be400eeb5f 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogExtension.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogExtension.scala @@ -378,21 +378,22 @@ final class DialogExtensionImpl(system: ActorSystem) extends DialogExtension wit .map(_.info.get) } + private val EmptyTextMessage = ApiTextMessage(text = "", mentions = Vector.empty, ext = None) + def getApiDialog(userId: Int, info: DialogInfo, sortDate: Instant): Future[ApiDialog] = { - val emptyMessageContent = ApiTextMessage(text = "", mentions = Vector.empty, ext = None) - val emptyMessage = HistoryMessage(userId, info.peer.get, new DateTime(0), 0, 0, emptyMessageContent.header, emptyMessageContent.toByteArray, None) + val emptyMessage = HistoryMessage(userId, info.peer.get, new DateTime(0), 0, 0, EmptyTextMessage.header, EmptyTextMessage.toByteArray, None) val peer = info.peer.get for { historyOwner ← getHistoryOwner(peer, userId) - messageOpt ← getLastMessage(userId, peer) - reactions ← messageOpt map (m ⇒ db.run(fetchReactions(peer, userId, m.randomId))) getOrElse FastFuture.successful(Vector.empty) - message ← getLastMessage(userId, peer) map (_ getOrElse emptyMessage) map (_.asStruct( + lastMessageOpt ← getLastMessage(historyOwner, peer) + reactions ← lastMessageOpt map (m ⇒ db.run(fetchReactions(peer, userId, m.randomId))) getOrElse FastFuture.successful(Vector.empty) + message = lastMessageOpt.getOrElse(emptyMessage).asStruct( lastReceivedAt = new DateTime(info.lastReceivedDate.toEpochMilli), lastReadAt = new DateTime(info.lastReadDate.toEpochMilli), reactions = reactions, attributes = None - )) map (_.getOrElse(throw new RuntimeException("Failed to get message struct"))) + ) getOrElse (throw new RuntimeException("Failed to get message struct")) firstUnreadOpt ← db.run(HistoryMessageRepo.findAfter(historyOwner, peer, new DateTime(info.lastReadDate.toEpochMilli), 1) map (_.headOption map (_.ofUser(userId)))) } yield ApiDialog( peer = peer.asStruct, @@ -423,8 +424,8 @@ final class DialogExtensionImpl(system: ActorSystem) extends DialogExtension wit .withDialogEnvelope(DialogEnvelope().withSendMessage(sendMessage))).mapTo[SeqStateDate] } - private def getLastMessage(userId: Int, peer: Peer): Future[Option[HistoryMessage]] = - db.run(HistoryMessageRepo.findNewest(userId, peer)) + private def getLastMessage(historyOwner: Int, peer: Peer): Future[Option[HistoryMessage]] = + db.run(HistoryMessageRepo.findNewest(historyOwner, peer)) private def reactions(events: Seq[ReactionEvent]): Seq[MessageReaction] = { (events.view groupBy (_.code) mapValues (_ map (_.userId)) map { diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/HistoryMessageRepo.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/HistoryMessageRepo.scala index 4ce5087c68..fc80a2712b 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/HistoryMessageRepo.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/HistoryMessageRepo.scala @@ -149,23 +149,13 @@ object HistoryMessageRepo { .map(_.userId) .result - def findNewest(userId: Int, peer: Peer): SqlAction[Option[HistoryMessage], NoStream, Read] = { - val filter = { m: HistoryMessageTable ⇒ - m.userId === userId && - m.peerType === peer.typ.value && - m.peerId === peer.id - } - findNewestFilter(userId, peer, filter) - } - - private def findNewestFilter(userId: Int, peer: Peer, filterClause: HistoryMessageTable ⇒ Rep[Boolean]) = { + def findNewest(userId: Int, peer: Peer): SqlAction[Option[HistoryMessage], NoStream, Read] = notDeletedMessages - .filter(filterClause) + .filter(m ⇒ m.userId === userId && m.peerType === peer.typ.value && m.peerId === peer.id) .sortBy(_.date.desc) .take(1) .result .headOption - } def find(userId: Int, peer: Peer): FixedSqlStreamingAction[Seq[HistoryMessage], HistoryMessage, Read] = notDeletedMessages From f8ce1aa7daceca3e2ccd676b5639861b91fbb0a2 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 21 Jul 2016 05:47:02 +0300 Subject: [PATCH 049/253] fix(server): compilation error --- .../server/api/rpc/service/search/SearchServiceImpl.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala index c3647ec323..88064e02ac 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala @@ -21,7 +21,8 @@ import scala.concurrent.{ ExecutionContext, Future } class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { override implicit protected val ec: ExecutionContext = system.dispatcher - private val db = DbExtension(system).db + protected val db = DbExtension(system).db + private val userExt = UserExtension(system) private val groupExt = GroupExtension(system) private val globalNamesStorage = new GlobalNamesStorageKeyValueStorage From e53d14f514756cba6c71eae70db073224a5e47b0 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 21 Jul 2016 06:59:47 +0300 Subject: [PATCH 050/253] fix(server:sequence): rewrite difference to avoid counters madness --- .../actor/server/dialog/DialogExtension.scala | 24 ++++-- .../im/actor/server/dialog/DialogRoot.scala | 12 ++- .../operations/DeliveryOperations.scala | 5 +- .../operations/DifferenceOperations.scala | 83 ++++++++++++++++++- .../scala/im/actor/server/persist/Group.scala | 3 - .../sequence/SequenceServiceImpl.scala | 1 + 6 files changed, 111 insertions(+), 17 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogExtension.scala b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogExtension.scala index be400eeb5f..3b7d1c5220 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogExtension.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogExtension.scala @@ -463,22 +463,34 @@ final class DialogExtensionImpl(system: ActorSystem) extends DialogExtension wit } } +object DialogGroupKeys { + val Favourites = "favourites" + val Direct = "privates" + val Groups = "groups" +} + +object DialogGroupTitles { + val Favourites = "Favourites" + val Direct = "Direct Messages" + val Groups = "Groups" +} + object DialogExtension extends ExtensionId[DialogExtensionImpl] with ExtensionIdProvider { override def lookup = DialogExtension override def createExtension(system: ExtendedActorSystem) = new DialogExtensionImpl(system) def groupKey(group: DialogGroupType) = group match { - case DialogGroupType.Favourites ⇒ "favourites" - case DialogGroupType.DirectMessages ⇒ "privates" - case DialogGroupType.Groups ⇒ "groups" + case DialogGroupType.Favourites ⇒ DialogGroupKeys.Favourites + case DialogGroupType.DirectMessages ⇒ DialogGroupKeys.Direct + case DialogGroupType.Groups ⇒ DialogGroupKeys.Groups case unknown ⇒ throw DialogErrors.UnknownDialogGroupType(unknown) } def groupTitle(group: DialogGroupType) = group match { - case DialogGroupType.Favourites ⇒ "Favourites" - case DialogGroupType.DirectMessages ⇒ "Direct Messages" - case DialogGroupType.Groups ⇒ "Groups" + case DialogGroupType.Favourites ⇒ DialogGroupTitles.Favourites + case DialogGroupType.DirectMessages ⇒ DialogGroupTitles.Direct + case DialogGroupType.Groups ⇒ DialogGroupTitles.Groups case unknown ⇒ throw DialogErrors.UnknownDialogGroupType(unknown) } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala index e65030de63..e308b0f305 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala @@ -107,6 +107,7 @@ private class DialogRoot(val userId: Int, extensions: Seq[ApiExtension]) import context.dispatcher private val system = context.system + private val seqUpdExt = SeqUpdatesExtension(system) private val userExt = UserExtension(system) private val groupExt = GroupExtension(system) private val db = DbExtension(system).db @@ -218,7 +219,7 @@ private class DialogRoot(val userId: Int, extensions: Seq[ApiExtension]) commit(e) (for { _ ← db.run(HistoryMessageRepo.deleteAll(userId, peer)) - _ ← SeqUpdatesExtension(system).deliverUserUpdate(userId, UpdateChatDelete(peer.asStruct)) + _ ← seqUpdExt.deliverUserUpdate(userId, UpdateChatDelete(peer.asStruct)) seqState ← sendChatGroupsChanged(clientAuthId) // _ = thatDialog ! PoisonPill // kill that dialog would be good } yield seqState) pipeTo sender() @@ -273,8 +274,13 @@ private class DialogRoot(val userId: Int, extensions: Seq[ApiExtension]) for { groups ← DialogExtension(system).fetchApiGroupedDialogs(userId) update = UpdateChatGroupsChanged(groups) - seqState ← SeqUpdatesExtension(system) - .deliverClientUpdate(userId, authId, update, pushRules) + seqState ← seqUpdExt.deliverClientUpdate( + userId, + authId, + update, + pushRules, + deliveryId = s"dialogschanged_${userId}" + ) } yield seqState } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DeliveryOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DeliveryOperations.scala index 38c7c2140e..04204cd210 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DeliveryOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DeliveryOperations.scala @@ -1,9 +1,8 @@ package im.actor.server.sequence.operations import com.google.protobuf.ByteString -import com.google.protobuf.wrappers.StringValue import im.actor.api.rpc.Update -import im.actor.server.model.{ Peer, SerializedUpdate, UpdateMapping } +import im.actor.server.model.{ SerializedUpdate, UpdateMapping } import im.actor.server.sequence.UserSequenceCommands.{ DeliverUpdate, Envelope } import im.actor.server.sequence.{ PushData, PushRules, SeqState, SeqUpdatesExtension } import akka.pattern.ask @@ -154,7 +153,7 @@ trait DeliveryOperations { this: SeqUpdatesExtension ⇒ (region.ref ? Envelope(userId).withDeliverUpdate(deliver)).mapTo[SeqState] } - private def serializedUpdate(u: Update): SerializedUpdate = + protected def serializedUpdate(u: Update): SerializedUpdate = SerializedUpdate(u.header, ByteString.copyFrom(u.toByteArray), u._relatedUserIds, u._relatedGroupIds) private def buildDeliver( diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DifferenceOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DifferenceOperations.scala index 430ab302e5..51239eacd1 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DifferenceOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DifferenceOperations.scala @@ -1,7 +1,10 @@ package im.actor.server.sequence.operations import akka.http.scaladsl.util.FastFuture +import im.actor.api.rpc.messaging.{ ApiDialogGroup, ApiDialogShort, UpdateChatGroupsChanged, UpdateMessageReadByMe } +import im.actor.api.rpc.peers.ApiPeer import im.actor.api.rpc.sequence.UpdateEmptyUpdate +import im.actor.server.dialog.{ DialogGroupKeys, DialogGroupTitles } import im.actor.server.model.{ SeqUpdate, SerializedUpdate, UpdateMapping } import im.actor.server.persist.sequence.UserSequenceRepo import im.actor.server.sequence.{ CommonState, Difference, SeqUpdatesExtension } @@ -18,7 +21,12 @@ trait DifferenceOperations { this: SeqUpdatesExtension ⇒ private type ReduceKey = String private object DiffAcc { - def empty(commonSeq: Int) = DiffAcc(commonSeq, 0, immutable.TreeMap.empty, Map.empty) + def empty(commonSeq: Int) = DiffAcc( + commonSeq = commonSeq, + seqDelta = 0, + generic = immutable.TreeMap.empty, + reduced = Map.empty + ) } /** @@ -42,7 +50,78 @@ trait DifferenceOperations { this: SeqUpdatesExtension ⇒ ) { def nonEmpty = generic.nonEmpty || reduced.nonEmpty - def toVector = (generic ++ reduced.values).values.toVector + private def rewriteDialogsCounter(dialogs: IndexedSeq[ApiDialogShort], upd: UpdateMessageReadByMe) = + dialogs map { dlg ⇒ + if (upd.peer == dlg.peer) { + dlg.copy(counter = upd.unreadCounter getOrElse 0) + } else { + dlg + } + } + + def toVector = { + val originalUpdates = (generic ++ reduced.values).values.toVector + + // If there is UpdateChatGroupsChanged in difference, + // we are writing up to date counters from UpdateMessageReadByMe + // for each peer we have in UpdateMessageReadByMe updates. + // After that, we update original difference + val optLastChatsChanged: Option[(Int, UpdateChatGroupsChanged)] = + originalUpdates.zipWithIndex.reverse find { + case (upd, i) ⇒ + upd.header == UpdateChatGroupsChanged.header + } flatMap { + case (upd, i) ⇒ + UpdateChatGroupsChanged.parseFrom(upd.body).right.toOption map (i → _) + } + + optLastChatsChanged match { + case None ⇒ originalUpdates + case Some((index, chatsChanged)) ⇒ + def singleGroup(groupKey: String) = (chatsChanged.dialogs collect { + case group if group.key == groupKey ⇒ group.dialogs + }).flatten + + val (groups, direct, favourites) = (originalUpdates foldLeft ( + singleGroup(DialogGroupKeys.Groups), + singleGroup(DialogGroupKeys.Direct), + singleGroup(DialogGroupKeys.Favourites) + )) { + case (acc @ (gr, dir, fav), upd) ⇒ + if (upd.header == UpdateMessageReadByMe.header) { + UpdateMessageReadByMe.parseFrom(upd.body).right.toOption map { upd ⇒ + ( + rewriteDialogsCounter(gr, upd), + rewriteDialogsCounter(dir, upd), + rewriteDialogsCounter(fav, upd) + ) + } getOrElse acc + } else acc + } + + val chatsChangedUpdated = + chatsChanged.copy( + Vector( + ApiDialogGroup( + title = DialogGroupTitles.Groups, + key = DialogGroupKeys.Groups, + dialogs = groups + ), + ApiDialogGroup( + title = DialogGroupTitles.Direct, + key = DialogGroupKeys.Direct, + dialogs = direct + ), + ApiDialogGroup( + title = DialogGroupTitles.Favourites, + key = DialogGroupKeys.Favourites, + dialogs = favourites + ) + ) + ) + originalUpdates.updated(index, serializedUpdate(chatsChangedUpdated)) + } + } } def getDifference( diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/Group.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/Group.scala index e5aeda7470..86bb7cc3e0 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/Group.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/Group.scala @@ -93,9 +93,6 @@ object GroupRepo { ) } - def findPublic = - groups.filter(_.isPublic === true).map(_.asGroup).result - @deprecated("Replace with some sort of key-value maybe?", "2016-06-05") def findAllIds = allIds.result diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/sequence/SequenceServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/sequence/SequenceServiceImpl.scala index 4c15592915..478e5256cb 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/sequence/SequenceServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/sequence/SequenceServiceImpl.scala @@ -161,6 +161,7 @@ final class SequenceServiceImpl(config: SequenceServiceConfig)( } } + // TODO: add non deleted check too. private def getNonChannelsIds(groups: Seq[ApiGroupOutPeer]): Future[Seq[Int]] = { FutureExt.ftraverse(groups) { case ApiGroupOutPeer(groupId, _) ⇒ From ff7e01742bf2d7bd2eaedbc26175f1904df0b0b1 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 21 Jul 2016 07:59:24 +0300 Subject: [PATCH 051/253] fix(server:dialogs): reduce key for update instead of delivery id, reorder dialogs list --- .../im/actor/server/dialog/DialogRoot.scala | 2 +- .../operations/DifferenceOperations.scala | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala index e308b0f305..eaae17e4e8 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala @@ -279,7 +279,7 @@ private class DialogRoot(val userId: Int, extensions: Seq[ApiExtension]) authId, update, pushRules, - deliveryId = s"dialogschanged_${userId}" + reduceKey = Some(s"dialogschanged_${userId}") ) } yield seqState } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DifferenceOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DifferenceOperations.scala index 51239eacd1..b1a843ee10 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DifferenceOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/operations/DifferenceOperations.scala @@ -82,18 +82,18 @@ trait DifferenceOperations { this: SeqUpdatesExtension ⇒ case group if group.key == groupKey ⇒ group.dialogs }).flatten - val (groups, direct, favourites) = (originalUpdates foldLeft ( + val (favourites, groups, direct) = (originalUpdates foldLeft ( + singleGroup(DialogGroupKeys.Favourites), singleGroup(DialogGroupKeys.Groups), - singleGroup(DialogGroupKeys.Direct), - singleGroup(DialogGroupKeys.Favourites) + singleGroup(DialogGroupKeys.Direct) )) { - case (acc @ (gr, dir, fav), upd) ⇒ + case (acc @ (fav, gr, dir), upd) ⇒ if (upd.header == UpdateMessageReadByMe.header) { UpdateMessageReadByMe.parseFrom(upd.body).right.toOption map { upd ⇒ ( + rewriteDialogsCounter(fav, upd), rewriteDialogsCounter(gr, upd), - rewriteDialogsCounter(dir, upd), - rewriteDialogsCounter(fav, upd) + rewriteDialogsCounter(dir, upd) ) } getOrElse acc } else acc @@ -102,6 +102,11 @@ trait DifferenceOperations { this: SeqUpdatesExtension ⇒ val chatsChangedUpdated = chatsChanged.copy( Vector( + ApiDialogGroup( + title = DialogGroupTitles.Favourites, + key = DialogGroupKeys.Favourites, + dialogs = favourites + ), ApiDialogGroup( title = DialogGroupTitles.Groups, key = DialogGroupKeys.Groups, @@ -111,11 +116,6 @@ trait DifferenceOperations { this: SeqUpdatesExtension ⇒ title = DialogGroupTitles.Direct, key = DialogGroupKeys.Direct, dialogs = direct - ), - ApiDialogGroup( - title = DialogGroupTitles.Favourites, - key = DialogGroupKeys.Favourites, - dialogs = favourites ) ) ) From b35d1b1d25c430d18d9bdb82dfe4ac37db37d879 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 21 Jul 2016 15:17:59 +0300 Subject: [PATCH 052/253] chore(server): update actor.json --- .../actor-core/src/main/actor-api/actor.json | 541 ++---------------- 1 file changed, 56 insertions(+), 485 deletions(-) diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index 30da5aee54..d707e0a5ed 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -7882,6 +7882,20 @@ "name": "Group", "doc": [ "Group information", + "", + "Permissions.", + "Permissions of this structure is about group messages operation, such as", + "ability to send messages, clear chat, leave group and so on. This operations", + "Can be held outside of the Group Info page.", + "", + "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", + "If default is TRUE then ONE == FALSE.", + "Bits:", + "0 - canSendMessage. Default is FALSE.", + "1 - canClear. Default is FALSE.", + "2 - canLeave. Default is FALSE.", + "3 - canDelete. Default is FALSE.", + "", { "type": "reference", "argument": "id", @@ -7932,9 +7946,9 @@ }, { "type": "reference", - "argument": "canSendMessage", + "argument": "permissions", "category": "full", - "description": " Can user send messages. Default is equals isMember for Group and false for others." + "description": " Permissions of group object" }, { "type": "reference", @@ -8054,10 +8068,10 @@ { "type": { "type": "opt", - "childType": "bool" + "childType": "int64" }, "id": 26, - "name": "canSendMessage" + "name": "permissions" }, { "type": { @@ -8138,6 +8152,22 @@ "name": "GroupFull", "doc": [ "Goup Full information", + "Permissions.", + "Idea of Group Full mermissions is about Group Info pages. This permissions", + "are usefull only when trying to view and update group settings and not related", + "to chat messages itself.", + "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", + "If default is TRUE then ONE == FALSE.", + "Bits:", + "0 - canEditInfo. Default is FALSE.", + "1 - canViewMembers. Default is FALSE.", + "2 - canInviteMembers. Default is FALSE.", + "3 - canInviteViaLink. Default is FALSE.", + "4 - canCall. Default is FALSE.", + "5 - canEditAdminSettings. Default is FALSE.", + "6 - canViewAdmins. Default is FALSE.", + "7 - canEditAdmins. Default is FALSE.", + "", { "type": "reference", "argument": "id", @@ -8180,30 +8210,12 @@ "category": "full", "description": " Is Members need to be loaded asynchronous. Default is false." }, - { - "type": "reference", - "argument": "canViewMembers", - "category": "full", - "description": " Can current user view members of the group. Default is true." - }, - { - "type": "reference", - "argument": "canInvitePeople", - "category": "full", - "description": " Can current user invite new people. Default is true." - }, { "type": "reference", "argument": "isSharedHistory", "category": "full", "description": " Is history shared among all users. Default is false." }, - { - "type": "reference", - "argument": "canEditGroupInfo", - "category": "full", - "description": " If current user can edit group info. Default is true." - }, { "type": "reference", "argument": "shortName", @@ -8212,45 +8224,9 @@ }, { "type": "reference", - "argument": "canEditShortName", - "category": "full", - "description": " If not set only owner can edit group's short name" - }, - { - "type": "reference", - "argument": "canEditAdminList", - "category": "full", - "description": " If not set only owner can edit admin list" - }, - { - "type": "reference", - "argument": "canViewAdminList", - "category": "full", - "description": " If not set only owner and admins can view admin list" - }, - { - "type": "reference", - "argument": "canEditAdminSettings", + "argument": "permissions", "category": "full", - "description": " If not set only owner can edit admin settings" - }, - { - "type": "reference", - "argument": "canInviteViaLink", - "category": "full", - "description": " If user can invite via link, default is false" - }, - { - "type": "reference", - "argument": "canDelete", - "category": "full", - "description": " If user can delete this group, default is false" - }, - { - "type": "reference", - "argument": "canLeave", - "category": "hidden", - "description": " If user can leave this group, default is true" + "description": " Group Permissions" } ], "expandable": "true", @@ -8328,22 +8304,6 @@ "id": 11, "name": "isAsyncMembers" }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 8, - "name": "canViewMembers" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 9, - "name": "canInvitePeople" - }, { "type": { "type": "opt", @@ -8352,14 +8312,6 @@ "id": 10, "name": "isSharedHistory" }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 13, - "name": "canEditGroupInfo" - }, { "type": { "type": "opt", @@ -8371,58 +8323,10 @@ { "type": { "type": "opt", - "childType": "bool" - }, - "id": 15, - "name": "canEditShortName" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 16, - "name": "canEditAdminList" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 17, - "name": "canViewAdminList" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 18, - "name": "canEditAdminSettings" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 19, - "name": "canInviteViaLink" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 20, - "name": "canDelete" - }, - { - "type": { - "type": "opt", - "childType": "bool" + "childType": "int64" }, - "id": 21, - "name": "canLeave" + "id": 27, + "name": "permissions" } ] } @@ -8930,317 +8834,15 @@ { "type": "update", "content": { - "name": "GroupCanSendMessagesChanged", - "header": 2624, - "doc": [ - "Update about can send messages changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "canSendMessages", - "category": "full", - "description": " Can send messages" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "bool", - "id": 2, - "name": "canSendMessages" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupCanViewMembersChanged", - "header": 2625, - "doc": [ - "Update about can view members changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "canViewMembers", - "category": "full", - "description": " Can view members" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "bool", - "id": 2, - "name": "canViewMembers" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupCanInviteMembersChanged", - "header": 2626, - "doc": [ - "Update about can invite members changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "canInviteMembers", - "category": "full", - "description": " Can invite members" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "bool", - "id": 2, - "name": "canInviteMembers" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupCanEditInfoChanged", - "header": 2631, - "doc": [ - "Update about can edit changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "canEditGroup", - "category": "full", - "description": " Can edit group info" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "bool", - "id": 2, - "name": "canEditGroup" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupCanEditUsernameChanged", - "header": 2632, - "doc": [ - "Update about can edit username changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "canEditUsername", - "category": "full", - "description": " Can edit username" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "bool", - "id": 2, - "name": "canEditUsername" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupCanEditAdminsChanged", - "header": 2633, - "doc": [ - "Update about can edit admins changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "canAssignAdmins", - "category": "hidden", - "description": " Can assign admins" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "bool", - "id": 2, - "name": "canAssignAdmins" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupCanViewAdminsChanged", - "header": 2640, - "doc": [ - "Update about view admings changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "canViewAdmins", - "category": "hidden", - "description": " Can view admins" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "bool", - "id": 2, - "name": "canViewAdmins" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupCanInviteViaLink", - "header": 2646, - "doc": [ - "Update about can invite via link changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "canInviteViaLink", - "category": "full", - "description": " Can Invite Via link" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "bool", - "id": 2, - "name": "canInviteViaLink" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupCanLeaveChanged", - "header": 2647, + "name": "GroupDeleted", + "header": 2658, "doc": [ - "Update about can leave changed", + "Update about group deleted", { "type": "reference", "argument": "groupId", "category": "full", "description": " Group Id" - }, - { - "type": "reference", - "argument": "canLeaveChanged", - "category": "full", - "description": " Can leave changed" } ], "attributes": [ @@ -9251,11 +8853,6 @@ }, "id": 1, "name": "groupId" - }, - { - "type": "bool", - "id": 2, - "name": "canLeaveChanged" } ] } @@ -9263,10 +8860,10 @@ { "type": "update", "content": { - "name": "GroupCanDeleteChanged", - "header": 2648, + "name": "GroupPermissionsChanged", + "header": 2663, "doc": [ - "Update about can delete changed", + "Update about group permissions changed", { "type": "reference", "argument": "groupId", @@ -9275,9 +8872,9 @@ }, { "type": "reference", - "argument": "canDeleteChanged", + "argument": "permissions", "category": "full", - "description": " Can delete changed" + "description": " New Permissions" } ], "attributes": [ @@ -9290,9 +8887,9 @@ "name": "groupId" }, { - "type": "bool", + "type": "int64", "id": 2, - "name": "canDeleteChanged" + "name": "permissions" } ] } @@ -9300,10 +8897,10 @@ { "type": "update", "content": { - "name": "GroupCanEditAdminSettingsChanged", - "header": 2641, + "name": "GroupFullPermissionsChanged", + "header": 2664, "doc": [ - "Update about edit admin settings changed", + "Update about Full Group permissions changed", { "type": "reference", "argument": "groupId", @@ -9312,9 +8909,9 @@ }, { "type": "reference", - "argument": "canEditAdminSettings", + "argument": "permissions", "category": "full", - "description": " Can edit admin settings" + "description": " New Permissions" } ], "attributes": [ @@ -9327,35 +8924,9 @@ "name": "groupId" }, { - "type": "bool", + "type": "int64", "id": 2, - "name": "canEditAdminSettings" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupDeleted", - "header": 2658, - "doc": [ - "Update about group deleted", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" + "name": "permissions" } ] } From d17895bc611a2082b62eb486629d97b7b95e98b0 Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 21 Jul 2016 19:34:32 +0300 Subject: [PATCH 053/253] feat(server:groups): bitmask based permission handling --- .../server/group/AdminCommandHandlers.scala | 127 ++++++---------- .../server/group/GroupCommandHandlers.scala | 7 + .../actor/server/group/GroupProcessor.scala | 19 ++- .../server/group/GroupQueryHandlers.scala | 16 +-- .../im/actor/server/group/GroupState.scala | 136 +++++++++++++----- .../server/group/MemberCommandHandlers.scala | 94 +++--------- .../actor/server/sequence/Optimization.scala | 13 +- 7 files changed, 194 insertions(+), 218 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala index 0dbd1666bf..bf17a9b8a1 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala @@ -5,7 +5,7 @@ import java.time.Instant import akka.actor.Status import akka.pattern.pipe import akka.http.scaladsl.util.FastFuture -import im.actor.api.rpc.{ PeersImplicits, Update } +import im.actor.api.rpc.Update import im.actor.api.rpc.groups._ import im.actor.api.rpc.messaging.UpdateChatClear import im.actor.concurrent.FutureExt @@ -66,7 +66,9 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { val updateAdmin = UpdateGroupMemberAdminChanged(groupId, cmd.candidateUserId, isAdmin = true) val updateMembers = UpdateGroupMembersUpdated(groupId, members) // now this user is admin, change edit rules for admins - val updateCanEdit = UpdateGroupCanEditInfoChanged(groupId, canEditGroup = newState.adminSettings.canAdminsEditGroupInfo) + + val updatePermissions = permissionsUpdates(cmd.candidateUserId, newState) + // val updateCanEdit = UpdateGroupCanEditInfoChanged(groupId, canEditGroup = newState.adminSettings.canAdminsEditGroupInfo) val updateObsolete = UpdateGroupMembersUpdateObsolete(groupId, members) @@ -119,10 +121,9 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { /////////////////////////// // Groups V2 API updates // /////////////////////////// - _ ← seqUpdExt.deliverUserUpdate( - userId = cmd.candidateUserId, - update = updateCanEdit - ) + _ ← FutureExt.ftraverse(updatePermissions) { update ⇒ + seqUpdExt.deliverUserUpdate(cmd.candidateUserId, update) + } seqStateDate ← if (state.groupType.isChannel) adminCHANNELUpdates else adminGROUPUpdates } yield (members, seqStateDate) @@ -150,7 +151,9 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { val updateAdmin = UpdateGroupMemberAdminChanged(groupId, cmd.targetUserId, isAdmin = false) val updateMembers = UpdateGroupMembersUpdated(groupId, members) // now this user is not admin, change edit rules to plain members - val updateCanEdit = UpdateGroupCanEditInfoChanged(groupId, canEditGroup = newState.adminSettings.canMembersEditGroupInfo) + + val updatePermissions = permissionsUpdates(cmd.targetUserId, newState) + // val updateCanEdit = UpdateGroupCanEditInfoChanged(groupId, canEditGroup = newState.adminSettings.canMembersEditGroupInfo) val updateObsolete = UpdateGroupMembersUpdateObsolete(groupId, members) @@ -205,10 +208,9 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { /////////////////////////// // Groups V2 API updates // /////////////////////////// - _ ← seqUpdExt.deliverUserUpdate( - userId = cmd.targetUserId, - update = updateCanEdit - ) + _ ← FutureExt.ftraverse(updatePermissions) { update ⇒ + seqUpdExt.deliverUserUpdate(cmd.targetUserId, update) + } seqState ← if (state.groupType.isChannel) adminCHANNELUpdates else adminGROUPUpdates } yield seqState @@ -226,23 +228,16 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { val newState = commit(evt) val memberIds = newState.memberIds - val prevOwnerUpdates = List( - UpdateGroupCanLeaveChanged(groupId, canLeaveChanged = true), - UpdateGroupCanDeleteChanged(groupId, canDeleteChanged = false) - ) - - val newOwnerUpdates = List( - UpdateGroupCanLeaveChanged(groupId, canLeaveChanged = false), - UpdateGroupCanDeleteChanged(groupId, canDeleteChanged = true) - ) + val updatePermissionsPrevOwner = permissionsUpdates(cmd.clientUserId, newState) + val updatePermissionsNewOwner = permissionsUpdates(cmd.newOwnerId, newState) val result: Future[SeqState] = for { - // push updates to previous owner - _ ← FutureExt.ftraverse(prevOwnerUpdates) { update ⇒ + // push permission updates to previous owner + _ ← FutureExt.ftraverse(updatePermissionsPrevOwner) { update ⇒ seqUpdExt.deliverUserUpdate(cmd.clientUserId, update) } - // push updates to new owner - _ ← FutureExt.ftraverse(newOwnerUpdates) { update ⇒ + // push permission updates to new owner + _ ← FutureExt.ftraverse(updatePermissionsNewOwner) { update ⇒ seqUpdExt.deliverUserUpdate(cmd.newOwnerId, update) } seqState ← seqUpdExt.broadcastClientUpdate( @@ -262,51 +257,21 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { protected def updateAdminSettings(cmd: UpdateAdminSettings): Unit = { if (!state.permissions.canEditAdminSettings(cmd.clientUserId)) { sender() ! Status.Failure(NotAdmin) + } else if (AdminSettings.fromBitMask(cmd.settingsBitMask) == state.adminSettings) { + sender() ! UpdateAdminSettingsAck() } else { - val settOld = state.adminSettings - persist(AdminSettingsUpdated(Instant.now, cmd.settingsBitMask)) { evt ⇒ val newState = commit(evt) - val settNew = newState.adminSettings - - val (membersUpdates, adminsUpdates) = { - // push to all members except admins and owner - val showAdminToMembers = PartialFunction.condOpt(settOld.showAdminsToMembers != settNew.showAdminsToMembers) { - case true ⇒ UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = settNew.showAdminsToMembers) - } - - // push to all members except admins and owner - val canMembersInvite = PartialFunction.condOpt(settOld.canMembersInvite != settNew.canMembersInvite) { - case true ⇒ UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = settNew.canMembersInvite) - } - - // push to all members except admins and owner - val canMembersEditGroupInfo = PartialFunction.condOpt(settOld.canMembersEditGroupInfo != settNew.canMembersEditGroupInfo) { - case true ⇒ UpdateGroupCanEditInfoChanged(groupId, canEditGroup = settNew.canMembersEditGroupInfo) - } - - // push to admins only - val canAdminsEditGroupInfo = PartialFunction.condOpt(settOld.canAdminsEditGroupInfo != settNew.canAdminsEditGroupInfo) { - case true ⇒ UpdateGroupCanEditInfoChanged(groupId, canEditGroup = settNew.canAdminsEditGroupInfo) - } - - ( - List(showAdminToMembers, canMembersInvite, canMembersEditGroupInfo).flatten[Update], - List(canAdminsEditGroupInfo).flatten[Update] - ) - } - - val plainMemberIds = (newState.memberIds - newState.ownerUserId) -- newState.adminIds - val adminsOnlyIds = newState.adminIds - newState.ownerUserId + //TODO: check if settings actually changed val result: Future[UpdateAdminSettingsAck] = for { - // deliver updates about settings changed to plain group members - _ ← FutureExt.ftraverse(membersUpdates) { update ⇒ - seqUpdExt.broadcastPeopleUpdate(userIds = plainMemberIds, update) - } - // deliver updates about settings changed to plain group members - _ ← FutureExt.ftraverse(membersUpdates) { update ⇒ - seqUpdExt.broadcastPeopleUpdate(userIds = adminsOnlyIds, update) + // deliver permissions updates to all group members + // maybe there is no need to generate updates for each user + // three parts: members, admins, owner should be enough + _ ← FutureExt.ftraverse(newState.memberIds.toSeq) { userId ⇒ + FutureExt.ftraverse(permissionsUpdates(userId, newState)) { update ⇒ + seqUpdExt.deliverUserUpdate(userId, update) + } } } yield UpdateAdminSettingsAck() @@ -349,28 +314,22 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { val dateMillis = evt.ts.toEpochMilli val randomId = ACLUtils.randomLong() - // TODO: add UpdateIsDeleted - val deleteGroupMembersUpdates: Vector[Update] = Vector( - UpdateGroupCanSendMessagesChanged(groupId, canSendMessages = false), - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), - UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), - UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), - UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), - UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), - UpdateGroupCanInviteViaLink(groupId, canInviteViaLink = false), - UpdateGroupCanLeaveChanged(groupId, canLeaveChanged = false), - UpdateGroupCanDeleteChanged(groupId, canDeleteChanged = false), - UpdateGroupMemberChanged(groupId, isMember = false), - // if channel, or group is big enough - if (newState.groupType.isChannel) - UpdateGroupMembersCountChanged(groupId, membersCount = 0) - else - UpdateGroupMembersUpdated(groupId, members = Vector.empty), - UpdateGroupDeleted(groupId) + val emptyPermissions = Vector( + UpdateGroupPermissionsChanged(groupId, newState.permissions.GroupEmpty), + UpdateGroupFullPermissionsChanged(groupId, newState.permissions.FullGroupEmpty) ) + val deleteGroupMembersUpdates: Vector[Update] = emptyPermissions ++ + Vector( + UpdateGroupMemberChanged(groupId, isMember = false), + // if channel, or group is big enough + if (newState.groupType.isChannel) + UpdateGroupMembersCountChanged(groupId, membersCount = 0) + else + UpdateGroupMembersUpdated(groupId, members = Vector.empty), + UpdateGroupDeleted(groupId) + ) + //TODO: remove deprecated. GroupInviteTokenRepo don't have replacement yet. newState.memberIds foreach { userId ⇒ db.run( diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 86fd4d7541..6ccef21e6c 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -5,6 +5,7 @@ import java.time.Instant import akka.actor.Status import akka.http.scaladsl.util.FastFuture import akka.pattern.pipe +import im.actor.api.rpc.Update import im.actor.api.rpc.groups._ import im.actor.api.rpc.users.ApiSex import im.actor.concurrent.FutureExt @@ -163,6 +164,12 @@ private[group] trait GroupCommandHandlers } } + protected def permissionsUpdates(userId: Int, currState: GroupState): Vector[Update] = + Vector( + UpdateGroupPermissionsChanged(groupId, currState.permissions.groupFor(userId)), + UpdateGroupFullPermissionsChanged(groupId, currState.permissions.fullFor(userId)) + ) + protected def isValidTitle(title: String) = title.nonEmpty && title.length < 255 } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index fd54c7dfc8..6b3c36c856 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -8,7 +8,7 @@ import akka.http.scaladsl.util.FastFuture import im.actor.api.rpc.peers.{ ApiPeer, ApiPeerType } import im.actor.concurrent.ActorFutures import im.actor.serialization.ActorSerializer -import im.actor.server.cqrs.{ Processor, TaggedEvent } +import im.actor.server.cqrs.{ Event, Processor, TaggedEvent } import im.actor.server.db.DbExtension import im.actor.server.dialog.{ DialogEnvelope, DialogExtension } import im.actor.server.group.GroupErrors._ @@ -184,6 +184,23 @@ private[group] final class GroupProcessor case LoadAdminSettings(clientUserId) ⇒ loadAdminSettings(clientUserId) } + override def afterCommit(e: Event) = { + super.afterCommit(e) + if (state.membersCount > 25) { + updateCanCall(state) + } + // TODO: add async members + // if(state.membersCount > 50) { updateMembersAsync(state) } + } + + private def updateCanCall(state: GroupState): Unit = { + state.memberIds foreach { userId ⇒ + permissionsUpdates(userId, state) foreach { update ⇒ + seqUpdExt.deliverUserUpdate(userId, update) + } + } + } + def persistenceId: String = GroupProcessor.persistenceIdFor(groupId) protected def getInitialState: GroupState = GroupState.empty diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index cfde4c1f59..ddfb122cdf 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -35,8 +35,7 @@ trait GroupQueryHandlers { } } - //TODO: do something with this method. Will this method used in "client" context. - // If not - don't change it. Maybe rename to `getMembersInternal` + //TODO: This is internal server API. Properly name it, for example `getMembersInternal` protected def getMembers: Future[GetMembersResponse] = FastFuture.successful { GetMembersResponse( @@ -108,7 +107,7 @@ trait GroupQueryHandlers { case Channel ⇒ ApiGroupType.CHANNEL case General | Unrecognized(_) ⇒ ApiGroupType.GROUP }), - canSendMessage = Some(state.permissions.canSendMessage(clientUserId)), + permissions = Some(state.permissions.groupFor(clientUserId)), isDeleted = Some(state.isDeleted) ) ) @@ -126,20 +125,11 @@ trait GroupQueryHandlers { ownerUserId = state.getShowableOwner(clientUserId), createDate = extractCreatedAtMillis(state), ext = None, - canViewMembers = Some(state.permissions.canViewMembers(clientUserId)), - canInvitePeople = Some(state.permissions.canInvitePeople(clientUserId)), isSharedHistory = Some(state.isHistoryShared), isAsyncMembers = Some(state.isAsyncMembers), members = membersAndCount(state, clientUserId)._1, shortName = state.shortName, - canEditGroupInfo = Some(state.permissions.canEditInfo(clientUserId)), - canEditShortName = Some(state.permissions.canEditShortName(clientUserId)), - canEditAdminList = Some(state.permissions.canEditAdmins(clientUserId)), - canViewAdminList = Some(state.permissions.canViewAdmins(clientUserId)), - canEditAdminSettings = Some(state.permissions.canEditAdminSettings(clientUserId)), - canInviteViaLink = Some(state.permissions.canInviteViaLink(clientUserId)), - canDelete = Some(state.permissions.canDelete(clientUserId)), - canLeave = Some(state.permissions.canLeave(clientUserId)) + permissions = Some(state.permissions.fullFor(clientUserId)) ) ) } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 7ee9b0da92..96b26079ce 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -296,13 +296,35 @@ private[group] final case class GroupState( def withSnapshot(metadata: SnapshotMetadata, snapshot: Any): GroupState = this object permissions { + val GroupEmpty = 0L + val FullGroupEmpty = 0L + + /////////////////////////// + // General permissions // + /////////////////////////// + + /** + * @note check up to date doc in im.actor.api.rpc.groups.ApiGroup + * + * Group permissions bits: + * 0 - canSendMessage. Default is FALSE. + * 1 - canClear. Default is FALSE. + * 2 - canLeave. Default is FALSE. + * 3 - canDelete. Default is FALSE. + */ + def groupFor(userId: Int): Long = { + ((toInt(canSendMessage(userId)) << 0) + + (toInt(canClear(userId)) << 1) + + (toInt(canLeave(userId)) << 2) + + (toInt(canDelete(userId)) << 3)).toLong + } /** * bot can send messages in all groups * in general/public group only members can send messages * in channels only owner and admins can send messages */ - def canSendMessage(clientUserId: Int) = + private def canSendMessage(clientUserId: Int) = { groupType match { case General ⇒ isMember(clientUserId) @@ -310,6 +332,57 @@ private[group] final case class GroupState( } } || bot.exists(_.userId == clientUserId) + // if history shared, only owner can clear, everyone otherwise + private def canClear(clientUserId: Int): Boolean = !isHistoryShared || isOwner(clientUserId) + + /** + * for now, owner can't leave group. + * He can either transfer ownership and leave group + * or delete group completely. + */ + def canLeave(clientUserId: Int): Boolean = !isOwner(clientUserId) + + // only owner can delete group + def canDelete(clientUserId: Int): Boolean = isOwner(clientUserId) + + //////////////////////////// + // Full group permissions // + //////////////////////////// + + /** + * @note check up to date doc at im.actor.api.rpc.groups.ApiGroupFull + * + * Full group permissions bits: + * 0 - canEditInfo. Default is FALSE. + * 1 - canViewMembers. Default is FALSE. + * 2 - canInviteMembers. Default is FALSE. + * 3 - canInviteViaLink. Default is FALSE. + * 4 - canCall. Default is FALSE. + * 5 - canEditAdminSettings. Default is FALSE. + * 6 - canViewAdmins. Default is FALSE. + * 7 - canEditAdmins. Default is FALSE. + */ + def fullFor(userId: Int): Long = { + ((toInt(canEditInfo(userId)) << 0) + + (toInt(canViewMembers(userId)) << 1) + + (toInt(canInviteMembers(userId)) << 2) + + (toInt(canInviteViaLink(userId)) << 3) + + (toInt(canCall(userId)) << 4) + + (toInt(canEditAdminSettings(userId)) << 5) + + (toInt(canViewAdmins(userId)) << 6) + + (toInt(canEditAdmins(userId)) << 7)).toLong + } + + /** + * owner always can edit group info + * admin can edit group info, if canAdminsEditGroupInfo is true in admin settings + * any member can edit group info, if canMembersEditGroupInfo is true in admin settings + */ + def canEditInfo(clientUserId: Int): Boolean = + isOwner(clientUserId) || + (isAdmin(clientUserId) && adminSettings.canAdminsEditGroupInfo) || + (isMember(clientUserId) && adminSettings.canMembersEditGroupInfo) + /** * in general/public group, all members can view members * in channels, owner and admins can view members @@ -321,10 +394,10 @@ private[group] final case class GroupState( } /** - * owner and admins always can invite new people - * members can invite new people if canMembersInvite is true + * owner and admins always can invite new members + * regular members can invite new members if adminSettings.canMembersInvite is true */ - def canInvitePeople(clientUserId: Int) = + def canInviteMembers(clientUserId: Int) = isOwner(clientUserId) || isAdmin(clientUserId) || (isMember(clientUserId) && adminSettings.canMembersInvite) @@ -332,54 +405,43 @@ private[group] final case class GroupState( /** * only owner and admins can invite via link */ - def canInviteViaLink(clientUserId: Int) = - isOwner(clientUserId) || isAdmin(clientUserId) - - /** - * owner and admins can kick members - */ - def canKickMember(clientUserId: Int) = - isOwner(clientUserId) || isAdmin(clientUserId) + private def canInviteViaLink(clientUserId: Int) = isOwner(clientUserId) || isAdmin(clientUserId) /** - * owner always can edit group info - * admin can edit group info, if canAdminsEditGroupInfo is true in admin settings - * any member can edit group info, if canMembersEditGroupInfo is true in admin settings + * All members can call, if group has less than 25 members, and is not a channel */ - def canEditInfo(clientUserId: Int): Boolean = - isOwner(clientUserId) || - (isAdmin(clientUserId) && adminSettings.canAdminsEditGroupInfo) || - (isMember(clientUserId) && adminSettings.canMembersEditGroupInfo) - - // only owner can change short name - def canEditShortName(clientUserId: Int): Boolean = isOwner(clientUserId) + private def canCall(clientUserId: Int) = !groupType.isChannel && membersCount <= 25 - // only owner can make history shared - def canMakeHistoryShared(clientUserId: Int): Boolean = isOwner(clientUserId) - - // only owner and other admins can edit admins list - def canEditAdmins(clientUserId: Int): Boolean = - isOwner(clientUserId) || isAdmin(clientUserId) + // only owner can change admin settings + def canEditAdminSettings(clientUserId: Int): Boolean = isOwner(clientUserId) /** * admins list is always visible to owner and admins * admins list is visible to any member if showAdminsToMembers = true */ - def canViewAdmins(clientUserId: Int): Boolean = + private def canViewAdmins(clientUserId: Int): Boolean = isOwner(clientUserId) || isAdmin(clientUserId) || adminSettings.showAdminsToMembers - // only owner can change admin settings - def canEditAdminSettings(clientUserId: Int): Boolean = isOwner(clientUserId) + // only owner and other admins can edit admins list + def canEditAdmins(clientUserId: Int): Boolean = + isOwner(clientUserId) || isAdmin(clientUserId) - // only owner can delete group - def canDelete(clientUserId: Int): Boolean = isOwner(clientUserId) + //////////////////////////// + // Internal permissions // + //////////////////////////// /** - * for now, owner can't leave group. - * He can either transfer ownership and leave group - * or delete group completely. + * owner and admins can kick members */ - def canLeave(clientUserId: Int): Boolean = !isOwner(clientUserId) + def canKickMember(clientUserId: Int) = + isOwner(clientUserId) || isAdmin(clientUserId) + + // only owner can change short name + def canEditShortName(clientUserId: Int): Boolean = isOwner(clientUserId) + + // only owner can make history shared + def canMakeHistoryShared(clientUserId: Int): Boolean = isOwner(clientUserId) + private def toInt(b: Boolean) = if (b) 1 else 0 } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala index b4df43f301..3fd617a513 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala @@ -23,7 +23,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { import im.actor.server.ApiConversions._ protected def invite(cmd: Invite): Unit = { - if (!state.permissions.canInvitePeople(cmd.inviterUserId)) { + if (!state.permissions.canInviteMembers(cmd.inviterUserId)) { sender() ! noPermission } else if (state.isInvited(cmd.inviteeUserId)) { sender() ! Status.Failure(GroupErrors.UserAlreadyInvited) @@ -40,7 +40,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { val apiMembers = newState.members.values.map(_.asStruct).toVector // if user ever been in this group - we should push these updates, - val inviteeUpdatesNew: List[Update] = refreshGroupUpdates(newState, cmd.inviteeUserId) + val inviteeUpdatesNew: Vector[Update] = refreshGroupUpdates(newState, cmd.inviteeUserId) val membersUpdateNew: Update = if (newState.groupType.isChannel) // if channel, or group is big enough @@ -220,8 +220,8 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // // If user was invited to group by other member - we don't need to push group updates, // cause they we pushed already on invite step - val joiningUserUpdatesNew: List[Update] = - if (wasInvited) List.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId) + val joiningUserUpdatesNew: Vector[Update] = + if (wasInvited) Vector.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId) val membersUpdateNew: Update = if (newState.groupType.isChannel) // if channel, or group is big enough @@ -340,38 +340,15 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { } else if (!state.permissions.canLeave(cmd.userId)) { sender() ! Status.Failure(CantLeaveGroup) } else { - persist(UserLeft(Instant.now, cmd.userId)) { evt ⇒ + val leftEvent = UserLeft(Instant.now, cmd.userId) + persist(leftEvent) { evt ⇒ // no commit here. it will be after service message sent val dateMillis = evt.ts.toEpochMilli val updateObsolete = UpdateGroupUserLeaveObsolete(groupId, cmd.userId, dateMillis, cmd.randomId) - val leftUserUpdatesNew: Vector[Update] = { - val commonUpdates = Vector( - UpdateGroupCanSendMessagesChanged(groupId, canSendMessages = false), - UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), - UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), - UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), - UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), - UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), - UpdateGroupCanInviteViaLink(groupId, canInviteViaLink = false), - UpdateGroupCanLeaveChanged(groupId, canLeaveChanged = false), - UpdateGroupCanDeleteChanged(groupId, canDeleteChanged = false) - ) - - if (state.groupType.isChannel) { - (UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false) +: - commonUpdates) :+ - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) - } else { - commonUpdates ++ Vector( - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupMembersUpdated(groupId, members = Vector.empty), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false) - ) - } - } + val updatePermissions = permissionsUpdates(cmd.userId, currState = state.updated(leftEvent)) val membersUpdateNew = if (state.groupType.isChannel) { // if channel, or group is big enough @@ -424,7 +401,8 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // push left user updates // • with empty group members // • that he can't view and invite members - _ ← FutureExt.ftraverse(leftUserUpdatesNew) { update ⇒ + leftUpdates = updatePermissions :+ UpdateGroupMembersUpdated(groupId, members = Vector.empty) + _ ← FutureExt.ftraverse(leftUpdates) { update ⇒ seqUpdExt.deliverUserUpdate(userId = cmd.userId, update) } } yield SeqStateDate(seq, state, date) @@ -445,7 +423,8 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { ) // push left user updates that he has no group rights - _ ← FutureExt.ftraverse(leftUserUpdatesNew) { update ⇒ + leftUpdates = updatePermissions :+ UpdateGroupMembersCountChanged(groupId, membersCount = 0) + _ ← FutureExt.ftraverse(leftUpdates) { update ⇒ seqUpdExt.deliverUserUpdate(userId = cmd.userId, update) } } yield SeqStateDate(seq, state, dateMillis) @@ -492,30 +471,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { val updateObsolete = UpdateGroupUserKickObsolete(groupId, cmd.kickedUserId, cmd.kickerUserId, dateMillis, cmd.randomId) - val kickedUserUpdatesNew: Vector[Update] = { - val commonUpdates = Vector( - UpdateGroupCanViewMembersChanged(groupId, canViewMembers = false), - UpdateGroupCanSendMessagesChanged(groupId, canSendMessages = false), - UpdateGroupCanEditInfoChanged(groupId, canEditGroup = false), - UpdateGroupCanEditUsernameChanged(groupId, canEditUsername = false), - UpdateGroupCanEditAdminsChanged(groupId, canAssignAdmins = false), - UpdateGroupCanViewAdminsChanged(groupId, canViewAdmins = false), - UpdateGroupCanEditAdminSettingsChanged(groupId, canEditAdminSettings = false), - UpdateGroupCanInviteMembersChanged(groupId, canInviteMembers = false), - UpdateGroupCanInviteViaLink(groupId, canInviteViaLink = false), - UpdateGroupCanLeaveChanged(groupId, canLeaveChanged = false), - UpdateGroupCanDeleteChanged(groupId, canDeleteChanged = false) - ) - - if (state.groupType.isChannel) { - commonUpdates :+ UpdateGroupMemberChanged(groupId, isMember = false) - } else { - commonUpdates ++ Vector( - UpdateGroupMembersUpdated(groupId, members = Vector.empty), - UpdateGroupMemberChanged(groupId, isMember = false) - ) - } - } + val updatePermissions = permissionsUpdates(cmd.kickedUserId, newState) val membersUpdateNew: Update = if (newState.groupType.isChannel) { // if channel, or group is big enough @@ -563,7 +519,11 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // • with empty group members // • that he is no longer a member of group // • that he can't view and invite members - _ ← FutureExt.ftraverse(kickedUserUpdatesNew) { update ⇒ + kickedUserUpdates = updatePermissions ++ Vector( + UpdateGroupMembersUpdated(groupId, members = Vector.empty), + UpdateGroupMemberChanged(groupId, isMember = false) + ) + _ ← FutureExt.ftraverse(kickedUserUpdates) { update ⇒ seqUpdExt.deliverUserUpdate(userId = cmd.kickedUserId, update) } } yield SeqStateDate(seq, state, date) @@ -591,7 +551,8 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { ) // push kicked user updates that he has no group rights - _ ← FutureExt.ftraverse(kickedUserUpdatesNew) { update ⇒ + kickedUserUpdates = updatePermissions :+ UpdateGroupMemberChanged(groupId, isMember = false) + _ ← FutureExt.ftraverse(kickedUserUpdates) { update ⇒ seqUpdExt.deliverUserUpdate(userId = cmd.kickedUserId, update) } } yield SeqStateDate(seq, state, dateMillis) @@ -626,27 +587,16 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // Updates that will be sent to user, when he enters group. // Helps clients that have this group to refresh it's data. - private def refreshGroupUpdates(newState: GroupState, userId: Int): List[Update] = List( + private def refreshGroupUpdates(newState: GroupState, userId: Int): Vector[Update] = Vector( UpdateGroupMemberChanged(groupId, isMember = true), UpdateGroupAboutChanged(groupId, newState.about), UpdateGroupAvatarChanged(groupId, newState.avatar), UpdateGroupTopicChanged(groupId, newState.topic), UpdateGroupTitleChanged(groupId, newState.title), - UpdateGroupOwnerChanged(groupId, newState.ownerUserId), - UpdateGroupCanSendMessagesChanged(groupId, newState.permissions.canSendMessage(userId)), - UpdateGroupCanViewMembersChanged(groupId, newState.permissions.canViewMembers(userId)), - UpdateGroupCanInviteMembersChanged(groupId, newState.permissions.canInvitePeople(userId)), - UpdateGroupCanEditInfoChanged(groupId, newState.permissions.canEditInfo(userId)), - UpdateGroupCanEditUsernameChanged(groupId, newState.permissions.canEditShortName(userId)), - UpdateGroupCanEditAdminsChanged(groupId, newState.permissions.canEditAdmins(userId)), - UpdateGroupCanViewAdminsChanged(groupId, newState.permissions.canViewAdmins(userId)), - UpdateGroupCanInviteViaLink(groupId, newState.permissions.canInviteViaLink(userId)), - UpdateGroupCanLeaveChanged(groupId, newState.permissions.canLeave(userId)), - UpdateGroupCanDeleteChanged(groupId, newState.permissions.canDelete(userId)), - UpdateGroupCanEditAdminSettingsChanged(groupId, newState.permissions.canEditAdminSettings(userId)) + UpdateGroupOwnerChanged(groupId, newState.ownerUserId) // UpdateGroupExtChanged(groupId, newState.extension) //TODO: figure out and fix // if(bigGroup) UpdateGroupMembersCountChanged(groupId, newState.extension) - ) + ) ++ permissionsUpdates(userId, newState) private def serviceMessageUpdate(senderUserId: Int, date: Long, randomId: Long, message: ApiServiceMessage) = UpdateMessage( diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala index e74b725349..5e6df967d1 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala @@ -36,9 +36,6 @@ object Optimization extends MessageParsing { UpdateGroupOwnerChanged.header, UpdateGroupHistoryShared.header, - UpdateGroupCanSendMessagesChanged.header, - UpdateGroupCanViewMembersChanged.header, - UpdateGroupCanInviteMembersChanged.header, UpdateGroupMemberChanged.header, UpdateGroupMembersBecameAsync.header, UpdateGroupMembersUpdated.header, @@ -46,14 +43,8 @@ object Optimization extends MessageParsing { UpdateGroupMembersCountChanged.header, UpdateGroupMemberAdminChanged.header, UpdateGroupShortNameChanged.header, - UpdateGroupCanEditInfoChanged.header, - UpdateGroupCanEditUsernameChanged.header, - UpdateGroupCanEditAdminsChanged.header, - UpdateGroupCanViewAdminsChanged.header, - UpdateGroupCanEditAdminSettingsChanged.header, - UpdateGroupCanInviteViaLink.header, - UpdateGroupCanLeaveChanged.header, - UpdateGroupCanDeleteChanged.header + UpdateGroupFullPermissionsChanged.header, + UpdateGroupPermissionsChanged.header ) if (deliveryTag == GroupV2) emptyUpdate From 23c564ef48cd063122432c97543c16b5a0184b7c Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 21 Jul 2016 21:17:00 +0300 Subject: [PATCH 054/253] chore(server): update actor-commons 0.0.18 -> 0.0.19 --- actor-server/project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/project/Dependencies.scala b/actor-server/project/Dependencies.scala index 26cb76681b..e466c43c8c 100644 --- a/actor-server/project/Dependencies.scala +++ b/actor-server/project/Dependencies.scala @@ -4,7 +4,7 @@ import sbt._ object Dependencies { object V { - val actorCommons = "0.0.18" + val actorCommons = "0.0.19" val actorBotkit = "1.0.109" val akka = "2.4.7" val akkaHttpJson = "1.5.0" From bed300db26e8f45e273dbdfbec59aaaee65f47dd Mon Sep 17 00:00:00 2001 From: rockjam Date: Thu, 21 Jul 2016 22:43:54 +0300 Subject: [PATCH 055/253] fix(server:groups): execute hook after state commit only if actor already recovered --- .../scala/im/actor/server/group/GroupProcessor.scala | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index 6b3c36c856..3c7488b586 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -186,11 +186,13 @@ private[group] final class GroupProcessor override def afterCommit(e: Event) = { super.afterCommit(e) - if (state.membersCount > 25) { - updateCanCall(state) + if (recoveryFinished) { + if (state.membersCount > 25) { + updateCanCall(state) + } + // TODO: add async members + // if(state.membersCount > 50) { updateMembersAsync(state) } } - // TODO: add async members - // if(state.membersCount > 50) { updateMembersAsync(state) } } private def updateCanCall(state: GroupState): Unit = { From 677f92f33719c4c2d4de16fe7f45efeb18fb2891 Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 22 Jul 2016 02:50:59 +0300 Subject: [PATCH 056/253] =?UTF-8?q?feat(server:search):=20=09=E2=80=A2=20p?= =?UTF-8?q?ut=20@=20before=20partial=20global=20name=20search=20result;=20?= =?UTF-8?q?=09=E2=80=A2=20filter=20out=20duplicated=20peers=20found=20-=20?= =?UTF-8?q?local=20peer=20is=20priority?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/search/SearchServiceImpl.scala | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala index 88064e02ac..16ce7852a1 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/search/SearchServiceImpl.scala @@ -40,17 +40,18 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { case ((pts, txts), ApiSearchPeerTypeCondition(pt)) ⇒ (pts + pt, txts) case ((pts, txts), _) ⇒ (pts, txts) } + val peerTypesSorted = peerTypes.toVector.sortBy(_.id) texts.toList match { case text :: Nil if text.length < 3 ⇒ FastFuture.successful(Ok(EmptyResult)) case text :: Nil ⇒ val tps = if (peerTypes.isEmpty) - Set(ApiSearchPeerType.Public, ApiSearchPeerType.Contacts, ApiSearchPeerType.Groups) + Vector(ApiSearchPeerType.Groups, ApiSearchPeerType.Contacts, ApiSearchPeerType.Public) else - peerTypes - searchResult(tps.toVector, Some(text), optimizations) - case Nil ⇒ searchResult(peerTypes.toVector, None, optimizations) + peerTypesSorted + searchResult(tps, Some(text), optimizations) + case Nil ⇒ searchResult(peerTypesSorted, None, optimizations) case _ ⇒ FastFuture.successful(Error(RpcError(400, "INVALID_QUERY", "Invalid query.", canTryAgain = false, None))) } } @@ -77,11 +78,15 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { )(implicit client: AuthorizedClientData): Future[HandlerResult[ResponsePeerSearch]] = { for { results ← FutureExt.ftraverse(pts)(search(_, text)).map(_.reduce(_ ++ _)) - (groupIds, userIds) = results.view.map(_.peer).foldLeft(Vector.empty[Int], Vector.empty[Int]) { - case ((gids, uids), ApiPeer(pt, pid)) ⇒ - pt match { - case ApiPeerType.Private ⇒ (gids, uids :+ pid) - case ApiPeerType.Group ⇒ (gids :+ pid, uids) + (groupIds, userIds, searchResults) = (results foldLeft (Vector.empty[Int], Vector.empty[Int], Vector.empty[ApiPeerSearchResult])) { + case (acc @ (gids, uids, rslts), found @ ApiPeerSearchResult(peer, _)) ⇒ + if (rslts.exists(_.peer == peer)) { + acc + } else { + peer.`type` match { + case ApiPeerType.Private ⇒ (gids, uids :+ peer.id, rslts :+ found) + case ApiPeerType.Group ⇒ (gids :+ peer.id, uids, rslts :+ found) + } } } // TODO: make like here: im.actor.server.api.rpc.service.groups.GroupsServiceImpl.usersOrPeers @@ -89,7 +94,7 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { } yield { val stripEntities = optimizations.contains(ApiUpdateOptimization.STRIP_ENTITIES) Ok(ResponsePeerSearch( - searchResults = results, + searchResults = searchResults, users = if (stripEntities) Vector.empty else users.toVector, groups = if (stripEntities) Vector.empty else groups.toVector, userPeers = users.toVector map (u ⇒ ApiUserOutPeer(u.id, u.accessHash)), @@ -149,10 +154,10 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { // search users by nickname prefix private def searchGlobalUsersPrefix(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[PeerAndMatchString]] = { text map { query ⇒ - globalNamesStorage.userIdsByPrefix(query) map { results ⇒ + globalNamesStorage.userIdsByPrefix(normName(query)) map { results ⇒ results collect { case (userId, nickName) if userId != client.userId ⇒ - ApiPeer(ApiPeerType.Private, userId) → nickName + ApiPeer(ApiPeerType.Private, userId) → s"@$nickName" } } } getOrElse FastFuture.successful(Vector.empty) @@ -161,15 +166,17 @@ class SearchServiceImpl(implicit system: ActorSystem) extends SearchService { // find groups by global name prefix private def searchGlobalGroupsPrefix(text: Option[String]): Future[IndexedSeq[PeerAndMatchString]] = { text map { query ⇒ - globalNamesStorage.groupIdsByPrefix(query) map { results ⇒ + globalNamesStorage.groupIdsByPrefix(normName(query)) map { results ⇒ results map { case (groupId, globalName) ⇒ - ApiPeer(ApiPeerType.Group, groupId) → globalName + ApiPeer(ApiPeerType.Group, groupId) → s"@$globalName" } } } getOrElse FastFuture.successful(Vector.empty) } + private def normName(n: String) = if (n.startsWith("@")) n.drop(1) else n + private def searchContacts(text: Option[String])(implicit client: AuthorizedClientData): Future[IndexedSeq[ApiPeer]] = { for { userIds ← db.run(UserContactRepo.findContactIdsActive(client.userId)) From 193a5fb8d574941dff5ad177cdc52a0d974a938a Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 22 Jul 2016 03:29:57 +0300 Subject: [PATCH 057/253] =?UTF-8?q?fix(server:groups):=20=09=E2=80=A2=20co?= =?UTF-8?q?rrect=20updates=20on=20group=20deletion;=20=09=E2=80=A2=20relea?= =?UTF-8?q?se=20global=20name=20on=20group=20deletion;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/group/AdminCommandHandlers.scala | 39 ++++++++++++------- .../im/actor/server/group/GroupState.scala | 2 - .../server/names/GlobalNamesStorage.scala | 1 + 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala index bf17a9b8a1..8254b34115 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala @@ -14,6 +14,7 @@ import im.actor.server.acl.ACLUtils import im.actor.server.group.GroupCommands.{ DeleteGroup, DismissUserAdmin, MakeHistoryShared, MakeUserAdmin, RevokeIntegrationToken, RevokeIntegrationTokenAck, TransferOwnership, UpdateAdminSettings, UpdateAdminSettingsAck } import im.actor.server.group.GroupErrors.{ NotAMember, NotAdmin, UserAlreadyAdmin, UserAlreadyNotAdmin } import im.actor.server.group.GroupEvents.{ AdminSettingsUpdated, AdminStatusChanged, GroupDeleted, HistoryBecameShared, IntegrationTokenRevoked, OwnerChanged } +import im.actor.server.names.{ GlobalNameOwner, OwnerType } import im.actor.server.persist.{ GroupBotRepo, GroupInviteTokenRepo, GroupUserRepo, HistoryMessageRepo } import im.actor.server.sequence.{ SeqState, SeqStateDate } @@ -308,22 +309,27 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { if (!state.permissions.canDelete(cmd.clientUserId)) { sender() ! noPermission } else { + val exMemberIds = state.memberIds + val exGlobalName = state.shortName + val exGroupType = state.groupType + persist(GroupDeleted(Instant.now, cmd.clientUserId)) { evt ⇒ - val newState = commit(evt) + commit(evt) val dateMillis = evt.ts.toEpochMilli val randomId = ACLUtils.randomLong() + val ZeroPermissions = 0L val emptyPermissions = Vector( - UpdateGroupPermissionsChanged(groupId, newState.permissions.GroupEmpty), - UpdateGroupFullPermissionsChanged(groupId, newState.permissions.FullGroupEmpty) + UpdateGroupPermissionsChanged(groupId, ZeroPermissions), + UpdateGroupFullPermissionsChanged(groupId, ZeroPermissions) ) val deleteGroupMembersUpdates: Vector[Update] = emptyPermissions ++ Vector( UpdateGroupMemberChanged(groupId, isMember = false), // if channel, or group is big enough - if (newState.groupType.isChannel) + if (exGroupType.isChannel) UpdateGroupMembersCountChanged(groupId, membersCount = 0) else UpdateGroupMembersUpdated(groupId, members = Vector.empty), @@ -331,7 +337,7 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { ) //TODO: remove deprecated. GroupInviteTokenRepo don't have replacement yet. - newState.memberIds foreach { userId ⇒ + exMemberIds foreach { userId ⇒ db.run( for { _ ← GroupUserRepo.delete(groupId, userId) @@ -341,16 +347,17 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { } val result: Future[SeqState] = for { - _ ← db.run(HistoryMessageRepo.deleteAll(cmd.clientUserId, apiGroupPeer.asModel)) + // release global name of group + _ ← globalNamesStorage.updateOrRemove(exGlobalName, newGlobalName = None, GlobalNameOwner(OwnerType.Group, groupId)) /////////////////////////// // Groups V1 API updates // /////////////////////////// // push all members updates about other members left group - _ ← FutureExt.ftraverse(newState.memberIds.toSeq) { userId ⇒ + _ ← FutureExt.ftraverse(exMemberIds.toSeq) { userId ⇒ seqUpdExt.broadcastPeopleUpdate( - userIds = newState.memberIds - userId, + userIds = exMemberIds - userId, update = UpdateGroupUserLeaveObsolete(groupId, userId, dateMillis, randomId) ) } @@ -358,15 +365,21 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { /////////////////////////// // Groups V2 API updates // /////////////////////////// + + // send all members update about group became empty(no members) _ ← Future.traverse(deleteGroupMembersUpdates) { update ⇒ - seqUpdExt.broadcastPeopleUpdate(newState.memberIds, update) + seqUpdExt.broadcastPeopleUpdate(exMemberIds, update) } - seqState ← seqUpdExt.broadcastClientUpdate( - cmd.clientUserId, - cmd.clientAuthId, - bcastUserIds = state.memberIds - cmd.clientUserId, + + // send all members except clientUserId `UpdateChatClear` + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = exMemberIds - cmd.clientUserId, update = UpdateChatClear(apiGroupPeer) ) + + // delete dialog from client user's dialog list + // history deletion happens inside + seqState ← dialogExt.delete(cmd.clientUserId, cmd.clientAuthId, apiGroupPeer.asModel) } yield seqState result pipeTo sender() diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 96b26079ce..3f2959e687 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -296,8 +296,6 @@ private[group] final case class GroupState( def withSnapshot(metadata: SnapshotMetadata, snapshot: Any): GroupState = this object permissions { - val GroupEmpty = 0L - val FullGroupEmpty = 0L /////////////////////////// // General permissions // diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala b/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala index dc766a5ef7..b46ee46684 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala @@ -90,6 +90,7 @@ final class GlobalNamesStorageKeyValueStorage(implicit system: ActorSystem) { * `oldGlobalName` = None, `newGlobalName` = Some("name") - insert new name * `oldGlobalName` = Some("oldName"), `newGlobalName` = Some("name") - update existing name * `oldGlobalName` = Some("oldName"), `newGlobalName` = None - delete existing name + * `oldGlobalName` = None, `newGlobalName` = None - does nothing */ def updateOrRemove(oldGlobalName: Option[String], newGlobalName: Option[String], owner: GlobalNameOwner): Future[Unit] = { val deleteFu = (oldGlobalName map delete) getOrElse FastFuture.successful(()) From a4182a87327a4c8b9aaef766fdf21c146ede7a87 Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 22 Jul 2016 04:10:38 +0300 Subject: [PATCH 058/253] feat(server:groups): new permissions added --- .../im/actor/server/group/GroupState.scala | 52 ++++++++++++++++--- .../server/group/MemberCommandHandlers.scala | 8 ++- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 3f2959e687..2d683a4c73 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -359,16 +359,30 @@ private[group] final case class GroupState( * 5 - canEditAdminSettings. Default is FALSE. * 6 - canViewAdmins. Default is FALSE. * 7 - canEditAdmins. Default is FALSE. + * + * NOT DOCUMENTED YET: + * 8 - canKickInvited. Default is FALSE. + * 9 - canKickAnyone. Default is FALSE. + * 10 - canEditForeign. Default is FALSE. + * 11 - canDeleteForeign. Default is FALSE. */ def fullFor(userId: Int): Long = { - ((toInt(canEditInfo(userId)) << 0) + + ( + (toInt(canEditInfo(userId)) << 0) + (toInt(canViewMembers(userId)) << 1) + (toInt(canInviteMembers(userId)) << 2) + (toInt(canInviteViaLink(userId)) << 3) + (toInt(canCall(userId)) << 4) + (toInt(canEditAdminSettings(userId)) << 5) + (toInt(canViewAdmins(userId)) << 6) + - (toInt(canEditAdmins(userId)) << 7)).toLong + (toInt(canEditAdmins(userId)) << 7) + + + // NOT DOCUMENTED YET: + (toInt(canKickInvited(userId)) << 8) + + (toInt(canKickAnyone(userId)) << 9) + + (toInt(canEditForeign(userId)) << 10) + + (toInt(canDeleteForeign(userId)) << 11) + ).toLong } /** @@ -424,15 +438,37 @@ private[group] final case class GroupState( def canEditAdmins(clientUserId: Int): Boolean = isOwner(clientUserId) || isAdmin(clientUserId) - //////////////////////////// - // Internal permissions // - //////////////////////////// + /** + * In General group members can kick people they invited + * In Channel only owner and admins can kick invited people + */ + def canKickInvited(userId: Int): Boolean = + groupType match { + case General ⇒ isMember(userId) + case Channel ⇒ isAdmin(userId) || isOwner(userId) + } /** - * owner and admins can kick members + * Only owner and admins can kick anyone */ - def canKickMember(clientUserId: Int) = - isOwner(clientUserId) || isAdmin(clientUserId) + def canKickAnyone(userId: Int): Boolean = + isOwner(userId) || isAdmin(userId) + + /** + * Only owner and admins can edit foreign messages + */ + private def canEditForeign(userId: Int): Boolean = + isOwner(userId) || isAdmin(userId) + + /** + * Only owner and admins can delete foreign messages + */ + private def canDeleteForeign(userId: Int): Boolean = + isOwner(userId) || isAdmin(userId) + + //////////////////////////// + // Internal permissions // + //////////////////////////// // only owner can change short name def canEditShortName(clientUserId: Int): Boolean = isOwner(clientUserId) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala index 3fd617a513..efbd494dea 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala @@ -459,7 +459,13 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { } protected def kick(cmd: Kick): Unit = { - if (!state.permissions.canKickMember(cmd.kickerUserId)) { + val canKick = + state.permissions.canKickAnyone(cmd.kickerUserId) || + ( + state.permissions.canKickInvited(cmd.kickerUserId) && + state.members.get(cmd.kickedUserId).exists(_.inviterUserId == cmd.kickerUserId) // user we kick invited by kicker + ) + if (!canKick) { sender() ! noPermission } else if (state.nonMember(cmd.kickedUserId)) { sender() ! notMember From 8313700c1fd3c46bdfad3b82224c78823041013f Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 22 Jul 2016 16:18:09 +0300 Subject: [PATCH 059/253] fix(server:groups): group deletion updates --- .../src/main/scala/im/actor/server/dialog/DialogRoot.scala | 2 -- .../scala/im/actor/server/group/AdminCommandHandlers.scala | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala index eaae17e4e8..090a6d0553 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala @@ -270,7 +270,6 @@ private class DialogRoot(val userId: Int, extensions: Seq[ApiExtension]) } private def sendChatGroupsChanged(authId: Long): Future[SeqState] = { - val pushRules = if (authId == 0L) PushRules() else PushRules().withExcludeAuthIds(Seq(authId)) for { groups ← DialogExtension(system).fetchApiGroupedDialogs(userId) update = UpdateChatGroupsChanged(groups) @@ -278,7 +277,6 @@ private class DialogRoot(val userId: Int, extensions: Seq[ApiExtension]) userId, authId, update, - pushRules, reduceKey = Some(s"dialogschanged_${userId}") ) } yield seqState diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala index 8254b34115..5f750cbf6a 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala @@ -328,12 +328,12 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { val deleteGroupMembersUpdates: Vector[Update] = emptyPermissions ++ Vector( UpdateGroupMemberChanged(groupId, isMember = false), + UpdateGroupDeleted(groupId), // if channel, or group is big enough if (exGroupType.isChannel) UpdateGroupMembersCountChanged(groupId, membersCount = 0) else - UpdateGroupMembersUpdated(groupId, members = Vector.empty), - UpdateGroupDeleted(groupId) + UpdateGroupMembersUpdated(groupId, members = Vector.empty) ) //TODO: remove deprecated. GroupInviteTokenRepo don't have replacement yet. From 5c1de3a3708f16973a3a82656601633b0e30ffd8 Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 22 Jul 2016 16:23:36 +0300 Subject: [PATCH 060/253] fix(server): reorder group delete updates --- .../actor/server/group/AdminCommandHandlers.scala | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala index 5f750cbf6a..c96ef7e854 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala @@ -320,20 +320,17 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { val randomId = ACLUtils.randomLong() val ZeroPermissions = 0L - val emptyPermissions = Vector( - UpdateGroupPermissionsChanged(groupId, ZeroPermissions), - UpdateGroupFullPermissionsChanged(groupId, ZeroPermissions) - ) - - val deleteGroupMembersUpdates: Vector[Update] = emptyPermissions ++ + val deleteGroupMembersUpdates: Vector[Update] = Vector( UpdateGroupMemberChanged(groupId, isMember = false), - UpdateGroupDeleted(groupId), // if channel, or group is big enough - if (exGroupType.isChannel) + (if (exGroupType.isChannel) UpdateGroupMembersCountChanged(groupId, membersCount = 0) else - UpdateGroupMembersUpdated(groupId, members = Vector.empty) + UpdateGroupMembersUpdated(groupId, members = Vector.empty)), + UpdateGroupPermissionsChanged(groupId, ZeroPermissions), + UpdateGroupFullPermissionsChanged(groupId, ZeroPermissions), + UpdateGroupDeleted(groupId) ) //TODO: remove deprecated. GroupInviteTokenRepo don't have replacement yet. From 2c9e0236bdc5881a88e0f43742cf154fd5f358fa Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 22 Jul 2016 16:50:23 +0300 Subject: [PATCH 061/253] fix(server:groups): push empty members list on group delete for old API --- .../im/actor/server/group/AdminCommandHandlers.scala | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala index c96ef7e854..1dcd4b9d6a 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala @@ -351,13 +351,11 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { // Groups V1 API updates // /////////////////////////// - // push all members updates about other members left group - _ ← FutureExt.ftraverse(exMemberIds.toSeq) { userId ⇒ - seqUpdExt.broadcastPeopleUpdate( - userIds = exMemberIds - userId, - update = UpdateGroupUserLeaveObsolete(groupId, userId, dateMillis, randomId) - ) - } + // push all members updates about group members became empty + _ ← seqUpdExt.broadcastPeopleUpdate( + userIds = exMemberIds, + update = UpdateGroupMembersUpdateObsolete(groupId, members = Vector.empty) + ) /////////////////////////// // Groups V2 API updates // From 2e6dd63c83668856204c6876028ebb6035d159a1 Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Fri, 22 Jul 2016 16:06:44 +0300 Subject: [PATCH 062/253] chore(server): update actor.json --- .../actor-core/src/main/actor-api/actor.json | 149 ++++++++++++++++-- 1 file changed, 140 insertions(+), 9 deletions(-) diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index d707e0a5ed..bca140d112 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -7876,6 +7876,86 @@ ] } }, + { + "type": "enum", + "content": { + "name": "GroupPermissions", + "values": [ + { + "name": "SEND_MESSAGE", + "id": 1 + }, + { + "name": "CLEAR", + "id": 2 + }, + { + "name": "LEAVE", + "id": 3 + }, + { + "name": "DELETE", + "id": 4 + } + ] + } + }, + { + "type": "enum", + "content": { + "name": "GroupFullPermissions", + "values": [ + { + "name": "EDIT_INFO", + "id": 1 + }, + { + "name": "VIEW_MEMBERS", + "id": 2 + }, + { + "name": "INVITE_MEMBERS", + "id": 3 + }, + { + "name": "INVITE_VIA_LINK", + "id": 4 + }, + { + "name": "CALL", + "id": 5 + }, + { + "name": "EDIT_ADMIN_SETTINGS", + "id": 6 + }, + { + "name": "VIEW_ADMINS", + "id": 7 + }, + { + "name": "EDIT_ADMINS", + "id": 8 + }, + { + "name": "KICK_INVITED", + "id": 9 + }, + { + "name": "KICK_ANYONE", + "id": 10 + }, + { + "name": "EDIT_FOREIGN", + "id": 11 + }, + { + "name": "DELETE_FOREIGN", + "id": 12 + } + ] + } + }, { "type": "struct", "content": { @@ -8098,7 +8178,8 @@ "childType": "bool" }, "id": 16, - "name": "isAdmin" + "name": "isAdmin", + "deprecated": "true" }, { "type": { @@ -8106,7 +8187,8 @@ "childType": "userId" }, "id": 8, - "name": "creatorUid" + "name": "creatorUid", + "deprecated": "true" }, { "type": { @@ -8117,7 +8199,8 @@ } }, "id": 9, - "name": "members" + "name": "members", + "deprecated": "true" }, { "type": { @@ -8125,7 +8208,8 @@ "childType": "date" }, "id": 10, - "name": "createDate" + "name": "createDate", + "deprecated": "true" }, { "type": { @@ -8133,7 +8217,8 @@ "childType": "string" }, "id": 17, - "name": "theme" + "name": "theme", + "deprecated": "true" }, { "type": { @@ -8141,7 +8226,8 @@ "childType": "string" }, "id": 18, - "name": "about" + "name": "about", + "deprecated": "true" } ] } @@ -8167,6 +8253,10 @@ "5 - canEditAdminSettings. Default is FALSE.", "6 - canViewAdmins. Default is FALSE.", "7 - canEditAdmins. Default is FALSE.", + "8 - canKickInvited. Default is FALSE.", + "9 - canKickAnyone. Default is FALSE.", + "10 - canEditForeign. Default is FALSE.", + "11 - canDeleteForeign. Default is FALSE.", "", { "type": "reference", @@ -8396,7 +8486,7 @@ "doc": [ { "type": "reference", - "argument": "members", + "argument": "users", "category": "full", "description": " Group members" }, @@ -8408,6 +8498,17 @@ } ], "attributes": [ + { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 3, + "name": "members" + }, { "type": { "type": "list", @@ -8417,7 +8518,7 @@ } }, "id": 1, - "name": "members" + "name": "users" }, { "type": { @@ -9978,6 +10079,36 @@ ] } }, + { + "type": "rpc", + "content": { + "name": "LeaveAndDelete", + "header": 2721, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Leave group and Delete Chat", + { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group peer" + } + ], + "attributes": [ + { + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + } + ] + } + }, { "type": "rpc", "content": { @@ -21581,4 +21712,4 @@ ] } ] -} \ No newline at end of file +} From a37115c383d694c0de733a671391e0377bab8c84 Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 22 Jul 2016 18:05:44 +0300 Subject: [PATCH 063/253] feat(server:groups): leaveAndDelete, change load members --- .../src/main/protobuf/groupV2.proto | 9 ++++++- .../im/actor/api/rpc/PeersImplicits.scala | 3 +++ .../actor/server/group/GroupOperations.scala | 9 ++++++- .../server/group/GroupQueryHandlers.scala | 18 +++++++++----- .../im/actor/server/group/GroupState.scala | 6 ++--- .../service/groups/GroupsServiceImpl.scala | 24 ++++++++++++++++--- 6 files changed, 54 insertions(+), 15 deletions(-) diff --git a/actor-server/actor-core/src/main/protobuf/groupV2.proto b/actor-server/actor-core/src/main/protobuf/groupV2.proto index 3d524d5339..d402520650 100644 --- a/actor-server/actor-core/src/main/protobuf/groupV2.proto +++ b/actor-server/actor-core/src/main/protobuf/groupV2.proto @@ -18,6 +18,13 @@ import "file.proto"; import "sequence.proto"; import "dialog.proto"; +message GroupMember { + int32 user_id = 1; + int32 inviter_user_id = 2; + int64 invited_at = 3; + bool is_admin = 4; +} + message GroupEnvelope { int32 group_id = 1; oneof command { @@ -306,7 +313,7 @@ message GroupQueries { } message LoadMembersResponse { - repeated int32 user_ids = 1; + repeated GroupMember members = 1; google.protobuf.BytesValue offset = 2;// should it be Option[Array[Byte]] } diff --git a/actor-server/actor-core/src/main/scala/im/actor/api/rpc/PeersImplicits.scala b/actor-server/actor-core/src/main/scala/im/actor/api/rpc/PeersImplicits.scala index d9d0e1b5ee..f8a868c348 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/api/rpc/PeersImplicits.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/api/rpc/PeersImplicits.scala @@ -24,6 +24,9 @@ trait PeersImplicits { lazy val asPeer: ApiPeer = ApiPeer(ApiPeerType.Group, groupOutPeer.groupId) + + lazy val asModel: Peer = + Peer(PeerType.Group, groupOutPeer.groupId) } implicit class ExtPeerModel(model: Peer) { diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala index fdbb22efc5..646e0cc15b 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupOperations.scala @@ -208,7 +208,14 @@ private[group] sealed trait Queries { def loadMembers(groupId: Int, clientUserId: Int, limit: Int, offset: Option[Array[Byte]]) = (viewRegion.ref ? GroupEnvelope(groupId) - .withLoadMembers(LoadMembers(clientUserId, limit, offset map ByteString.copyFrom))).mapTo[LoadMembersResponse] map (r ⇒ r.userIds → r.offset.map(_.toByteArray)) + .withLoadMembers(LoadMembers(clientUserId, limit, offset map ByteString.copyFrom))).mapTo[LoadMembersResponse] map { resp ⇒ + ( + resp.members map { m ⇒ + ApiMember(m.userId, m.inviterUserId, m.invitedAt, isAdmin = Some(m.isAdmin)) + }, + resp.offset.map(_.toByteArray) + ) + } def loadAdminSettings(groupId: Int, clientUserId: Int): Future[ApiAdminSettings] = { (viewRegion.ref ? diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index ddfb122cdf..71fad35c88 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -45,23 +45,29 @@ trait GroupQueryHandlers { ) } - //TODO: rewrite to sort by online + name. Won't work like this - // we can subscribe group object to group onlines! When online comes, we reorder key-set. Use that key set as source. protected def loadMembers(clientUserId: Int, limit: Int, offsetBs: Option[ByteString]): Future[LoadMembersResponse] = { def load = { implicit val mat = ActorMaterializer() val offset = offsetBs map (_.toByteArray) map (Int32Value.parseFrom(_).value) getOrElse 0 for { - (userIds, nextOffset) ← Source(state.members.keySet) - .mapAsync(1)(userId ⇒ userExt.getName(userId, clientUserId) map (userId → _)) - .runFold(Vector.empty[(Int, String)])(_ :+ _) map { users ⇒ + (members, nextOffset) ← Source(state.members) + .mapAsync(1)(member ⇒ userExt.getName(member._1, clientUserId) map (member._2 → _)) + .runFold(Vector.empty[(Member, String)])(_ :+ _) map { users ⇒ val tail = users.sortBy(_._2).map(_._1).drop(offset) val nextOffset = if (tail.length > limit) Some(Int32Value(offset + limit).toByteArray) else None (tail.take(limit), nextOffset) } } yield LoadMembersResponse( - userIds = userIds, + members = members map { + case Member(userId, inviterUserId, invitedAt, isAdmin) ⇒ + GroupMember( + userId, + inviterUserId, + invitedAt.toEpochMilli, + isAdmin + ) + }, offset = nextOffset map ByteString.copyFrom ) } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 2d683a4c73..5a87046151 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -310,6 +310,7 @@ private[group] final case class GroupState( * 2 - canLeave. Default is FALSE. * 3 - canDelete. Default is FALSE. */ + // TODO: add ApiGroupFullPermissions def groupFor(userId: Int): Long = { ((toInt(canSendMessage(userId)) << 0) + (toInt(canClear(userId)) << 1) + @@ -359,13 +360,12 @@ private[group] final case class GroupState( * 5 - canEditAdminSettings. Default is FALSE. * 6 - canViewAdmins. Default is FALSE. * 7 - canEditAdmins. Default is FALSE. - * - * NOT DOCUMENTED YET: * 8 - canKickInvited. Default is FALSE. * 9 - canKickAnyone. Default is FALSE. * 10 - canEditForeign. Default is FALSE. * 11 - canDeleteForeign. Default is FALSE. */ + // TODO: add ApiGroupFullPermissions def fullFor(userId: Int): Long = { ( (toInt(canEditInfo(userId)) << 0) + @@ -376,8 +376,6 @@ private[group] final case class GroupState( (toInt(canEditAdminSettings(userId)) << 5) + (toInt(canViewAdmins(userId)) << 6) + (toInt(canEditAdmins(userId)) << 7) + - - // NOT DOCUMENTED YET: (toInt(canKickInvited(userId)) << 8) + (toInt(canKickAnyone(userId)) << 9) + (toInt(canEditForeign(userId)) << 10) + diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index 7e03397d99..88cbae7636 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -16,6 +16,7 @@ import im.actor.api.rpc.users.ApiUser import im.actor.concurrent.FutureExt import im.actor.server.acl.ACLUtils import im.actor.server.db.DbExtension +import im.actor.server.dialog.DialogExtension import im.actor.server.file.{ FileErrors, ImageUtils } import im.actor.server.group._ import im.actor.server.model.GroupInviteToken @@ -47,6 +48,7 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act private val userExt = UserExtension(actorSystem) private val groupPresenceExt = GroupPresenceExtension(actorSystem) private val globalNamesStorage = new GlobalNamesStorageKeyValueStorage + private val dialogExt = DialogExtension(actorSystem) /** * Loading Full Groups @@ -128,9 +130,12 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act authorized(clientData) { implicit client ⇒ withGroupOutPeer(groupPeer) { for { - (userIds, nextOffset) ← groupExt.loadMembers(groupPeer.groupId, client.userId, limit, next) - members ← FutureExt.ftraverse(userIds)(userExt.getApiStruct(_, client.userId, client.authId)) - } yield Ok(ResponseLoadMembers(members.toVector map (u ⇒ ApiUserOutPeer(u.id, u.accessHash)), nextOffset)) + (members, nextOffset) ← groupExt.loadMembers(groupPeer.groupId, client.userId, limit, next) + membersAndPeers ← FutureExt.ftraverse(members) { member ⇒ + userExt.getAccessHash(member.userId, client.authId) map (hash ⇒ member → ApiUserOutPeer(member.userId, hash)) + } + (members, peers) = membersAndPeers.unzip + } yield Ok(ResponseLoadMembers(peers.toVector, nextOffset, members.toVector)) } } } @@ -248,6 +253,19 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act } } + override def doHandleLeaveAndDelete(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = + authorized(clientData) { implicit client ⇒ + withGroupOutPeer(groupPeer) { + for { + _ ← groupExt.leaveGroup(groupPeer.groupId, ACLUtils.randomLong()) + SeqState(seq, state) ← dialogExt.delete(client.userId, client.authId, groupPeer.asModel) + } yield { + groupPresenceExt.notifyGroupUserRemoved(groupPeer.groupId, client.userId) + Ok(ResponseSeq(seq, state.toByteArray)) + } + } + } + override def doHandleCreateGroup( randomId: Long, title: String, From 8846d632ee3ee56fafad291743d06060c07011a6 Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 22 Jul 2016 18:36:01 +0300 Subject: [PATCH 064/253] fix(server:search): lowercase nick search queries --- .../main/scala/im/actor/server/names/GlobalNamesStorage.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala b/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala index b46ee46684..a78b47e909 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/names/GlobalNamesStorage.scala @@ -39,7 +39,7 @@ final class GlobalNamesStorageKeyValueStorage(implicit system: ActorSystem) { * Looks only in GlobalNamesStorage */ def groupIdsByPrefix(namePrefix: String): Future[IndexedSeq[(Int, String)]] = { - conn.run(GlobalNamesStorage.getByPrefix(namePrefix)) map { searchResults ⇒ + conn.run(GlobalNamesStorage.getByPrefix(normalized(namePrefix))) map { searchResults ⇒ searchResults flatMap { case (fullName, bytes) ⇒ Some(GlobalNameOwner.parseFrom(bytes)) filter (_.ownerType.isGroup) map (o ⇒ o.ownerId → fullName) @@ -52,7 +52,7 @@ final class GlobalNamesStorageKeyValueStorage(implicit system: ActorSystem) { * Looks in both GlobalNamesStorage and UserRepo(compatibility mode) */ def userIdsByPrefix(namePrefix: String): Future[IndexedSeq[(Int, String)]] = { - val kvSearch = conn.run(GlobalNamesStorage.getByPrefix(namePrefix)) map { searchResults ⇒ + val kvSearch = conn.run(GlobalNamesStorage.getByPrefix(normalized(namePrefix))) map { searchResults ⇒ searchResults flatMap { case (fullName, bytes) ⇒ Some(GlobalNameOwner.parseFrom(bytes)) filter (_.ownerType.isUser) map (o ⇒ o.ownerId → fullName) From e4cd53ed282e5eb7a9606b3601e914007d3b57ec Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 22 Jul 2016 19:31:57 +0300 Subject: [PATCH 065/253] chore(server): update actor.json --- .../actor-core/src/main/actor-api/actor.json | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index bca140d112..35fd7b3469 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -6601,6 +6601,32 @@ ] } }, + { + "type": "update", + "content": { + "name": "ChatDropCache", + "header": 2690, + "doc": [ + "Update about cache drop", + { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + } + ], + "attributes": [ + { + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + } + ] + } + }, { "type": "update", "content": { @@ -7896,6 +7922,14 @@ { "name": "DELETE", "id": 4 + }, + { + "name": "JOIN", + "id": 5 + }, + { + "name": "VIEW_INFO", + "id": 6 } ] } @@ -7975,6 +8009,8 @@ "1 - canClear. Default is FALSE.", "2 - canLeave. Default is FALSE.", "3 - canDelete. Default is FALSE.", + "4 - canJoin. Default is FALSE.", + "5 - canViewInfo. Default is FALSE.", "", { "type": "reference", From fed4f92ecf7f6de88a695255608b8bae42119750 Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 22 Jul 2016 19:34:05 +0300 Subject: [PATCH 066/253] =?UTF-8?q?feat(server:groups):=20=20=20=20?= =?UTF-8?q?=E2=80=A2=20add=20canJoin,=20canViewInfo=20permisssions=20to=20?= =?UTF-8?q?group;=20=20=20=20=E2=80=A2=20send=20ChatDropCache=20on=20group?= =?UTF-8?q?=20join?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../im/actor/server/group/GroupState.scala | 13 +++++++++++- .../server/group/MemberCommandHandlers.scala | 20 +++++++++++++------ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 5a87046151..b600c77d69 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -309,13 +309,17 @@ private[group] final case class GroupState( * 1 - canClear. Default is FALSE. * 2 - canLeave. Default is FALSE. * 3 - canDelete. Default is FALSE. + * 4 - canJoin. Default is FALSE. + * 5 - canViewInfo. Default is FALSE. */ // TODO: add ApiGroupFullPermissions def groupFor(userId: Int): Long = { ((toInt(canSendMessage(userId)) << 0) + (toInt(canClear(userId)) << 1) + (toInt(canLeave(userId)) << 2) + - (toInt(canDelete(userId)) << 3)).toLong + (toInt(canDelete(userId)) << 3) + + (toInt(canJoin(userId)) << 4) + + (toInt(canViewInfo(userId)) << 5)).toLong } /** @@ -344,6 +348,13 @@ private[group] final case class GroupState( // only owner can delete group def canDelete(clientUserId: Int): Boolean = isOwner(clientUserId) + // anyone can join in group with shared history + def canJoin(clientUserId: Int): Boolean = isHistoryShared + + // if history shared - anyone can view info + // only members can view info in private groups + def canViewInfo(clientUserId: Int): Boolean = isHistoryShared || isMember(clientUserId) + //////////////////////////// // Full group permissions // //////////////////////////// diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala index efbd494dea..5c82a2a377 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala @@ -6,7 +6,7 @@ import akka.actor.Status import akka.pattern.pipe import im.actor.api.rpc.Update import im.actor.api.rpc.groups._ -import im.actor.api.rpc.messaging.{ ApiServiceMessage, UpdateMessage } +import im.actor.api.rpc.messaging.{ ApiServiceMessage, UpdateChatDropCache, UpdateMessage } import im.actor.concurrent.FutureExt import im.actor.server.acl.ACLUtils import im.actor.server.group.GroupCommands.{ Invite, Join, Kick, Leave } @@ -39,8 +39,12 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { val memberIds = newState.memberIds val apiMembers = newState.members.values.map(_.asStruct).toVector - // if user ever been in this group - we should push these updates, - val inviteeUpdatesNew: Vector[Update] = refreshGroupUpdates(newState, cmd.inviteeUserId) + // if user ever been in this group - we should push these updates + // TODO: unify isHistoryShared usage + val inviteeUpdatesNew: Vector[Update] = { + val optDrop = if(newState.isHistoryShared) Some(UpdateChatDropCache(apiGroupPeer)) else None + optDrop ++: refreshGroupUpdates(newState, cmd.inviteeUserId) + } val membersUpdateNew: Update = if (newState.groupType.isChannel) // if channel, or group is big enough @@ -219,9 +223,12 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // that means we need to push all group-info related updates // // If user was invited to group by other member - we don't need to push group updates, - // cause they we pushed already on invite step - val joiningUserUpdatesNew: Vector[Update] = - if (wasInvited) Vector.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId) + // cause they were pushed already on invite step + // TODO: unify isHistoryShared usage + val joiningUserUpdatesNew: Vector[Update] = { + val optDrop = if(newState.isHistoryShared) Some(UpdateChatDropCache(apiGroupPeer)) else None + optDrop ++: (if (wasInvited) Vector.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId)) + } val membersUpdateNew: Update = if (newState.groupType.isChannel) // if channel, or group is big enough @@ -594,6 +601,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // Updates that will be sent to user, when he enters group. // Helps clients that have this group to refresh it's data. private def refreshGroupUpdates(newState: GroupState, userId: Int): Vector[Update] = Vector( + UpdateChatDropCache(apiGroupPeer), UpdateGroupMemberChanged(groupId, isMember = true), UpdateGroupAboutChanged(groupId, newState.about), UpdateGroupAvatarChanged(groupId, newState.avatar), From 97ed65a4cdcb832d9aa6caf016f1d77f1677b5a2 Mon Sep 17 00:00:00 2001 From: rockjam Date: Fri, 22 Jul 2016 21:04:18 +0300 Subject: [PATCH 067/253] fix(server:groups): clear and delete cleanup --- .../server/group/AdminCommandHandlers.scala | 14 ++++++++++++++ .../server/group/MemberCommandHandlers.scala | 4 ++-- .../server/persist/HistoryMessageRepo.scala | 1 - .../rpc/service/messaging/HistoryHandlers.scala | 17 +++++++++-------- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala index 1dcd4b9d6a..df37b3b8e4 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/AdminCommandHandlers.scala @@ -11,6 +11,7 @@ import im.actor.api.rpc.messaging.UpdateChatClear import im.actor.concurrent.FutureExt import im.actor.server.CommonErrors import im.actor.server.acl.ACLUtils +import im.actor.server.dialog.HistoryUtils import im.actor.server.group.GroupCommands.{ DeleteGroup, DismissUserAdmin, MakeHistoryShared, MakeUserAdmin, RevokeIntegrationToken, RevokeIntegrationTokenAck, TransferOwnership, UpdateAdminSettings, UpdateAdminSettingsAck } import im.actor.server.group.GroupErrors.{ NotAMember, NotAdmin, UserAlreadyAdmin, UserAlreadyNotAdmin } import im.actor.server.group.GroupEvents.{ AdminSettingsUpdated, AdminStatusChanged, GroupDeleted, HistoryBecameShared, IntegrationTokenRevoked, OwnerChanged } @@ -312,6 +313,8 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { val exMemberIds = state.memberIds val exGlobalName = state.shortName val exGroupType = state.groupType + val exHistoryShared = state.isHistoryShared + val peer = apiGroupPeer.asModel persist(GroupDeleted(Instant.now, cmd.clientUserId)) { evt ⇒ commit(evt) @@ -347,6 +350,17 @@ private[group] trait AdminCommandHandlers extends GroupsImplicits { // release global name of group _ ← globalNamesStorage.updateOrRemove(exGlobalName, newGlobalName = None, GlobalNameOwner(OwnerType.Group, groupId)) + // explicitly delete group history. + // TODO: move to utility method + _ ← if (exHistoryShared) { + db.run(HistoryMessageRepo.deleteAll(HistoryUtils.SharedUserId, peer)) + } else { + // for client user we delete history separately + FutureExt.ftraverse((exMemberIds - cmd.clientUserId).toSeq) { userId ⇒ + db.run(HistoryMessageRepo.deleteAll(userId, peer)) + } + } + /////////////////////////// // Groups V1 API updates // /////////////////////////// diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala index 5c82a2a377..06b19c0976 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala @@ -42,7 +42,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // if user ever been in this group - we should push these updates // TODO: unify isHistoryShared usage val inviteeUpdatesNew: Vector[Update] = { - val optDrop = if(newState.isHistoryShared) Some(UpdateChatDropCache(apiGroupPeer)) else None + val optDrop = if (newState.isHistoryShared) Some(UpdateChatDropCache(apiGroupPeer)) else None optDrop ++: refreshGroupUpdates(newState, cmd.inviteeUserId) } @@ -226,7 +226,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // cause they were pushed already on invite step // TODO: unify isHistoryShared usage val joiningUserUpdatesNew: Vector[Update] = { - val optDrop = if(newState.isHistoryShared) Some(UpdateChatDropCache(apiGroupPeer)) else None + val optDrop = if (newState.isHistoryShared) Some(UpdateChatDropCache(apiGroupPeer)) else None optDrop ++: (if (wasInvited) Vector.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId)) } diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/HistoryMessageRepo.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/HistoryMessageRepo.scala index fc80a2712b..a7d03e9cd1 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/HistoryMessageRepo.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/HistoryMessageRepo.scala @@ -214,7 +214,6 @@ object HistoryMessageRepo { .result def deleteAll(userId: Int, peer: Peer): FixedSqlAction[Int, NoStream, Write] = { - require(userId != SharedUserId, "Can't delete messages for shared user") notDeletedMessages .filter(m ⇒ m.userId === userId && m.peerType === peer.typ.value && m.peerId === peer.id) .map(_.deletedAt) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala index 4223d3ed4d..fb55eed14d 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/messaging/HistoryHandlers.scala @@ -52,24 +52,25 @@ trait HistoryHandlers { case ApiPeerType.Private | ApiPeerType.EncryptedPrivate ⇒ FastFuture.successful(true) case ApiPeerType.Group ⇒ - groupExt.isHistoryShared(peer.id) map (!_) + groupExt.isHistoryShared(peer.id) map (isShared ⇒ !isShared) } - for { - canDelete ← canClearChat - SeqState(seq, state) ← if (canDelete) { + canClearChat flatMap { canClear ⇒ + if (canClear) { for { _ ← db.run(HistoryMessageRepo.deleteAll(client.userId, peer.asModel)) - seqState ← seqUpdExt.deliverClientUpdate( + SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( client.userId, client.authId, update = UpdateChatClear(peer.asPeer) ) - } yield seqState + } yield Ok(ResponseSeq(seq, state.toByteArray)) } else { - FastFuture.successful(Error(CommonRpcErrors.forbidden("Can't clear chat with shared history"))) + FastFuture.successful[HandlerResult[ResponseSeq]]( + Error(CommonRpcErrors.forbidden("Can't clear chat with shared history")) + ) } - } yield Ok(ResponseSeq(seq, state.toByteArray)) + } } override def doHandleDeleteChat(peer: ApiOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = { From bc771f9f4e3054e158ee4dfa3b86c3eec62a8e90 Mon Sep 17 00:00:00 2001 From: rockjam Date: Sun, 24 Jul 2016 22:24:14 +0300 Subject: [PATCH 068/253] fix(server:dialogs): return UpdateChatDelete on chat delete --- .../src/main/scala/im/actor/server/dialog/DialogRoot.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala index 090a6d0553..a177f55057 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/dialog/DialogRoot.scala @@ -219,8 +219,8 @@ private class DialogRoot(val userId: Int, extensions: Seq[ApiExtension]) commit(e) (for { _ ← db.run(HistoryMessageRepo.deleteAll(userId, peer)) - _ ← seqUpdExt.deliverUserUpdate(userId, UpdateChatDelete(peer.asStruct)) - seqState ← sendChatGroupsChanged(clientAuthId) + seqState ← seqUpdExt.deliverClientUpdate(userId, clientAuthId, update = UpdateChatDelete(peer.asStruct)) + _ ← sendChatGroupsChanged(0L) // _ = thatDialog ! PoisonPill // kill that dialog would be good } yield seqState) pipeTo sender() } From bad092c1649c152dfb005c0998774b818cc20f4d Mon Sep 17 00:00:00 2001 From: rockjam Date: Sun, 24 Jul 2016 22:59:05 +0300 Subject: [PATCH 069/253] chore(server): update actor.json --- .../actor-core/src/main/actor-api/actor.json | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index 35fd7b3469..5e9fdbab71 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -10220,6 +10220,36 @@ ] } }, + { + "type": "rpc", + "content": { + "name": "JoinGroupByPeer", + "header": 2722, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Join group by peer", + { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + } + ], + "attributes": [ + { + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + } + ] + } + }, { "type": "comment", "content": "Administration" From 40fa960893a08f69f44f1fe606a094698fd62bc1 Mon Sep 17 00:00:00 2001 From: rockjam Date: Sun, 24 Jul 2016 22:59:35 +0300 Subject: [PATCH 070/253] feat(server:groups): implement join group by peer method --- .../rpc/service/groups/GroupRpcErrors.scala | 1 + .../service/groups/GroupsServiceImpl.scala | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala index ecf61be123..e668f74df1 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupRpcErrors.scala @@ -19,6 +19,7 @@ object GroupRpcErrors { val InvalidInviteGroup = RpcError(403, "INVALID_INVITE_GROUP", "Invalid group name provided!", false, None) val GroupNotPublic = RpcError(400, "GROUP_IS_NOT_PUBLIC", "The group is not public.", false, None) val CantLeaveGroup = RpcError(403, "CANT_LEAVE_GROUP", "You can't leave this group!", false, None) + val CantJoinGroup = RpcError(403, "CANT_JOIN_GROUP", "You can't join this group!", false, None) val InvalidShortName = RpcError(400, "GROUP_SHORT_NAME_INVALID", "Invalid group short name. Valid short name should contain from 5 to 32 characters, and may consist of latin characters, numbers and underscores", false, None) val ShortNameTaken = RpcError(400, "GROUP_SHORT_NAME_TAKEN", "This short name already belongs to other user or group, we are sorry!", false, None) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index 88cbae7636..c6876f852a 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -413,6 +413,28 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act action.value } + override def doHandleJoinGroupByPeer(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = + authorized(clientData) { implicit client ⇒ + withGroupOutPeer(groupPeer) { + val action = for { + apiGroup ← fromFuture(groupExt.getApiStruct(groupPeer.groupId, client.userId)) + _ ← fromBoolean(GroupRpcErrors.CantJoinGroup)(canJoin(apiGroup.permissions)) + joinResp ← fromFuture(groupExt.joinGroup( + groupId = groupPeer.groupId, + joiningUserId = client.userId, + joiningUserAuthId = client.authId, + invitingUserId = None + )) + SeqStateDate(seq, state, _) = joinResp._1 + } yield ResponseSeq(seq, state.toByteArray) + + action.value + } + } + + private def canJoin(permissions: Option[Long]) = + permissions exists (p ⇒ (p & (1 << 4)) != 0) // TODO: make wrapper around permissions + override def doHandleRevokeInviteUrl(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseInviteUrl]] = authorized(clientData) { implicit client ⇒ withGroupOutPeer(groupPeer) { From 1f92c5f7c6bfd1597521242dd030b2d036d781f5 Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 25 Jul 2016 16:43:08 +0300 Subject: [PATCH 071/253] fix(server:contacts): clean unregistered contacts API --- .../persist/contact/UnregisteredEmailContactRepo.scala | 9 +++------ .../persist/contact/UnregisteredPhoneContactRepo.scala | 4 ++-- .../im/actor/server/user/ContactRegisteredSpec.scala | 4 ++-- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/contact/UnregisteredEmailContactRepo.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/contact/UnregisteredEmailContactRepo.scala index 016b81783d..1853f58ab6 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/contact/UnregisteredEmailContactRepo.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/contact/UnregisteredEmailContactRepo.scala @@ -12,14 +12,11 @@ final class UnregisteredEmailContactTable(tag: Tag) extends UnregisteredContactB } object UnregisteredEmailContactRepo { - val emailContacts = TableQuery[UnregisteredEmailContactTable] + private val emailContacts = TableQuery[UnregisteredEmailContactTable] - def create(email: String, ownerUserId: Int, name: Option[String]) = + private def create(email: String, ownerUserId: Int, name: Option[String]) = emailContacts += UnregisteredEmailContact(email, ownerUserId, name) - def create(contacts: Seq[UnregisteredEmailContact]) = - emailContacts ++= contacts - def createIfNotExists(email: String, ownerUserId: Int, name: Option[String]) = { create(email, ownerUserId, name).asTry } @@ -29,4 +26,4 @@ object UnregisteredEmailContactRepo { def deleteAll(email: String) = emailContacts.filter(_.email === email).delete -} \ No newline at end of file +} diff --git a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/contact/UnregisteredPhoneContactRepo.scala b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/contact/UnregisteredPhoneContactRepo.scala index c1a20bfbb1..d4d52c3e05 100644 --- a/actor-server/actor-persist/src/main/scala/im/actor/server/persist/contact/UnregisteredPhoneContactRepo.scala +++ b/actor-server/actor-persist/src/main/scala/im/actor/server/persist/contact/UnregisteredPhoneContactRepo.scala @@ -12,9 +12,9 @@ final class UnregisteredPhoneContactTable(tag: Tag) extends UnregisteredContactB } object UnregisteredPhoneContactRepo { - val phoneContacts = TableQuery[UnregisteredPhoneContactTable] + private val phoneContacts = TableQuery[UnregisteredPhoneContactTable] - def create(phoneNumber: Long, ownerUserId: Int, name: Option[String]) = + private def create(phoneNumber: Long, ownerUserId: Int, name: Option[String]) = phoneContacts += UnregisteredPhoneContact(phoneNumber, ownerUserId, name) def createIfNotExists(phoneNumber: Long, ownerUserId: Int, name: Option[String]) = { diff --git a/actor-server/actor-tests/src/test/scala/im/actor/server/user/ContactRegisteredSpec.scala b/actor-server/actor-tests/src/test/scala/im/actor/server/user/ContactRegisteredSpec.scala index c84b3b4438..ba40d6086d 100644 --- a/actor-server/actor-tests/src/test/scala/im/actor/server/user/ContactRegisteredSpec.scala +++ b/actor-server/actor-tests/src/test/scala/im/actor/server/user/ContactRegisteredSpec.scala @@ -87,7 +87,7 @@ final class ContactRegisteredSpec extends BaseAppSuite with ImplicitAuthService val (alice, aliceAuthId, aliceAuthSid, _) = createUser() val aliceClientData = ClientData(aliceAuthId, 1, Some(AuthData(alice.id, aliceAuthSid, 42))) - whenReady(db.run(UnregisteredEmailContactRepo.create("test@acme.com", alice.id, None)))(identity) + whenReady(db.run(UnregisteredEmailContactRepo.createIfNotExists("test@acme.com", alice.id, None)))(identity) val (bob, bobAuthId, bobAuthSid, _) = createUser() val bobClientData = ClientData(bobAuthId, 1, Some(AuthData(bob.id, bobAuthSid, 42))) @@ -96,4 +96,4 @@ final class ContactRegisteredSpec extends BaseAppSuite with ImplicitAuthService (aliceClientData, bobClientData) } -} \ No newline at end of file +} From f06fd3f03fe5dc675092f25d4dcfdbc11959207a Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 25 Jul 2016 19:06:49 +0300 Subject: [PATCH 072/253] feat(server:groups): group async members --- .../actor-core/src/main/protobuf/group.proto | 6 ++ .../server/group/GroupCommandHandlers.scala | 18 ++++ .../actor/server/group/GroupProcessor.scala | 16 ++-- .../im/actor/server/group/GroupState.scala | 13 ++- .../server/group/MemberCommandHandlers.scala | 92 ++++++++++++++----- .../actor/server/sequence/Optimization.scala | 4 +- 6 files changed, 106 insertions(+), 43 deletions(-) diff --git a/actor-server/actor-core/src/main/protobuf/group.proto b/actor-server/actor-core/src/main/protobuf/group.proto index 654125b819..b0fa464429 100644 --- a/actor-server/actor-core/src/main/protobuf/group.proto +++ b/actor-server/actor-core/src/main/protobuf/group.proto @@ -156,6 +156,12 @@ message GroupEvents { required int32 executor_user_id = 2; } + message MembersBecameAsync { + option (scalapb.message).extends = "im.actor.server.group.GroupEvent"; + + required int64 ts = 1 [(scalapb.field).type = "java.time.Instant"]; + } + message GroupDeleted { option (scalapb.message).extends = "im.actor.server.group.GroupEvent"; diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 6ccef21e6c..0b0b37ac66 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -172,4 +172,22 @@ private[group] trait GroupCommandHandlers protected def isValidTitle(title: String) = title.nonEmpty && title.length < 255 + protected def updateCanCall(currState: GroupState): Unit = { + currState.memberIds foreach { userId ⇒ + permissionsUpdates(userId, currState) foreach { update ⇒ + seqUpdExt.deliverUserUpdate(userId, update) + } + } + } + + protected def makeMembersAsync(): Unit = { + persist(MembersBecameAsync(Instant.now)) { evt ⇒ + val newState = commit(evt) + + seqUpdExt.broadcastPeopleUpdate( + userIds = newState.memberIds, + update = UpdateGroupMembersBecameAsync(groupId) + ) + } + } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index 3c7488b586..4a5856c146 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -93,7 +93,8 @@ object GroupProcessor { 22019 → classOf[GroupEvents.AdminSettingsUpdated], 22020 → classOf[GroupEvents.AdminStatusChanged], 22021 → classOf[GroupEvents.HistoryBecameShared], - 22022 → classOf[GroupEvents.GroupDeleted] + 22022 → classOf[GroupEvents.GroupDeleted], + 22023 → classOf[GroupEvents.MembersBecameAsync] ) def persistenceIdFor(groupId: Int): String = s"Group-${groupId}" @@ -187,18 +188,13 @@ private[group] final class GroupProcessor override def afterCommit(e: Event) = { super.afterCommit(e) if (recoveryFinished) { + // can't make calls in group with more than 25 members if (state.membersCount > 25) { updateCanCall(state) } - // TODO: add async members - // if(state.membersCount > 50) { updateMembersAsync(state) } - } - } - - private def updateCanCall(state: GroupState): Unit = { - state.memberIds foreach { userId ⇒ - permissionsUpdates(userId, state) foreach { update ⇒ - seqUpdExt.deliverUserUpdate(userId, update) + // from 50+ members we make group with async members + if (state.membersCount >= 50) { + makeMembersAsync() } } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index b600c77d69..2cd85489de 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -83,6 +83,7 @@ private[group] object GroupState { groupType = GroupType.General, isHidden = false, isHistoryShared = false, + isAsyncMembers = false, members = Map.empty, invitedUserIds = Set.empty, accessHash = 0L, @@ -112,6 +113,7 @@ private[group] final case class GroupState( groupType: GroupType, isHidden: Boolean, isHistoryShared: Boolean, + isAsyncMembers: Boolean, // members info members: Map[Int, Member], @@ -152,13 +154,6 @@ private[group] final case class GroupState( val isDeleted = deletedAt.nonEmpty - //TODO: add on commit(not during recovery!) hook to make group with async members, when more than 100 - def isAsyncMembers = - groupType match { - case General ⇒ members.size > 100 - case Channel ⇒ true - } - def getShowableOwner(clientUserId: Int): Option[Int] = groupType match { case General ⇒ Some(creatorUserId) @@ -168,6 +163,7 @@ private[group] final case class GroupState( override def updated(e: Event): GroupState = e match { case evt: Created ⇒ val typeOfGroup = evt.typ.getOrElse(GroupType.General) + val isMemberAsync = typeOfGroup.isChannel this.copy( id = evt.groupId, createdAt = Some(evt.ts), @@ -181,6 +177,7 @@ private[group] final case class GroupState( groupType = typeOfGroup, isHidden = evt.isHidden getOrElse false, isHistoryShared = evt.isHistoryShared getOrElse false, + isAsyncMembers = isMemberAsync, members = ( evt.userIds map { userId ⇒ userId → @@ -267,6 +264,8 @@ private[group] final case class GroupState( this.copy(adminSettings = AdminSettings.fromBitMask(bitMask)) case HistoryBecameShared(_, _) ⇒ this.copy(isHistoryShared = true) + case MembersBecameAsync(_) ⇒ + this.copy(isAsyncMembers = true) case GroupDeleted(ts, _) ⇒ // FIXME: don't implement snapshots, before figure out deleted groups behavior this.copy( diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala index 06b19c0976..37cce140ef 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala @@ -37,7 +37,6 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { val dateMillis = evt.ts.toEpochMilli val memberIds = newState.memberIds - val apiMembers = newState.members.values.map(_.asStruct).toVector // if user ever been in this group - we should push these updates // TODO: unify isHistoryShared usage @@ -46,11 +45,26 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { optDrop ++: refreshGroupUpdates(newState, cmd.inviteeUserId) } - val membersUpdateNew: Update = - if (newState.groupType.isChannel) // if channel, or group is big enough - UpdateGroupMembersCountChanged(groupId, newState.membersCount) - else - UpdateGroupMembersUpdated(groupId, apiMembers) + // For groups with not async members we should push Diff for members, and all Members for invitee + // For groups with async members we should push UpdateGroupMembersCountChanged for both invitee and members + val (inviteeUpdateNew, membersUpdateNew): (Update, Update) = + if (newState.isAsyncMembers) { + val u = UpdateGroupMembersCountChanged(groupId, newState.membersCount) + (u, u) + } else { + val apiMembers = newState.members.values.map(_.asStruct).toVector + val inviteeMember = apiMembers.find(_.userId == cmd.inviteeUserId) + + ( + UpdateGroupMembersUpdated(groupId, apiMembers), + UpdateGroupMemberDiff( + groupId, + addedMembers = inviteeMember.toVector, + membersCount = newState.membersCount, + removedUsers = Vector.empty + ) + ) + } val inviteeUpdateObsolete = UpdateGroupInviteObsolete( groupId, @@ -73,11 +87,11 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { def inviteGROUPUpdates: Future[SeqStateDate] = for { - // push updated members list to inviteeUserId, + // push updated members list/count to inviteeUserId, // make it `FatSeqUpdate` if this user invited to group for first time. _ ← seqUpdExt.deliverUserUpdate( userId = cmd.inviteeUserId, - membersUpdateNew, + update = inviteeUpdateNew, pushRules = seqUpdExt.pushRules(isFat = !inviteeIsExUser, Some(PushTexts.Invited)), deliveryId = s"invite_${groupId}_${cmd.randomId}" ) @@ -87,7 +101,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { seqUpdExt.deliverUserUpdate(userId = cmd.inviteeUserId, update) } - // push updated members list to all group members except inviteeUserId + // push updated members difference to all group members except inviteeUserId SeqState(seq, state) ← seqUpdExt.broadcastClientUpdate( userId = cmd.inviterUserId, authId = cmd.inviterAuthId, @@ -112,7 +126,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // push updated members count to inviteeUserId _ ← seqUpdExt.deliverUserUpdate( userId = cmd.inviteeUserId, - membersUpdateNew, + update = inviteeUpdateNew, pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.Invited)), deliveryId = s"invite_${groupId}_${cmd.randomId}" ) @@ -230,11 +244,35 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { optDrop ++: (if (wasInvited) Vector.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId)) } - val membersUpdateNew: Update = - if (newState.groupType.isChannel) // if channel, or group is big enough - UpdateGroupMembersCountChanged(groupId, newState.membersCount) - else - UpdateGroupMembersUpdated(groupId, apiMembers) // will update date when member got into group + // For groups with not async members we should push: + // • Diff for members; + // • Diff for joining user if he was previously invited; + // • Members for joining user if he wasn't previously invited. + // + // For groups with async members we should push: + // • UpdateGroupMembersCountChanged for both joining user and members + val (joiningUpdateNew, membersUpdateNew): (Update, Update) = + if (newState.isAsyncMembers) { + val u = UpdateGroupMembersCountChanged(groupId, newState.membersCount) + (u, u) + } else { + val joiningMember = apiMembers.find(_.userId == cmd.joiningUserId) + val diff = UpdateGroupMemberDiff( + groupId, + addedMembers = joiningMember.toVector, + membersCount = newState.membersCount, + removedUsers = Vector.empty + ) + + if (wasInvited) { + (diff, diff) + } else { + ( + UpdateGroupMembersUpdated(groupId, apiMembers), + diff + ) + } + } // TODO: not sure how it should be in old API val membersUpdateObsolete = UpdateGroupMembersUpdateObsolete(groupId, apiMembers) @@ -258,19 +296,19 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { seqUpdExt.deliverUserUpdate(userId = cmd.joiningUserId, update) } - // push updated members list to joining user, + // push updated members list/count/difference to joining user, // make it `FatSeqUpdate` if this user invited to group for first time. // TODO???: isFat = !wasInvited - is it correct? SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( userId = cmd.joiningUserId, authId = cmd.joiningUserAuthId, - update = membersUpdateNew, + update = joiningUpdateNew, pushRules = seqUpdExt.pushRules(isFat = !wasInvited, None), //!wasInvited means that user came for first time here deliveryId = s"join_${groupId}_${randomId}" ) - // push updated members list to all group members except joiningUserId + // push updated members list/count to all group members except joiningUserId _ ← seqUpdExt.broadcastPeopleUpdate( memberIds - cmd.joiningUserId, membersUpdateNew, @@ -297,7 +335,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( userId = cmd.joiningUserId, authId = cmd.joiningUserAuthId, - update = membersUpdateNew, + update = joiningUpdateNew, deliveryId = s"join_${groupId}_${randomId}" ) @@ -358,15 +396,17 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { val updatePermissions = permissionsUpdates(cmd.userId, currState = state.updated(leftEvent)) val membersUpdateNew = - if (state.groupType.isChannel) { // if channel, or group is big enough + if (state.isAsyncMembers) { UpdateGroupMembersCountChanged( groupId, membersCount = state.membersCount - 1 ) } else { - UpdateGroupMembersUpdated( + UpdateGroupMemberDiff( groupId, - members = state.members.filterNot(_._1 == cmd.userId).values.map(_.asStruct).toVector + removedUsers = Vector(cmd.userId), + addedMembers = Vector.empty, + membersCount = state.membersCount - 1 ) } @@ -487,15 +527,17 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { val updatePermissions = permissionsUpdates(cmd.kickedUserId, newState) val membersUpdateNew: Update = - if (newState.groupType.isChannel) { // if channel, or group is big enough + if (newState.isAsyncMembers) { UpdateGroupMembersCountChanged( groupId, membersCount = newState.membersCount ) } else { - UpdateGroupMembersUpdated( + UpdateGroupMemberDiff( groupId, - members = newState.members.values.map(_.asStruct).toVector + removedUsers = Vector(cmd.kickedUserId), + addedMembers = Vector.empty, + membersCount = newState.membersCount ) } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala index 5e6df967d1..01f6e81092 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/sequence/Optimization.scala @@ -3,6 +3,7 @@ package im.actor.server.sequence import com.google.protobuf.ByteString import im.actor.api.rpc.counters.UpdateCountersChanged import im.actor.api.rpc.groups._ +import im.actor.api.rpc.messaging.UpdateChatDropCache import im.actor.api.rpc.sequence.{ ApiUpdateOptimization, UpdateEmptyUpdate } import im.actor.server.messaging.MessageParsing import im.actor.server.model.SerializedUpdate @@ -44,7 +45,8 @@ object Optimization extends MessageParsing { UpdateGroupMemberAdminChanged.header, UpdateGroupShortNameChanged.header, UpdateGroupFullPermissionsChanged.header, - UpdateGroupPermissionsChanged.header + UpdateGroupPermissionsChanged.header, + UpdateChatDropCache.header ) if (deliveryTag == GroupV2) emptyUpdate From d3103801f56b8307ccdfebad2a348cc7b9487e58 Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 25 Jul 2016 19:21:42 +0300 Subject: [PATCH 073/253] fix(server:groups): update drop cache --- .../im/actor/server/group/MemberCommandHandlers.scala | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala index 37cce140ef..271d936061 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala @@ -38,7 +38,6 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { val dateMillis = evt.ts.toEpochMilli val memberIds = newState.memberIds - // if user ever been in this group - we should push these updates // TODO: unify isHistoryShared usage val inviteeUpdatesNew: Vector[Update] = { val optDrop = if (newState.isHistoryShared) Some(UpdateChatDropCache(apiGroupPeer)) else None @@ -240,8 +239,12 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // cause they were pushed already on invite step // TODO: unify isHistoryShared usage val joiningUserUpdatesNew: Vector[Update] = { - val optDrop = if (newState.isHistoryShared) Some(UpdateChatDropCache(apiGroupPeer)) else None - optDrop ++: (if (wasInvited) Vector.empty[Update] else refreshGroupUpdates(newState, cmd.joiningUserId)) + if (wasInvited) { + Vector.empty[Update] + } else { + val optDrop = if (newState.isHistoryShared) Some(UpdateChatDropCache(apiGroupPeer)) else None + optDrop ++: refreshGroupUpdates(newState, cmd.joiningUserId) + } } // For groups with not async members we should push: @@ -643,7 +646,6 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // Updates that will be sent to user, when he enters group. // Helps clients that have this group to refresh it's data. private def refreshGroupUpdates(newState: GroupState, userId: Int): Vector[Update] = Vector( - UpdateChatDropCache(apiGroupPeer), UpdateGroupMemberChanged(groupId, isMember = true), UpdateGroupAboutChanged(groupId, newState.about), UpdateGroupAvatarChanged(groupId, newState.avatar), From 9c92ad4bf3285954d640cf2672944b6a05a444b8 Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 25 Jul 2016 19:23:51 +0300 Subject: [PATCH 074/253] refactor(server:groups): add some logging --- .../main/scala/im/actor/server/group/GroupCommandHandlers.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala index 0b0b37ac66..0eb5380506 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupCommandHandlers.scala @@ -173,6 +173,7 @@ private[group] trait GroupCommandHandlers protected def isValidTitle(title: String) = title.nonEmpty && title.length < 255 protected def updateCanCall(currState: GroupState): Unit = { + log.debug(s"Group {} can call updated", groupId) currState.memberIds foreach { userId ⇒ permissionsUpdates(userId, currState) foreach { update ⇒ seqUpdExt.deliverUserUpdate(userId, update) @@ -183,6 +184,7 @@ private[group] trait GroupCommandHandlers protected def makeMembersAsync(): Unit = { persist(MembersBecameAsync(Instant.now)) { evt ⇒ val newState = commit(evt) + log.debug(s"Group {} became async members", groupId) seqUpdExt.broadcastPeopleUpdate( userIds = newState.memberIds, From 1102c6f947d079ba925b1bbbe241a0d7411f05ad Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 25 Jul 2016 20:08:51 +0300 Subject: [PATCH 075/253] chore(server): update actor.json --- .../actor-core/src/main/actor-api/actor.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index 5e9fdbab71..544ad17482 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -6637,7 +6637,7 @@ { "type": "reference", "argument": "dialogs", - "category": "full", + "category": "compact", "description": " New dialgos list" } ], @@ -10415,6 +10415,12 @@ "argument": "canAdminsEditGroupInfo", "category": "full", "description": " Can admins edit group info" + }, + { + "type": "reference", + "argument": "showJoinLeaveMessages", + "category": "full", + "description": " Should join and leave messages be visible to members" } ], "expandable": "true", @@ -10438,6 +10444,11 @@ "type": "bool", "id": 4, "name": "canAdminsEditGroupInfo" + }, + { + "type": "bool", + "id": 5, + "name": "showJoinLeaveMessages" } ] } From cbf1d0af19d1cee0da343fd0d9637c13e618382f Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 25 Jul 2016 20:24:16 +0300 Subject: [PATCH 076/253] feat(server:groups): admin setting to show join/leave messages --- .../server/group/GroupQueryHandlers.scala | 3 +- .../im/actor/server/group/GroupState.scala | 27 ++++++------ .../server/group/MemberCommandHandlers.scala | 41 ++++++++++++------- 3 files changed, 43 insertions(+), 28 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala index 71fad35c88..65bf91f2b4 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupQueryHandlers.scala @@ -167,7 +167,8 @@ trait GroupQueryHandlers { showAdminsToMembers = state.adminSettings.showAdminsToMembers, canMembersInvite = state.adminSettings.canMembersInvite, canMembersEditGroupInfo = state.adminSettings.canMembersEditGroupInfo, - canAdminsEditGroupInfo = state.adminSettings.canAdminsEditGroupInfo + canAdminsEditGroupInfo = state.adminSettings.canAdminsEditGroupInfo, + showJoinLeaveMessages = state.adminSettings.showJoinLeaveMessages ) ) } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index 2cd85489de..b5799b9625 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -27,26 +27,27 @@ object AdminSettings { showAdminsToMembers = true, canMembersInvite = true, canMembersEditGroupInfo = true, - canAdminsEditGroupInfo = true + canAdminsEditGroupInfo = true, + showJoinLeaveMessages = true ) val ChannelsDefault = AdminSettings( showAdminsToMembers = false, canMembersInvite = false, canMembersEditGroupInfo = false, - canAdminsEditGroupInfo = true + canAdminsEditGroupInfo = true, + showJoinLeaveMessages = false // TODO: figure it out. We don't use it by default ) // format: OFF def apiToBitMask(settings: ApiAdminSettings): Int = { - def toInt(b: Boolean) = if(b) 1 else 0 - - List( - toInt(settings.showAdminsToMembers) << 0, - toInt(settings.canMembersInvite) << 1, - toInt(settings.canMembersEditGroupInfo) << 2, - toInt(settings.canAdminsEditGroupInfo) << 3 - ).sum + def toInt(b: Boolean) = if (b) 1 else 0 + + (toInt(settings.showAdminsToMembers) << 0) + + (toInt(settings.canMembersInvite) << 1) + + (toInt(settings.canMembersEditGroupInfo) << 2) + + (toInt(settings.canAdminsEditGroupInfo) << 3) + + (toInt(settings.showJoinLeaveMessages) << 4) } def fromBitMask(mask: Int): AdminSettings = { @@ -54,7 +55,8 @@ object AdminSettings { showAdminsToMembers = (mask & (1 << 0)) != 0, canMembersInvite = (mask & (1 << 1)) != 0, canMembersEditGroupInfo = (mask & (1 << 2)) != 0, - canAdminsEditGroupInfo = (mask & (1 << 3)) != 0 + canAdminsEditGroupInfo = (mask & (1 << 3)) != 0, + showJoinLeaveMessages = (mask & (1 << 4)) != 0 ) } // format: ON @@ -64,7 +66,8 @@ private[group] final case class AdminSettings( showAdminsToMembers: Boolean, // 1 canMembersInvite: Boolean, // 2 canMembersEditGroupInfo: Boolean, // 4 - canAdminsEditGroupInfo: Boolean // 8 + canAdminsEditGroupInfo: Boolean, // 8 + showJoinLeaveMessages: Boolean // 16 ) private[group] object GroupState { diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala index 271d936061..fa4cf0a250 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala @@ -3,6 +3,7 @@ package im.actor.server.group import java.time.{ Instant, LocalDateTime, ZoneOffset } import akka.actor.Status +import akka.http.scaladsl.util.FastFuture import akka.pattern.pipe import im.actor.api.rpc.Update import im.actor.api.rpc.groups._ @@ -228,6 +229,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { val date = evt.ts val dateMillis = date.toEpochMilli + val showJoinMessage = newState.adminSettings.showJoinLeaveMessages val memberIds = newState.memberIds val apiMembers = newState.members.values.map(_.asStruct).toVector val randomId = ACLUtils.randomLong() @@ -318,13 +320,17 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { deliveryId = s"userjoined_${groupId}_${randomId}" ) - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - senderUserId = cmd.joiningUserId, - senderAuthId = cmd.joiningUserAuthId, - randomId = randomId, - serviceMessage // no delivery tag. This updated handled this way in Groups V1 - ) + date ← if (showJoinMessage) { + dialogExt.sendServerMessage( + apiGroupPeer, + senderUserId = cmd.joiningUserId, + senderAuthId = cmd.joiningUserAuthId, + randomId = randomId, + serviceMessage // no delivery tag. This updated handled this way in Groups V1 + ) map (_.date) + } else { + FastFuture.successful(dateMillis) + } } yield SeqStateDate(seq, state, date) def joinCHANNELUpdates: Future[SeqStateDate] = @@ -393,6 +399,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { // no commit here. it will be after service message sent val dateMillis = evt.ts.toEpochMilli + val showLeaveMessage = state.adminSettings.showJoinLeaveMessages val updateObsolete = UpdateGroupUserLeaveObsolete(groupId, cmd.userId, dateMillis, cmd.randomId) @@ -432,14 +439,18 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { ) // send service message - SeqStateDate(_, _, date) ← dialogExt.sendServerMessage( - apiGroupPeer, - senderUserId = cmd.userId, - senderAuthId = cmd.authId, - randomId = cmd.randomId, - message = serviceMessage, - deliveryTag = Some(Optimization.GroupV2) - ) + date ← if (showLeaveMessage) { + dialogExt.sendServerMessage( + apiGroupPeer, + senderUserId = cmd.userId, + senderAuthId = cmd.authId, + randomId = cmd.randomId, + message = serviceMessage, + deliveryTag = Some(Optimization.GroupV2) + ) map (_.date) + } else { + FastFuture.successful(dateMillis) + } // push left user that he is no longer a member SeqState(seq, state) ← seqUpdExt.deliverClientUpdate( From c76645c214f68e2b53c970eee174e6f8b80096a5 Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 25 Jul 2016 20:55:22 +0300 Subject: [PATCH 077/253] fix(server:groups): push join message to joining user --- .../server/group/MemberCommandHandlers.scala | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala index fa4cf0a250..bc7d52be6b 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala @@ -329,7 +329,17 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { serviceMessage // no delivery tag. This updated handled this way in Groups V1 ) map (_.date) } else { - FastFuture.successful(dateMillis) + // push join message only to joining user + seqUpdExt.deliverUserUpdate( + userId = cmd.joiningUserId, + update = serviceMessageUpdate( + cmd.joiningUserId, + dateMillis, + randomId, + serviceMessage + ), + deliveryTag = Some(Optimization.GroupV2) + ) map (_ ⇒ dateMillis) } } yield SeqStateDate(seq, state, date) @@ -354,6 +364,18 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { membersUpdateNew, deliveryId = s"userjoined_${groupId}_${randomId}" ) + + // push join message only to joining user + _ <- seqUpdExt.deliverUserUpdate( + userId = cmd.joiningUserId, + update = serviceMessageUpdate( + cmd.joiningUserId, + dateMillis, + randomId, + serviceMessage + ), + deliveryTag = Some(Optimization.GroupV2) + ) } yield SeqStateDate(seq, state, dateMillis) val result: Future[(SeqStateDate, Vector[Int], Long)] = From a2723bd1559c8120628bdde9ab000017cd279812 Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 25 Jul 2016 21:02:50 +0300 Subject: [PATCH 078/253] fix(server:groups): push texts --- .../server/group/InfoCommandHandlers.scala | 6 ++--- .../server/group/MemberCommandHandlers.scala | 8 +++--- .../im/actor/server/group/PushTexts.scala | 25 ++++++++++++++++--- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/InfoCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/InfoCommandHandlers.scala index 7072283b75..389cfc7f0a 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/InfoCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/InfoCommandHandlers.scala @@ -94,7 +94,7 @@ private[group] trait InfoCommandHandlers { randomId = cmd.randomId ) val serviceMessage = GroupServiceMessages.changedTitle(title) - val pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.TitleChanged)) + val pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.titleChanged(newState.groupType))) //TODO: remove deprecated db.run(GroupRepo.updateTitle(groupId, title, cmd.clientUserId, cmd.randomId, date = evt.ts)) @@ -168,7 +168,7 @@ private[group] trait InfoCommandHandlers { date = dateMillis ) val serviceMessage = GroupServiceMessages.changedTopic(topic) - val pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.TopicChanged)) + val pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.topicChanged(newState.groupType))) //TODO: remove deprecated db.run(GroupRepo.updateTopic(groupId, topic)) @@ -232,7 +232,7 @@ private[group] trait InfoCommandHandlers { val updateNew = UpdateGroupAboutChanged(groupId, about) val updateObsolete = UpdateGroupAboutChangedObsolete(groupId, about) val serviceMessage = GroupServiceMessages.changedAbout(about) - val pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.TopicChanged)) + val pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.topicChanged(newState.groupType))) //TODO: remove deprecated db.run(GroupRepo.updateAbout(groupId, about)) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala index bc7d52be6b..16a4b64d61 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/MemberCommandHandlers.scala @@ -92,7 +92,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { _ ← seqUpdExt.deliverUserUpdate( userId = cmd.inviteeUserId, update = inviteeUpdateNew, - pushRules = seqUpdExt.pushRules(isFat = !inviteeIsExUser, Some(PushTexts.Invited)), + pushRules = seqUpdExt.pushRules(isFat = !inviteeIsExUser, Some(PushTexts.invited(newState.groupType))), deliveryId = s"invite_${groupId}_${cmd.randomId}" ) @@ -127,7 +127,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { _ ← seqUpdExt.deliverUserUpdate( userId = cmd.inviteeUserId, update = inviteeUpdateNew, - pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.Invited)), + pushRules = seqUpdExt.pushRules(isFat = false, Some(PushTexts.invited(newState.groupType))), deliveryId = s"invite_${groupId}_${cmd.randomId}" ) @@ -167,7 +167,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { _ ← seqUpdExt.deliverUserUpdate( userId = cmd.inviteeUserId, inviteeUpdateObsolete, - pushRules = seqUpdExt.pushRules(isFat = true, Some(PushTexts.Invited)), + pushRules = seqUpdExt.pushRules(isFat = true, Some(PushTexts.invited(newState.groupType))), deliveryId = s"invite_obsolete_${groupId}_${cmd.randomId}" ) @@ -366,7 +366,7 @@ private[group] trait MemberCommandHandlers extends GroupsImplicits { ) // push join message only to joining user - _ <- seqUpdExt.deliverUserUpdate( + _ ← seqUpdExt.deliverUserUpdate( userId = cmd.joiningUserId, update = serviceMessageUpdate( cmd.joiningUserId, diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/PushTexts.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/PushTexts.scala index 674d313ea7..bdb45dc401 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/PushTexts.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/PushTexts.scala @@ -3,10 +3,27 @@ package im.actor.server.group //TODO: make up to date with channels object PushTexts { val Added = "User added" - val Invited = "You are invited to a group" val Kicked = "User kicked" val Left = "User left" - val TitleChanged = "Group title changed" - val TopicChanged = "Group topic changed" - val AboutChanged = "Group about changed" + + def invited(gt: GroupType) = + if (gt.isChannel) { + "You are invited to a channel" + } else { + "You are invited to a group" + } + + def titleChanged(gt: GroupType) = + if (gt.isChannel) { + "Channel title changed" + } else { + "Group title changed" + } + + def topicChanged(gt: GroupType) = + if (gt.isChannel) { + "Channel topic changed" + } else { + "Group topic changed" + } } From 1a39fff9f13465d39612010a8258b17a56809124 Mon Sep 17 00:00:00 2001 From: rockjam Date: Mon, 25 Jul 2016 21:28:10 +0300 Subject: [PATCH 079/253] fix(server): fix --- .../src/main/scala/im/actor/server/group/GroupProcessor.scala | 4 ++-- .../src/main/scala/im/actor/server/group/GroupState.scala | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala index 4a5856c146..009961ccfa 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupProcessor.scala @@ -189,11 +189,11 @@ private[group] final class GroupProcessor super.afterCommit(e) if (recoveryFinished) { // can't make calls in group with more than 25 members - if (state.membersCount > 25) { + if (state.membersCount == 26) { updateCanCall(state) } // from 50+ members we make group with async members - if (state.membersCount >= 50) { + if (state.membersCount >= 50 && !state.isAsyncMembers) { makeMembersAsync() } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala index b5799b9625..01bc29da71 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/group/GroupState.scala @@ -385,7 +385,7 @@ private[group] final case class GroupState( (toInt(canViewMembers(userId)) << 1) + (toInt(canInviteMembers(userId)) << 2) + (toInt(canInviteViaLink(userId)) << 3) + - (toInt(canCall(userId)) << 4) + + (toInt(canCall) << 4) + (toInt(canEditAdminSettings(userId)) << 5) + (toInt(canViewAdmins(userId)) << 6) + (toInt(canEditAdmins(userId)) << 7) + @@ -433,7 +433,7 @@ private[group] final case class GroupState( /** * All members can call, if group has less than 25 members, and is not a channel */ - private def canCall(clientUserId: Int) = !groupType.isChannel && membersCount <= 25 + def canCall = !groupType.isChannel && membersCount <= 25 // only owner can change admin settings def canEditAdminSettings(clientUserId: Int): Boolean = isOwner(clientUserId) From 97d62cc722f4347a6493ef4678a73e4eecca6964 Mon Sep 17 00:00:00 2001 From: Diego Date: Mon, 1 Aug 2016 09:34:41 -0300 Subject: [PATCH 080/253] changes for call custom activity after login --- .../main/java/im/actor/sdk/controllers/auth/AuthActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java index c6cb930c8e..6058d95483 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java @@ -157,7 +157,7 @@ private void updateState(AuthState state, boolean force) { break; case LOGGED_IN: finish(); - startActivity(new Intent(this, RootActivity.class)); + ActorSDK.sharedActor().startAfterLoginActivity(this); break; } } From 5818d8286ad5a21df1a09a2beceadc61a17c5b3a Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 3 Aug 2016 08:48:36 -0300 Subject: [PATCH 081/253] alteracoes --- .../src/main/java/clc/ClcApplication.java | 139 +++++++++++++++--- 1 file changed, 116 insertions(+), 23 deletions(-) diff --git a/actor-sdk/sdk-core-clc/app-clc/src/main/java/clc/ClcApplication.java b/actor-sdk/sdk-core-clc/app-clc/src/main/java/clc/ClcApplication.java index eca1cfabcf..f302142b70 100644 --- a/actor-sdk/sdk-core-clc/app-clc/src/main/java/clc/ClcApplication.java +++ b/actor-sdk/sdk-core-clc/app-clc/src/main/java/clc/ClcApplication.java @@ -2,7 +2,9 @@ import im.actor.core.*; +import im.actor.core.api.*; import im.actor.core.api.rpc.RequestEditAbout; +import im.actor.core.api.rpc.ResponseRawRequest; import im.actor.core.api.rpc.ResponseSeq; import im.actor.core.api.updates.UpdateUserAboutChanged; import im.actor.core.entity.*; @@ -15,9 +17,14 @@ import im.actor.core.viewmodel.CommandCallback; import im.actor.core.viewmodel.UserVM; import im.actor.runtime.clc.ClcJavaPreferenceStorage; +import im.actor.runtime.function.Consumer; +import im.actor.runtime.function.Function; import im.actor.runtime.generic.mvvm.AndroidListUpdate; import im.actor.runtime.generic.mvvm.BindedDisplayList; import im.actor.runtime.generic.mvvm.DisplayList; +import im.actor.runtime.json.JSONException; +import im.actor.runtime.json.JSONObject; +import im.actor.runtime.promise.Promise; import im.actor.sdk.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,7 +47,8 @@ public class ClcApplication { private static int messagesCount = 5; private static int randomSeed; - public static void sendMessage(String number, final String message) { + + public static void sendMessage(String number, final String message) { messenger.findUsers(number).start(new CommandCallback() { @Override public void onResult(UserVM[] users) { @@ -58,7 +66,7 @@ public void onResult(UserVM[] users) { @Override public void onResult(Boolean res) { if (res) { - messenger.sendMessage(peer, message); + messenger.sendMessage(peer, message); } } @@ -74,7 +82,7 @@ public void onError(Exception e) { @Override public void onError(Exception e) { - + logger.error(e.getMessage(), e); } }); } @@ -84,10 +92,10 @@ public static void signUp(final String name, Sex sex, String avatarPath) { @Override public void onResult(AuthState res) { if (res == AuthState.LOGGED_IN){ - logger.info("LOGGED_IN"); -// sendMessage("+989150000" + (myNumber + 20), "seed: " + randomSeed + "," + myNumber); + logger.info("Logado"); + sendMessage("+989150000" + (myNumber + 20), "seed: " + randomSeed + "," + myNumber); }else if(res == AuthState.SIGN_UP){ - logger.info("SIGN_UP"); + logger.info("Deve Entrar"); } } @@ -105,10 +113,73 @@ public static void sendCode(String code) { public void onResult(AuthState res) { randomSeed = new Random().nextInt(); if (res == AuthState.SIGN_UP) { - logger.info("SIGN_UP"); + logger.info("Vai Logar"); signUp("75550000" + (myNumber), Sex.MALE, null); } else if(res == AuthState.LOGGED_IN){ - logger.info("LOGGED_IN"); + logger.info("Ja esta logado, vai enviar msg"); + + // sendMessage("+556191520714", "seed: " + randomSeed + "," + myNumber); + //sendMessage("5564999663299", "Teste"); + + // List items = new ArrayList<>(); + //items.add(new ApiMapValueItem("id",new ApiInt32Value(1))); + + + ApiRawValue values = new ApiInt32Value(826965698); + + messenger.rawRequestCommand("grupoExtService","getPublicGroups", values).start(new CommandCallback() { + @Override + public void onResult(ResponseRawRequest res) { + logger.debug("TAG", "onResult: "); + logger.debug(res.toString()); + ApiArrayValue values = (ApiArrayValue) res.getResult(); + + for(ApiRawValue val : values.getArray()){ + JSONObject g = null; + try { + g = new JSONObject(((ApiStringValue)val).getText()); + + JSONObject obj = new JSONObject(); + obj.put("userId", messenger.myUid()); + obj.put("groupId", g.getInt("id")); + + ApiStringValue param = new ApiStringValue(obj.toString()); + messenger.rawRequestCommand("grupoExtService","getInviteLink", param).start(new CommandCallback() { + @Override + public void onResult(ResponseRawRequest res) { + logger.debug(((ApiStringValue)res.getResult()).getText()); + } + @Override + public void onError(Exception e) { + logger.error(e.getMessage(), e); + } + }); + + + ApiInt64Value idGrupo = new ApiInt64Value(obj.getLong("groupId")); + + messenger.rawRequestCommand("grupoExtService","getGroupAdmin", idGrupo).start(new CommandCallback() { + @Override + public void onResult(ResponseRawRequest res) { + logger.debug(String.valueOf(((ApiInt64Value)res.getResult()).getValue())); + } + @Override + public void onError(Exception e) { + logger.error(e.getMessage(), e); + } + }); + + logger.debug(g.toString()); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + @Override + public void onError(Exception e) { + logger.error("onError: ", e); + } + }); } } @@ -124,24 +195,42 @@ public void onError(Exception e) { } public static void requestSms(int phone) { - long res = Long.parseLong("75550000" + phone); - messenger.requestStartPhoneAuth(res).start(new CommandCallback() { - @Override - public void onResult(AuthState res) { - logger.info(res.toString()); - sendCode("0000"); - } + long res = Long.parseLong("75550000" + phone); + messenger.requestStartPhoneAuth(res).start(new CommandCallback() { + @Override + public void onResult(AuthState res) { + logger.info(res.toString()); + sendCode("0000"); - @Override - public void onError(Exception e) { - logger.error(e.getMessage(),e); - } - }); + } + + @Override + public void onError(Exception e) { + logger.error(e.getMessage(),e); + } + }); + +// messenger.requestStartPhoneAuth2(Long.parseLong("75550000" + phone)) +// .then(new Consumer() { +// @Override +// public void apply(AuthStartRes res) { +// logger.info(res.toString()); +// +// sendMessage("5564999663299", "Teste"); +// +// } +// }).failure(new Consumer() { +// @Override +// public void apply(Exception e) { +// logger.error(e.getMessage(), e); +// } +// }); } public static void main(String[] args) { ConfigurationBuilder builder = new ConfigurationBuilder(); + if (args.length > 0) builder.addEndpoint(args[0]); else @@ -157,21 +246,23 @@ public void loadPhoneBook(Callback callback) { builder.setNotificationProvider(new NotificationProvider() { @Override public void onMessageArriveInApp(Messenger messenger) { + logger.debug("onMessageArriveInApp"); } @Override public void onNotification(Messenger messenger, List topNotifications, int messagesCount, int conversationsCount) { + logger.debug("onNotification"); } @Override public void onUpdateNotification(Messenger messenger, List topNotifications, int messagesCount, int conversationsCount) { - + logger.debug("onUpdateNotification"); } @Override public void hideAllNotifications() { - + logger.debug("hideAllNotifications"); } }); @@ -184,7 +275,9 @@ public void hideAllNotifications() { "najva00000000000000000123-" + myNumber, "najva00000000000000000000-v1-" + myNumber)); - messenger = new ClcMessenger(builder.build(),Integer.toString(myNumber)); + + + messenger = new ClcMessenger(builder.build(), String.valueOf(myNumber)); // messenger.resetAuth(); requestSms(myNumber); From dde83471520080b0a41ec54ce0234c21de65d9f7 Mon Sep 17 00:00:00 2001 From: Actor Bot Date: Wed, 3 Aug 2016 22:04:21 +0300 Subject: [PATCH 082/253] chore(server): setting version to 3.0.0 --- actor-server/version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 5051b75100..867df91f76 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.0-SNAPSHOT" +version in ThisBuild := "3.0.0" \ No newline at end of file From 0e935616ca167d32c3bb2db35ab28537e5337558 Mon Sep 17 00:00:00 2001 From: Actor Bot Date: Wed, 3 Aug 2016 23:39:27 +0300 Subject: [PATCH 083/253] chore(server): setting version to 3.0.1-SNAPSHOT --- actor-server/version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 867df91f76..d46b3d6f4b 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.0" \ No newline at end of file +version in ThisBuild := "3.0.1-SNAPSHOT" \ No newline at end of file From f5f37822539f42c91f99fe088a51e96df43646e9 Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Sat, 6 Aug 2016 00:01:22 -0400 Subject: [PATCH 084/253] fix(iOS): Fixing speakers on video calls, remove video enable/disable --- .../Calls/AACallViewController.swift | 41 ++++++++++-------- .../Sources/Utils/AAAudioManager.swift | 42 +++++++++++++------ .../actor/core/modules/calls/CallActor.java | 6 ++- .../core/modules/calls/CallViewModels.java | 19 ++++++--- .../java/im/actor/core/viewmodel/CallVM.java | 9 +++- 5 files changed, 77 insertions(+), 40 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Calls/AACallViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Calls/AACallViewController.swift index faa8cc7ea6..e3334dce96 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Calls/AACallViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Calls/AACallViewController.swift @@ -28,7 +28,7 @@ public class AACallViewController: AAViewController, RTCEAGLVideoViewDelegate { public let declineCallButtonText = UILabel() public let muteButton = AACircleButton(size: 72) - public let videoButton = AACircleButton(size: 72) + // public let videoButton = AACircleButton(size: 72) var isScheduledDispose = false var timer: NSTimer? @@ -89,13 +89,13 @@ public class AACallViewController: AAViewController, RTCEAGLVideoViewDelegate { Actor.toggleCallMuteWithCallId(self.callId) } - videoButton.image = UIImage.bundled("ic_video_44") - videoButton.title = AALocalized("CallsVideo") - videoButton.alpha = 0 + // videoButton.image = UIImage.bundled("ic_video_44") + // videoButton.title = AALocalized("CallsVideo") + // videoButton.alpha = 0 - videoButton.button.viewDidTap = { - Actor.toggleVideoEnabledWithCallId(self.callId) - } + // videoButton.button.viewDidTap = { + // Actor.toggleVideoEnabledWithCallId(self.callId) + // } // @@ -140,7 +140,7 @@ public class AACallViewController: AAViewController, RTCEAGLVideoViewDelegate { self.view.addSubview(declineCallButton) self.view.addSubview(declineCallButtonText) self.view.addSubview(muteButton) - self.view.addSubview(videoButton) + // self.view.addSubview(videoButton) self.view.addSubview(localView) } @@ -168,7 +168,12 @@ public class AACallViewController: AAViewController, RTCEAGLVideoViewDelegate { private func layoutButtons() { muteButton.frame = CGRectMake((self.view.width / 3 - 84) / 2, self.view.height - 72 - 49, 84, 72 + 5 + 44) - videoButton.frame = CGRectMake(2 * self.view.width / 3 + (self.view.width / 3 - 84) / 2, self.view.height - 72 - 49, 84, 72 + 5 + 44) +// videoButton.frame = CGRectMake(2 * self.view.width / 3 + (self.view.width / 3 - 84) / 2, self.view.height - 72 - 49, 84, 72 + 5 + 44) +// if call.isVideoPreferred.boolValue { +// videoButton.hidden = true +// } else { +// videoButton.hidden = false +// } if !declineCallButton.hidden || !answerCallButton.hidden { if !declineCallButton.hidden && !answerCallButton.hidden { @@ -256,7 +261,7 @@ public class AACallViewController: AAViewController, RTCEAGLVideoViewDelegate { if (self.call.isOutgoing) { self.muteButton.showViewAnimated() - self.videoButton.showViewAnimated() + // self.videoButton.showViewAnimated() self.answerCallButton.hidden = true self.answerCallButtonText.hidden = true @@ -277,7 +282,7 @@ public class AACallViewController: AAViewController, RTCEAGLVideoViewDelegate { } else if (ACCallState_Enum.CONNECTING == value.toNSEnum()) { self.muteButton.showViewAnimated() - self.videoButton.showViewAnimated() + // self.videoButton.showViewAnimated() self.answerCallButton.hidden = true self.answerCallButtonText.hidden = true @@ -291,7 +296,7 @@ public class AACallViewController: AAViewController, RTCEAGLVideoViewDelegate { } else if (ACCallState_Enum.IN_PROGRESS == value.toNSEnum()) { self.muteButton.showViewAnimated() - self.videoButton.showViewAnimated() + // self.videoButton.showViewAnimated() self.answerCallButton.hidden = true self.answerCallButtonText.hidden = true @@ -305,7 +310,7 @@ public class AACallViewController: AAViewController, RTCEAGLVideoViewDelegate { } else if (ACCallState_Enum.ENDED == value.toNSEnum()) { self.muteButton.hideViewAnimated() - self.videoButton.hideViewAnimated() + // self.videoButton.hideViewAnimated() self.answerCallButton.hidden = true self.answerCallButtonText.hidden = true @@ -359,9 +364,9 @@ public class AACallViewController: AAViewController, RTCEAGLVideoViewDelegate { if call.peer.isPrivate { // Bind Video Button - binder.bind(call.isVideoEnabled) { (value: JavaLangBoolean!) -> () in - self.videoButton.filled = value.booleanValue() - } +// binder.bind(call.isVideoEnabled) { (value: JavaLangBoolean!) -> () in +// self.videoButton.filled = value.booleanValue() +// } // Local Video can be only one, so we can just keep active track reference and handle changes binder.bind(call.ownVideoTracks, closure: { (videoTracks: ACArrayListMediaTrack!) in @@ -419,8 +424,8 @@ public class AACallViewController: AAViewController, RTCEAGLVideoViewDelegate { }) } else { - self.videoButton.filled = false - self.videoButton.enabled = false + // self.videoButton.filled = false + // self.videoButton.enabled = false } } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Utils/AAAudioManager.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Utils/AAAudioManager.swift index d8fdcdc42a..5af6d6543b 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Utils/AAAudioManager.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Utils/AAAudioManager.swift @@ -22,11 +22,11 @@ public class AAAudioManager: NSObject, AVAudioPlayerDelegate { private var isVisible = false private var isEnabled: Bool = false + private var isVideoPreferred = false private var openedConnections: Int = 0 public override init() { - super.init() - + super.init() } public func appVisible() { @@ -38,6 +38,8 @@ public class AAAudioManager: NSObject, AVAudioPlayerDelegate { } public func callStart(call: ACCallVM) { + isVideoPreferred = call.isVideoPreferred + if !call.isOutgoing { isRinging = true if isVisible { @@ -46,7 +48,7 @@ public class AAAudioManager: NSObject, AVAudioPlayerDelegate { audioRouter.category = AVAudioSessionCategoryPlayAndRecord audioRouter.mode = AVAudioSessionModeDefault audioRouter.currentRoute = .Speaker - audioRouter.isEnabled = isEnabled + audioRouter.isEnabled = true } ringtoneStart() } else { @@ -55,28 +57,42 @@ public class AAAudioManager: NSObject, AVAudioPlayerDelegate { vibrate() } else { isEnabled = true - audioRouter.category = AVAudioSessionCategoryPlayAndRecord - audioRouter.mode = AVAudioSessionModeVoiceChat - audioRouter.currentRoute = .Receiver - audioRouter.isEnabled = isEnabled + audioRouter.batchedUpdate { + audioRouter.category = AVAudioSessionCategoryPlayAndRecord + audioRouter.mode = AVAudioSessionModeVoiceChat + if isVideoPreferred { + audioRouter.currentRoute = .Speaker + } else { + audioRouter.currentRoute = .Receiver + } + audioRouter.isEnabled = true + } } } public func callAnswered(call: ACCallVM) { ringtoneEnd() isRinging = false - audioRouter.mode = AVAudioSessionModeVoiceChat - audioRouter.currentRoute = .Receiver + audioRouter.batchedUpdate { + audioRouter.mode = AVAudioSessionModeVoiceChat + if isVideoPreferred { + audioRouter.currentRoute = .Speaker + } else { + audioRouter.currentRoute = .Receiver + } + } } public func callEnd(call: ACCallVM) { ringtoneEnd() isRinging = false isEnabled = false - audioRouter.category = AVAudioSessionCategorySoloAmbient - audioRouter.mode = AVAudioSessionModeDefault - audioRouter.currentRoute = .Receiver - audioRouter.isEnabled = isEnabled + audioRouter.batchedUpdate { + audioRouter.category = AVAudioSessionCategorySoloAmbient + audioRouter.mode = AVAudioSessionModeDefault + audioRouter.currentRoute = .Receiver + audioRouter.isEnabled = false + } } public func peerConnectionStarted() { diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/calls/CallActor.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/calls/CallActor.java index cd4a9bb38d..329b300ce3 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/calls/CallActor.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/calls/CallActor.java @@ -66,7 +66,8 @@ public void preStart() { callBus.joinMasterBus(responseDoCall.getEventBusId(), responseDoCall.getDeviceId()); callBus.changeVideoEnabled(isVideoInitiallyEnabled); callBus.startOwn(); - callVM = callViewModels.spawnNewOutgoingVM(responseDoCall.getCallId(), peer, isVideoInitiallyEnabled); + callVM = callViewModels.spawnNewOutgoingVM(responseDoCall.getCallId(), peer, isVideoInitiallyEnabled, + isVideoInitiallyEnabled); }).failure(e -> self().send(PoisonPill.INSTANCE)); } else { api(new RequestGetCallInfo(callId)).then(responseGetCallInfo -> { @@ -76,7 +77,8 @@ public void preStart() { isVideoInitiallyEnabled = responseGetCallInfo.isVideoPreferred(); callBus.changeVideoEnabled(isVideoInitiallyEnabled); } - callVM = callViewModels.spawnNewIncomingVM(callId, peer, isVideoInitiallyEnabled, CallState.RINGING); + callVM = callViewModels.spawnNewIncomingVM(callId, peer, isVideoInitiallyEnabled, + isVideoInitiallyEnabled, CallState.RINGING); }).failure(e -> self().send(PoisonPill.INSTANCE)); } } diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/calls/CallViewModels.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/calls/CallViewModels.java index 094276249c..a42a3eba3b 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/calls/CallViewModels.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/calls/CallViewModels.java @@ -27,23 +27,29 @@ public synchronized CallVM getCall(long id) { return callModels.get(id); } - public synchronized CallVM spawnNewVM(long callId, Peer peer, boolean isOutgoing, boolean isVideoEnabled, ArrayList members, CallState callState) { - CallVM callVM = new CallVM(callId, peer, isOutgoing, isVideoEnabled, members, callState); + public synchronized CallVM spawnNewVM(long callId, Peer peer, boolean isOutgoing, + boolean isVideoEnabled, boolean isVideoPreffered, + ArrayList members, CallState callState) { + CallVM callVM = new CallVM(callId, peer, isOutgoing, isVideoEnabled, isVideoPreffered, + members, callState); synchronized (callModels) { callModels.put(callId, callVM); } return callVM; } - public synchronized CallVM spawnNewIncomingVM(long callId, Peer peer, boolean isVideoEnabled, CallState callState) { - CallVM callVM = new CallVM(callId, peer, false, isVideoEnabled, new ArrayList<>(), callState); + public synchronized CallVM spawnNewIncomingVM(long callId, Peer peer, boolean isVideoEnabled, + boolean isVideoPreffered, CallState callState) { + CallVM callVM = new CallVM(callId, peer, false, isVideoEnabled, isVideoPreffered, + new ArrayList<>(), callState); synchronized (callModels) { callModels.put(callId, callVM); } return callVM; } - public synchronized CallVM spawnNewOutgoingVM(long callId, Peer peer, boolean isVideoEnabled) { + public synchronized CallVM spawnNewOutgoingVM(long callId, Peer peer, boolean isVideoEnabled, + boolean isVideoPreferred) { ArrayList members = new ArrayList<>(); if (peer.getPeerType() == PeerType.PRIVATE || peer.getPeerType() == PeerType.PRIVATE_ENCRYPTED) { @@ -56,6 +62,7 @@ public synchronized CallVM spawnNewOutgoingVM(long callId, Peer peer, boolean is } } } - return spawnNewVM(callId, peer, true, isVideoEnabled, members, CallState.RINGING); + return spawnNewVM(callId, peer, true, isVideoEnabled, isVideoPreferred, members, + CallState.RINGING); } } diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/viewmodel/CallVM.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/viewmodel/CallVM.java index be0a615179..3e5a55246e 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/viewmodel/CallVM.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/viewmodel/CallVM.java @@ -35,6 +35,8 @@ public class CallVM { private final BooleanValueModel isAudioEnabled; @Property("nonatomic, readonly") private final BooleanValueModel isVideoEnabled; + @Property("nonatomic, readonly") + private final boolean isVideoPreferred; @Property("nonatomic, readonly") private final ValueModel> members; @@ -45,7 +47,7 @@ public class CallVM { @Property("nonatomic, readonly") private final boolean isOutgoing; - public CallVM(long callId, Peer peer, boolean isOutgoing, boolean isVideoEnabled, ArrayList initialMembers, CallState state) { + public CallVM(long callId, Peer peer, boolean isOutgoing, boolean isVideoEnabled, boolean isVideoPreferred, ArrayList initialMembers, CallState state) { this.callId = callId; this.peer = peer; this.isOutgoing = isOutgoing; @@ -57,6 +59,7 @@ public CallVM(long callId, Peer peer, boolean isOutgoing, boolean isVideoEnabled this.members = new ValueModel<>("calls." + callId + ".members", new ArrayList<>(initialMembers)); this.isAudioEnabled = new BooleanValueModel("calls." + callId + ".audio_enabled", true); this.isVideoEnabled = new BooleanValueModel("calls." + callId + ".video_enabled", isVideoEnabled); + this.isVideoPreferred = isVideoPreferred; this.callStart = 0; } @@ -88,6 +91,10 @@ public ValueModel> getMembers() { return members; } + public boolean isVideoPreferred() { + return isVideoPreferred; + } + public void setCallStart(long callStart) { this.callStart = callStart; } From 6b16a9bc3da1b5992fdd3b3aa545bd88af1424a1 Mon Sep 17 00:00:00 2001 From: diego Date: Sat, 6 Aug 2016 11:24:30 -0300 Subject: [PATCH 085/253] alteracoes --- .../src/main/java/im/actor/Application.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index 9f7f8be97a..9c2756a110 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -1,5 +1,6 @@ package im.actor; +import android.graphics.Color; import android.os.Bundle; import android.support.multidex.MultiDex; import android.support.v4.app.Fragment; @@ -43,11 +44,20 @@ public void onCreate() { public void onConfigureActorSDK() { ActorSDK.sharedActor().setDelegate(new ActorSDKDelegate()); ActorSDK.sharedActor().setPushId(209133700967L); + ActorSDK.sharedActor().setActorPushEndpoint(null); ActorStyle style = ActorSDK.sharedActor().style; style.setDialogsActiveTextColor(0xff5882ac); style.setShowAvatarPrivateInTitle(false); + style.setDialogsActiveTextColor(0xff5882ac); + style.setMainColor(Color.parseColor("#A43436")); + style.setAccentColor(Color.parseColor("#1F3255")); + style.setAccentPressedColor(Color.parseColor("#1F3255")); + style.setPrimaryAltColor(Color.parseColor("#A43436")); + style.setToolBarColor(Color.parseColor("#A43436")); + style.setFabColor(Color.parseColor("#A43436")); + ActorSDK.sharedActor().setFastShareEnabled(true); ActorSDK.sharedActor().setCallsEnabled(true); @@ -61,6 +71,8 @@ public void onConfigureActorSDK() { "actor_news" }); + ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); + // ActorSDK.sharedActor().setTwitter(""); // ActorSDK.sharedActor().setHomePage("http://www.foo.com"); From dfa0a0db7593d44eee3f2aa2774b32d4a5346f88 Mon Sep 17 00:00:00 2001 From: diego Date: Sat, 6 Aug 2016 21:28:07 -0300 Subject: [PATCH 086/253] alteracoes --- .../src/main/java/im/actor/Application.java | 4 +++- .../src/main/java/im/actor/sdk/ActorStyle.java | 13 +++++++++++++ .../sdk/controllers/activity/BaseActivity.java | 16 ++++++++++++++++ .../activity/BaseFragmentActivity.java | 15 +++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index 9c2756a110..0f2dca86a2 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -53,6 +53,7 @@ public void onConfigureActorSDK() { style.setDialogsActiveTextColor(0xff5882ac); style.setMainColor(Color.parseColor("#A43436")); style.setAccentColor(Color.parseColor("#1F3255")); + style.setStatusBarColor(Color.parseColor("#A43436")); style.setAccentPressedColor(Color.parseColor("#1F3255")); style.setPrimaryAltColor(Color.parseColor("#A43436")); style.setToolBarColor(Color.parseColor("#A43436")); @@ -71,7 +72,8 @@ public void onConfigureActorSDK() { "actor_news" }); - ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); +// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); + ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://64.137.236.110:9070"}); // ActorSDK.sharedActor().setTwitter(""); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorStyle.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorStyle.java index 95a729f7ff..c97193d415 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorStyle.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorStyle.java @@ -54,6 +54,8 @@ public void setDefaultAvatarPlaceholders(int[] defaultAvatarPlaceholders) { //main color private int mainColor = 0xff4d74a6; + + public int getMainColor() { return mainColor; } @@ -62,6 +64,17 @@ public void setMainColor(int mainColor) { this.mainColor = mainColor; } + //status bar color + private int statusBarColor = 0xff4d74a6; + + public int getStatusBarColor() { + return statusBarColor; + } + + public void setStatusBarColor(int statusBarColor) { + this.statusBarColor = statusBarColor; + } + // primary alt colors private int primaryAltColor = 0xff4ca665; diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseActivity.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseActivity.java index f1cc93a875..e107f0f65c 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseActivity.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseActivity.java @@ -2,11 +2,15 @@ import android.app.ProgressDialog; import android.graphics.drawable.ColorDrawable; +import android.os.Build; import android.os.Bundle; +import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; +import android.view.Window; +import android.view.WindowManager; import android.widget.TextView; import im.actor.core.entity.Avatar; @@ -46,6 +50,18 @@ protected void onCreate(Bundle savedInstanceState) { if (getSupportActionBar() != null && STYLE.getToolBarColor() != 0) { getSupportActionBar().setBackgroundDrawable(new ColorDrawable(STYLE.getToolBarColor())); } + + changeStatusBarColor(); + + } + + public void changeStatusBarColor(){ + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + window.setStatusBarColor(STYLE.getStatusBarColor()); + } } @Override diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseFragmentActivity.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseFragmentActivity.java index 5a88b798b2..655ac60332 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseFragmentActivity.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseFragmentActivity.java @@ -1,12 +1,16 @@ package im.actor.sdk.controllers.activity; import android.graphics.drawable.ColorDrawable; +import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; +import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.view.MenuItem; import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; import android.widget.FrameLayout; import im.actor.sdk.R; @@ -42,6 +46,17 @@ protected void onCreate(Bundle savedInstanceState) { // Setting Background Color getWindow().setBackgroundDrawable(new ColorDrawable(STYLE.getMainBackgroundColor())); + + changeStatusBarColor(); + } + + public void changeStatusBarColor(){ + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + window.setStatusBarColor(STYLE.getStatusBarColor()); + } } public void showFragment(Fragment fragment, boolean addToBackStack) { From 62aa99da0f2dee8c9782d8ba63924bfbf763cea7 Mon Sep 17 00:00:00 2001 From: diego Date: Wed, 10 Aug 2016 23:55:27 -0300 Subject: [PATCH 087/253] changes for custom Intent notification --- .../src/main/java/im/actor/sdk/ActorSDKDelegate.java | 8 ++++++++ .../src/main/java/im/actor/sdk/BaseActorSDKDelegate.java | 6 ++++++ .../main/java/im/actor/sdk/core/AndroidNotifications.java | 7 ++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKDelegate.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKDelegate.java index f79148c74e..0d6ebb96ba 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKDelegate.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKDelegate.java @@ -1,5 +1,6 @@ package im.actor.sdk; +import android.content.Intent; import android.net.Uri; import android.support.v4.app.Fragment; import android.view.ViewGroup; @@ -219,5 +220,12 @@ public interface ActorSDKDelegate { */ int getNotificationColor(); + /** + * Override change notification Intent + * + * @return Intent + */ + Intent getNotificationIntent(); + } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/BaseActorSDKDelegate.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/BaseActorSDKDelegate.java index ad319c7bb7..bfbf813fb4 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/BaseActorSDKDelegate.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/BaseActorSDKDelegate.java @@ -1,5 +1,6 @@ package im.actor.sdk; +import android.content.Intent; import android.net.Uri; import android.provider.Settings; import android.support.v4.app.Fragment; @@ -137,4 +138,9 @@ public Uri getNotificationSound() { public int getNotificationColor() { return ActorSDK.sharedActor().style.getMainColor(); } + + @Override + public Intent getNotificationIntent() { + return null; + } } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/core/AndroidNotifications.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/core/AndroidNotifications.java index 2c3200fb64..7ce4010877 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/core/AndroidNotifications.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/core/AndroidNotifications.java @@ -227,8 +227,13 @@ public void onDownloaded(FileSystemReference reference) { builder.setContentTitle(ActorSDK.sharedActor().getAppName()); builder.setContentText(messagesCount + context.getString(R.string.notification_multiple_canversations_after_msg_count) + conversationsCount + context.getString(R.string.notifications_multiple_canversations_after_coversations_count)); visiblePeer = null; + + intent = ActorSDK.sharedActor().getDelegate().getNotificationIntent(); + + if(intent == null){ + intent = new Intent(context, RootActivity.class); + } - intent = new Intent(context, RootActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); builder.setContentIntent(PendingIntent.getActivity(context, 0, intent, From 6401a8d6f4b8a00c77b9ae2e3dae6f41b8b25a8d Mon Sep 17 00:00:00 2001 From: diego Date: Thu, 11 Aug 2016 00:21:00 -0300 Subject: [PATCH 088/253] changes for custom activity on notifications --- .../src/main/java/im/actor/sdk/ActorSDKDelegate.java | 9 +++------ .../src/main/java/im/actor/sdk/BaseActorSDKDelegate.java | 7 +++++-- .../java/im/actor/sdk/core/AndroidNotifications.java | 8 +++----- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKDelegate.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKDelegate.java index 0d6ebb96ba..0f6da644aa 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKDelegate.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKDelegate.java @@ -220,12 +220,9 @@ public interface ActorSDKDelegate { */ int getNotificationColor(); - /** - * Override change notification Intent - * - * @return Intent - */ - Intent getNotificationIntent(); + + + Class getNotificationIntentClass(); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/BaseActorSDKDelegate.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/BaseActorSDKDelegate.java index bfbf813fb4..93b00760ff 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/BaseActorSDKDelegate.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/BaseActorSDKDelegate.java @@ -17,6 +17,7 @@ import im.actor.sdk.controllers.conversation.messages.content.MessageHolder; import im.actor.sdk.controllers.conversation.messages.MessagesAdapter; import im.actor.sdk.controllers.conversation.quote.QuoteFragment; +import im.actor.sdk.controllers.root.RootActivity; import im.actor.sdk.controllers.settings.BaseGroupInfoActivity; import im.actor.sdk.intents.ActorIntent; import im.actor.sdk.intents.ActorIntentFragmentActivity; @@ -140,7 +141,9 @@ public int getNotificationColor() { } @Override - public Intent getNotificationIntent() { - return null; + public Class getNotificationIntentClass() { + return RootActivity.class; } + + } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/core/AndroidNotifications.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/core/AndroidNotifications.java index 7ce4010877..fae1c9b9ac 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/core/AndroidNotifications.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/core/AndroidNotifications.java @@ -227,12 +227,10 @@ public void onDownloaded(FileSystemReference reference) { builder.setContentTitle(ActorSDK.sharedActor().getAppName()); builder.setContentText(messagesCount + context.getString(R.string.notification_multiple_canversations_after_msg_count) + conversationsCount + context.getString(R.string.notifications_multiple_canversations_after_coversations_count)); visiblePeer = null; - - intent = ActorSDK.sharedActor().getDelegate().getNotificationIntent(); - if(intent == null){ - intent = new Intent(context, RootActivity.class); - } + + intent = new Intent(context, ActorSDK.sharedActor().getDelegate().getNotificationIntentClass()); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); builder.setContentIntent(PendingIntent.getActivity(context, 0, From b1693488ac2edcff7c501a7c5bd9a21c3954f2dc Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Thu, 11 Aug 2016 22:25:33 -0400 Subject: [PATCH 089/253] fix(iOS): Fixing shadows --- .../Conversation/Cell/AABubbleCell.swift | 67 ++++++------------- 1 file changed, 19 insertions(+), 48 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Cell/AABubbleCell.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Cell/AABubbleCell.swift index 98954e7c0a..518930906e 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Cell/AABubbleCell.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Cell/AABubbleCell.swift @@ -181,6 +181,9 @@ public class AABubbleCell: UICollectionViewCell { contentView.addSubview(bubble) contentView.addSubview(bubbleBorder) + if appStyle.bubbleShadowEnabled { + contentView.addSubview(bubbleShadow) + } contentView.addSubview(newMessage) contentView.addSubview(dateBg) contentView.addSubview(dateText) @@ -298,61 +301,45 @@ public class AABubbleCell: UICollectionViewCell { switch(type) { case BubbleType.TextIn: if (isCompact) { - bubbleShadow.image = AABubbleCell.cachedInTextCompactBgShadow - bubbleShadow.highlightedImage = AABubbleCell.cachedInTextCompactBgShadow bubble.image = AABubbleCell.cachedInTextCompactBg bubbleBorder.image = AABubbleCell.cachedInTextCompactBgBorder - bubble.highlightedImage = AABubbleCell.cachedInTextCompactSelectedBg - bubbleBorder.highlightedImage = AABubbleCell.cachedInTextCompactBgBorder + bubbleShadow.image = AABubbleCell.cachedInTextCompactBgShadow } else { - bubbleShadow.image = AABubbleCell.cachedInTextBgShadow - bubbleShadow.highlightedImage = AABubbleCell.cachedInTextBgShadow bubble.image = AABubbleCell.cachedInTextBg bubbleBorder.image = AABubbleCell.cachedInTextBgBorder - bubble.highlightedImage = AABubbleCell.cachedInTextBg - bubbleBorder.highlightedImage = AABubbleCell.cachedInTextBgBorder + bubbleShadow.image = AABubbleCell.cachedInTextBgShadow } break case BubbleType.TextOut: if (isCompact) { - bubbleShadow.image = AABubbleCell.cachedOutTextCompactBgShadow - bubbleShadow.highlightedImage = AABubbleCell.cachedOutTextCompactBgShadow bubble.image = AABubbleCell.cachedOutTextCompactBg bubbleBorder.image = AABubbleCell.cachedOutTextCompactBgBorder - bubble.highlightedImage = AABubbleCell.cachedOutTextCompactSelectedBg - bubbleBorder.highlightedImage = AABubbleCell.cachedOutTextCompactBgBorder + bubbleShadow.image = AABubbleCell.cachedOutTextCompactBgShadow } else { - bubbleShadow.image = AABubbleCell.cachedOutTextBgShadow - bubbleShadow.highlightedImage = AABubbleCell.cachedOutTextBgShadow bubble.image = AABubbleCell.cachedOutTextBg bubbleBorder.image = AABubbleCell.cachedOutTextBgBorder - bubble.highlightedImage = AABubbleCell.cachedOutTextBg - bubbleBorder.highlightedImage = AABubbleCell.cachedOutTextBgBorder + bubbleShadow.image = AABubbleCell.cachedOutTextBgShadow } break case BubbleType.MediaIn: bubble.image = AABubbleCell.cachedMediaBg bubbleBorder.image = AABubbleCell.cachedMediaBgBorder - bubble.highlightedImage = AABubbleCell.cachedMediaBg - bubbleBorder.highlightedImage = AABubbleCell.cachedMediaBgBorder + bubbleShadow.image = nil break case BubbleType.MediaOut: bubble.image = AABubbleCell.cachedMediaBg bubbleBorder.image = AABubbleCell.cachedMediaBgBorder - bubble.highlightedImage = AABubbleCell.cachedMediaBg - bubbleBorder.highlightedImage = AABubbleCell.cachedMediaBgBorder + bubbleShadow.image = nil break case BubbleType.Service: bubble.image = AABubbleCell.cachedServiceBg bubbleBorder.image = nil - bubble.highlightedImage = AABubbleCell.cachedServiceBg - bubbleBorder.highlightedImage = nil + bubbleShadow.image = nil break case BubbleType.Sticker: bubble.image = nil; bubbleBorder.image = nil - bubble.highlightedImage = nil; - bubbleBorder.highlightedImage = nil + bubbleShadow.image = nil break } } @@ -362,61 +349,45 @@ public class AABubbleCell: UICollectionViewCell { switch (type) { case BubbleType.TextIn: if (!isFullSize!) { - bubbleShadow.image = AABubbleCell.cachedInTextCompactBgShadow - // bubbleShadow.highlightedImage = AABubbleCell.cachedInTextCompactBgShadow bubble.image = AABubbleCell.cachedInTextCompactBg bubbleBorder.image = AABubbleCell.cachedInTextCompactBgBorder - // bubble.highlightedImage = AABubbleCell.cachedInTextCompactSelectedBg - // bubbleBorder.highlightedImage = AABubbleCell.cachedInTextCompactBgBorder + bubbleShadow.image = AABubbleCell.cachedInTextCompactBgShadow } else { - bubbleShadow.image = AABubbleCell.cachedInTextBgShadow - // bubbleShadow.highlightedImage = AABubbleCell.cachedInTextBgShadow bubble.image = AABubbleCell.cachedInTextBg bubbleBorder.image = AABubbleCell.cachedInTextBgBorder - // bubble.highlightedImage = AABubbleCell.cachedInTextBg - // bubbleBorder.highlightedImage = AABubbleCell.cachedInTextBgBorder + bubbleShadow.image = AABubbleCell.cachedInTextBgShadow } break case BubbleType.TextOut: if (!isFullSize!) { - bubbleShadow.image = AABubbleCell.cachedOutTextCompactBgShadow - // bubbleShadow.highlightedImage = AABubbleCell.cachedOutTextCompactBgShadow bubble.image = AABubbleCell.cachedOutTextCompactBg bubbleBorder.image = AABubbleCell.cachedOutTextCompactBgBorder - // bubble.highlightedImage = AABubbleCell.cachedOutTextCompactSelectedBg - // bubbleBorder.highlightedImage = AABubbleCell.cachedOutTextCompactBgBorder + bubbleShadow.image = AABubbleCell.cachedOutTextCompactBgShadow } else { - bubbleShadow.image = AABubbleCell.cachedOutTextBgShadow - // bubbleShadow.highlightedImage = AABubbleCell.cachedOutTextBgShadow bubble.image = AABubbleCell.cachedOutTextBg bubbleBorder.image = AABubbleCell.cachedOutTextBgBorder - // bubble.highlightedImage = AABubbleCell.cachedOutTextBg - // bubbleBorder.highlightedImage = AABubbleCell.cachedOutTextBgBorder + bubbleShadow.image = AABubbleCell.cachedOutTextBgShadow } break case BubbleType.MediaIn: bubble.image = AABubbleCell.cachedMediaBg bubbleBorder.image = AABubbleCell.cachedMediaBgBorder - // bubble.highlightedImage = AABubbleCell.cachedMediaBg - // bubbleBorder.highlightedImage = AABubbleCell.cachedMediaBgBorder + bubbleShadow.image = nil break case BubbleType.MediaOut: bubble.image = AABubbleCell.cachedMediaBg bubbleBorder.image = AABubbleCell.cachedMediaBgBorder - // bubble.highlightedImage = AABubbleCell.cachedMediaBg - // bubbleBorder.highlightedImage = AABubbleCell.cachedMediaBgBorder + bubbleShadow.image = nil break case BubbleType.Service: bubble.image = AABubbleCell.cachedServiceBg bubbleBorder.image = nil - // bubble.highlightedImage = AABubbleCell.cachedServiceBg - // bubbleBorder.highlightedImage = nil + bubbleShadow.image = nil break case BubbleType.Sticker: bubble.image = nil; bubbleBorder.image = nil - // bubble.highlightedImage = nil; - // bubbleBorder.highlightedImage = nil + bubbleShadow.image = nil break } } From ae89f1268a2dbfa6c253d114b76bed92ab6ebe77 Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Thu, 11 Aug 2016 22:27:57 -0400 Subject: [PATCH 090/253] fix(iOS): Fixing iOS order --- .../Controllers/Content/Conversation/Cell/AABubbleCell.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Cell/AABubbleCell.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Cell/AABubbleCell.swift index 518930906e..ee88447ff4 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Cell/AABubbleCell.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Cell/AABubbleCell.swift @@ -179,11 +179,11 @@ public class AABubbleCell: UICollectionViewCell { contentView.transform = CGAffineTransformMake(1, 0, 0, -1, 0, 0) - contentView.addSubview(bubble) - contentView.addSubview(bubbleBorder) if appStyle.bubbleShadowEnabled { contentView.addSubview(bubbleShadow) } + contentView.addSubview(bubble) + contentView.addSubview(bubbleBorder) contentView.addSubview(newMessage) contentView.addSubview(dateBg) contentView.addSubview(dateText) From cca529d5d602e0dee58c639a7f60499509e19f86 Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Thu, 11 Aug 2016 22:31:20 -0400 Subject: [PATCH 091/253] fix(iOS): Fixing decline button location --- .../Sources/Controllers/Calls/AACallViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Calls/AACallViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Calls/AACallViewController.swift index e3334dce96..d843dba394 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Calls/AACallViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Calls/AACallViewController.swift @@ -187,7 +187,8 @@ public class AACallViewController: AAViewController, RTCEAGLVideoViewDelegate { answerCallButtonText.under(answerCallButton.frame, offset: 5) } if !declineCallButton.hidden { - declineCallButton.frame = CGRectMake((self.view.width - 72) / 2, self.view.height - 72 - 49, 72, 72) + // declineCallButton.frame = CGRectMake((self.view.width - 72) / 2, self.view.height - 72 - 49, 72, 72) + declineCallButton.frame = CGRectMake(self.view.width - 72 - 25, self.view.height - 72 - 49, 72, 72) declineCallButtonText.under(declineCallButton.frame, offset: 5) } } From 43b32df140ba96275ef036edc8c6e287aff35128 Mon Sep 17 00:00:00 2001 From: diego Date: Sat, 13 Aug 2016 23:37:53 -0300 Subject: [PATCH 092/253] give access to ModuleContext --- .../src/main/java/im/actor/core/AndroidMessenger.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/actor-sdk/sdk-core/core/core-android/src/main/java/im/actor/core/AndroidMessenger.java b/actor-sdk/sdk-core/core/core-android/src/main/java/im/actor/core/AndroidMessenger.java index e169abe598..aa5f365ab4 100644 --- a/actor-sdk/sdk-core/core/core-android/src/main/java/im/actor/core/AndroidMessenger.java +++ b/actor-sdk/sdk-core/core/core-android/src/main/java/im/actor/core/AndroidMessenger.java @@ -33,6 +33,7 @@ import im.actor.core.entity.Peer; import im.actor.core.entity.SearchEntity; import im.actor.core.entity.content.FastThumb; +import im.actor.core.modules.ModuleContext; import im.actor.core.network.NetworkState; import im.actor.core.utils.AppStateActor; import im.actor.core.utils.IOUtils; @@ -528,4 +529,8 @@ public EventBus getEvents() { return modules.getEvents(); } + public ModuleContext getModules(){ + return getModuleContext(); + } + } \ No newline at end of file From 7440bdf444e59fa47a458d5e171187a522b8c884 Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 28 Aug 2016 16:20:08 -0300 Subject: [PATCH 093/253] update google-play-service to version 9.4 --- .../android-google-maps/build.gradle | 2 +- .../java/im/actor/map/MapPickerActivity.java | 19 +++++++++++++------ .../android-google-push/build.gradle | 2 +- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-google-maps/build.gradle b/actor-sdk/sdk-core-android/android-google-maps/build.gradle index 579f387e40..9091738679 100644 --- a/actor-sdk/sdk-core-android/android-google-maps/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-maps/build.gradle @@ -52,7 +52,7 @@ dependencies { //compile 'im.actor:android-sdk:0.1.30' compile project(':actor-sdk:sdk-core-android:android-sdk') - compile 'com.google.android.gms:play-services-maps:8.4.0' + compile 'com.google.android.gms:play-services-maps:9.4.0' } diff --git a/actor-sdk/sdk-core-android/android-google-maps/src/main/java/im/actor/map/MapPickerActivity.java b/actor-sdk/sdk-core-android/android-google-maps/src/main/java/im/actor/map/MapPickerActivity.java index 0772c7522b..78f5d9a45a 100644 --- a/actor-sdk/sdk-core-android/android-google-maps/src/main/java/im/actor/map/MapPickerActivity.java +++ b/actor-sdk/sdk-core-android/android-google-maps/src/main/java/im/actor/map/MapPickerActivity.java @@ -35,6 +35,7 @@ import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; +import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; @@ -290,12 +291,18 @@ private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the map. if (mMap == null) { // Try to obtain the map from the SupportMapFragment. - mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) - .getMap(); - // Check if we were successful in obtaining the map. - if (mMap != null) { - setUpMap(); - } + ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) + .getMapAsync(new OnMapReadyCallback() { + @Override + public void onMapReady(GoogleMap googleMap) { + mMap = googleMap; + // Check if we were successful in obtaining the map. + if (mMap != null) { + setUpMap(); + } + } + }); + } } diff --git a/actor-sdk/sdk-core-android/android-google-push/build.gradle b/actor-sdk/sdk-core-android/android-google-push/build.gradle index b655e311cc..bda82be2dd 100644 --- a/actor-sdk/sdk-core-android/android-google-push/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-push/build.gradle @@ -50,7 +50,7 @@ dependencies { //compile 'im.actor:android-sdk:0.1.30' compile project(':actor-sdk:sdk-core-android:android-sdk') - compile 'com.google.android.gms:play-services-gcm:8.4.0' + compile 'com.google.android.gms:play-services-gcm:9.4.0' } // From fddfbfbeefb7b60c63e304383ef1995b3dd2168c Mon Sep 17 00:00:00 2001 From: diego Date: Tue, 30 Aug 2016 23:12:03 -0300 Subject: [PATCH 094/253] Translation PT-BR fixes --- .../main/res/values-pt-rBR/picker_strings.xml | 4 +- .../src/main/res/values-pt-rBR/ui_text.xml | 272 +++++++++++++++--- 2 files changed, 236 insertions(+), 40 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/picker_strings.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/picker_strings.xml index f5d80933a5..6ddee2cd90 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/picker_strings.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/picker_strings.xml @@ -25,8 +25,8 @@ Nenhum arquivo aqui Pesquisar Pesquisar - Organizar por nome - Organizar por data + Ordenar por nome + Ordenar por data Câmera Arquivos recentes Pastas Pricipais diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml index 6146214650..278194cab0 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml @@ -21,12 +21,22 @@ Sem Cartão SD Número do telefone copiado para área de transferência + Email copiado para a área de transferência Mensagens copiadas para área de transferência + Nome do usuário copiado para a área de transferência Não foi possível remover membro do grupo Não foi possível adicionar usuário ao grupo Esse usuário já é membro do grupo O Nome não pode ficar em branco Não foi possível alterar o nome + O Apelido não pode ficar em branco + Não foi possível alterar o apelido + O campo Sobre não pode ficar em branco + Nenhum aplicativo está disponível para abrir isto + Não foi possível sair do grupo + Não foi possível criar o grupo + Não foi possível excluir a conversa + Não foi possível limpar a conversa Compartilhar Salvar no Telefone @@ -47,7 +57,7 @@ Mensagens seguras para Equipes e Amigos Grandes Grupos de Conversação - Grupos realmente grades de conversação. Mais de 300 usuários por grupo. Comunique-se com suas equipes e tomem decisões em conjunto. + Grupos de conversação realmente grandes. Mais de 300 usuários por grupo. Comunique-se com suas equipes e tomem decisões em conjunto. Funciona em todas as plataformas Não importa se você está no metrô ou nas montanhas. Sua mensagem sempre chegará a pessoa certa. @@ -66,13 +76,19 @@ Selecione um país Código do país inválido + Estamos usando seu e-mail de trabalho para autenticação para que possamos adicionar seus colegas na sua lista de contatos e adicioná-lo a grupos de trabalho instantaneamente. + PORQUE PRECISAMOS DO SEU EMAIL DE TRABALHO? + + Use o email para se registrar + Use o telefone para se registrar + Escolha o tipo de autenticação Por favor escolha tipo de autenticação. Registrar Entrar com seu número de telefone - com e-mail + com seu e-mail @@ -81,6 +97,27 @@ E-mail CONFIRMAR E-MAIL + By signing up, you agree to the Terms of Service and Privacy Policy. + By signing up, you agree to the Terms of Service. + By signing up, you agree to the Privacy Policy. + Others users will be able to find you via email or phone number. + + Change server endpoint + reset to default + + Terms of Service + Privacy Policy + + + Sign in + Please enter your phone or email. + Please enter your phone. + Please enter your email. + phone or email + phone + email + SIGN IN + Nós lhe enviamos um SMS com o código de para o seu telefone {0} Nós lhe enviamos um e-mail com o código de ativação para {0} @@ -100,20 +137,16 @@ COMEÇAR A CONVERSAR + Please, enter a valid phone number or email Por favor, insira seu número de telefone por favor, insira seu e-mail O código expirou. Por favor reinicie o processo de validação. - au Código inválido. Por favor tente de novo. Erro de autenticação. Por favor tente de novo. - - digitando… - {0} está digitando… - {0} pessoas estão digitando… - Insira algo para pesquisar + Global search Nada encontrado Ajuda Pesquisar @@ -123,6 +156,7 @@ Escrever Criar grupo + Criar canal Entrar no grupo público Adicionar contato @@ -141,12 +175,23 @@ Editar perfil Mudar foto Configurações + Sobre Actor Ajuda Perguntar Notificações Opções do Chat Segurança + Blocked list + Set username + Change username + Username + You can choose a username in {appName}. Other people will be able to find you by this username and contact you without using your phone number.\n\nYou can use a–z, 0–9 and underscores. Minimum length is 5 characters. + Enter your Username + About me + About user + Wallpaper + Chamar {0} SMS {0} @@ -185,6 +230,12 @@ Convidar via link + Select all + Select none + + Share link + Send link via sms/email to multiple contacts + Informações do Grupo Ver contato @@ -194,6 +245,7 @@ Sair do grupo Local + Contato Arquivo Fazer vídeo Tirar foto @@ -209,11 +261,42 @@ Enviar Parar Baixar + DESLIZE PARA CANCELAR Você não é membro desse grupo + Entrar + Silenciar + Descilenciar + + COMEÇAR + Não há descrição para este bot ainda + Mensagem não suportada nesta versão. Por favor espere pela atualização da aplicação para ver a mensagem. + Forward + Quote + Delete + Copy + Like + Edit last message + Only your last message can be edited + The message is too old + + + Gallery + Video + File + Camera + Contact + Location + + + Location + Map + Satellite + Hybrid + Perfil Compartilhada @@ -221,6 +304,18 @@ Midia Configurações Notificações + Notifications sound + Block user + Unblock user + Block {user}? + + Remove from contacts + Add to Contacts + Voice Call + Video Call + New Message + + Mobile phone Adicionando aos Contatos… Removendo dos Contatos… @@ -234,6 +329,7 @@ Informações do Grupo + Informações do Canal Membros {0} de {1} @@ -250,18 +346,76 @@ Ver {0} Remover {0} do grupo - Adicionar membro - Sair do grupo + Editar Alterar tema Alterar foto - Integrar com token + Token de integração Compartilhado Documentos Adicionar um membro + Add a member + Add members + Leave group + Leave channel + Administration + Make admin + Revoke admin rights + + Group Administration + Channel Administration + + Permissions + Control what is possible in this group + Control what is possible in this channel + + Group Type + Channel Type + Public + Public + Private + Private + Delete Group + You will lose all messages in this group. + Delete Channel + You will lose all messages in this channel. + + Share History + Shared + All members will see all messages + + All members can edit group info + Admins can edit group info + All members can invite to group + Show member leave/join messages + Admin label is visible to all members + + All members can edit channel info + Admins can edit channel info + All members can invite to channel + Show member leave/join messages + Admin label is visible to all members + + Public Group + Public groups can be found in search, anyone can join them. + Private Group + Private group can only be joined via personal invitation. + + Public Channel + Public channels can be found in search, anyone can join them. + Private channel + Private channel can only be joined via personal invitation. Você não é membro desse grupo + About the group + Set group description + Group theme + Set group theme + + bot + + Unable to change group short name Sua foto @@ -287,21 +441,16 @@ Pesquisar por nome Feito - - Adicionar membro + + Create channel + Name the channel + Enter channel name and set optional channel picture - - Grupos públicos - Membros: - Amigos: - ENTRAR - ABRIR - Ei! - Olhe nossos pricipais chats públicos - Converse com seus amigos! - Principais conevrsas com seus amigos - Todos os grupos + Name + Description + + Adicionar membro Link do convite @@ -315,30 +464,27 @@ Não foi possível remover link do convite Carregando o link do convite - - Integração Token - Este token pode ser usado para configurar integrações com este grupo - Copiar token - Remover token - Compartilhar token - Token copiado para área de transferência - Enviar token - Não foi possiver receber o token - Não foi possível remover o token - Não foi possível remover o token - você não é o admin deste grupo - Carregano a integração com o token + Entrar "%1$s"? Documentos Nenhum documento ainda + Arquivo salvo: Insira seu nome Insira o nome do contato Insira o nome do grupo + Enter group theme + Enter your nick CANCELAR SALVAR Alterando o nome… + Changing username… + Changing description… + Changing theme… + Tell people anything you want, briefly. + Ajuda @@ -357,12 +503,23 @@ Alertas Toque da conversa Tocar sons para mesnagens que chegam e que envio. - Sons - Ativar alertas sonoros + Vibrar Ativar aletas vibratórios + Group + Enable group notifications + Only for mentions + Enable group notifications only for mentions Mostrar nome e mensagens Mostrar texto da mensagem e o nome do contato no painel de notificações + Sons + Ativar alertas sonoros + Set sound + Set notification sound + " messages in " + " chats" + " messages" + Selecione um contato @@ -372,6 +529,9 @@ Enviar usando enter Pressionar a tecla enter envia a mensagem + Animation auto play + Is animations playing automatically after downloaded + Markdown Markdown está ativado @@ -380,8 +540,25 @@ Finalizar todas as sessões Sair de todos os dispositivos Você tem certeza que quer sair de todos os outros dispositivos? Todas as informações serão perdidas neles. + Are you sure want to logout on this device? All app data will be lost on {device} Dispositivos e serviços autorizados Carregando… + Unable to remove auth + (This) + Unable to load. Please try again. + + + Last seen + Change who can see your Last Seen time. + Everybody + My Contacts + Nobody + + + Blocked list + You haven\'t blocked anyone + Loading blocked list… + UNBLOCK Você tem certeza que quer remover {0} mensagens? @@ -406,12 +583,27 @@ Midia Imagens %d de %d + no recent emoji yet + + + Call ended + Incoming call + Ringing… + Connecting… + speaker + mute + video + messages + add user + return to call Você tem certeza que quer sair do grupo "%1$s"? + Are you sure you want to exit channel "%1$s"? Sair Remover "%1$s" grupo? + Delete "%1$s" channel? Remover Remover conversa com "%1$s"? @@ -423,6 +615,8 @@ Remover token? Remover + Compartilhar com + Impossível conectar. Por favor verifique sua conexão com a Internet e tente de novo. \n\nSe o problema persistir, por favor reinicie seu dispositivo. @@ -431,4 +625,6 @@ problema persistir. Tipo de URL desconhecida + + From 958a235dd9a1f6bf3c570bc374ec0d00e060db3b Mon Sep 17 00:00:00 2001 From: Diego Date: Wed, 31 Aug 2016 10:25:02 -0300 Subject: [PATCH 095/253] Translation PT-BR fixes --- .../src/main/res/values-pt-rBR/ui_text.xml | 319 +++++++++--------- 1 file changed, 159 insertions(+), 160 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml index 278194cab0..bd780beaac 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml @@ -97,26 +97,26 @@ E-mail CONFIRMAR E-MAIL - By signing up, you agree to the Terms of Service and Privacy Policy. - By signing up, you agree to the Terms of Service. - By signing up, you agree to the Privacy Policy. - Others users will be able to find you via email or phone number. + Ao inscrever-se, você concorda com os Termos de Serviço e Política de Privacidade. + Ao inscrever-se, você concorda com os Termos de Serviço. + Ao inscrever-se, você concorda com a Política de Privacidade. + Outros usuários serão capazes de encontrá-lo via e-mail ou número de telefone. - Change server endpoint - reset to default + Alterar o endereço do servidor + Restaurar o valor padrão - Terms of Service - Privacy Policy + Termos de Serviço + Política de Privacidade - Sign in - Please enter your phone or email. - Please enter your phone. - Please enter your email. - phone or email - phone + Entrar + Por favor, informe seu telefone ou email. + Por favor, informe seu telefone. + Por favor, informe seu email. + telefone ou email + telefone email - SIGN IN + ENTRAR Nós lhe enviamos um SMS com o código de para o seu telefone {0} @@ -137,7 +137,7 @@ COMEÇAR A CONVERSAR - Please, enter a valid phone number or email + Por favor, informe um telefone ou email válido Por favor, insira seu número de telefone por favor, insira seu e-mail O código expirou. Por favor reinicie o processo de validação. @@ -146,7 +146,7 @@ Insira algo para pesquisar - Global search + Pesquisa Global Nada encontrado Ajuda Pesquisar @@ -182,15 +182,15 @@ Opções do Chat Segurança - Blocked list - Set username - Change username - Username - You can choose a username in {appName}. Other people will be able to find you by this username and contact you without using your phone number.\n\nYou can use a–z, 0–9 and underscores. Minimum length is 5 characters. - Enter your Username - About me - About user - Wallpaper + Lista de bloqueados + Informe o apelido + Alterar o apelido + Apelido + Você pode escolher um nome de usuário {appName}. Outras pessoas serão capazes de encontrá-lo por este nome de usuário e contactá-lo sem usar o seu número de telefone.\n\nVocê pode usar os caracteres a-z, 0-9 e underline. O comprimento mínimo é de 5 caracteres. + Informe seu apelido + Sobre mim + Sobre o usuário + Papel de Parede Chamar {0} @@ -224,7 +224,7 @@ Avise um amigo ou adicione manualmente usando o botão abaixo. - Removee {0} dos contatos + Remove {0} dos contatos Removendo… Editar nome @@ -274,28 +274,28 @@ Mensagem não suportada nesta versão. Por favor espere pela atualização da aplicação para ver a mensagem. - Forward - Quote - Delete - Copy - Like - Edit last message - Only your last message can be edited - The message is too old + Encaminhar + Citar + Excluir + Copiar + Gostar + Editar a última mensagem + Somente sua última mensagem pode ser editada + A mensagem é muito velha - Gallery - Video - File - Camera - Contact - Location + Galeria + Vídeo + Arquivo + Câmera + Contato + Localização - Location - Map - Satellite - Hybrid + Localização + Mapa + Satélite + Híbrido Perfil @@ -305,17 +305,17 @@ Configurações Notificações Notifications sound - Block user - Unblock user - Block {user}? + Bloquear usuário + Desbloquear usuário + Bloquear {user}? - Remove from contacts - Add to Contacts - Voice Call - Video Call - New Message + Remover dos contatos + Adicionar aos contatos + Chamada de voz + Chamada de vídeo + Nova mensagem - Mobile phone + Telefone celular Adicionando aos Contatos… Removendo dos Contatos… @@ -355,67 +355,67 @@ Documentos Adicionar um membro - Add a member - Add members - Leave group - Leave channel - Administration - Make admin - Revoke admin rights - - Group Administration - Channel Administration - - Permissions - Control what is possible in this group - Control what is possible in this channel - - Group Type - Channel Type - Public - Public - Private - Private - Delete Group - You will lose all messages in this group. - Delete Channel - You will lose all messages in this channel. - - Share History - Shared - All members will see all messages - - All members can edit group info - Admins can edit group info - All members can invite to group - Show member leave/join messages - Admin label is visible to all members - - All members can edit channel info - Admins can edit channel info - All members can invite to channel - Show member leave/join messages - Admin label is visible to all members - - Public Group - Public groups can be found in search, anyone can join them. - Private Group - Private group can only be joined via personal invitation. - - Public Channel - Public channels can be found in search, anyone can join them. - Private channel - Private channel can only be joined via personal invitation. + Adicionar um membro + Adicionar membros + Sair do grupo + Sair do canal + Administração + Torná-lo admin + Remover permissão de admin + + Administração do grupo + Administração do canal + + Permissões + Configure o que é possível ser feito neste grupo. + Configure o que é possível ser feito neste canal. + + Tipo do Grupo + Tipo do Canal + Público + Público + Privado + Privado + Excluir Grupo + Você irá perder todas as mensagens deste grupo. + Excluir Canal + Você irá perder todas as mensagens deste canal. + + Compartilhar Histórico + Compartilhado + Todos os membros irão ver todas as mensagens + + Todos os membros podem editar as informações do grupo. + Admins podem editar as informações do grupo. + Todos os membros podem convidar para o grupo. + Exibir mensagens quando membros sairem/entrarem. + Indicador de Admin será visível para todos os membros. + + Todos os membros podem editar as informações do canal. + Admins podem editar as informações do canal. + Todos os membros podem convidar para o canal. + Exibir mensagens quando membros sairem/entrarem. + Indicador de Admin será visível para todos os membros. + + Grupo público + Grupos públicos podem ser encontrados na busca, qualquer um pode entrar. + Grupo privado + Grupos privados só podem ser acessados através de convite pessoal. + + Canal público + Canais públicos podem ser encontrados na busca, qualquer um pode entrar. + Canal privado + Canais privados só podem ser acessados através de convite pessoal. Você não é membro desse grupo - About the group - Set group description - Group theme - Set group theme + Sobre o grupo + Atribuir uma descrição ao grupo + Tema do grupo + Atribuir um tema ao grupo bot - Unable to change group short name + Não é possível alterar o nome curto do grupo Sua foto @@ -442,12 +442,12 @@ Feito - Create channel - Name the channel - Enter channel name and set optional channel picture + Criar canal + Nome do canal + Entre com o nome do canal e adicionar uma foto opcional - Name - Description + Nome + Descrição Adicionar membro @@ -475,15 +475,15 @@ Insira seu nome Insira o nome do contato Insira o nome do grupo - Enter group theme - Enter your nick + Informe o tema do grupo + Informe seu apelido CANCELAR SALVAR Alterando o nome… - Changing username… - Changing description… - Changing theme… - Tell people anything you want, briefly. + Alterando o apelido… + Alterando a descrição… + Alterando o tema… + Diga às pessoas o que quiser, brevemente. @@ -506,19 +506,19 @@ Vibrar Ativar aletas vibratórios - Group - Enable group notifications - Only for mentions - Enable group notifications only for mentions + Grupo + Ativar notificação de grupos + Apenas para mensionamentos + Ativar notificação do grupo apenas para mensionamentos Mostrar nome e mensagens Mostrar texto da mensagem e o nome do contato no painel de notificações Sons Ativar alertas sonoros - Set sound - Set notification sound - " messages in " - " chats" - " messages" + Configurar som + Configurar som da notificação. + " mensagem em " + " conversas" + " mensagems" @@ -529,8 +529,8 @@ Enviar usando enter Pressionar a tecla enter envia a mensagem - Animation auto play - Is animations playing automatically after downloaded + Tocar Animação automaticamente. + As animações tocarão automaticamente após o download Markdown Markdown está ativado @@ -540,25 +540,25 @@ Finalizar todas as sessões Sair de todos os dispositivos Você tem certeza que quer sair de todos os outros dispositivos? Todas as informações serão perdidas neles. - Are you sure want to logout on this device? All app data will be lost on {device} + Tem a certeza que quer sair deste dispositivo? Todos os dados de aplicativos serão perdidos em {device} Dispositivos e serviços autorizados Carregando… - Unable to remove auth - (This) - Unable to load. Please try again. + Não foi possível remover a autenticação + (Isto) + Não foi possível carregar. Tente novamente. - Last seen - Change who can see your Last Seen time. - Everybody - My Contacts - Nobody + Visto pela última vez + Alterar quem pode ver o sua última atividade. + Todo mundo + Meus contatos + Ninguem - Blocked list - You haven\'t blocked anyone - Loading blocked list… - UNBLOCK + Lista de bloqueados + Você não tem ninguem bloqueado + Carregando lista de bloqueados… + DESBLOQUEAR Você tem certeza que quer remover {0} mensagens? @@ -583,27 +583,27 @@ Midia Imagens %d de %d - no recent emoji yet + nenhum emoji recente ainda - Call ended - Incoming call - Ringing… - Connecting… - speaker - mute - video - messages - add user - return to call + Ligação terminada + Recebendo ligação + Tocando… + Conectando… + alto falante + mudo + vídeo + mensagens + adicionar usuário + retornar a ligação Você tem certeza que quer sair do grupo "%1$s"? - Are you sure you want to exit channel "%1$s"? + Você tem certeza que quer sair do canal "%1$s"? Sair Remover "%1$s" grupo? - Delete "%1$s" channel? + Remover "%1$s" canal? Remover Remover conversa com "%1$s"? @@ -625,6 +625,5 @@ problema persistir. Tipo de URL desconhecida - - + From 4158b6a19f5452068ea7f704a362474ee01028c5 Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Wed, 7 Sep 2016 13:23:18 +0300 Subject: [PATCH 096/253] fix(core): Fixing iOS compatibility --- .../ActorSDK/Sources/ActorSDK.swift | 2 +- .../core/modules/sequence/SequenceActor.java | 26 ++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift index 0116857588..237b3e17d5 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift @@ -446,7 +446,7 @@ import DZNWebViewController Actor.checkCall(jlong(callId)!, withAttempt: 0) } } else if let seq = aps["seq"] as? String { - Actor.onPushReceivedWithSeq(jint(seq)!) + Actor.onPushReceivedWithSeq(jint(seq)!, withAuthId: 0) } } } diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/sequence/SequenceActor.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/sequence/SequenceActor.java index 6e68474160..6d282b30cb 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/sequence/SequenceActor.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/sequence/SequenceActor.java @@ -105,17 +105,25 @@ private void onPushSeqReceived(int seq, long authId) { if (context().getApiModule() == null) { return; } - context().getApiModule().checkIsCurrentAuthId(authId).then(same -> { - if (same) { - if (seq <= this.seq) { - Log.d(TAG, "Ignored PushSeq {seq:" + seq + "}"); - } else { - Log.w(TAG, "External Out of sequence: starting timer for invalidation"); - startInvalidationTimer(); + if (authId != 0) { + context().getApiModule().checkIsCurrentAuthId(authId).then(same -> { + if (same) { + if (seq <= this.seq) { + Log.d(TAG, "Ignored PushSeq {seq:" + seq + "}"); + } else { + Log.w(TAG, "External Out of sequence: starting timer for invalidation"); + startInvalidationTimer(); + } } + }); + } else { + if (seq <= this.seq) { + Log.d(TAG, "Ignored PushSeq {seq:" + seq + "}"); + } else { + Log.w(TAG, "External Out of sequence: starting timer for invalidation"); + startInvalidationTimer(); } - }); - + } } @Deprecated From 22c4d6d543fb67554b608949fbd334d1b940575c Mon Sep 17 00:00:00 2001 From: diego Date: Thu, 8 Sep 2016 16:59:24 -0300 Subject: [PATCH 097/253] remocao da troca do servidor e exclusao dos paises que nao sejam o Brasil --- .../sdk/controllers/auth/SignInFragment.java | 8 +- .../controllers/auth/SignPhoneFragment.java | 4 + .../im/actor/sdk/util/country/Countries.java | 462 +++++++++--------- .../android-sdk/src/main/res/menu/sign_in.xml | 8 +- .../src/main/res/values-pt-rBR/ui_text.xml | 5 + .../src/main/res/values/strings_countries.xml | 2 +- 6 files changed, 249 insertions(+), 240 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java index bef363fbc0..cb316ff905 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java @@ -181,10 +181,10 @@ public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); menu.clear(); getActivity().getMenuInflater().inflate(R.menu.sign_in, menu); - MenuItem item = menu.findItem(R.id.change_endpoint); - if (item != null) { - item.setVisible(ActorSDK.sharedActor().isUseAlternateEndpointsEnabled()); - } +// MenuItem item = menu.findItem(R.id.change_endpoint); +// if (item != null) { +// item.setVisible(ActorSDK.sharedActor().isUseAlternateEndpointsEnabled()); +// } } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignPhoneFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignPhoneFragment.java index 9f3c1a2625..47eebfbe08 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignPhoneFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignPhoneFragment.java @@ -273,6 +273,10 @@ public void onClick(View view) { requestCode(); } }); + + + setCountry(Countries.getInstance().getCountryByShortName("BR")); + } private void requestCode() { diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/country/Countries.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/country/Countries.java index 1c9fa8226b..f7778b6918 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/country/Countries.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/country/Countries.java @@ -51,237 +51,237 @@ public ArrayList getCountries() { static { countries = new ArrayList(); - countries.add(new Country("1", "US", R.string.US)); - countries.add(new Country("1", "CA", R.string.CA)); - countries.add(new Country("1", "DO", R.string.DO)); - countries.add(new Country("1", "PR", R.string.PR)); - countries.add(new Country("7", "RU", R.string.RU)); - countries.add(new Country("7", "KZ", R.string.KZ)); - countries.add(new Country("20", "EG", R.string.EG)); - countries.add(new Country("27", "ZA", R.string.ZA)); - countries.add(new Country("30", "GR", R.string.GR)); - countries.add(new Country("31", "NL", R.string.NL)); - countries.add(new Country("32", "BE", R.string.BE)); - countries.add(new Country("33", "FR", R.string.FR)); - countries.add(new Country("34", "ES", R.string.ES)); - countries.add(new Country("36", "HU", R.string.HU)); - countries.add(new Country("39", "IT", R.string.IT)); - countries.add(new Country("40", "RO", R.string.RO)); - countries.add(new Country("41", "CH", R.string.CH)); - countries.add(new Country("42", "YL", R.string.YL)); - countries.add(new Country("43", "AT", R.string.AT)); - countries.add(new Country("44", "GB", R.string.GB)); - countries.add(new Country("45", "DK", R.string.DK)); - countries.add(new Country("46", "SE", R.string.SE)); - countries.add(new Country("47", "NO", R.string.NO)); - countries.add(new Country("48", "PL", R.string.PL)); - countries.add(new Country("49", "DE", R.string.DE)); - countries.add(new Country("51", "PE", R.string.PE)); - countries.add(new Country("52", "MX", R.string.MX)); - countries.add(new Country("53", "CU", R.string.CU)); - countries.add(new Country("54", "AR", R.string.AR)); +// countries.add(new Country("1", "US", R.string.US)); +// countries.add(new Country("1", "CA", R.string.CA)); +// countries.add(new Country("1", "DO", R.string.DO)); +// countries.add(new Country("1", "PR", R.string.PR)); +// countries.add(new Country("7", "RU", R.string.RU)); +// countries.add(new Country("7", "KZ", R.string.KZ)); +// countries.add(new Country("20", "EG", R.string.EG)); +// countries.add(new Country("27", "ZA", R.string.ZA)); +// countries.add(new Country("30", "GR", R.string.GR)); +// countries.add(new Country("31", "NL", R.string.NL)); +// countries.add(new Country("32", "BE", R.string.BE)); +// countries.add(new Country("33", "FR", R.string.FR)); +// countries.add(new Country("34", "ES", R.string.ES)); +// countries.add(new Country("36", "HU", R.string.HU)); +// countries.add(new Country("39", "IT", R.string.IT)); +// countries.add(new Country("40", "RO", R.string.RO)); +// countries.add(new Country("41", "CH", R.string.CH)); +// countries.add(new Country("42", "YL", R.string.YL)); +// countries.add(new Country("43", "AT", R.string.AT)); +// countries.add(new Country("44", "GB", R.string.GB)); +// countries.add(new Country("45", "DK", R.string.DK)); +// countries.add(new Country("46", "SE", R.string.SE)); +// countries.add(new Country("47", "NO", R.string.NO)); +// countries.add(new Country("48", "PL", R.string.PL)); +// countries.add(new Country("49", "DE", R.string.DE)); +// countries.add(new Country("51", "PE", R.string.PE)); +// countries.add(new Country("52", "MX", R.string.MX)); +// countries.add(new Country("53", "CU", R.string.CU)); +// countries.add(new Country("54", "AR", R.string.AR)); countries.add(new Country("55", "BR", R.string.BR)); - countries.add(new Country("56", "CL", R.string.CL)); - countries.add(new Country("57", "CO", R.string.CO)); - countries.add(new Country("58", "VE", R.string.VE)); - countries.add(new Country("60", "MY", R.string.MY)); - countries.add(new Country("61", "AU", R.string.AU)); - countries.add(new Country("62", "ID", R.string.ID)); - countries.add(new Country("63", "PH", R.string.PH)); - countries.add(new Country("64", "NZ", R.string.NZ)); - countries.add(new Country("65", "SG", R.string.SG)); - countries.add(new Country("66", "TH", R.string.TH)); - countries.add(new Country("81", "JP", R.string.JP)); - countries.add(new Country("82", "KR", R.string.KR)); - countries.add(new Country("84", "VN", R.string.VN)); - countries.add(new Country("86", "CN", R.string.CN)); - countries.add(new Country("90", "TR", R.string.TR)); - countries.add(new Country("91", "IN", R.string.IN)); - countries.add(new Country("92", "PK", R.string.PK)); - countries.add(new Country("93", "AF", R.string.AF)); - countries.add(new Country("94", "LK", R.string.LK)); - countries.add(new Country("95", "MM", R.string.MM)); - countries.add(new Country("98", "IR", R.string.IR)); - countries.add(new Country("211", "SS", R.string.SS)); - countries.add(new Country("212", "MA", R.string.MA)); - countries.add(new Country("213", "DZ", R.string.DZ)); - countries.add(new Country("216", "TN", R.string.TN)); - countries.add(new Country("218", "LY", R.string.LY)); - countries.add(new Country("220", "GM", R.string.GM)); - countries.add(new Country("221", "SN", R.string.SN)); - countries.add(new Country("222", "MR", R.string.MR)); - countries.add(new Country("223", "ML", R.string.ML)); - countries.add(new Country("224", "GN", R.string.GN)); - countries.add(new Country("225", "CI", R.string.CI)); - countries.add(new Country("226", "BF", R.string.BF)); - countries.add(new Country("227", "NE", R.string.NE)); - countries.add(new Country("228", "TG", R.string.TG)); - countries.add(new Country("229", "BJ", R.string.BJ)); - countries.add(new Country("230", "MU", R.string.MU)); - countries.add(new Country("231", "LR", R.string.LR)); - countries.add(new Country("232", "SL", R.string.SL)); - countries.add(new Country("233", "GH", R.string.GH)); - countries.add(new Country("234", "NG", R.string.NG)); - countries.add(new Country("235", "TD", R.string.TD)); - countries.add(new Country("236", "CF", R.string.CF)); - countries.add(new Country("237", "CM", R.string.CM)); - countries.add(new Country("238", "CV", R.string.CV)); - countries.add(new Country("239", "ST", R.string.ST)); - countries.add(new Country("240", "GQ", R.string.GQ)); - countries.add(new Country("241", "GA", R.string.GA)); - countries.add(new Country("242", "CG", R.string.CG)); - countries.add(new Country("243", "CD", R.string.CD)); - countries.add(new Country("244", "AO", R.string.AO)); - countries.add(new Country("245", "GW", R.string.GW)); - countries.add(new Country("246", "IO", R.string.IO)); - countries.add(new Country("247", "SH", R.string.SH)); - countries.add(new Country("248", "SC", R.string.SC)); - countries.add(new Country("249", "SD", R.string.SD)); - countries.add(new Country("250", "RW", R.string.RW)); - countries.add(new Country("251", "ET", R.string.ET)); - countries.add(new Country("252", "SO", R.string.SO)); - countries.add(new Country("253", "DJ", R.string.DJ)); - countries.add(new Country("254", "KE", R.string.KE)); - countries.add(new Country("255", "TZ", R.string.TZ)); - countries.add(new Country("256", "UG", R.string.UG)); - countries.add(new Country("257", "BI", R.string.BI)); - countries.add(new Country("258", "MZ", R.string.MZ)); - countries.add(new Country("260", "ZM", R.string.ZM)); - countries.add(new Country("261", "MG", R.string.MG)); - countries.add(new Country("262", "RE", R.string.RE)); - countries.add(new Country("263", "ZW", R.string.ZW)); - countries.add(new Country("264", "NA", R.string.NA)); - countries.add(new Country("265", "MW", R.string.MW)); - countries.add(new Country("266", "LS", R.string.LS)); - countries.add(new Country("267", "BW", R.string.BW)); - countries.add(new Country("268", "SZ", R.string.SZ)); - countries.add(new Country("269", "KM", R.string.KM)); - countries.add(new Country("290", "SH", R.string.SH)); - countries.add(new Country("291", "ER", R.string.ER)); - countries.add(new Country("297", "AW", R.string.AW)); - countries.add(new Country("298", "FO", R.string.FO)); - countries.add(new Country("299", "GL", R.string.GL)); - countries.add(new Country("350", "GI", R.string.GI)); - countries.add(new Country("351", "PT", R.string.PT)); - countries.add(new Country("352", "LU", R.string.LU)); - countries.add(new Country("353", "IE", R.string.IE)); - countries.add(new Country("354", "IS", R.string.IS)); - countries.add(new Country("355", "AL", R.string.AL)); - countries.add(new Country("356", "MT", R.string.MT)); - countries.add(new Country("357", "CY", R.string.CY)); - countries.add(new Country("358", "FI", R.string.FI)); - countries.add(new Country("359", "BG", R.string.BG)); - countries.add(new Country("370", "LT", R.string.LT)); - countries.add(new Country("371", "LV", R.string.LV)); - countries.add(new Country("372", "EE", R.string.EE)); - countries.add(new Country("373", "MD", R.string.MD)); - countries.add(new Country("374", "AM", R.string.AM)); - countries.add(new Country("375", "BY", R.string.BY)); - countries.add(new Country("376", "AD", R.string.AD)); - countries.add(new Country("377", "MC", R.string.MC)); - countries.add(new Country("378", "SM", R.string.SM)); - countries.add(new Country("380", "UA", R.string.UA)); - countries.add(new Country("381", "RS", R.string.RS)); - countries.add(new Country("382", "ME", R.string.ME)); - countries.add(new Country("385", "HR", R.string.HR)); - countries.add(new Country("386", "SI", R.string.SI)); - countries.add(new Country("387", "BA", R.string.BA)); - countries.add(new Country("389", "MK", R.string.MK)); - countries.add(new Country("420", "CZ", R.string.CZ)); - countries.add(new Country("421", "SK", R.string.SK)); - countries.add(new Country("423", "LI", R.string.LI)); - countries.add(new Country("500", "FK", R.string.FK)); - countries.add(new Country("501", "BZ", R.string.BZ)); - countries.add(new Country("502", "GT", R.string.GT)); - countries.add(new Country("503", "SV", R.string.SV)); - countries.add(new Country("504", "HN", R.string.HN)); - countries.add(new Country("505", "NI", R.string.NI)); - countries.add(new Country("506", "CR", R.string.CR)); - countries.add(new Country("507", "PA", R.string.PA)); - countries.add(new Country("508", "PM", R.string.PM)); - countries.add(new Country("509", "HT", R.string.HT)); - countries.add(new Country("590", "GP", R.string.GP)); - countries.add(new Country("591", "BO", R.string.BO)); - countries.add(new Country("592", "GY", R.string.GY)); - countries.add(new Country("593", "EC", R.string.EC)); - countries.add(new Country("594", "GF", R.string.GF)); - countries.add(new Country("595", "PY", R.string.PY)); - countries.add(new Country("596", "MQ", R.string.MQ)); - countries.add(new Country("597", "SR", R.string.SR)); - countries.add(new Country("598", "UY", R.string.UY)); - countries.add(new Country("599", "CW", R.string.CW)); - countries.add(new Country("599", "BQ", R.string.BQ)); - countries.add(new Country("670", "TL", R.string.TL)); - countries.add(new Country("672", "NF", R.string.NF)); - countries.add(new Country("673", "BN", R.string.BN)); - countries.add(new Country("674", "NR", R.string.NR)); - countries.add(new Country("675", "PG", R.string.PG)); - countries.add(new Country("676", "TO", R.string.TO)); - countries.add(new Country("677", "SB", R.string.SB)); - countries.add(new Country("678", "VU", R.string.VU)); - countries.add(new Country("679", "FJ", R.string.FJ)); - countries.add(new Country("680", "PW", R.string.PW)); - countries.add(new Country("681", "WF", R.string.WF)); - countries.add(new Country("682", "CK", R.string.CK)); - countries.add(new Country("683", "NU", R.string.NU)); - countries.add(new Country("685", "WS", R.string.WS)); - countries.add(new Country("686", "KI", R.string.KI)); - countries.add(new Country("687", "NC", R.string.NC)); - countries.add(new Country("688", "TV", R.string.TV)); - countries.add(new Country("689", "PF", R.string.PF)); - countries.add(new Country("690", "TK", R.string.TK)); - countries.add(new Country("691", "FM", R.string.FM)); - countries.add(new Country("692", "MH", R.string.MH)); - countries.add(new Country("850", "KP", R.string.KP)); - countries.add(new Country("852", "HK", R.string.HK)); - countries.add(new Country("853", "MO", R.string.MO)); - countries.add(new Country("855", "KH", R.string.KH)); - countries.add(new Country("856", "LA", R.string.LA)); - countries.add(new Country("880", "BD", R.string.BD)); - countries.add(new Country("886", "TW", R.string.TW)); - countries.add(new Country("960", "MV", R.string.MV)); - countries.add(new Country("961", "LB", R.string.LB)); - countries.add(new Country("962", "JO", R.string.JO)); - countries.add(new Country("963", "SY", R.string.SY)); - countries.add(new Country("964", "IQ", R.string.IQ)); - countries.add(new Country("965", "KW", R.string.KW)); - countries.add(new Country("966", "SA", R.string.SA)); - countries.add(new Country("967", "YE", R.string.YE)); - countries.add(new Country("968", "OM", R.string.OM)); - countries.add(new Country("970", "PS", R.string.PS)); - countries.add(new Country("971", "AE", R.string.AE)); - countries.add(new Country("972", "IL", R.string.IL)); - countries.add(new Country("973", "BH", R.string.BH)); - countries.add(new Country("974", "QA", R.string.QA)); - countries.add(new Country("975", "BT", R.string.BT)); - countries.add(new Country("976", "MN", R.string.MN)); - countries.add(new Country("977", "NP", R.string.NP)); - countries.add(new Country("992", "TJ", R.string.TJ)); - countries.add(new Country("993", "TM", R.string.TM)); - countries.add(new Country("994", "AZ", R.string.AZ)); - countries.add(new Country("995", "GE", R.string.GE)); - countries.add(new Country("996", "KG", R.string.KG)); - countries.add(new Country("998", "UZ", R.string.UZ)); - countries.add(new Country("1242", "BS", R.string.BS)); - countries.add(new Country("1246", "BB", R.string.BB)); - countries.add(new Country("1264", "AI", R.string.AI)); - countries.add(new Country("1268", "AG", R.string.AG)); - countries.add(new Country("1284", "VG", R.string.VG)); - countries.add(new Country("1340", "VI", R.string.VI)); - countries.add(new Country("1345", "KY", R.string.KY)); - countries.add(new Country("1441", "BM", R.string.BM)); - countries.add(new Country("1473", "GD", R.string.GD)); - countries.add(new Country("1649", "TC", R.string.TC)); - countries.add(new Country("1664", "MS", R.string.MS)); - countries.add(new Country("1670", "MP", R.string.MP)); - countries.add(new Country("1671", "GU", R.string.GU)); - countries.add(new Country("1684", "AS", R.string.AS)); - countries.add(new Country("1721", "SX", R.string.SX)); - countries.add(new Country("1758", "LC", R.string.LC)); - countries.add(new Country("1767", "DM", R.string.DM)); - countries.add(new Country("1784", "VC", R.string.VC)); - countries.add(new Country("1868", "TT", R.string.TT)); - countries.add(new Country("1869", "KN", R.string.KN)); - countries.add(new Country("1876", "JM", R.string.JM)); +// countries.add(new Country("56", "CL", R.string.CL)); +// countries.add(new Country("57", "CO", R.string.CO)); +// countries.add(new Country("58", "VE", R.string.VE)); +// countries.add(new Country("60", "MY", R.string.MY)); +// countries.add(new Country("61", "AU", R.string.AU)); +// countries.add(new Country("62", "ID", R.string.ID)); +// countries.add(new Country("63", "PH", R.string.PH)); +// countries.add(new Country("64", "NZ", R.string.NZ)); +// countries.add(new Country("65", "SG", R.string.SG)); +// countries.add(new Country("66", "TH", R.string.TH)); +// countries.add(new Country("81", "JP", R.string.JP)); +// countries.add(new Country("82", "KR", R.string.KR)); +// countries.add(new Country("84", "VN", R.string.VN)); +// countries.add(new Country("86", "CN", R.string.CN)); +// countries.add(new Country("90", "TR", R.string.TR)); +// countries.add(new Country("91", "IN", R.string.IN)); +// countries.add(new Country("92", "PK", R.string.PK)); +// countries.add(new Country("93", "AF", R.string.AF)); +// countries.add(new Country("94", "LK", R.string.LK)); +// countries.add(new Country("95", "MM", R.string.MM)); +// countries.add(new Country("98", "IR", R.string.IR)); +// countries.add(new Country("211", "SS", R.string.SS)); +// countries.add(new Country("212", "MA", R.string.MA)); +// countries.add(new Country("213", "DZ", R.string.DZ)); +// countries.add(new Country("216", "TN", R.string.TN)); +// countries.add(new Country("218", "LY", R.string.LY)); +// countries.add(new Country("220", "GM", R.string.GM)); +// countries.add(new Country("221", "SN", R.string.SN)); +// countries.add(new Country("222", "MR", R.string.MR)); +// countries.add(new Country("223", "ML", R.string.ML)); +// countries.add(new Country("224", "GN", R.string.GN)); +// countries.add(new Country("225", "CI", R.string.CI)); +// countries.add(new Country("226", "BF", R.string.BF)); +// countries.add(new Country("227", "NE", R.string.NE)); +// countries.add(new Country("228", "TG", R.string.TG)); +// countries.add(new Country("229", "BJ", R.string.BJ)); +// countries.add(new Country("230", "MU", R.string.MU)); +// countries.add(new Country("231", "LR", R.string.LR)); +// countries.add(new Country("232", "SL", R.string.SL)); +// countries.add(new Country("233", "GH", R.string.GH)); +// countries.add(new Country("234", "NG", R.string.NG)); +// countries.add(new Country("235", "TD", R.string.TD)); +// countries.add(new Country("236", "CF", R.string.CF)); +// countries.add(new Country("237", "CM", R.string.CM)); +// countries.add(new Country("238", "CV", R.string.CV)); +// countries.add(new Country("239", "ST", R.string.ST)); +// countries.add(new Country("240", "GQ", R.string.GQ)); +// countries.add(new Country("241", "GA", R.string.GA)); +// countries.add(new Country("242", "CG", R.string.CG)); +// countries.add(new Country("243", "CD", R.string.CD)); +// countries.add(new Country("244", "AO", R.string.AO)); +// countries.add(new Country("245", "GW", R.string.GW)); +// countries.add(new Country("246", "IO", R.string.IO)); +// countries.add(new Country("247", "SH", R.string.SH)); +// countries.add(new Country("248", "SC", R.string.SC)); +// countries.add(new Country("249", "SD", R.string.SD)); +// countries.add(new Country("250", "RW", R.string.RW)); +// countries.add(new Country("251", "ET", R.string.ET)); +// countries.add(new Country("252", "SO", R.string.SO)); +// countries.add(new Country("253", "DJ", R.string.DJ)); +// countries.add(new Country("254", "KE", R.string.KE)); +// countries.add(new Country("255", "TZ", R.string.TZ)); +// countries.add(new Country("256", "UG", R.string.UG)); +// countries.add(new Country("257", "BI", R.string.BI)); +// countries.add(new Country("258", "MZ", R.string.MZ)); +// countries.add(new Country("260", "ZM", R.string.ZM)); +// countries.add(new Country("261", "MG", R.string.MG)); +// countries.add(new Country("262", "RE", R.string.RE)); +// countries.add(new Country("263", "ZW", R.string.ZW)); +// countries.add(new Country("264", "NA", R.string.NA)); +// countries.add(new Country("265", "MW", R.string.MW)); +// countries.add(new Country("266", "LS", R.string.LS)); +// countries.add(new Country("267", "BW", R.string.BW)); +// countries.add(new Country("268", "SZ", R.string.SZ)); +// countries.add(new Country("269", "KM", R.string.KM)); +// countries.add(new Country("290", "SH", R.string.SH)); +// countries.add(new Country("291", "ER", R.string.ER)); +// countries.add(new Country("297", "AW", R.string.AW)); +// countries.add(new Country("298", "FO", R.string.FO)); +// countries.add(new Country("299", "GL", R.string.GL)); +// countries.add(new Country("350", "GI", R.string.GI)); +// countries.add(new Country("351", "PT", R.string.PT)); +// countries.add(new Country("352", "LU", R.string.LU)); +// countries.add(new Country("353", "IE", R.string.IE)); +// countries.add(new Country("354", "IS", R.string.IS)); +// countries.add(new Country("355", "AL", R.string.AL)); +// countries.add(new Country("356", "MT", R.string.MT)); +// countries.add(new Country("357", "CY", R.string.CY)); +// countries.add(new Country("358", "FI", R.string.FI)); +// countries.add(new Country("359", "BG", R.string.BG)); +// countries.add(new Country("370", "LT", R.string.LT)); +// countries.add(new Country("371", "LV", R.string.LV)); +// countries.add(new Country("372", "EE", R.string.EE)); +// countries.add(new Country("373", "MD", R.string.MD)); +// countries.add(new Country("374", "AM", R.string.AM)); +// countries.add(new Country("375", "BY", R.string.BY)); +// countries.add(new Country("376", "AD", R.string.AD)); +// countries.add(new Country("377", "MC", R.string.MC)); +// countries.add(new Country("378", "SM", R.string.SM)); +// countries.add(new Country("380", "UA", R.string.UA)); +// countries.add(new Country("381", "RS", R.string.RS)); +// countries.add(new Country("382", "ME", R.string.ME)); +// countries.add(new Country("385", "HR", R.string.HR)); +// countries.add(new Country("386", "SI", R.string.SI)); +// countries.add(new Country("387", "BA", R.string.BA)); +// countries.add(new Country("389", "MK", R.string.MK)); +// countries.add(new Country("420", "CZ", R.string.CZ)); +// countries.add(new Country("421", "SK", R.string.SK)); +// countries.add(new Country("423", "LI", R.string.LI)); +// countries.add(new Country("500", "FK", R.string.FK)); +// countries.add(new Country("501", "BZ", R.string.BZ)); +// countries.add(new Country("502", "GT", R.string.GT)); +// countries.add(new Country("503", "SV", R.string.SV)); +// countries.add(new Country("504", "HN", R.string.HN)); +// countries.add(new Country("505", "NI", R.string.NI)); +// countries.add(new Country("506", "CR", R.string.CR)); +// countries.add(new Country("507", "PA", R.string.PA)); +// countries.add(new Country("508", "PM", R.string.PM)); +// countries.add(new Country("509", "HT", R.string.HT)); +// countries.add(new Country("590", "GP", R.string.GP)); +// countries.add(new Country("591", "BO", R.string.BO)); +// countries.add(new Country("592", "GY", R.string.GY)); +// countries.add(new Country("593", "EC", R.string.EC)); +// countries.add(new Country("594", "GF", R.string.GF)); +// countries.add(new Country("595", "PY", R.string.PY)); +// countries.add(new Country("596", "MQ", R.string.MQ)); +// countries.add(new Country("597", "SR", R.string.SR)); +// countries.add(new Country("598", "UY", R.string.UY)); +// countries.add(new Country("599", "CW", R.string.CW)); +// countries.add(new Country("599", "BQ", R.string.BQ)); +// countries.add(new Country("670", "TL", R.string.TL)); +// countries.add(new Country("672", "NF", R.string.NF)); +// countries.add(new Country("673", "BN", R.string.BN)); +// countries.add(new Country("674", "NR", R.string.NR)); +// countries.add(new Country("675", "PG", R.string.PG)); +// countries.add(new Country("676", "TO", R.string.TO)); +// countries.add(new Country("677", "SB", R.string.SB)); +// countries.add(new Country("678", "VU", R.string.VU)); +// countries.add(new Country("679", "FJ", R.string.FJ)); +// countries.add(new Country("680", "PW", R.string.PW)); +// countries.add(new Country("681", "WF", R.string.WF)); +// countries.add(new Country("682", "CK", R.string.CK)); +// countries.add(new Country("683", "NU", R.string.NU)); +// countries.add(new Country("685", "WS", R.string.WS)); +// countries.add(new Country("686", "KI", R.string.KI)); +// countries.add(new Country("687", "NC", R.string.NC)); +// countries.add(new Country("688", "TV", R.string.TV)); +// countries.add(new Country("689", "PF", R.string.PF)); +// countries.add(new Country("690", "TK", R.string.TK)); +// countries.add(new Country("691", "FM", R.string.FM)); +// countries.add(new Country("692", "MH", R.string.MH)); +// countries.add(new Country("850", "KP", R.string.KP)); +// countries.add(new Country("852", "HK", R.string.HK)); +// countries.add(new Country("853", "MO", R.string.MO)); +// countries.add(new Country("855", "KH", R.string.KH)); +// countries.add(new Country("856", "LA", R.string.LA)); +// countries.add(new Country("880", "BD", R.string.BD)); +// countries.add(new Country("886", "TW", R.string.TW)); +// countries.add(new Country("960", "MV", R.string.MV)); +// countries.add(new Country("961", "LB", R.string.LB)); +// countries.add(new Country("962", "JO", R.string.JO)); +// countries.add(new Country("963", "SY", R.string.SY)); +// countries.add(new Country("964", "IQ", R.string.IQ)); +// countries.add(new Country("965", "KW", R.string.KW)); +// countries.add(new Country("966", "SA", R.string.SA)); +// countries.add(new Country("967", "YE", R.string.YE)); +// countries.add(new Country("968", "OM", R.string.OM)); +// countries.add(new Country("970", "PS", R.string.PS)); +// countries.add(new Country("971", "AE", R.string.AE)); +// countries.add(new Country("972", "IL", R.string.IL)); +// countries.add(new Country("973", "BH", R.string.BH)); +// countries.add(new Country("974", "QA", R.string.QA)); +// countries.add(new Country("975", "BT", R.string.BT)); +// countries.add(new Country("976", "MN", R.string.MN)); +// countries.add(new Country("977", "NP", R.string.NP)); +// countries.add(new Country("992", "TJ", R.string.TJ)); +// countries.add(new Country("993", "TM", R.string.TM)); +// countries.add(new Country("994", "AZ", R.string.AZ)); +// countries.add(new Country("995", "GE", R.string.GE)); +// countries.add(new Country("996", "KG", R.string.KG)); +// countries.add(new Country("998", "UZ", R.string.UZ)); +// countries.add(new Country("1242", "BS", R.string.BS)); +// countries.add(new Country("1246", "BB", R.string.BB)); +// countries.add(new Country("1264", "AI", R.string.AI)); +// countries.add(new Country("1268", "AG", R.string.AG)); +// countries.add(new Country("1284", "VG", R.string.VG)); +// countries.add(new Country("1340", "VI", R.string.VI)); +// countries.add(new Country("1345", "KY", R.string.KY)); +// countries.add(new Country("1441", "BM", R.string.BM)); +// countries.add(new Country("1473", "GD", R.string.GD)); +// countries.add(new Country("1649", "TC", R.string.TC)); +// countries.add(new Country("1664", "MS", R.string.MS)); +// countries.add(new Country("1670", "MP", R.string.MP)); +// countries.add(new Country("1671", "GU", R.string.GU)); +// countries.add(new Country("1684", "AS", R.string.AS)); +// countries.add(new Country("1721", "SX", R.string.SX)); +// countries.add(new Country("1758", "LC", R.string.LC)); +// countries.add(new Country("1767", "DM", R.string.DM)); +// countries.add(new Country("1784", "VC", R.string.VC)); +// countries.add(new Country("1868", "TT", R.string.TT)); +// countries.add(new Country("1869", "KN", R.string.KN)); +// countries.add(new Country("1876", "JM", R.string.JM)); } } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/menu/sign_in.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/menu/sign_in.xml index dc7c72f8f6..181c17e7f7 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/menu/sign_in.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/menu/sign_in.xml @@ -12,9 +12,9 @@ android:title="@string/tour_sign_up" app:showAsAction="always" /> - + + + + \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml index bd780beaac..2a77557381 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml @@ -213,6 +213,11 @@ Sair do grupo Remover grupo + Ver informações do canal + Renomear canal + Sair do canal + Excluir canal + Contatos Não há contatos diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/strings_countries.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/strings_countries.xml index 519d539925..659d83e1db 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/strings_countries.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/strings_countries.xml @@ -33,7 +33,7 @@ Mexico Cuba Argentina - Brazil + Brasil Chile Colombia Venezuela From 56a18014b6712a3e3fae3766ea3edc7edfc984f6 Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 18 Sep 2016 15:11:15 -0300 Subject: [PATCH 098/253] alteracoes --- actor-sdk/sdk-core-android/android-google-maps/build.gradle | 2 +- actor-sdk/sdk-core-android/android-google-push/build.gradle | 2 +- actor-sdk/sdk-core-android/android-sdk/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-google-maps/build.gradle b/actor-sdk/sdk-core-android/android-google-maps/build.gradle index 9091738679..7127827403 100644 --- a/actor-sdk/sdk-core-android/android-google-maps/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-maps/build.gradle @@ -3,7 +3,7 @@ buildscript { classpath 'com.android.tools.build:gradle:2.1.3' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" - classpath 'me.tatarka:gradle-retrolambda:3.2.5' + classpath 'me.tatarka:gradle-retrolambda:3.3.0' } } plugins { diff --git a/actor-sdk/sdk-core-android/android-google-push/build.gradle b/actor-sdk/sdk-core-android/android-google-push/build.gradle index bda82be2dd..911a1642b2 100644 --- a/actor-sdk/sdk-core-android/android-google-push/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-push/build.gradle @@ -3,7 +3,7 @@ buildscript { classpath 'com.android.tools.build:gradle:2.1.3' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" - classpath 'me.tatarka:gradle-retrolambda:3.2.5' + classpath 'me.tatarka:gradle-retrolambda:3.3.0' } } diff --git a/actor-sdk/sdk-core-android/android-sdk/build.gradle b/actor-sdk/sdk-core-android/android-sdk/build.gradle index 92c1d9d729..2a6c73ad61 100644 --- a/actor-sdk/sdk-core-android/android-sdk/build.gradle +++ b/actor-sdk/sdk-core-android/android-sdk/build.gradle @@ -3,7 +3,7 @@ buildscript { classpath 'com.android.tools.build:gradle:2.1.3' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" - classpath 'me.tatarka:gradle-retrolambda:3.2.5' + classpath 'me.tatarka:gradle-retrolambda:3.3.0' } } From cbce78659f30146d4d8a36458847524b89a6c96f Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 18 Sep 2016 18:49:40 -0300 Subject: [PATCH 099/253] alteracos --- actor-sdk/sdk-core-android/android-google-maps/build.gradle | 2 +- actor-sdk/sdk-core-android/android-google-push/build.gradle | 2 +- actor-sdk/sdk-core-android/android-sdk/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-google-maps/build.gradle b/actor-sdk/sdk-core-android/android-google-maps/build.gradle index 7127827403..9091738679 100644 --- a/actor-sdk/sdk-core-android/android-google-maps/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-maps/build.gradle @@ -3,7 +3,7 @@ buildscript { classpath 'com.android.tools.build:gradle:2.1.3' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" - classpath 'me.tatarka:gradle-retrolambda:3.3.0' + classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } plugins { diff --git a/actor-sdk/sdk-core-android/android-google-push/build.gradle b/actor-sdk/sdk-core-android/android-google-push/build.gradle index 911a1642b2..bda82be2dd 100644 --- a/actor-sdk/sdk-core-android/android-google-push/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-push/build.gradle @@ -3,7 +3,7 @@ buildscript { classpath 'com.android.tools.build:gradle:2.1.3' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" - classpath 'me.tatarka:gradle-retrolambda:3.3.0' + classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } diff --git a/actor-sdk/sdk-core-android/android-sdk/build.gradle b/actor-sdk/sdk-core-android/android-sdk/build.gradle index 2a6c73ad61..92c1d9d729 100644 --- a/actor-sdk/sdk-core-android/android-sdk/build.gradle +++ b/actor-sdk/sdk-core-android/android-sdk/build.gradle @@ -3,7 +3,7 @@ buildscript { classpath 'com.android.tools.build:gradle:2.1.3' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" - classpath 'me.tatarka:gradle-retrolambda:3.3.0' + classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } From e201d9e4bec045b7f2ddfcb221c9940bdf93e799 Mon Sep 17 00:00:00 2001 From: diego Date: Tue, 20 Sep 2016 15:29:06 -0300 Subject: [PATCH 100/253] alteracoes --- actor-sdk/sdk-core-android/android-app/build.gradle | 2 +- actor-sdk/sdk-core-android/android-google-maps/build.gradle | 4 ++-- actor-sdk/sdk-core-android/android-google-push/build.gradle | 4 ++-- actor-sdk/sdk-core-android/android-sdk/build.gradle | 4 ++-- actor-sdk/sdk-core/core/core-android/build.gradle | 2 +- actor-sdk/sdk-core/runtime/runtime-android/build.gradle | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-app/build.gradle b/actor-sdk/sdk-core-android/android-app/build.gradle index c218a304e5..00eca7c2f2 100644 --- a/actor-sdk/sdk-core-android/android-app/build.gradle +++ b/actor-sdk/sdk-core-android/android-app/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:2.2.0' classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } diff --git a/actor-sdk/sdk-core-android/android-google-maps/build.gradle b/actor-sdk/sdk-core-android/android-google-maps/build.gradle index 9091738679..27d126da8d 100644 --- a/actor-sdk/sdk-core-android/android-google-maps/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-maps/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:2.2.0' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" classpath 'me.tatarka:gradle-retrolambda:3.2.5' @@ -140,7 +140,7 @@ project.afterEvaluate { mavenDeployer { // beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } - repository(url: "http://64.137.236.110:8081/repository/maven-snapshots/") { + repository(url: "http://64.137.170.2:8081/content/repositories/snapshots/") { authentication(userName: ossrhUsername, password: ossrhPassword) } diff --git a/actor-sdk/sdk-core-android/android-google-push/build.gradle b/actor-sdk/sdk-core-android/android-google-push/build.gradle index bda82be2dd..f004455a49 100644 --- a/actor-sdk/sdk-core-android/android-google-push/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-push/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:2.2.0' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" classpath 'me.tatarka:gradle-retrolambda:3.2.5' @@ -137,7 +137,7 @@ project.afterEvaluate { mavenDeployer { // beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } - repository(url: "http://64.137.236.110:8081/repository/maven-snapshots/") { + repository(url: "http://64.137.170.2:8081/content/repositories/snapshots/") { authentication(userName: ossrhUsername, password: ossrhPassword) } diff --git a/actor-sdk/sdk-core-android/android-sdk/build.gradle b/actor-sdk/sdk-core-android/android-sdk/build.gradle index 92c1d9d729..a3cf447fa3 100644 --- a/actor-sdk/sdk-core-android/android-sdk/build.gradle +++ b/actor-sdk/sdk-core-android/android-sdk/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:2.2.0' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" classpath 'me.tatarka:gradle-retrolambda:3.2.5' @@ -190,7 +190,7 @@ project.afterEvaluate { mavenDeployer { // beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } - repository(url: "http://64.137.236.110:8081/repository/maven-snapshots/") { + repository(url: "http://64.137.170.2:8081/content/repositories/snapshots/") { authentication(userName: ossrhUsername, password: ossrhPassword) } diff --git a/actor-sdk/sdk-core/core/core-android/build.gradle b/actor-sdk/sdk-core/core/core-android/build.gradle index 390b823d44..a3ea540536 100644 --- a/actor-sdk/sdk-core/core/core-android/build.gradle +++ b/actor-sdk/sdk-core/core/core-android/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:2.2.0' classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } diff --git a/actor-sdk/sdk-core/runtime/runtime-android/build.gradle b/actor-sdk/sdk-core/runtime/runtime-android/build.gradle index ef3cd88fdd..dc30bcee10 100644 --- a/actor-sdk/sdk-core/runtime/runtime-android/build.gradle +++ b/actor-sdk/sdk-core/runtime/runtime-android/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:2.2.0' classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } From 4d0eac58de58917dff6840a133e40362c49b6e7e Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Fri, 23 Sep 2016 08:32:41 +0300 Subject: [PATCH 101/253] fix(iOS): Trying to fix new cocoa pods compatibility --- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index b0b461e8eb..e449aedfd2 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -36,7 +36,7 @@ Pod::Spec.new do |s| s.dependency 'M13ProgressSuite' s.preserve_paths = 'Frameworks' - s.vendored_framework = 'Frameworks/ActorSDK.framework' + s.vendored_framework = 'ActorSDK.framework' s.xcconfig = { "SWIFT_INCLUDE_PATHS" => "$(PROJECT_DIR)/ActorSDK-iOS/Frameworks/", From 306559d67afb48baba9128aab927c71487ae78a0 Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Fri, 23 Sep 2016 12:05:51 +0300 Subject: [PATCH 102/253] fix(iOS): Trying to fix new cocoa pods compatibility --- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index e449aedfd2..5864bc118e 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -35,7 +35,7 @@ Pod::Spec.new do |s| s.dependency 'TTTAttributedLabel' s.dependency 'M13ProgressSuite' - s.preserve_paths = 'Frameworks' + s.preserve_paths = '{Frameworks,ActorSDK.framework}' s.vendored_framework = 'ActorSDK.framework' s.xcconfig = { From 27e17c44cb5e858410f652ba5edf3baf1217650d Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Fri, 23 Sep 2016 13:41:18 +0300 Subject: [PATCH 103/253] fix(iOS): Trying to fix new cocoa pods compatibility --- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index 5864bc118e..987d0cd0d0 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -35,7 +35,7 @@ Pod::Spec.new do |s| s.dependency 'TTTAttributedLabel' s.dependency 'M13ProgressSuite' - s.preserve_paths = '{Frameworks,ActorSDK.framework}' + s.preserve_paths = '{Frameworks/**/*,ActorSDK.framework/**/*,ActorSDK.framework.dSYM}' s.vendored_framework = 'ActorSDK.framework' s.xcconfig = { From 389474e200eef9606875c3e53c16a51c8a24b28e Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Fri, 23 Sep 2016 07:51:49 -0300 Subject: [PATCH 104/253] alteracoes --- .DS_Store | Bin 0 -> 8196 bytes actor-sdk/.DS_Store | Bin 0 -> 6148 bytes actor-sdk/sdk-core-android/.DS_Store | Bin 0 -> 6148 bytes actor-sdk/sdk-core-android/android-sdk/.DS_Store | Bin 0 -> 6148 bytes .../sdk-core-android/android-sdk/src/.DS_Store | Bin 0 -> 6148 bytes .../android-sdk/src/main/.DS_Store | Bin 0 -> 6148 bytes .../android-sdk/src/main/AndroidManifest.xml | 4 ++++ .../android-sdk/src/main/res/.DS_Store | Bin 0 -> 8196 bytes actor-server/.DS_Store | Bin 0 -> 8196 bytes 9 files changed, 4 insertions(+) create mode 100644 .DS_Store create mode 100644 actor-sdk/.DS_Store create mode 100644 actor-sdk/sdk-core-android/.DS_Store create mode 100644 actor-sdk/sdk-core-android/android-sdk/.DS_Store create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/.DS_Store create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/.DS_Store create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/.DS_Store create mode 100644 actor-server/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..24d5e6ad48640b13ed1f958925b89b0463be4d7a GIT binary patch literal 8196 zcmeHMU2GIZ9G~CO!Y*CgX(>>SYd9$eYbq291w`Qb!8e44egkss-L9~*-L1EKSF~0e z-~5iBF&d3g@dMQOfS@lvV1h#{cZ>AzXnMjlpy$nfcAkfBrK& zzx&PX{qGoKXwMr<7^`E9DU=2B3M#IVgk9tbDHisW6N3C1%dtC|#|(BbGcsXx)DbZd zF%U5jF%U5jF>o_5K<{jklr%qGU>69v`^Xkfb zx(~P`-M;SUy>>mfJ7`&knF;G%x__Wp?{QuGa$V2#S>{NZ*LJv$uUn3pyTWx(zvUS2 zNV}VN3~x`joUh+9`~zt|vnyv7$hAv%%s$JrGL~)m52%zBHO=crM_ZS#YD%`WHjgzW zM^~(9Zb~j|X&oD@MuVcvZCu{AeQ@jHm?XDrl z7=a}|Cq7S6c8mUwoJpnZ*5=0-s9aZiJbDZ{#X_x7<(}GekhCFPo3up=H`HER&zQFC zTB5Zme5=}DkQB5 z>DG!{9u(u-48t@OMQKPK`Zy3wL+bVbS%U;RPz|Z(u&%Irwv=_UZEPRuVw63_US>zx zF?O7tU?8T^P}aUK`slf{av-%@;P ziMT{~BTa|*LhOZWYdW!EBsWl}Q ziQ~YhNNXT-L*?bt+N!M-M}wD1>uPO{I0SsEwAO2Fs>+#cEKF3W|AunECf)u_s=dg5 zXMbWUDo}@8Nvn&o3hR(U2WfQ!cAyJ8(T!g0MH)IXFi5EmhH*bUJcO}8v5(>jJc+0A z44%a+conbVb-aQ1aRf*4A&%n&KE-D^iPJcX?@P41wM4r=-AKD7_x9DUld&~LZn{py z|Ld>+`~PI5Cfakvz@%XSWu4uf?X=zESAx==iJc^_qw#JF*ZfeRHuI8GRZU2_x>Z(^E+rJG&oM!?}H^b#`S(@sUa=1Ap_m z&Z|h}X>l#}^jPJIp7iuMPs-EK&UdVmYB=y8^o#TyQ~Ob#9;s5rDpS?_7K+yz_*>Iy zckgLi?shw~ww&(ociQsFZg)1@5Idf?{c!Ku%ahUU!^cmbzkL1n{o;o$kH9b4$bE-% z_=(0pnK}=PJk$AGjGfOj&u3%?m;q*Bc^Ggzly`4=9*LiX8DIvMgaO(gBr0Lxu(oKn z4s7W6k;a>ZBxuuJf>1gP9M%?b1Vz|XM4Kwy6+_r`^h*~PIIJz&bP#4`oX4#!+zmyT z)zL3aIEcU^x6A-DaFc-*+x6-EfARPG|IH-sF$2uNf5m`k9)t%yd?k0bF1#F_wG#CV qm4xDIi&rUVn4=hD=_uYpHG+Og24di_wul}S{t+-VaKjATDg&3p18RT( literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/.DS_Store b/actor-sdk/sdk-core-android/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..37a3f8a1329b922a3b25512c08cd788fcc85fb66 GIT binary patch literal 6148 zcmeHK-D=w~6h2C`&1s>yY=y#Z1icz$kkK_|cV60F76KkEWi6SF%_3&3U^@*X1bn^6 z*w&x-7;Mk5SJ~Chk(AQX_IB&W`QYd~lFpIrPe!r;K=j7R3jiMgJT&4)3yWJo{bV=L za4p2bjG;k60?(nulJPGnKx?-I5#+dH1zcUf5AmcN#hH#V;#WM%R9SU8KSg7q`QYIr zueFF+Ui4R%kHev!gjH0H%U)ExH8qu_vGe;;HJtlzw9YR5DBf4;WZ*y9)_E1FJT0!I z9v!GW(UYDY=Sg`K+VKulQVj?GYQIQNFts1$>AosetTI)7Y$3eXz+anAyPL1ta--Xs zwdHhctJ9V*H@dUgidgr&r_VND?;Vb2pFV&2dU|$#@$I`^B!S z0{V29AeN2;$F*hbK?s|QY*U51VhEd#?b5{sj%&*{9fX+~$8j?YcS8|oc5Ig>97JH5 zOICmtxURs0t@?ES@7{g?zn;W3R)7`wuM`l?op7gzujJ0w8!ty^twei=MxeOb@?{D- i<|xKkI*QlO46t32gB&=nEn^FUe*}yST(AOvRDs_sC}z_D literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e89e5e97b3f0aa01642f7630c7d5454a4eb96a4d GIT binary patch literal 6148 zcmeHKUrQq~5Kr2wTLoEBLGUHulhB8XTJdeI-s3@G59QFK?z)Q&EW2fQYmrjeXFrDC zzwdFNpTVzkPdAgK(o*kHQJI0sZ!(!lnqNw0!x-buUa-ZO%^0&l5ldBQo)H{JosyFA zAaa}|>-tgRL+`KOor)&MTVw#wuFNu)vJ1aIetwb6@_PM|m&%oy**U8^53)FKFD-s^ zJ4xToy}Xw-z4TP|WDxqsZh3iUWPeGL=*jl{V;T0__R3)r=bntibS(AkM8-kVZzjDs z$j)3n--!(JPTO8>rQsE%w!AnzmYMWrB=hSkh*fRdYlA^!cfTgK8}(sL4EFZwHL184H;tntz68%GdK5)S z3=jjv!24#v+-las``!lqdSZYWcmW3Reh{FDj=@5sx;mi2&qo}uAfkYcZwW+U&@otO zgb@&~Qvr1JbCPz=vXhSB~7HCTz*n)~U^5trei>pePtuXnaZmLzQBP#ZtTmss#K3 X4M4|Wp%FYF^dX>VpoSQDRR;b6bID@C literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..01f8a59d3b3d04cfbfba2f312dd13426faf8637b GIT binary patch literal 6148 zcmeHKPfIH?5Kn5=t%9uR1Hntclh8v&t$16j?S|WfvP*cT0EMBBiirKZfs* zeh)!EgJ0#HoJrE6RF8_v3`~BL$xPDxQZgIH7_W7LHO6elm<5VhC_(dz;5h1-6pROv z;~ai3ZTV5+L;wF+G&w#a19)~tcELO*S^WI`{8l8>tWtU8g^A+i)U;Ka0hybz=jTq{ zX3}#rFYBZ=uYIg~G6;QR*S)Mcw0|W@G_pPaK!&}By||minJ440{Vet5P{u*ht0kQ{ zNKafn-=Pe$X2bqbZ--q-t$T5JAXDkfNM@HM5UbR%m-_wc=5|@ES1W_E=x=RR%3@=^ zIvC9J70X&)-Q3wfY7MTgfB*UW@8u!O5IWa&Cyb}X>KL}7n$6&5eT^-Qi=Od065mCU#w*;av=orj3 z!Uzc0sen3_n>EIV8&M}y4)ai_?m0=#UGB+<2u2u)XP~nU_8mT1)h=G?3Oz5tS z_5bJF@Bf!c)FTFnfp5hCFYdW}HQ17=tz(VpoSRuPzIg=Bot$W literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/src/main/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ed616c1347dd334eb7f69c44ff8f5a21590d386f GIT binary patch literal 6148 zcmeHKUrQq~5Kr2w+X}Lxf^aW^dphVtMXmU@SG~uB!iwd%O5J4_8(4PB?$&aY!am=} zIRD&zkAw3w_*L%7nIsiU^-)oofyr+&nMs;oN@l|t$^#hA?)vp^9`RcIa&97mm# zlJOvNoFg0fQQ|}Izdx9ZCdX@J0MD+>QWmnzA3Z$3NM?DXam!2P%EIE3Rjq-n)a=!j z6Stp?+}z8DS<6emtDX!(-`H(0?@#TcB#G{A&p(#osAsPqBysM^I7}a;b~`c-l2I!e z#zEF~^?V%}8TPU%w3|KYv|ZUS0qG^Y@=V1P=dKC2Iz!a07H$jzv YU!Vc#7%Vh`2ZTNZ6b;l6124+J9my$T#Q*>R literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml index 16b41d5c31..f4d40a11cc 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml @@ -80,6 +80,10 @@ android:host="actor.im" android:pathPrefix="/join/" android:scheme="https" /> + diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/src/main/res/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..edff1d886b7626843016a199caeeb6340b55ffb0 GIT binary patch literal 8196 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 G=H?%l_b9Ib literal 0 HcmV?d00001 From eda721fcfc7b575aaca7943da030535355480c9a Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Fri, 23 Sep 2016 14:06:59 +0300 Subject: [PATCH 105/253] feat+fix: heapster, fixing prometheus config, fixing API servers configuration --- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index 987d0cd0d0..644d049cfc 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -35,7 +35,7 @@ Pod::Spec.new do |s| s.dependency 'TTTAttributedLabel' s.dependency 'M13ProgressSuite' - s.preserve_paths = '{Frameworks/**/*,ActorSDK.framework/**/*,ActorSDK.framework.dSYM}' + s.preserve_paths = '{Frameworks,ActorSDK.framework,ActorSDK.framework.dSYM}' s.vendored_framework = 'ActorSDK.framework' s.xcconfig = { From d55746c27062155e057f9e239c7e777049c0461b Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sat, 24 Sep 2016 07:06:50 -0300 Subject: [PATCH 106/253] alteracoes --- .DS_Store | Bin 10244 -> 10244 bytes actor-sdk/.DS_Store | Bin 10244 -> 10244 bytes actor-sdk/sdk-core-clc/app-clc/keyvalue.db | Bin 3072 -> 3072 bytes actor-sdk/sdk-core-clc/app-clc/list.db | Bin 5120 -> 5120 bytes actor-sdk/sdk-core/.DS_Store | Bin 8196 -> 8196 bytes actor-sdk/sdk-core/runtime/.DS_Store | Bin 6148 -> 8196 bytes .../sdk-core/runtime/runtime-js/.DS_Store | Bin 6148 -> 6148 bytes 7 files changed, 0 insertions(+), 0 deletions(-) diff --git a/.DS_Store b/.DS_Store index 619ee97cb9cf94e7bfc22aa44aa05966c2ec9e28..de58dcb6643ff0c995ccdb35e5dd24c630696b82 100644 GIT binary patch delta 27 jcmZn(XbIThCdkM*IZ#Y&bFAPKu8oDqm^ZU4{AC9Kg9Hhh delta 29 lcmZn(XbIThCdkMzIZ#Y&bFAPKE=I@zd_-Z93|UNBZOR?8SuC=28jRGcRXyU4RrENm$!1o<;&u@PpntJneN&FURB zL<~d>L<~d>L<~d>TnG%%nJto1;@p?ksEinh82Dc@AohnOWr3*>rz8ej2NgjGKv+i2 zL83av0fA34#8ik=5(8HnQ$`O6T@i*DknUtpitdD|5T_(ccLwRs5YCJ+LP0P)`6Ywy z3@M3G88HwsFq;7pyU%BNR$vbE&yL@-U>I- z^LcgU4e9;vc-q(fg4eF+cLi6LVP?a6ukPrM_`(+qU7+$-AF?>gi{WK6~ul_az|+Hx;&E205CmL()Z=x^i^n=#Jjq?7Hrlsyhc3E_EFz*9dE$QdxRNY zU0gSuF~q_^(sHE>^5lFZLT4F zjldGGi!W7_U821sZ&E3nwPo?;D%X`hkM3U%u|jK9xu^EsM6!^sP1;I@8*0C;XH8o+ zt=3u;-lGnVNeX3St9Ff2jV5&{=Z=ifoqMu*L;PBWf2iycb8po>fBUHE(DYRsQ*G^a z@p!368y5ZB48t@OMQJE%r6F~NtTv>YWksdKYzbS#I@wmXmloFqJH(E#C)lg(HFko% z!#-iB*jMaZ_C5QF{lb1_zX6D$4CSanJrY=gMyx>#)}j>~(1}gx#%65800uFPo!AQt z2Vi3a1>BB1a3}7N`N>hJ7N%tZxi zaTzIe71m=TQs^Lsc40euu>)!JV-GUWk%d9}bTEpW;o&w+l1`^csrQgl592=EkB9LH z9>rsL9M9neyoi_ZGG50UcoT2oJ$#DKXDGI3hGM@crP#4_-mzV0AK8m)Ki4(73K*Cp zd8iff|EAKv|3_>^3`7iE#0;RUGu_!v4_Ioq6tQ-a@?Od!iGEWO0~acSaGWp*#|h8; oVMz5Pbrn9T5T_(k3#I@3hk)RNHah=_`hWPn8lC@vP%pCLFX^~c4FCWD delta 121 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{MGqg=C6q~50$jCS`z?zY9GLL`+M@n&WPEvk; z&c?!M_QmWR9D>Xsg+TS(K*AM>+cp+{XP(S2qsz$%wxd G!3+Q-XB4Xd diff --git a/actor-sdk/sdk-core/runtime/runtime-js/.DS_Store b/actor-sdk/sdk-core/runtime/runtime-js/.DS_Store index feca8613504bcd7430524202412f605a970dd548..feaacec66654a91eae201e5b9935e4807bff33f7 100644 GIT binary patch delta 161 zcmZoMXfc=|&e%RNQH+&?fq{WzVxou)6OaJ{%s|Y@z#zcDkdjiIoRgHFpTjsYQNs=- z&dQL)P|A?Wkb@)#)>6z+#E=YA4io{JQqGXbPy`cV+?Z&`KG{HoWivMi4+mrW#>DT; Xllesy1wpnd0C55kgTZD;k;BXYYQG_T delta 108 zcmZoMXfc=|&Zs)EP}rD}fq{XUp_rkFAvvWuIVUMUKL;oR0ZdRDqy~ru7$EW+FPgDW jd{DfZokM_wQFY_R@640=MHB@=suGZNG;DShIm`?Im1`AZ From 1c93ef21e2e7acea6a5b08e9564075f22fa09504 Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 25 Sep 2016 22:08:35 -0300 Subject: [PATCH 107/253] alteracoes --- .../sdk-core-android/android-sdk/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml index f4d40a11cc..2bdf8d4a3c 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml @@ -82,7 +82,7 @@ android:scheme="https" /> From d17c640c9157a155d0368606e50895eab2c1e600 Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 25 Sep 2016 22:17:03 -0300 Subject: [PATCH 108/253] alteracoes --- .../sdk-core-android/android-sdk/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml index 2bdf8d4a3c..c9871d82c2 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ android:pathPrefix="/join/" android:scheme="https" /> From f371982e32f4abfa02802a77d38e81db018c458f Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Tue, 27 Sep 2016 18:09:20 +0300 Subject: [PATCH 109/253] fix(iOS): Trying to fix new cocoa pods compatibility --- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index 644d049cfc..75e3528d02 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -35,8 +35,8 @@ Pod::Spec.new do |s| s.dependency 'TTTAttributedLabel' s.dependency 'M13ProgressSuite' - s.preserve_paths = '{Frameworks,ActorSDK.framework,ActorSDK.framework.dSYM}' - s.vendored_framework = 'ActorSDK.framework' + s.ios.preserve_paths = '**/*' + s.ios.vendored_framework = 'ActorSDK.framework' s.xcconfig = { "SWIFT_INCLUDE_PATHS" => "$(PROJECT_DIR)/ActorSDK-iOS/Frameworks/", From 4ad4653f5da3ed4f171fcd8b3c10b89d5c5918a4 Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Tue, 27 Sep 2016 20:40:40 +0300 Subject: [PATCH 110/253] fix(iOS): Trying to fix new cocoa pods compatibility --- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 16 ++++++---------- .../Template/CommonCrypto.framework/module.map | 4 ++++ actor-sdk/sdk-core-ios/Template/LICENSE | 13 +++++++++++++ actor-sdk/sdk-core-ios/buildFramework.sh | 15 +++++++++++++-- 4 files changed, 36 insertions(+), 12 deletions(-) create mode 100755 actor-sdk/sdk-core-ios/Template/CommonCrypto.framework/module.map create mode 100755 actor-sdk/sdk-core-ios/Template/LICENSE diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index 75e3528d02..b3f54d5e5a 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -5,15 +5,11 @@ Pod::Spec.new do |s| s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { "Actor LLC" => "steve@actor.im" } - s.source = { :git => "https://github.com/actorapp/ActorSDK-iOS.git", :tag => "v#{s.version}" } + s.source = { :http => "https://github.com/actorapp/ActorSDK-iOS/releases/download/v#{s.version}/ActorSDK.zip https://github.com/actorapp/ActorSDK-iOS.git"} s.platform = :ios, "8.0" s.requires_arc = true - s.prepare_command = <<-CMD - Scripts/download.sh - CMD - # Core s.dependency 'RegexKitLite' s.dependency 'zipzap' @@ -36,10 +32,10 @@ Pod::Spec.new do |s| s.dependency 'M13ProgressSuite' s.ios.preserve_paths = '**/*' - s.ios.vendored_framework = 'ActorSDK.framework' + s.ios.vendored_frameworks = 'ActorSDK.framework' - s.xcconfig = { - "SWIFT_INCLUDE_PATHS" => "$(PROJECT_DIR)/ActorSDK-iOS/Frameworks/", - "FRAMEWORK_SEARCH_PATHS" => "$(PROJECT_DIR)/ActorSDK-iOS/Frameworks/" - } + # s.xcconfig = { + # "SWIFT_INCLUDE_PATHS" => "$(PROJECT_DIR)/ActorSDK-iOS/Frameworks/", + # "FRAMEWORK_SEARCH_PATHS" => "$(PROJECT_DIR)/ActorSDK-iOS/Frameworks/" + # } end diff --git a/actor-sdk/sdk-core-ios/Template/CommonCrypto.framework/module.map b/actor-sdk/sdk-core-ios/Template/CommonCrypto.framework/module.map new file mode 100755 index 0000000000..6b6c8409b5 --- /dev/null +++ b/actor-sdk/sdk-core-ios/Template/CommonCrypto.framework/module.map @@ -0,0 +1,4 @@ +module CommonCrypto [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h" + export * +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-ios/Template/LICENSE b/actor-sdk/sdk-core-ios/Template/LICENSE new file mode 100755 index 0000000000..c612f4f7f6 --- /dev/null +++ b/actor-sdk/sdk-core-ios/Template/LICENSE @@ -0,0 +1,13 @@ +Copyright 2014-2015 Actor LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/actor-sdk/sdk-core-ios/buildFramework.sh b/actor-sdk/sdk-core-ios/buildFramework.sh index aa08486af1..7f289ebe58 100755 --- a/actor-sdk/sdk-core-ios/buildFramework.sh +++ b/actor-sdk/sdk-core-ios/buildFramework.sh @@ -54,8 +54,19 @@ cp -a build/Build/Products/Release-iphonesimulator/ActorSDK.framework/Modules/Ac # Copying dSYM cp -a build/Build/Products/Release-iphoneos/ActorSDK.framework.dSYM/* build/Output/ActorSDK.framework.dSYM/ +# Making Bundle +mkdir -p build/Podspec/ + # Compressing Framework -cd build/Output/ +rm -fr build/Podspec +mkdir -p build/Podspec/ActorSDK.framework +mkdir -p build/Podspec/ActorSDK.framework.dSYM +cp -r build/Output/ActorSDK.framework build/Podspec/ +cp -r build/Output/ActorSDK.framework.dSYM build/Podspec/ +cp -r Template/ build/Podspec/ + +cd build/Podspec/ rm -f ActorSDK.zip -zip -r ActorSDK.zip ActorSDK.framework ActorSDK.framework.dSYM +zip -r ActorSDK.zip * +mv ActorSDK.zip ../ From 260bf322ec21c6a132a5e2e71a10512984ade5f7 Mon Sep 17 00:00:00 2001 From: Steve Kite Date: Tue, 27 Sep 2016 21:17:44 +0300 Subject: [PATCH 111/253] fix(iOS): Trying to fix new cocoa pods compatibility --- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index b3f54d5e5a..900421a2ea 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -5,7 +5,7 @@ Pod::Spec.new do |s| s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { "Actor LLC" => "steve@actor.im" } - s.source = { :http => "https://github.com/actorapp/ActorSDK-iOS/releases/download/v#{s.version}/ActorSDK.zip https://github.com/actorapp/ActorSDK-iOS.git"} + s.source = { :http => "https://github.com/actorapp/ActorSDK-iOS/releases/download/v#{s.version}/ActorSDK.zip"} s.platform = :ios, "8.0" s.requires_arc = true From 3e466bc49b27d1bb7fb708bbb1045a1723c8ba3b Mon Sep 17 00:00:00 2001 From: diego Date: Sat, 1 Oct 2016 19:41:27 -0300 Subject: [PATCH 112/253] alteracoes --- .../src/main/res/values-pt-rBR/ui_text.xml | 12 ++++++++++++ actor-server/version.sbt | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml index 2a77557381..76fff08603 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml @@ -457,6 +457,18 @@ Adicionar membro + + grupos públicos + Membros: + Amigos: + ENTRAR + ABRIR + Ei! + Confira as nossas primeiras conversas públicas + Conversar com amigos! + Conversas principais com os seus amigos + Todos os grupos + Link do convite Qualquer um que tenha {appName} instalado poderá entrar no seu grupo acessando esse link diff --git a/actor-server/version.sbt b/actor-server/version.sbt index d46b3d6f4b..a396787a39 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.1-SNAPSHOT" \ No newline at end of file +version in ThisBuild := "3.0.2-SNAPSHOT" \ No newline at end of file From 929b9dabd9aa2ab9e5e45fba46a235c45cca6538 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sat, 1 Oct 2016 22:53:58 -0300 Subject: [PATCH 113/253] alteracoes --- actor-sdk/.DS_Store | Bin 10244 -> 10244 bytes actor-server/version.sbt | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index eb2db23dde3dbad3622462441d4b51b31097c321..dde706da0fb81dab8fc678c122c869789060f1bc 100644 GIT binary patch delta 14 VcmZn(XbIThB*@6P*;(+Q7yu;`1dIRx delta 14 VcmZn(XbIThB*@6H*;(+Q7yu;=1d9Lw diff --git a/actor-server/version.sbt b/actor-server/version.sbt index d46b3d6f4b..df818fbe30 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.1-SNAPSHOT" \ No newline at end of file +version in ThisBuild := "3.0.3-SNAPSHOT" \ No newline at end of file From aa209147f384ea5094701be245184063f43e94af Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Mon, 3 Oct 2016 21:27:16 +0300 Subject: [PATCH 114/253] chore(iOS): change AARingtonesViewController, AAUserViewController init() access modifiers to public --- .../AppIcon.appiconset/Contents.json | 20 +++++++++++++++++++ .../ActorSDK/Sources/ActorSDK.swift | 2 +- .../Managed Runtime/AAViewController.swift | 2 +- .../Ringtones/AARingtonesViewController.swift | 2 +- .../User/AAUserViewController.swift | 4 ++-- 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorApp/Resources/Images.xcassets/AppIcon.appiconset/Contents.json b/actor-sdk/sdk-core-ios/ActorApp/Resources/Images.xcassets/AppIcon.appiconset/Contents.json index 8d9a22fda2..2ad4f23a0d 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/Resources/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/actor-sdk/sdk-core-ios/ActorApp/Resources/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "size" : "29x29", "idiom" : "iphone", @@ -36,6 +46,16 @@ "filename" : "Icon-60@3x.png", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "size" : "29x29", "idiom" : "ipad", diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift index a91ef5ab1e..3e2960a482 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift @@ -590,7 +590,7 @@ import ReachabilitySwift // /// Handling URL Opening in application - func openUrl(_ url: String) { + open func openUrl(_ url: String) { if let u = URL(string: url) { // Handle phone call diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AAViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AAViewController.swift index d82c183b8e..a593669a83 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AAViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AAViewController.swift @@ -17,7 +17,7 @@ open class AAViewController: UIViewController, UINavigationControllerDelegate, U var pendingPickClosure: ((_ image: UIImage) -> ())? - var popover: UIPopoverController? + open var popover: UIPopoverController? // Content type for view tracking diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Ringtones/AARingtonesViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Ringtones/AARingtonesViewController.swift index ecbdaef3f2..e1ce8cb6fc 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Ringtones/AARingtonesViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Ringtones/AARingtonesViewController.swift @@ -20,7 +20,7 @@ open class AARingtonesViewController: AATableViewController { var directories: [String] = [] var soundFiles: [(directory: String, files: [String])] = [] - init() { + public init() { super.init(style: UITableViewStyle.plain) self.title = AALocalized("Ringtones") diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift index f84797eb52..c9997a319c 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift @@ -9,7 +9,7 @@ class AAUserViewController: AAContentTableController { var headerRow: AAAvatarRow! var isContactRow: AACommonRow! - init(uid: Int) { + public init(uid: Int) { super.init(style: AAContentTableStyle.settingsPlain) self.uid = uid @@ -18,7 +18,7 @@ class AAUserViewController: AAContentTableController { self.title = AALocalized("ProfileTitle") } - required init(coder aDecoder: NSCoder) { + public required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } From 0dc86c692499f1946fdfee9d08923a99ca21855f Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Tue, 4 Oct 2016 18:34:14 +0300 Subject: [PATCH 115/253] chore(iOS): change AARingtonesViewController fields, AAUserViewController access modifiers to open --- .../Sources/Controllers/User/AAUserViewController.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift index c9997a319c..2ac85b0cd5 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift @@ -4,10 +4,12 @@ import UIKit -class AAUserViewController: AAContentTableController { +open class AAUserViewController: AAContentTableController { var headerRow: AAAvatarRow! var isContactRow: AACommonRow! + open var setRingtoneController: AARingtonesViewController + open var sound: String public init(uid: Int) { super.init(style: AAContentTableStyle.settingsPlain) @@ -175,8 +177,8 @@ class AAUserViewController: AAContentTableController { if(Actor.isNotificationsEnabled(with: peer)){ r.selectAction = {() -> Bool in // Sound: Choose sound - let setRingtoneController = AARingtonesViewController() - let sound = Actor.getNotificationsSound(with: peer) + setRingtoneController = AARingtonesViewController() + sound = Actor.getNotificationsSound(with: peer) setRingtoneController.selectedRingtone = (sound != nil) ? sound! : "" setRingtoneController.completion = {(selectedSound:String) in Actor.changeNotificationsSound(peer, withValue: selectedSound) From 4b220a4182e721eee9555fd07abacf624cc599e4 Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Tue, 4 Oct 2016 19:04:44 +0300 Subject: [PATCH 116/253] chore(iOS): change AAUserViewController fields access modifiers to open --- .../User/AAUserViewController.swift | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift index 2ac85b0cd5..7aed0a7234 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift @@ -8,8 +8,8 @@ open class AAUserViewController: AAContentTableController { var headerRow: AAAvatarRow! var isContactRow: AACommonRow! - open var setRingtoneController: AARingtonesViewController - open var sound: String + open var setRingtoneController: AARingtonesViewController! + open var sound: String! public init(uid: Int) { super.init(style: AAContentTableStyle.settingsPlain) @@ -24,7 +24,7 @@ open class AAUserViewController: AAContentTableController { fatalError("init(coder:) has not been implemented") } - override func tableDidLoad() { + override open func tableDidLoad() { // Profile section { (s) -> () in @@ -177,13 +177,13 @@ open class AAUserViewController: AAContentTableController { if(Actor.isNotificationsEnabled(with: peer)){ r.selectAction = {() -> Bool in // Sound: Choose sound - setRingtoneController = AARingtonesViewController() - sound = Actor.getNotificationsSound(with: peer) - setRingtoneController.selectedRingtone = (sound != nil) ? sound! : "" - setRingtoneController.completion = {(selectedSound:String) in + self.setRingtoneController = AARingtonesViewController() + self.sound = Actor.getNotificationsSound(with: peer) + self.setRingtoneController.selectedRingtone = (self.sound != nil) ? self.sound! : "" + self.setRingtoneController.completion = {(selectedSound:String) in Actor.changeNotificationsSound(peer, withValue: selectedSound) } - let navigationController = AANavigationController(rootViewController: setRingtoneController) + let navigationController = AANavigationController(rootViewController: self.setRingtoneController) if (AADevice.isiPad) { navigationController.isModalInPopover = true navigationController.modalPresentationStyle = UIModalPresentationStyle.currentContext @@ -295,7 +295,7 @@ open class AAUserViewController: AAContentTableController { } } - override func tableWillBind(_ binder: AABinder) { + override open func tableWillBind(_ binder: AABinder) { binder.bind(user.getAvatarModel(), closure: { (value: ACAvatar?) -> () in self.headerRow.reload() }) From 3dd2df6408d88ed41ea628c2f4cbf230b6b33ad1 Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Tue, 4 Oct 2016 19:41:55 +0300 Subject: [PATCH 117/253] chore(iOS): change AARingtonesViewController fields access modifiers to open --- .../Controllers/Ringtones/AARingtonesViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Ringtones/AARingtonesViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Ringtones/AARingtonesViewController.swift index e1ce8cb6fc..d65aae45a0 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Ringtones/AARingtonesViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Ringtones/AARingtonesViewController.swift @@ -13,8 +13,8 @@ import AVFoundation open class AARingtonesViewController: AATableViewController { var audioPlayer: AVAudioPlayer! - var selectedRingtone: String = "" - var completion: ((String) -> ())! + open var selectedRingtone: String = "" + open var completion: ((String) -> ())! let rootSoundDirectories: [String] = ["/Library/Ringtones"/*,"/System/Library/Audio/UISounds"*/] var directories: [String] = [] From a2852ec39641aac2ce0fcf6a63d5cb8c4a5abbab Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Fri, 7 Oct 2016 18:56:57 +0300 Subject: [PATCH 118/253] fix(iOS): fix share menu crash, recover fast share --- .../Localizable/Base.lproj/InfoPlist.strings | 3 +- .../Conversation/Views/AAThumbnailView.swift | 58 +++++++++---------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorApp/Resources/Localizable/Base.lproj/InfoPlist.strings b/actor-sdk/sdk-core-ios/ActorApp/Resources/Localizable/Base.lproj/InfoPlist.strings index f7d6ad5b07..4af4eb52c8 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/Resources/Localizable/Base.lproj/InfoPlist.strings +++ b/actor-sdk/sdk-core-ios/ActorApp/Resources/Localizable/Base.lproj/InfoPlist.strings @@ -3,4 +3,5 @@ // "CFBundleDisplayName" = "Actor SDK"; -"CFBundleName" = "Actor SDK"; \ No newline at end of file +"CFBundleName" = "Actor SDK"; +"NSPhotoLibraryUsageDescription" = "We need this so you can share photos and videos from your photo library"; diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Views/AAThumbnailView.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Views/AAThumbnailView.swift index 66c517e5ca..06656dfc38 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Views/AAThumbnailView.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Views/AAThumbnailView.swift @@ -87,14 +87,14 @@ open class AAThumbnailView: UIView,UICollectionViewDelegate , UICollectionViewDa let options = PHFetchOptions() options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] -// switch mediaType { -// case .Image: -// options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Image.rawValue) -// case .Video: -// options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Video.rawValue) -// case .ImageAndVideo: -// options.predicate = NSPredicate(format: "mediaType = %d OR mediaType = %d", PHAssetMediaType.Image.rawValue, PHAssetMediaType.Video.rawValue) -// } + switch mediaType { + case .image: + options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue) + case .video: + options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.video.rawValue) + case .imageAndVideo: + options.predicate = NSPredicate(format: "mediaType = %d OR mediaType = %d", PHAssetMediaType.image.rawValue, PHAssetMediaType.video.rawValue) + } options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue) @@ -107,27 +107,27 @@ open class AAThumbnailView: UIView,UICollectionViewDelegate , UICollectionViewDa let requestOptions = PHImageRequestOptions() requestOptions.isSynchronous = true requestOptions.deliveryMode = .fastFormat - -// result.enumerateObjects { asset, _, stop in -// -// if self.assets.count > fetchLimit { -// stop.initialize(to: true) -// } -// -// if let asset = asset as? PHAsset { -// var isGIF = false -// self.imageManager.requestImageData(for: asset, options: requestOptions) { data, _, _, info in -// if data != nil { -// let gifMarker = info!["PHImageFileURLKey"] as! URL -// print(gifMarker.pathExtension) -// isGIF = (gifMarker.pathExtension == "GIF") ? true : false -// print(isGIF) -// self.prefetchImagesForAsset(asset) -// } -// self.assets.append((asset,isGIF)) -// } -// } -// } + + result.enumerateObjects ({ asset, _, stop in + + if self.assets.count > fetchLimit { + stop.initialize(to: true) + } + + if let asset = asset as? PHAsset { + var isGIF = false + self.imageManager.requestImageData(for: asset, options: requestOptions) { data, _, _, info in + if data != nil { + let gifMarker = info!["PHImageFileURLKey"] as! URL + print(gifMarker.pathExtension) + isGIF = (gifMarker.pathExtension == "GIF") ? true : false + print(isGIF) + self.prefetchImagesForAsset(asset) + } + self.assets.append((asset,isGIF)) + } + } + }) } fileprivate func prefetchImagesForAsset(_ asset: PHAsset) { From 8f14b0af11bbdd697cd37c81d37e263018e27e29 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Mon, 10 Oct 2016 12:31:35 -0300 Subject: [PATCH 119/253] alteracoes --- actor-server/version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 133ec807f6..2c281834d1 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.3-SNAPSHOT" +version in ThisBuild := "3.0.4-SNAPSHOT" From b6ace0ff96f950545b9e28653fa90349e6068a03 Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Mon, 10 Oct 2016 20:39:23 +0300 Subject: [PATCH 120/253] fix(iOS): recover contacts sync, request permissions --- .../Localizable/Base.lproj/InfoPlist.strings | 24 ++- .../Resources/Base.lproj/Localizable.strings | 1 + .../Providers/iOSPhoneBookProvider.swift | 191 +++++++++--------- 3 files changed, 115 insertions(+), 101 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorApp/Resources/Localizable/Base.lproj/InfoPlist.strings b/actor-sdk/sdk-core-ios/ActorApp/Resources/Localizable/Base.lproj/InfoPlist.strings index 4af4eb52c8..84a1ecafce 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/Resources/Localizable/Base.lproj/InfoPlist.strings +++ b/actor-sdk/sdk-core-ios/ActorApp/Resources/Localizable/Base.lproj/InfoPlist.strings @@ -1,7 +1,19 @@ -// -// Copyright (c) 2014-2016 Actor LLC. -// +{ + CFBundleDisplayName = "Actor SDK"; + CFBundleName = "Actor SDK"; + + /* + * Permissions + */ + + "NSPhotoLibraryUsageDescription" = "We need this so you can share photos and videos from your photo library"; + + "NSCameraUsageDescription" = "We need this so you can take and share photos and videos"; + + "NSLocationUsageDescription" = "We need this so you can share your current location"; + + "NSMicrophoneUsageDescription" = "We need this so you can record and share voice messages"; + + "NSContactsUsageDescription" = "We need this so you can connect with your friends across all your devices"; -"CFBundleDisplayName" = "Actor SDK"; -"CFBundleName" = "Actor SDK"; -"NSPhotoLibraryUsageDescription" = "We need this so you can share photos and videos from your photo library"; +} diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings index e54b96b6de..69e74bcce2 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings @@ -752,3 +752,4 @@ "ErrorUnableToJoin" = "Unable to join to group"; "ErrorUnableToCall" = "Unable to call this number"; + diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/iOSPhoneBookProvider.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/iOSPhoneBookProvider.swift index 771416d65a..5135c5a6f7 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/iOSPhoneBookProvider.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/iOSPhoneBookProvider.swift @@ -18,101 +18,102 @@ class PhoneBookProvider: NSObject, ACPhoneBookProvider { return } let book: ABAddressBook = rawBook!.takeRetainedValue() -// ABAddressBookRequestAccessWithCompletion(book, { (granted: Bool, error: CFError!) -> Void in -// if (!granted) { -// print("Access to AddressBook denied") -// callback.onLoaded(withContacts: JavaUtilArrayList()) -// return -// } -// -// autoreleasepool { -// let numbersSet = CharacterSet(charactersIn: "0123456789").inverted -// let contacts = JavaUtilArrayList() -// var index = 1 -// let people = ABAddressBookCopyArrayOfAllPeople(book).takeRetainedValue() as [ABRecordRef] -// -// for person in people { -// let firstName = self.extractString(person as ABRecord, propertyName: kABPersonFirstNameProperty) -// let middleName = self.extractString(person as ABRecord, propertyName: kABPersonMiddleNameProperty) -// let lastName = self.extractString(person as ABRecord, propertyName: kABPersonLastNameProperty) -// -// var contactName :String? -// -// // -// // For Performance. LOL. -// // -// if firstName != nil { -// if middleName != nil { -// if lastName != nil { -// contactName = firstName! + " " + middleName! + " " + lastName! -// } else { -// contactName = firstName! + " " + middleName! -// } -// } else { -// if (lastName != nil) { -// contactName = firstName! + " " + lastName! -// } else { -// contactName = firstName -// } -// } -// } else { -// if middleName != nil { -// if lastName != nil { -// contactName = middleName! + " " + lastName! -// } else { -// contactName = middleName -// } -// } else { -// if lastName != nil { -// contactName = lastName -// } -// } -// } -// -// if (firstName == "Name not specified") { -// contactName = nil -// } -// -// let contactPhones = JavaUtilArrayList() -// let contactEmails = JavaUtilArrayList() -// let contact = ACPhoneBookContact(long: jlong(index), with: contactName, with: contactPhones, with: contactEmails) -// index += 1 -// if let phones: ABMultiValueRef = -// self.extractProperty(person as ABRecord, propertyName: kABPersonPhoneProperty) as ABMultiValueRef? { -// for i in 0...ABMultiValueGetCount(phones) { -// var phoneStr = self.extractString(phones, index: i) -// if (phoneStr == nil || phoneStr!.trim().isEmpty) { -// continue -// } -// phoneStr = phoneStr!.strip(numbersSet) -// let phoneVal = Int64(phoneStr!)// numberFormatter.numberFromString(phoneStr!)?.longLongValue -// if (phoneVal != nil) { -// contactPhones.addWithId(ACPhoneBookPhone(long: jlong(index), withLong: jlong(phoneVal!))) -// index += 1 -// } -// } -// } -// -// if let emails: ABMultiValueRef = -// self.extractProperty(person as ABRecord, propertyName: kABPersonEmailProperty) as ABMultiValueRef? { -// for i in 0...ABMultiValueGetCount(emails) { -// let emailStr = self.extractString(emails, index: i) -// if (emailStr == nil || emailStr!.trim().isEmpty) { -// continue -// } -// contactEmails.addWithId(ACPhoneBookEmail(long: jlong(index), with: emailStr!)) -// index += 1 -// } -// } -// -// if (contactPhones.size() != 0 || contactEmails.size() != 0) { -// contacts.addWithId(contact) -// } -// } -// -// callback.onLoaded(withContacts: contacts) -// } -// }) + + ABAddressBookRequestAccessWithCompletion(book, { (granted: Bool, error: CFError?) in + if (!granted) { + print("Access to AddressBook denied") + callback.onLoaded(withContacts: JavaUtilArrayList()) + return + } + + autoreleasepool { + let numbersSet = CharacterSet(charactersIn: "0123456789").inverted + let contacts = JavaUtilArrayList() + var index = 1 + let people = ABAddressBookCopyArrayOfAllPeople(book).takeRetainedValue() as [ABRecord] + + for person in people { + let firstName = self.extractString(person as ABRecord, propertyName: kABPersonFirstNameProperty) + let middleName = self.extractString(person as ABRecord, propertyName: kABPersonMiddleNameProperty) + let lastName = self.extractString(person as ABRecord, propertyName: kABPersonLastNameProperty) + + var contactName :String? + + // + // For Performance. LOL. + // + if firstName != nil { + if middleName != nil { + if lastName != nil { + contactName = firstName! + " " + middleName! + " " + lastName! + } else { + contactName = firstName! + " " + middleName! + } + } else { + if (lastName != nil) { + contactName = firstName! + " " + lastName! + } else { + contactName = firstName + } + } + } else { + if middleName != nil { + if lastName != nil { + contactName = middleName! + " " + lastName! + } else { + contactName = middleName + } + } else { + if lastName != nil { + contactName = lastName + } + } + } + + if (firstName == "Name not specified") { + contactName = nil + } + + let contactPhones = JavaUtilArrayList() + let contactEmails = JavaUtilArrayList() + let contact = ACPhoneBookContact(long: jlong(index), with: contactName, with: contactPhones, with: contactEmails) + index += 1 + if let phones: ABMultiValue = + self.extractProperty(person as ABRecord, propertyName: kABPersonPhoneProperty) as ABMultiValue? { + for i in 0...ABMultiValueGetCount(phones) { + var phoneStr = self.extractString(phones, index: i) + if (phoneStr == nil || phoneStr!.trim().isEmpty) { + continue + } + phoneStr = phoneStr!.strip(numbersSet) + let phoneVal = Int64(phoneStr!)// numberFormatter.numberFromString(phoneStr!)?.longLongValue + if (phoneVal != nil) { + contactPhones?.add(withId: ACPhoneBookPhone(long: jlong(index), withLong: jlong(phoneVal!))) + index += 1 + } + } + } + + if let emails: ABMultiValue = + self.extractProperty(person as ABRecord, propertyName: kABPersonEmailProperty) as ABMultiValue? { + for i in 0...ABMultiValueGetCount(emails) { + let emailStr = self.extractString(emails, index: i) + if (emailStr == nil || emailStr!.trim().isEmpty) { + continue + } + contactEmails?.add(withId: ACPhoneBookEmail(long: jlong(index), with: emailStr!)) + index += 1 + } + } + + if (contactPhones?.size() != 0 || contactEmails?.size() != 0) { + contacts?.add(withId: contact) + } + } + + callback.onLoaded(withContacts: contacts) + } + }) } } From c5134084a06a0253b91129b61347ff18277c393c Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Tue, 11 Oct 2016 18:39:56 +0300 Subject: [PATCH 121/253] fix(iOS): select first wallpaper from settings by default --- .../ActorApp.xcodeproj/project.pbxproj | 1784 ++- .../ActorSDK.xcodeproj/project.pbxproj | 13025 +++++++++++++--- .../AppIcon.appiconset/Contents.json | 20 + .../ConversationViewController.swift | 20 +- 4 files changed, 11728 insertions(+), 3121 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj index 48b7ede315..e83e6d07cc 100644 --- a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj @@ -1,579 +1,1211 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { + + + + + archiveVersion + 1 + classes + + objectVersion + 46 + objects + + 06230F031BC7FF2F00A4807B + + isa + PBXFileReference + lastKnownFileType + wrapper.pb-project + path + ActorSDK.xcodeproj + sourceTree + <group> + + 06230F041BC7FF2F00A4807B + + children + + 06230F081BC7FF3000A4807B + + isa + PBXGroup + name + Products + sourceTree + <group> + + 06230F071BC7FF3000A4807B + + containerPortal + 06230F031BC7FF2F00A4807B + isa + PBXContainerItemProxy + proxyType + 2 + remoteGlobalIDString + 066A50D21BC4AE63000E606E + remoteInfo + ActorSDK + + 06230F081BC7FF3000A4807B + + fileType + wrapper.framework + isa + PBXReferenceProxy + path + ActorSDK.framework + remoteRef + 06230F071BC7FF3000A4807B + sourceTree + BUILT_PRODUCTS_DIR + + 06230F091BC7FF3500A4807B + + fileRef + 06230F081BC7FF3000A4807B + isa + PBXBuildFile + + 06230F0A1BC7FF3500A4807B + + fileRef + 06230F081BC7FF3000A4807B + isa + PBXBuildFile + settings + + ATTRIBUTES + + CodeSignOnCopy + RemoveHeadersOnCopy + + + + 06230F0B1BC7FF3500A4807B + + containerPortal + 06230F031BC7FF2F00A4807B + isa + PBXContainerItemProxy + proxyType + 1 + remoteGlobalIDString + 066A50D11BC4AE63000E606E + remoteInfo + ActorSDK + + 06230F0C1BC7FF3500A4807B + + isa + PBXTargetDependency + name + ActorSDK + targetProxy + 06230F0B1BC7FF3500A4807B + + 06230F0D1BC7FF3500A4807B + + buildActionMask + 2147483647 + dstPath + + dstSubfolderSpec + 10 + files + + 06230F0A1BC7FF3500A4807B + + isa + PBXCopyFilesBuildPhase + name + Embed Frameworks + runOnlyForDeploymentPostprocessing + 0 + + 065974E11BC6926C00B8C7DF + + explicitFileType + wrapper.framework + isa + PBXFileReference + name + ActorSDK.framework + path + /Users/ex3ndr/Library/Developer/Xcode/DerivedData/ActorApp-clcqncodqhdxutfqgjvteqywzxue/Build/Products/Debug-iphoneos/ActorSDK.framework + sourceTree + <absolute> + + 068B397A1C85386A002BFF73 + + isa + PBXFileReference + lastKnownFileType + file + name + ringtone.m4a + path + Resources/ringtone.m4a + sourceTree + <group> + + 068B397B1C85386A002BFF73 + + fileRef + 068B397A1C85386A002BFF73 + isa + PBXBuildFile + + 068C6E4E1BBC4BF900182516 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + file.storyboard + name + Launch Screen.storyboard + path + Supporting Files/Launch Screen.storyboard + sourceTree + <group> + + 068C6E4F1BBC4BF900182516 + + fileRef + 068C6E4E1BBC4BF900182516 + isa + PBXBuildFile + + 06CE898D1BD841D0005A5530 + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + SystemConfiguration.framework + path + System/Library/Frameworks/SystemConfiguration.framework + sourceTree + SDKROOT + + 06CE898E1BD841D0005A5530 + + fileRef + 06CE898D1BD841D0005A5530 + isa + PBXBuildFile + + 06E7B24E1C109C4B0090660C + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + MapKit.framework + path + System/Library/Frameworks/MapKit.framework + sourceTree + SDKROOT + + 06E7B24F1C109C4B0090660C + + fileRef + 06E7B24E1C109C4B0090660C + isa + PBXBuildFile + + 06FC5E741BAB2DCC0071F153 + + buildActionMask + 2147483647 + files + + inputPaths + + isa + PBXShellScriptBuildPhase + name + Configure Crashlytics + outputPaths + + runOnlyForDeploymentPostprocessing + 0 + shellPath + /bin/sh + shellScript + # Initialization of Crashlytics -/* Begin PBXBuildFile section */ - 06230F091BC7FF3500A4807B /* ActorSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06230F081BC7FF3000A4807B /* ActorSDK.framework */; }; - 06230F0A1BC7FF3500A4807B /* ActorSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 06230F081BC7FF3000A4807B /* ActorSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 068B397B1C85386A002BFF73 /* ringtone.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 068B397A1C85386A002BFF73 /* ringtone.m4a */; }; - 068C6E4F1BBC4BF900182516 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 068C6E4E1BBC4BF900182516 /* Launch Screen.storyboard */; }; - 06CE898E1BD841D0005A5530 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06CE898D1BD841D0005A5530 /* SystemConfiguration.framework */; }; - 06E7B24F1C109C4B0090660C /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06E7B24E1C109C4B0090660C /* MapKit.framework */; }; - 2CE3FEBEF881B465BDE1045A959BFB0A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2ACD33B73078EB46A22D2D4C45BF1E6E /* Images.xcassets */; }; - 34279C7FB8E40393FEAC939F6474BE2E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 148837AEB986AFDE519BEBD3686AB073 /* main.m */; }; - A88F4C381ED2B98E99A68937 /* Pods_ActorApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */; }; - DFE814D1E12D2647AF2DBA3F76405F06 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A521812020DAAAA325065ADC32B7DEB /* AppDelegate.swift */; }; - F45B35E37C8CB7140417EA87AAFEFDA2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 13C57576F07AC8694C15B51DFDFDC4C6 /* InfoPlist.strings */; }; -/* End PBXBuildFile section */ +# Getting build secret +BUILD_SECRET=$FABRIC_BUILD_SECRET -/* Begin PBXContainerItemProxy section */ - 06230F071BC7FF3000A4807B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 066A50D21BC4AE63000E606E; - remoteInfo = ActorSDK; - }; - 06230F0B1BC7FF3500A4807B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 066A50D11BC4AE63000E606E; - remoteInfo = ActorSDK; - }; -/* End PBXContainerItemProxy section */ +# Getting api key from Info.plist +API_KEY=$(/usr/libexec/PlistBuddy "${PRODUCT_SETTINGS_PATH}" -c "Print :Fabric:APIKey") -/* Begin PBXCopyFilesBuildPhase section */ - 06230F0D1BC7FF3500A4807B /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 06230F0A1BC7FF3500A4807B /* ActorSDK.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = ActorSDK.xcodeproj; sourceTree = ""; }; - 065974E11BC6926C00B8C7DF /* ActorSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; name = ActorSDK.framework; path = "/Users/ex3ndr/Library/Developer/Xcode/DerivedData/ActorApp-clcqncodqhdxutfqgjvteqywzxue/Build/Products/Debug-iphoneos/ActorSDK.framework"; sourceTree = ""; }; - 068B397A1C85386A002BFF73 /* ringtone.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; name = ringtone.m4a; path = Resources/ringtone.m4a; sourceTree = ""; }; - 068C6E4E1BBC4BF900182516 /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = "Launch Screen.storyboard"; path = "Supporting Files/Launch Screen.storyboard"; sourceTree = ""; }; - 06CE898D1BD841D0005A5530 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 06E7B24E1C109C4B0090660C /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; }; - 148837AEB986AFDE519BEBD3686AB073 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = "Supporting Files/main.m"; sourceTree = ""; }; - 15F89F101C21317400776ACD /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; - 2A521812020DAAAA325065ADC32B7DEB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 2ACD33B73078EB46A22D2D4C45BF1E6E /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Resources/Images.xcassets; sourceTree = ""; }; - 404790AFDFFBD618E6175093 /* Pods-ActorApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorApp.release.xcconfig"; path = "Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp.release.xcconfig"; sourceTree = ""; }; - 6238B42B2462DBE201B457C54CA819D7 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; - 65E498AE225CBED71E8F3CD1CA2767B7 /* ActorApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ActorApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 6EE6E889CD9BA13B5A0828221608DB9A /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; - 7C171D4472C8F54A2AA0315EA0C69FED /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = ""; }; - 8B0B56F75C11CA3A0404AB4417F9B41B /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; - 9B2EEB8CEF2E94D58EA09D9D /* Pods-ActorApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorApp.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp.debug.xcconfig"; sourceTree = ""; }; - A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ActorApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DE8D1D9859D2C4D4C7EC7AD74BB65F0E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "Supporting Files/Info.plist"; sourceTree = ""; }; - F76A77E9428111C798E69B43EA06A281 /* ActorApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = ActorApp.entitlements; path = "Supporting Files/ActorApp.entitlements"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 4533F91FE5E247335BA76B35E6FC28C1 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 06CE898E1BD841D0005A5530 /* SystemConfiguration.framework in Frameworks */, - 06E7B24F1C109C4B0090660C /* MapKit.framework in Frameworks */, - 06230F091BC7FF3500A4807B /* ActorSDK.framework in Frameworks */, - A88F4C381ED2B98E99A68937 /* Pods_ActorApp.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 06230F041BC7FF2F00A4807B /* Products */ = { - isa = PBXGroup; - children = ( - 06230F081BC7FF3000A4807B /* ActorSDK.framework */, - ); - name = Products; - sourceTree = ""; - }; - 1ACEA023B930E6F261DAC0A6BDB410C1 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - DE8D1D9859D2C4D4C7EC7AD74BB65F0E /* Info.plist */, - 148837AEB986AFDE519BEBD3686AB073 /* main.m */, - F76A77E9428111C798E69B43EA06A281 /* ActorApp.entitlements */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 75DC9F2DE93F0AFA6A85B53C4B694EAE /* Resources */ = { - isa = PBXGroup; - children = ( - 068B397A1C85386A002BFF73 /* ringtone.m4a */, - 2ACD33B73078EB46A22D2D4C45BF1E6E /* Images.xcassets */, - 13C57576F07AC8694C15B51DFDFDC4C6 /* InfoPlist.strings */, - 068C6E4E1BBC4BF900182516 /* Launch Screen.storyboard */, - ); - name = Resources; - sourceTree = ""; - }; - 86C48777C0FD262E78F8BEC9253C9914 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 06E7B24E1C109C4B0090660C /* MapKit.framework */, - 06CE898D1BD841D0005A5530 /* SystemConfiguration.framework */, - 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */, - 065974E11BC6926C00B8C7DF /* ActorSDK.framework */, - A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - BFFF6424C537CA65F6346593 /* Pods */ = { - isa = PBXGroup; - children = ( - 9B2EEB8CEF2E94D58EA09D9D /* Pods-ActorApp.debug.xcconfig */, - 404790AFDFFBD618E6175093 /* Pods-ActorApp.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - C83A7EEB1948C38ECEFC1D330C57A7B1 /* Products */ = { - isa = PBXGroup; - children = ( - 65E498AE225CBED71E8F3CD1CA2767B7 /* ActorApp.app */, - ); - name = Products; - sourceTree = ""; - }; - D0310FF36675D7510E52D86CDA8E2C6C /* ActorApp */ = { - isa = PBXGroup; - children = ( - 75DC9F2DE93F0AFA6A85B53C4B694EAE /* Resources */, - 1ACEA023B930E6F261DAC0A6BDB410C1 /* Supporting Files */, - 2A521812020DAAAA325065ADC32B7DEB /* AppDelegate.swift */, - ); - path = ActorApp; - sourceTree = ""; - }; - D873D85572C6C400293E0DF69DBA58DD = { - isa = PBXGroup; - children = ( - D0310FF36675D7510E52D86CDA8E2C6C /* ActorApp */, - 86C48777C0FD262E78F8BEC9253C9914 /* Frameworks */, - C83A7EEB1948C38ECEFC1D330C57A7B1 /* Products */, - BFFF6424C537CA65F6346593 /* Pods */, - ); - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - EA6B7348F8364542DDD264F741AAAA19 /* ActorApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 58731A67470ABB64477A86D26A0C38CA /* Build configuration list for PBXNativeTarget "ActorApp" */; - buildPhases = ( - 712B269FC35BFB6C85DF769C /* [CP] Check Pods Manifest.lock */, - 50CB7471D350DF82230B74B5952FA7BD /* Sources */, - 4533F91FE5E247335BA76B35E6FC28C1 /* Frameworks */, - B094A1F03E91E4354C789DE8702D2FB4 /* Resources */, - 06FC5E741BAB2DCC0071F153 /* Configure Crashlytics */, - 06230F0D1BC7FF3500A4807B /* Embed Frameworks */, - AAA022A9BD9362E00B0F9BDE /* [CP] Embed Pods Frameworks */, - EFFD470B63C1BB419D199F19 /* [CP] Copy Pods Resources */, - 851EE1A34619AE6677649A27 /* Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 06230F0C1BC7FF3500A4807B /* PBXTargetDependency */, - ); - name = ActorApp; - productName = ActorApp; - productReference = 65E498AE225CBED71E8F3CD1CA2767B7 /* ActorApp.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 3A4CF5A8B873DEC01817A2C1107BF8FD /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0730; - ORGANIZATIONNAME = "Actor LLC"; - TargetAttributes = { - EA6B7348F8364542DDD264F741AAAA19 = { - CreatedOnToolsVersion = 6.4; - DevelopmentTeam = HVJR44Y5B6; - LastSwiftMigration = 0800; - SystemCapabilities = { - com.apple.Maps.iOS = { - enabled = 1; - }; - com.apple.Push = { - enabled = 1; - }; - com.apple.iCloud = { - enabled = 1; - }; - }; - }; - }; - }; - buildConfigurationList = 6A6B0DB51CB7FEB1D7D881E55C02AD30 /* Build configuration list for PBXProject "ActorApp" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - "zh-Hans", - pt, - ru, - es, - ); - mainGroup = D873D85572C6C400293E0DF69DBA58DD; - productRefGroup = C83A7EEB1948C38ECEFC1D330C57A7B1 /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 06230F041BC7FF2F00A4807B /* Products */; - ProjectRef = 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - EA6B7348F8364542DDD264F741AAAA19 /* ActorApp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 06230F081BC7FF3000A4807B /* ActorSDK.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ActorSDK.framework; - remoteRef = 06230F071BC7FF3000A4807B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - B094A1F03E91E4354C789DE8702D2FB4 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2CE3FEBEF881B465BDE1045A959BFB0A /* Images.xcassets in Resources */, - F45B35E37C8CB7140417EA87AAFEFDA2 /* InfoPlist.strings in Resources */, - 068B397B1C85386A002BFF73 /* ringtone.m4a in Resources */, - 068C6E4F1BBC4BF900182516 /* Launch Screen.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 06FC5E741BAB2DCC0071F153 /* Configure Crashlytics */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Configure Crashlytics"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Initialization of Crashlytics\n\n# Getting build secret\nBUILD_SECRET=$FABRIC_BUILD_SECRET\n\n# Getting api key from Info.plist\nAPI_KEY=$(/usr/libexec/PlistBuddy \"${PRODUCT_SETTINGS_PATH}\" -c \"Print :Fabric:APIKey\")\n\nif [ -n \"$BUILD_SECRET\" ]; then\n if [[ $? -ne 0 ]]; then\n echo \"Crashlytics not installed, skipping\"\n else\n if [ -n \"$API_KEY\" ]; then\n echo \"Uploading symbols to crashlytics\" \"$API_KEY\" \"$BUILD_SECRET\"\n \"${PODS_ROOT}/Fabric/Fabric.framework/run\" \"$API_KEY\" \"$BUILD_SECRET\"\n else\n echo \"Crashlytics not installed, skipping\"\n fi\n fi\nelse\n echo \"Crashlytics build secret not set, skipping\"\nfi"; - }; - 712B269FC35BFB6C85DF769C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - 851EE1A34619AE6677649A27 /* Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - AAA022A9BD9362E00B0F9BDE /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - EFFD470B63C1BB419D199F19 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 50CB7471D350DF82230B74B5952FA7BD /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DFE814D1E12D2647AF2DBA3F76405F06 /* AppDelegate.swift in Sources */, - 34279C7FB8E40393FEAC939F6474BE2E /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 06230F0C1BC7FF3500A4807B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = ActorSDK; - targetProxy = 06230F0B1BC7FF3500A4807B /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 13C57576F07AC8694C15B51DFDFDC4C6 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 8B0B56F75C11CA3A0404AB4417F9B41B /* Base */, - 7C171D4472C8F54A2AA0315EA0C69FED /* pt */, - 6238B42B2462DBE201B457C54CA819D7 /* ru */, - 6EE6E889CD9BA13B5A0828221608DB9A /* zh-Hans */, - 15F89F101C21317400776ACD /* es */, - ); - name = InfoPlist.strings; - path = Resources/Localizable; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 4DE2EA6053BDD0185E284AA71245C654 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9B2EEB8CEF2E94D58EA09D9D /* Pods-ActorApp.debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_MODULES_AUTOLINK = YES; - CODE_SIGN_ENTITLEMENTS = "ActorApp/Supporting Files/ActorApp.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; - ENABLE_BITCODE = NO; - FABRIC_BUILD_SECRET = ""; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks", - "$(PROJECT_DIR)/build/Debug-iphoneos", - ); - GCC_OPTIMIZATION_LEVEL = 0; - INFOPLIST_FILE = "ActorApp/Supporting Files/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - J2OBJC_VERSION = 0.9.8.2.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = im.actor.sdk.dev; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - SDK_PATH = "../actor-sdk"; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - USER_HEADER_SEARCH_PATHS = ""; - }; - name = Debug; - }; - C8EA64248333B842F7E13CD5378F81D3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = "$(inherited)"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - EE9DE1CA46805369DC88E0A5B8F7445D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 404790AFDFFBD618E6175093 /* Pods-ActorApp.release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_MODULES_AUTOLINK = YES; - CODE_SIGN_ENTITLEMENTS = "ActorApp/Supporting Files/ActorApp.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; - ENABLE_BITCODE = NO; - FABRIC_BUILD_SECRET = ""; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks", - "$(PROJECT_DIR)/build/Debug-iphoneos", - ); - GCC_OPTIMIZATION_LEVEL = 0; - INFOPLIST_FILE = "ActorApp/Supporting Files/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - J2OBJC_VERSION = 0.9.8.2.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - OTHER_LDFLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = im.actor.sdk.dev; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - SDK_PATH = "../actor-sdk"; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - USER_HEADER_SEARCH_PATHS = ""; - }; - name = Release; - }; - F6DBA7973E222F542FEC4D7E41CCEAA8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = "$(inherited)"; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 58731A67470ABB64477A86D26A0C38CA /* Build configuration list for PBXNativeTarget "ActorApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4DE2EA6053BDD0185E284AA71245C654 /* Debug */, - EE9DE1CA46805369DC88E0A5B8F7445D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 6A6B0DB51CB7FEB1D7D881E55C02AD30 /* Build configuration list for PBXProject "ActorApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F6DBA7973E222F542FEC4D7E41CCEAA8 /* Debug */, - C8EA64248333B842F7E13CD5378F81D3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 3A4CF5A8B873DEC01817A2C1107BF8FD /* Project object */; -} +if [ -n "$BUILD_SECRET" ]; then + if [[ $? -ne 0 ]]; then + echo "Crashlytics not installed, skipping" + else + if [ -n "$API_KEY" ]; then + echo "Uploading symbols to crashlytics" "$API_KEY" "$BUILD_SECRET" + "${PODS_ROOT}/Fabric/Fabric.framework/run" "$API_KEY" "$BUILD_SECRET" + else + echo "Crashlytics not installed, skipping" + fi + fi +else + echo "Crashlytics build secret not set, skipping" +fi + + 13C57576F07AC8694C15B51DFDFDC4C6 + + children + + 8B0B56F75C11CA3A0404AB4417F9B41B + 7C171D4472C8F54A2AA0315EA0C69FED + 6238B42B2462DBE201B457C54CA819D7 + 6EE6E889CD9BA13B5A0828221608DB9A + 15F89F101C21317400776ACD + + isa + PBXVariantGroup + name + InfoPlist.strings + path + Resources/Localizable + sourceTree + <group> + + 148837AEB986AFDE519BEBD3686AB073 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + main.m + path + Supporting Files/main.m + sourceTree + <group> + + 15F89F101C21317400776ACD + + isa + PBXFileReference + lastKnownFileType + text.plist.strings + name + es + path + es.lproj/InfoPlist.strings + sourceTree + <group> + + 1ACEA023B930E6F261DAC0A6BDB410C1 + + children + + DE8D1D9859D2C4D4C7EC7AD74BB65F0E + 148837AEB986AFDE519BEBD3686AB073 + F76A77E9428111C798E69B43EA06A281 + + isa + PBXGroup + name + Supporting Files + sourceTree + <group> + + 2A521812020DAAAA325065ADC32B7DEB + + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AppDelegate.swift + sourceTree + <group> + + 2ACD33B73078EB46A22D2D4C45BF1E6E + + isa + PBXFileReference + lastKnownFileType + folder.assetcatalog + name + Images.xcassets + path + Resources/Images.xcassets + sourceTree + <group> + + 2CE3FEBEF881B465BDE1045A959BFB0A + + fileRef + 2ACD33B73078EB46A22D2D4C45BF1E6E + isa + PBXBuildFile + + 34279C7FB8E40393FEAC939F6474BE2E + + fileRef + 148837AEB986AFDE519BEBD3686AB073 + isa + PBXBuildFile + + 3A4CF5A8B873DEC01817A2C1107BF8FD + + attributes + + LastSwiftUpdateCheck + 0700 + LastUpgradeCheck + 0730 + ORGANIZATIONNAME + Actor LLC + TargetAttributes + + EA6B7348F8364542DDD264F741AAAA19 + + CreatedOnToolsVersion + 6.4 + DevelopmentTeam + HVJR44Y5B6 + LastSwiftMigration + 0800 + SystemCapabilities + + com.apple.Maps.iOS + + enabled + 1 + + com.apple.Push + + enabled + 1 + + com.apple.iCloud + + enabled + 1 + + + + + + buildConfigurationList + 6A6B0DB51CB7FEB1D7D881E55C02AD30 + compatibilityVersion + Xcode 3.2 + developmentRegion + English + hasScannedForEncodings + 0 + isa + PBXProject + knownRegions + + en + Base + zh-Hans + pt + ru + es + + mainGroup + D873D85572C6C400293E0DF69DBA58DD + productRefGroup + C83A7EEB1948C38ECEFC1D330C57A7B1 + projectDirPath + + projectReferences + + + ProductGroup + 06230F041BC7FF2F00A4807B + ProjectRef + 06230F031BC7FF2F00A4807B + + + projectRoot + + targets + + EA6B7348F8364542DDD264F741AAAA19 + + + 404790AFDFFBD618E6175093 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + name + Pods-ActorApp.release.xcconfig + path + Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp.release.xcconfig + sourceTree + <group> + + 4533F91FE5E247335BA76B35E6FC28C1 + + buildActionMask + 2147483647 + files + + 06CE898E1BD841D0005A5530 + 06E7B24F1C109C4B0090660C + 06230F091BC7FF3500A4807B + A88F4C381ED2B98E99A68937 + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 4DE2EA6053BDD0185E284AA71245C654 + + baseConfigurationReference + 9B2EEB8CEF2E94D58EA09D9D + buildSettings + + ALWAYS_SEARCH_USER_PATHS + YES + ASSETCATALOG_COMPILER_APPICON_NAME + AppIcon + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME + LaunchImage + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES + YES + CLANG_MODULES_AUTOLINK + YES + CODE_SIGN_ENTITLEMENTS + ActorApp/Supporting Files/ActorApp.entitlements + CODE_SIGN_IDENTITY + iPhone Developer + CODE_SIGN_IDENTITY[sdk=iphoneos*] + iPhone Developer + DEBUG_INFORMATION_FORMAT + dwarf-with-dsym + EMBEDDED_CONTENT_CONTAINS_SWIFT + YES + ENABLE_BITCODE + NO + FABRIC_BUILD_SECRET + + FRAMEWORK_SEARCH_PATHS + + $(inherited) + $(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks + $(PROJECT_DIR)/build/Debug-iphoneos + + GCC_OPTIMIZATION_LEVEL + 0 + INFOPLIST_FILE + ActorApp/Supporting Files/Info.plist + IPHONEOS_DEPLOYMENT_TARGET + 8.0 + J2OBJC_VERSION + 0.9.8.2.1 + LD_RUNPATH_SEARCH_PATHS + $(inherited) @executable_path/Frameworks @loader_path/Frameworks + LIBRARY_SEARCH_PATHS + $(inherited) + ONLY_ACTIVE_ARCH + YES + OTHER_LDFLAGS + $(inherited) + PRODUCT_BUNDLE_IDENTIFIER + im.actor.sdk.dev + PRODUCT_NAME + $(TARGET_NAME) + PROVISIONING_PROFILE + + SDK_PATH + ../actor-sdk + SWIFT_OBJC_BRIDGING_HEADER + + SWIFT_OPTIMIZATION_LEVEL + -Onone + SWIFT_VERSION + 3.0 + USER_HEADER_SEARCH_PATHS + + + isa + XCBuildConfiguration + name + Debug + + 50CB7471D350DF82230B74B5952FA7BD + + buildActionMask + 2147483647 + files + + DFE814D1E12D2647AF2DBA3F76405F06 + 34279C7FB8E40393FEAC939F6474BE2E + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 58731A67470ABB64477A86D26A0C38CA + + buildConfigurations + + 4DE2EA6053BDD0185E284AA71245C654 + EE9DE1CA46805369DC88E0A5B8F7445D + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + 6238B42B2462DBE201B457C54CA819D7 + + isa + PBXFileReference + lastKnownFileType + text.plist.strings + name + ru + path + ru.lproj/InfoPlist.strings + sourceTree + <group> + + 65E498AE225CBED71E8F3CD1CA2767B7 + + explicitFileType + wrapper.application + includeInIndex + 0 + isa + PBXFileReference + path + ActorApp.app + sourceTree + BUILT_PRODUCTS_DIR + + 6A6B0DB51CB7FEB1D7D881E55C02AD30 + + buildConfigurations + + F6DBA7973E222F542FEC4D7E41CCEAA8 + C8EA64248333B842F7E13CD5378F81D3 + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + 6EE6E889CD9BA13B5A0828221608DB9A + + isa + PBXFileReference + lastKnownFileType + text.plist.strings + name + zh-Hans + path + zh-Hans.lproj/InfoPlist.strings + sourceTree + <group> + + 712B269FC35BFB6C85DF769C + + buildActionMask + 2147483647 + files + + inputPaths + + isa + PBXShellScriptBuildPhase + name + [CP] Check Pods Manifest.lock + outputPaths + + runOnlyForDeploymentPostprocessing + 0 + shellPath + /bin/sh + shellScript + diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null +if [[ $? != 0 ]] ; then + cat << EOM +error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. +EOM + exit 1 +fi + + showEnvVarsInLog + 0 + + 75DC9F2DE93F0AFA6A85B53C4B694EAE + + children + + 068B397A1C85386A002BFF73 + 2ACD33B73078EB46A22D2D4C45BF1E6E + 13C57576F07AC8694C15B51DFDFDC4C6 + 068C6E4E1BBC4BF900182516 + + isa + PBXGroup + name + Resources + sourceTree + <group> + + 7C171D4472C8F54A2AA0315EA0C69FED + + isa + PBXFileReference + lastKnownFileType + text.plist.strings + name + pt + path + pt.lproj/InfoPlist.strings + sourceTree + <group> + + 851EE1A34619AE6677649A27 + + buildActionMask + 2147483647 + files + + inputPaths + + isa + PBXShellScriptBuildPhase + name + Embed Pods Frameworks + outputPaths + + runOnlyForDeploymentPostprocessing + 0 + shellPath + /bin/sh + shellScript + "${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-frameworks.sh" + + showEnvVarsInLog + 0 + + 86C48777C0FD262E78F8BEC9253C9914 + + children + + 06E7B24E1C109C4B0090660C + 06CE898D1BD841D0005A5530 + 06230F031BC7FF2F00A4807B + 065974E11BC6926C00B8C7DF + A275ED497CA570AD01FB66A7 + + isa + PBXGroup + name + Frameworks + sourceTree + <group> + + 8B0B56F75C11CA3A0404AB4417F9B41B + + isa + PBXFileReference + lastKnownFileType + text.plist.strings + name + Base + path + Base.lproj/InfoPlist.strings + sourceTree + <group> + + 9B2EEB8CEF2E94D58EA09D9D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + name + Pods-ActorApp.debug.xcconfig + path + Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp.debug.xcconfig + sourceTree + <group> + + A275ED497CA570AD01FB66A7 + + explicitFileType + wrapper.framework + includeInIndex + 0 + isa + PBXFileReference + path + Pods_ActorApp.framework + sourceTree + BUILT_PRODUCTS_DIR + + A88F4C381ED2B98E99A68937 + + fileRef + A275ED497CA570AD01FB66A7 + isa + PBXBuildFile + + AAA022A9BD9362E00B0F9BDE + + buildActionMask + 2147483647 + files + + inputPaths + + isa + PBXShellScriptBuildPhase + name + [CP] Embed Pods Frameworks + outputPaths + + runOnlyForDeploymentPostprocessing + 0 + shellPath + /bin/sh + shellScript + "${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-frameworks.sh" + + showEnvVarsInLog + 0 + + B094A1F03E91E4354C789DE8702D2FB4 + + buildActionMask + 2147483647 + files + + 2CE3FEBEF881B465BDE1045A959BFB0A + F45B35E37C8CB7140417EA87AAFEFDA2 + 068B397B1C85386A002BFF73 + 068C6E4F1BBC4BF900182516 + + isa + PBXResourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + BFFF6424C537CA65F6346593 + + children + + 9B2EEB8CEF2E94D58EA09D9D + 404790AFDFFBD618E6175093 + + isa + PBXGroup + name + Pods + sourceTree + <group> + + C83A7EEB1948C38ECEFC1D330C57A7B1 + + children + + 65E498AE225CBED71E8F3CD1CA2767B7 + + isa + PBXGroup + name + Products + sourceTree + <group> + + C8EA64248333B842F7E13CD5378F81D3 + + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + CLANG_CXX_LANGUAGE_STANDARD + gnu++0x + CLANG_CXX_LIBRARY + libc++ + CLANG_ENABLE_MODULES + YES + CLANG_ENABLE_OBJC_ARC + YES + CLANG_WARN_BOOL_CONVERSION + YES + CLANG_WARN_CONSTANT_CONVERSION + YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE + YES_ERROR + CLANG_WARN_EMPTY_BODY + YES + CLANG_WARN_ENUM_CONVERSION + YES + CLANG_WARN_INT_CONVERSION + YES + CLANG_WARN_OBJC_ROOT_CLASS + YES_ERROR + CLANG_WARN_UNREACHABLE_CODE + YES + CLANG_WARN__DUPLICATE_METHOD_MATCH + YES + CODE_SIGN_IDENTITY[sdk=iphoneos*] + iPhone Developer + COPY_PHASE_STRIP + NO + DEBUG_INFORMATION_FORMAT + dwarf-with-dsym + ENABLE_NS_ASSERTIONS + NO + ENABLE_STRICT_OBJC_MSGSEND + YES + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_NO_COMMON_BLOCKS + YES + GCC_WARN_64_TO_32_BIT_CONVERSION + YES + GCC_WARN_ABOUT_RETURN_TYPE + YES_ERROR + GCC_WARN_UNDECLARED_SELECTOR + YES + GCC_WARN_UNINITIALIZED_AUTOS + YES_AGGRESSIVE + GCC_WARN_UNUSED_FUNCTION + YES + GCC_WARN_UNUSED_VARIABLE + YES + IPHONEOS_DEPLOYMENT_TARGET + 8.0 + MTL_ENABLE_DEBUG_INFO + NO + OTHER_LDFLAGS + $(inherited) + SDKROOT + iphoneos + TARGETED_DEVICE_FAMILY + 1,2 + VALIDATE_PRODUCT + YES + + isa + XCBuildConfiguration + name + Release + + D0310FF36675D7510E52D86CDA8E2C6C + + children + + 75DC9F2DE93F0AFA6A85B53C4B694EAE + 1ACEA023B930E6F261DAC0A6BDB410C1 + 2A521812020DAAAA325065ADC32B7DEB + + isa + PBXGroup + path + ActorApp + sourceTree + <group> + + D873D85572C6C400293E0DF69DBA58DD + + children + + D0310FF36675D7510E52D86CDA8E2C6C + 86C48777C0FD262E78F8BEC9253C9914 + C83A7EEB1948C38ECEFC1D330C57A7B1 + BFFF6424C537CA65F6346593 + + isa + PBXGroup + sourceTree + <group> + + DE8D1D9859D2C4D4C7EC7AD74BB65F0E + + isa + PBXFileReference + lastKnownFileType + text.plist.xml + name + Info.plist + path + Supporting Files/Info.plist + sourceTree + <group> + + DFE814D1E12D2647AF2DBA3F76405F06 + + fileRef + 2A521812020DAAAA325065ADC32B7DEB + isa + PBXBuildFile + + EA6B7348F8364542DDD264F741AAAA19 + + buildConfigurationList + 58731A67470ABB64477A86D26A0C38CA + buildPhases + + 712B269FC35BFB6C85DF769C + 50CB7471D350DF82230B74B5952FA7BD + 4533F91FE5E247335BA76B35E6FC28C1 + B094A1F03E91E4354C789DE8702D2FB4 + 06FC5E741BAB2DCC0071F153 + 06230F0D1BC7FF3500A4807B + AAA022A9BD9362E00B0F9BDE + EFFD470B63C1BB419D199F19 + 851EE1A34619AE6677649A27 + + buildRules + + dependencies + + 06230F0C1BC7FF3500A4807B + + isa + PBXNativeTarget + name + ActorApp + productName + ActorApp + productReference + 65E498AE225CBED71E8F3CD1CA2767B7 + productType + com.apple.product-type.application + + EE9DE1CA46805369DC88E0A5B8F7445D + + baseConfigurationReference + 404790AFDFFBD618E6175093 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + YES + ASSETCATALOG_COMPILER_APPICON_NAME + AppIcon + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME + LaunchImage + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES + YES + CLANG_MODULES_AUTOLINK + YES + CODE_SIGN_ENTITLEMENTS + ActorApp/Supporting Files/ActorApp.entitlements + CODE_SIGN_IDENTITY + iPhone Developer + CODE_SIGN_IDENTITY[sdk=iphoneos*] + iPhone Developer + EMBEDDED_CONTENT_CONTAINS_SWIFT + YES + ENABLE_BITCODE + NO + FABRIC_BUILD_SECRET + + FRAMEWORK_SEARCH_PATHS + + $(inherited) + $(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks + $(PROJECT_DIR)/build/Debug-iphoneos + + GCC_OPTIMIZATION_LEVEL + 0 + INFOPLIST_FILE + ActorApp/Supporting Files/Info.plist + IPHONEOS_DEPLOYMENT_TARGET + 8.0 + J2OBJC_VERSION + 0.9.8.2.1 + LD_RUNPATH_SEARCH_PATHS + $(inherited) @executable_path/Frameworks @loader_path/Frameworks + LIBRARY_SEARCH_PATHS + $(inherited) + OTHER_LDFLAGS + $(inherited) + PRODUCT_BUNDLE_IDENTIFIER + im.actor.sdk.dev + PRODUCT_NAME + $(TARGET_NAME) + PROVISIONING_PROFILE + + SDK_PATH + ../actor-sdk + SWIFT_OBJC_BRIDGING_HEADER + + SWIFT_OPTIMIZATION_LEVEL + -Onone + SWIFT_VERSION + 3.0 + USER_HEADER_SEARCH_PATHS + + + isa + XCBuildConfiguration + name + Release + + EFFD470B63C1BB419D199F19 + + buildActionMask + 2147483647 + files + + inputPaths + + isa + PBXShellScriptBuildPhase + name + [CP] Copy Pods Resources + outputPaths + + runOnlyForDeploymentPostprocessing + 0 + shellPath + /bin/sh + shellScript + "${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-resources.sh" + + showEnvVarsInLog + 0 + + F45B35E37C8CB7140417EA87AAFEFDA2 + + fileRef + 13C57576F07AC8694C15B51DFDFDC4C6 + isa + PBXBuildFile + + F6DBA7973E222F542FEC4D7E41CCEAA8 + + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + CLANG_CXX_LANGUAGE_STANDARD + gnu++0x + CLANG_CXX_LIBRARY + libc++ + CLANG_ENABLE_MODULES + YES + CLANG_ENABLE_OBJC_ARC + YES + CLANG_WARN_BOOL_CONVERSION + YES + CLANG_WARN_CONSTANT_CONVERSION + YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE + YES_ERROR + CLANG_WARN_EMPTY_BODY + YES + CLANG_WARN_ENUM_CONVERSION + YES + CLANG_WARN_INT_CONVERSION + YES + CLANG_WARN_OBJC_ROOT_CLASS + YES_ERROR + CLANG_WARN_UNREACHABLE_CODE + YES + CLANG_WARN__DUPLICATE_METHOD_MATCH + YES + CODE_SIGN_IDENTITY[sdk=iphoneos*] + iPhone Developer + COPY_PHASE_STRIP + NO + DEBUG_INFORMATION_FORMAT + dwarf-with-dsym + ENABLE_STRICT_OBJC_MSGSEND + YES + ENABLE_TESTABILITY + YES + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_DYNAMIC_NO_PIC + NO + GCC_NO_COMMON_BLOCKS + YES + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + GCC_WARN_64_TO_32_BIT_CONVERSION + YES + GCC_WARN_ABOUT_RETURN_TYPE + YES_ERROR + GCC_WARN_UNDECLARED_SELECTOR + YES + GCC_WARN_UNINITIALIZED_AUTOS + YES_AGGRESSIVE + GCC_WARN_UNUSED_FUNCTION + YES + GCC_WARN_UNUSED_VARIABLE + YES + IPHONEOS_DEPLOYMENT_TARGET + 8.0 + MTL_ENABLE_DEBUG_INFO + YES + ONLY_ACTIVE_ARCH + YES + OTHER_LDFLAGS + $(inherited) + SDKROOT + iphoneos + SWIFT_OPTIMIZATION_LEVEL + -Onone + TARGETED_DEVICE_FAMILY + 1,2 + + isa + XCBuildConfiguration + name + Debug + + F76A77E9428111C798E69B43EA06A281 + + isa + PBXFileReference + lastKnownFileType + text.xml + name + ActorApp.entitlements + path + Supporting Files/ActorApp.entitlements + sourceTree + <group> + + + rootObject + 3A4CF5A8B873DEC01817A2C1107BF8FD + + diff --git a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj index 75f6063376..0cf6732f3d 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj @@ -1,2548 +1,10489 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { + + + + + archiveVersion + 1 + classes + + objectVersion + 46 + objects + + 060134FD1C95ED4C00A18C4E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYAsyncLayer.h + sourceTree + <group> + + 060134FE1C95ED4C00A18C4E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYAsyncLayer.m + sourceTree + <group> + + 060134FF1C95ED4C00A18C4E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYSentinel.h + sourceTree + <group> + + 060135001C95ED4C00A18C4E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYSentinel.m + sourceTree + <group> + + 060135011C95ED4C00A18C4E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTransaction.h + sourceTree + <group> + + 060135021C95ED4C00A18C4E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTransaction.m + sourceTree + <group> + + 060135031C95ED4C00A18C4E + + fileRef + 060134FD1C95ED4C00A18C4E + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 060135041C95ED4C00A18C4E + + fileRef + 060134FE1C95ED4C00A18C4E + isa + PBXBuildFile + + 060135051C95ED4C00A18C4E + + fileRef + 060134FF1C95ED4C00A18C4E + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 060135061C95ED4C00A18C4E + + fileRef + 060135001C95ED4C00A18C4E + isa + PBXBuildFile + + 060135071C95ED4C00A18C4E + + fileRef + 060135011C95ED4C00A18C4E + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 060135081C95ED4C00A18C4E + + fileRef + 060135021C95ED4C00A18C4E + isa + PBXBuildFile + + 0601BBB11CA4C7DE00AEFA81 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ElegantPresentations.swift + sourceTree + <group> + + 0601BBB21CA4C7DE00AEFA81 + + fileRef + 0601BBB11CA4C7DE00AEFA81 + isa + PBXBuildFile + + 0601BBB31CA4C80D00AEFA81 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ElegantPresentationController.swift + sourceTree + <group> + + 0601BBB41CA4C80D00AEFA81 + + fileRef + 0601BBB31CA4C80D00AEFA81 + isa + PBXBuildFile + + 06129AA51C8359FB0099286B + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + CocoaLifecycleRuntime.swift + sourceTree + <group> + + 06129AA61C8359FB0099286B + + fileRef + 06129AA51C8359FB0099286B + isa + PBXBuildFile + + 06129AA81C8394700099286B + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAudioManager.swift + sourceTree + <group> + + 06129AA91C8394700099286B + + fileRef + 06129AA81C8394700099286B + isa + PBXBuildFile + + 06129AAA1C83B80A0099286B + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAudioRouter.swift + sourceTree + <group> + + 06129AAB1C83B80B0099286B + + fileRef + 06129AAA1C83B80A0099286B + isa + PBXBuildFile + + 0618509D1C9582DD00C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABackgroundCellRenderer.swift + sourceTree + <group> + + 0618509E1C9582DD00C522D5 + + fileRef + 0618509D1C9582DD00C522D5 + isa + PBXBuildFile + + 0618509F1C95CA2600C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + CocoaDispatcher.swift + sourceTree + <group> + + 061850A01C95CA2600C522D5 + + fileRef + 0618509F1C95CA2600C522D5 + isa + PBXBuildFile + + 061850A31C95CBF000C522D5 + + children + + 061850A41C95CBF000C522D5 + 061850B71C95CBF000C522D5 + 061850C21C95CBF000C522D5 + 061850D31C95CBF000C522D5 + 061850D41C95CBF000C522D5 + 061850D51C95CBF000C522D5 + 061850D61C95CBF000C522D5 + 061850D71C95CBF000C522D5 + 061850D81C95CBF000C522D5 + 061850D91C95CBF000C522D5 + 060134FD1C95ED4C00A18C4E + 060134FE1C95ED4C00A18C4E + 060134FF1C95ED4C00A18C4E + 060135001C95ED4C00A18C4E + 060135011C95ED4C00A18C4E + 060135021C95ED4C00A18C4E + + isa + PBXGroup + name + YYKit + path + Libs/YYKit + sourceTree + <group> + + 061850A41C95CBF000C522D5 + + children + + 061850A51C95CBF000C522D5 + 061850A61C95CBF000C522D5 + 061850A71C95CBF000C522D5 + 061850A81C95CBF000C522D5 + 061850A91C95CBF000C522D5 + 061850AA1C95CBF000C522D5 + 061850AB1C95CBF000C522D5 + 061850AC1C95CBF000C522D5 + 061850AD1C95CBF000C522D5 + 061850AE1C95CBF000C522D5 + 061850AF1C95CBF000C522D5 + 061850B01C95CBF000C522D5 + 061850B11C95CBF000C522D5 + 061850B21C95CBF000C522D5 + 061850B31C95CBF000C522D5 + 061850B41C95CBF000C522D5 + 061850B51C95CBF000C522D5 + 061850B61C95CBF000C522D5 + + isa + PBXGroup + path + Component + sourceTree + <group> + + 061850A51C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextContainerView.h + sourceTree + <group> + + 061850A61C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextContainerView.m + sourceTree + <group> + + 061850A71C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextDebugOption.h + sourceTree + <group> + + 061850A81C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextDebugOption.m + sourceTree + <group> + + 061850A91C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextEffectWindow.h + sourceTree + <group> + + 061850AA1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextEffectWindow.m + sourceTree + <group> + + 061850AB1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextInput.h + sourceTree + <group> + + 061850AC1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextInput.m + sourceTree + <group> + + 061850AD1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextKeyboardManager.h + sourceTree + <group> + + 061850AE1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextKeyboardManager.m + sourceTree + <group> + + 061850AF1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextLayout.h + sourceTree + <group> + + 061850B01C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextLayout.m + sourceTree + <group> + + 061850B11C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextLine.h + sourceTree + <group> + + 061850B21C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextLine.m + sourceTree + <group> + + 061850B31C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextMagnifier.h + sourceTree + <group> + + 061850B41C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextMagnifier.m + sourceTree + <group> + + 061850B51C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextSelectionView.h + sourceTree + <group> + + 061850B61C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextSelectionView.m + sourceTree + <group> + + 061850B71C95CBF000C522D5 + + children + + 061850B81C95CBF000C522D5 + 061850B91C95CBF000C522D5 + 061850BA1C95CBF000C522D5 + 061850BB1C95CBF000C522D5 + 061850BC1C95CBF000C522D5 + 061850BD1C95CBF000C522D5 + 061850BE1C95CBF000C522D5 + 061850BF1C95CBF000C522D5 + 061850C01C95CBF000C522D5 + 061850C11C95CBF000C522D5 + + isa + PBXGroup + path + String + sourceTree + <group> + + 061850B81C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextArchiver.h + sourceTree + <group> + + 061850B91C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextArchiver.m + sourceTree + <group> + + 061850BA1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextAttribute.h + sourceTree + <group> + + 061850BB1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextAttribute.m + sourceTree + <group> + + 061850BC1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextParser.h + sourceTree + <group> + + 061850BD1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextParser.m + sourceTree + <group> + + 061850BE1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextRubyAnnotation.h + sourceTree + <group> + + 061850BF1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextRubyAnnotation.m + sourceTree + <group> + + 061850C01C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextRunDelegate.h + sourceTree + <group> + + 061850C11C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextRunDelegate.m + sourceTree + <group> + + 061850C21C95CBF000C522D5 + + children + + 061850C31C95CBF000C522D5 + 061850C41C95CBF000C522D5 + 061850C51C95CBF000C522D5 + 061850C61C95CBF000C522D5 + 061850C71C95CBF000C522D5 + 061850C81C95CBF000C522D5 + 061850C91C95CBF000C522D5 + 061850CA1C95CBF000C522D5 + 061850CB1C95CBF000C522D5 + 061850CC1C95CBF000C522D5 + 061850CD1C95CBF000C522D5 + 061850CE1C95CBF000C522D5 + 061850CF1C95CBF000C522D5 + 061850D01C95CBF000C522D5 + 061850D11C95CBF000C522D5 + 061850D21C95CBF000C522D5 + + isa + PBXGroup + path + Utility + sourceTree + <group> + + 061850C31C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NSAttributedString+YYText.h + sourceTree + <group> + + 061850C41C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NSAttributedString+YYText.m + sourceTree + <group> + + 061850C51C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NSParagraphStyle+YYText.h + sourceTree + <group> + + 061850C61C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NSParagraphStyle+YYText.m + sourceTree + <group> + + 061850C71C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + UIPasteboard+YYText.h + sourceTree + <group> + + 061850C81C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + UIPasteboard+YYText.m + sourceTree + <group> + + 061850C91C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + UIView+YYText.h + sourceTree + <group> + + 061850CA1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + UIView+YYText.m + sourceTree + <group> + + 061850CB1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextAsyncLayer.h + sourceTree + <group> + + 061850CC1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextAsyncLayer.m + sourceTree + <group> + + 061850CD1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextTransaction.h + sourceTree + <group> + + 061850CE1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextTransaction.m + sourceTree + <group> + + 061850CF1C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextUtilities.h + sourceTree + <group> + + 061850D01C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextUtilities.m + sourceTree + <group> + + 061850D11C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextWeakProxy.h + sourceTree + <group> + + 061850D21C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextWeakProxy.m + sourceTree + <group> + + 061850D31C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYDispatchQueuePool.h + sourceTree + <group> + + 061850D41C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYDispatchQueuePool.m + sourceTree + <group> + + 061850D51C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYLabel.h + sourceTree + <group> + + 061850D61C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYLabel.m + sourceTree + <group> + + 061850D71C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYText.h + sourceTree + <group> + + 061850D81C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + YYTextView.h + sourceTree + <group> + + 061850D91C95CBF000C522D5 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + YYTextView.m + sourceTree + <group> + + 061850DA1C95CBF000C522D5 + + fileRef + 061850A51C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850DB1C95CBF000C522D5 + + fileRef + 061850A61C95CBF000C522D5 + isa + PBXBuildFile + + 061850DC1C95CBF000C522D5 + + fileRef + 061850A71C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850DD1C95CBF000C522D5 + + fileRef + 061850A81C95CBF000C522D5 + isa + PBXBuildFile + + 061850DE1C95CBF000C522D5 + + fileRef + 061850A91C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850DF1C95CBF000C522D5 + + fileRef + 061850AA1C95CBF000C522D5 + isa + PBXBuildFile + + 061850E01C95CBF000C522D5 + + fileRef + 061850AB1C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850E11C95CBF000C522D5 + + fileRef + 061850AC1C95CBF000C522D5 + isa + PBXBuildFile + + 061850E21C95CBF000C522D5 + + fileRef + 061850AD1C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850E31C95CBF000C522D5 + + fileRef + 061850AE1C95CBF000C522D5 + isa + PBXBuildFile + + 061850E41C95CBF000C522D5 + + fileRef + 061850AF1C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850E51C95CBF000C522D5 + + fileRef + 061850B01C95CBF000C522D5 + isa + PBXBuildFile + + 061850E61C95CBF000C522D5 + + fileRef + 061850B11C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850E71C95CBF000C522D5 + + fileRef + 061850B21C95CBF000C522D5 + isa + PBXBuildFile + + 061850E81C95CBF000C522D5 + + fileRef + 061850B31C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850E91C95CBF000C522D5 + + fileRef + 061850B41C95CBF000C522D5 + isa + PBXBuildFile + + 061850EA1C95CBF000C522D5 + + fileRef + 061850B51C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850EB1C95CBF000C522D5 + + fileRef + 061850B61C95CBF000C522D5 + isa + PBXBuildFile + + 061850EC1C95CBF000C522D5 + + fileRef + 061850B81C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850ED1C95CBF000C522D5 + + fileRef + 061850B91C95CBF000C522D5 + isa + PBXBuildFile + + 061850EE1C95CBF000C522D5 + + fileRef + 061850BA1C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850EF1C95CBF000C522D5 + + fileRef + 061850BB1C95CBF000C522D5 + isa + PBXBuildFile + + 061850F01C95CBF000C522D5 + + fileRef + 061850BC1C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850F11C95CBF000C522D5 + + fileRef + 061850BD1C95CBF000C522D5 + isa + PBXBuildFile + + 061850F21C95CBF000C522D5 + + fileRef + 061850BE1C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850F31C95CBF000C522D5 + + fileRef + 061850BF1C95CBF000C522D5 + isa + PBXBuildFile + + 061850F41C95CBF000C522D5 + + fileRef + 061850C01C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850F51C95CBF000C522D5 + + fileRef + 061850C11C95CBF000C522D5 + isa + PBXBuildFile + + 061850F61C95CBF000C522D5 + + fileRef + 061850C31C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850F71C95CBF000C522D5 + + fileRef + 061850C41C95CBF000C522D5 + isa + PBXBuildFile + + 061850F81C95CBF000C522D5 + + fileRef + 061850C51C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850F91C95CBF000C522D5 + + fileRef + 061850C61C95CBF000C522D5 + isa + PBXBuildFile + + 061850FA1C95CBF000C522D5 + + fileRef + 061850C71C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850FB1C95CBF000C522D5 + + fileRef + 061850C81C95CBF000C522D5 + isa + PBXBuildFile + + 061850FC1C95CBF000C522D5 + + fileRef + 061850C91C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850FD1C95CBF000C522D5 + + fileRef + 061850CA1C95CBF000C522D5 + isa + PBXBuildFile + + 061850FE1C95CBF000C522D5 + + fileRef + 061850CB1C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061850FF1C95CBF000C522D5 + + fileRef + 061850CC1C95CBF000C522D5 + isa + PBXBuildFile + + 061851001C95CBF000C522D5 + + fileRef + 061850CD1C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061851011C95CBF000C522D5 + + fileRef + 061850CE1C95CBF000C522D5 + isa + PBXBuildFile + + 061851021C95CBF000C522D5 + + fileRef + 061850CF1C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061851031C95CBF000C522D5 + + fileRef + 061850D01C95CBF000C522D5 + isa + PBXBuildFile + + 061851041C95CBF000C522D5 + + fileRef + 061850D11C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061851051C95CBF000C522D5 + + fileRef + 061850D21C95CBF000C522D5 + isa + PBXBuildFile + + 061851061C95CBF000C522D5 + + fileRef + 061850D31C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061851071C95CBF000C522D5 + + fileRef + 061850D41C95CBF000C522D5 + isa + PBXBuildFile + + 061851081C95CBF000C522D5 + + fileRef + 061850D51C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 061851091C95CBF000C522D5 + + fileRef + 061850D61C95CBF000C522D5 + isa + PBXBuildFile + + 0618510A1C95CBF000C522D5 + + fileRef + 061850D71C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 0618510B1C95CBF000C522D5 + + fileRef + 061850D81C95CBF000C522D5 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 0618510C1C95CBF000C522D5 + + fileRef + 061850D91C95CBF000C522D5 + isa + PBXBuildFile + + 06230F3F1BC95BD200A4807B + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + RMPhoneFormat.m + sourceTree + <group> + + 06230F401BC95BD200A4807B + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + RMPhoneFormat.h + sourceTree + <group> + + 06230F411BC95BD200A4807B + + fileRef + 06230F3F1BC95BD200A4807B + isa + PBXBuildFile + + 06230F421BC95BD200A4807B + + fileRef + 06230F401BC95BD200A4807B + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 06230F431BC95C0E00A4807B + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + text + path + ABPhoneFieldCodes.txt + sourceTree + <group> + + 06230F441BC95C0E00A4807B + + isa + PBXFileReference + lastKnownFileType + file + path + PhoneFormats.dat + sourceTree + <group> + + 06230F451BC95C0E00A4807B + + fileRef + 06230F431BC95C0E00A4807B + isa + PBXBuildFile + + 06230F461BC95C0E00A4807B + + fileRef + 06230F441BC95C0E00A4807B + isa + PBXBuildFile + + 063074161BD68E370053DEAF + + isa + PBXFileReference + lastKnownFileType + image.jpeg + path + bg_3_preview.jpg + sourceTree + <group> + + 063074171BD68E370053DEAF + + isa + PBXFileReference + lastKnownFileType + image.jpeg + path + bg_2_preview.jpg + sourceTree + <group> + + 063074181BD68E370053DEAF + + isa + PBXFileReference + lastKnownFileType + image.jpeg + path + bg_1_preview.jpg + sourceTree + <group> + + 063074191BD68E370053DEAF + + fileRef + 063074161BD68E370053DEAF + isa + PBXBuildFile + + 0630741A1BD68E370053DEAF + + fileRef + 063074171BD68E370053DEAF + isa + PBXBuildFile + + 0630741B1BD68E370053DEAF + + fileRef + 063074181BD68E370053DEAF + isa + PBXBuildFile + + 064E41B41CA1D2FF00A4A9D1 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABigAlertController.swift + sourceTree + <group> + + 064E41B51CA1D2FF00A4A9D1 + + fileRef + 064E41B41CA1D2FF00A4A9D1 + isa + PBXBuildFile + + 065974A41BC621F100B8C7DF + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAuthNavigationController.swift + sourceTree + <group> + + 065974A51BC621F100B8C7DF + + fileRef + 065974A41BC621F100B8C7DF + isa + PBXBuildFile + + 065974A61BC62B3600B8C7DF + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ViewExtensions.swift + sourceTree + <group> + + 065974A71BC62B3600B8C7DF + + fileRef + 065974A61BC62B3600B8C7DF + isa + PBXBuildFile + + 065975011BC7534100B8C7DF + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + FMDBBridge.swift + sourceTree + <group> + + 065975021BC7534100B8C7DF + + fileRef + 065975011BC7534100B8C7DF + isa + PBXBuildFile + + 065975041BC757A300B8C7DF + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ActorRuntime.swift + sourceTree + <group> + + 065975051BC757A300B8C7DF + + fileRef + 065975041BC757A300B8C7DF + isa + PBXBuildFile + + 065975061BC7BB4000B8C7DF + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AANavigationBadge.swift + sourceTree + <group> + + 065975071BC7BB4000B8C7DF + + fileRef + 065975061BC7BB4000B8C7DF + isa + PBXBuildFile + + 065975081BC7C4F300B8C7DF + + children + + 0659751D1BC7C84200B8C7DF + 065975501BC7DD3C00B8C7DF + 06230F431BC95C0E00A4807B + 0659753A1BC7D22200B8C7DF + 06E3C58C1C74931F004776CD + 065975461BC7D34200B8C7DF + 06230F441BC95C0E00A4807B + 153F6B3C1C2A9B1900C0B960 + 065975491BC7DBA000B8C7DF + 0659754A1BC7DBA000B8C7DF + 06E3C58A1C746AAC004776CD + + isa + PBXGroup + path + Resources + sourceTree + <group> + + 0659751D1BC7C84200B8C7DF + + children + + 0659751E1BC7C84E00B8C7DF + 063074181BD68E370053DEAF + 065975201BC7C84E00B8C7DF + 063074171BD68E370053DEAF + 0659751F1BC7C84E00B8C7DF + 063074161BD68E370053DEAF + + isa + PBXGroup + path + Backgrounds + sourceTree + <group> + + 0659751E1BC7C84E00B8C7DF + + isa + PBXFileReference + lastKnownFileType + image.jpeg + path + bg_1.jpg + sourceTree + <group> + + 0659751F1BC7C84E00B8C7DF + + isa + PBXFileReference + lastKnownFileType + image.jpeg + path + bg_3.jpg + sourceTree + <group> + + 065975201BC7C84E00B8C7DF + + isa + PBXFileReference + lastKnownFileType + image.jpeg + path + bg_2.jpg + sourceTree + <group> + + 065975211BC7C84E00B8C7DF + + fileRef + 0659751E1BC7C84E00B8C7DF + isa + PBXBuildFile + + 065975221BC7C84E00B8C7DF + + fileRef + 0659751F1BC7C84E00B8C7DF + isa + PBXBuildFile + + 065975231BC7C84E00B8C7DF + + fileRef + 065975201BC7C84E00B8C7DF + isa + PBXBuildFile + + 065975381BC7CA7B00B8C7DF + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Bundle.swift + sourceTree + <group> + + 065975391BC7CA7B00B8C7DF + + fileRef + 065975381BC7CA7B00B8C7DF + isa + PBXBuildFile + + 0659753A1BC7D22200B8C7DF + + isa + PBXFileReference + lastKnownFileType + folder.assetcatalog + path + Images.xcassets + sourceTree + <group> + + 0659753B1BC7D22200B8C7DF + + fileRef + 0659753A1BC7D22200B8C7DF + isa + PBXBuildFile + + 065975441BC7D34200B8C7DF + + fileRef + 065975461BC7D34200B8C7DF + isa + PBXBuildFile + + 065975451BC7D34200B8C7DF + + isa + PBXFileReference + lastKnownFileType + text.plist.strings + name + pt + path + pt.lproj/Localizable.strings + sourceTree + <group> + + 065975461BC7D34200B8C7DF + + children + + 0659754D1BC7DCED00B8C7DF + 15F89F0F1C21317400776ACD + 065975451BC7D34200B8C7DF + 065975471BC7D34400B8C7DF + 065975481BC7D34600B8C7DF + + isa + PBXVariantGroup + name + Localizable.strings + path + . + sourceTree + <group> + + 065975471BC7D34400B8C7DF + + isa + PBXFileReference + lastKnownFileType + text.plist.strings + name + ru + path + ru.lproj/Localizable.strings + sourceTree + <group> + + 065975481BC7D34600B8C7DF + + isa + PBXFileReference + lastKnownFileType + text.plist.strings + name + zh-Hans + path + zh-Hans.lproj/Localizable.strings + sourceTree + <group> + + 065975491BC7DBA000B8C7DF + + isa + PBXFileReference + lastKnownFileType + file + path + iapetus.caf + sourceTree + <group> + + 0659754A1BC7DBA000B8C7DF + + isa + PBXFileReference + lastKnownFileType + file + path + notification.caf + sourceTree + <group> + + 0659754B1BC7DBA000B8C7DF + + fileRef + 065975491BC7DBA000B8C7DF + isa + PBXBuildFile + + 0659754C1BC7DBA000B8C7DF + + fileRef + 0659754A1BC7DBA000B8C7DF + isa + PBXBuildFile + + 0659754D1BC7DCED00B8C7DF + + isa + PBXFileReference + lastKnownFileType + text.plist.strings + name + Base + path + Base.lproj/Localizable.strings + sourceTree + <group> + + 0659754E1BC7DD3C00B8C7DF + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + text.css + path + highlight-default.min.css + sourceTree + <group> + + 0659754F1BC7DD3C00B8C7DF + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.javascript + path + highlight.min.js + sourceTree + <group> + + 065975501BC7DD3C00B8C7DF + + children + + 0659754E1BC7DD3C00B8C7DF + 0659754F1BC7DD3C00B8C7DF + + isa + PBXGroup + path + Highlighter + sourceTree + <group> + + 065975511BC7DD3C00B8C7DF + + fileRef + 0659754E1BC7DD3C00B8C7DF + isa + PBXBuildFile + + 065975521BC7DD3C00B8C7DF + + fileRef + 0659754F1BC7DD3C00B8C7DF + isa + PBXBuildFile + + 065975531BC7DF5100B8C7DF + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + CocoaAssetsRuntime.swift + sourceTree + <group> + + 065975541BC7DF5100B8C7DF + + fileRef + 065975531BC7DF5100B8C7DF + isa + PBXBuildFile + + 065A06B51C6CEFE00012EA09 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + CocoaWebRTCRuntime.swift + sourceTree + <group> + + 065A06B61C6CEFE00012EA09 + + fileRef + 065A06B51C6CEFE00012EA09 + isa + PBXBuildFile + + 066A50C81BC4AE63000E606E + + children + + 066A50D41BC4AE63000E606E + 2F428D134E194A828C3DF863 + 066A50D31BC4AE63000E606E + F0BB28A250FF185B1F4D414D + + isa + PBXGroup + sourceTree + <group> + + 066A50C91BC4AE63000E606E + + attributes + + LastSwiftUpdateCheck + 0700 + LastUpgradeCheck + 0700 + ORGANIZATIONNAME + Steve Kite + TargetAttributes + + 066A50D11BC4AE63000E606E + + CreatedOnToolsVersion + 7.0 + DevelopmentTeam + HVJR44Y5B6 + LastSwiftMigration + 0800 + + + + buildConfigurationList + 066A50CC1BC4AE63000E606E + compatibilityVersion + Xcode 3.2 + developmentRegion + English + hasScannedForEncodings + 0 + isa + PBXProject + knownRegions + + en + ru + zh-Hans + Base + es + + mainGroup + 066A50C81BC4AE63000E606E + productRefGroup + 066A50D31BC4AE63000E606E + projectDirPath + + projectReferences + + projectRoot + + targets + + 066A50D11BC4AE63000E606E + + + 066A50CC1BC4AE63000E606E + + buildConfigurations + + 066A50D81BC4AE63000E606E + 066A50D91BC4AE63000E606E + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + 066A50CD1BC4AE63000E606E + + buildActionMask + 2147483647 + files + + 15D35F781C20273D00E3717A + 15D35F181C20185500E3717A + 066A52F81BC52B13000E606E + BEFE68D51C4657360001F2D6 + 066A51591BC4C14A000E606E + 061850F11C95CBF000C522D5 + BED5A1FB1C48396A0045FDB0 + 15D35F161C20185500E3717A + 061850E11C95CBF000C522D5 + 9AA6A41F1D08568A00957A7F + 066A525E1BC503BB000E606E + 061850F31C95CBF000C522D5 + BED5A1F91C48396A0045FDB0 + 066A53101BC53317000E606E + 152AA8B91C2989270030DEEE + 066A52F21BC52B02000E606E + 15D35F561C20187E00E3717A + 060135061C95ED4C00A18C4E + 061850DB1C95CBF000C522D5 + 15D35F301C20187200E3717A + 066A532E1BC53406000E606E + 06ABFE3D1D41283A0031A0D6 + 066A514A1BC4BCE0000E606E + 066A52401BC4EECD000E606E + BED5A1F51C48396A0045FDB0 + 066A52FF1BC52FA9000E606E + 066A53301BC53406000E606E + 066A52FD1BC52FA8000E606E + 066A52351BC4EEBA000E606E + 061850A01C95CA2600C522D5 + 066A51461BC4BBC3000E606E + 066A52271BC4EEAC000E606E + 066A51411BC4BB5C000E606E + 066A52E51BC52A20000E606E + 0618509E1C9582DD00C522D5 + 15D35F691C20187E00E3717A + 066A52251BC4EEAC000E606E + 15D35F601C20187E00E3717A + 061850EB1C95CBF000C522D5 + 15D35F1C1C20185500E3717A + 066A532B1BC53406000E606E + 061850E91C95CBF000C522D5 + 06E323151C6A7AC000D66F53 + 066A52C71BC521EA000E606E + 061850FD1C95CBF000C522D5 + 153F6B5D1C2B3AC500C0B960 + 15D35F1E1C20185500E3717A + 065974A51BC621F100B8C7DF + 068AFC391C94A0050055F503 + BED5A1FF1C48396A0045FDB0 + 066A518E1BC4C383000E606E + 06E7B2541C139B6F0090660C + 066A52CC1BC521FA000E606E + 061850E31C95CBF000C522D5 + 066A52571BC4EF61000E606E + 066A532F1BC53406000E606E + 06ABFE3A1D410D2D0031A0D6 + 15D35F631C20187E00E3717A + 066A527F1BC51ED0000E606E + 066A52481BC4EED5000E606E + 066A51921BC4C383000E606E + 066A52DC1BC52385000E606E + 065975071BC7BB4000B8C7DF + 066A518D1BC4C383000E606E + 066A52F01BC52B02000E606E + 060135081C95ED4C00A18C4E + 066A52741BC5101A000E606E + 153F6B611C2BF8EC00C0B960 + 152AA8A91C2989270030DEEE + BED5A1F31C48396A0045FDB0 + 066A53071BC53183000E606E + 061850EF1C95CBF000C522D5 + 06230F411BC95BD200A4807B + BE4DBE6C1C5723BE00A31894 + 066A52361BC4EEBA000E606E + 066A52431BC4EECD000E606E + 061851011C95CBF000C522D5 + 066A52341BC4EEBA000E606E + 15D35F311C20187200E3717A + 061850F91C95CBF000C522D5 + 06E1648F1C96D99F005AFB94 + 066A52DF1BC5241F000E606E + 066A51221BC4B55C000E606E + 066A532D1BC53406000E606E + 065974A71BC62B3600B8C7DF + 066A52F11BC52B02000E606E + 061850FF1C95CBF000C522D5 + 065A06B61C6CEFE00012EA09 + 15D35F5A1C20187E00E3717A + 066A52381BC4EEBA000E606E + 06C1D0771C8BC9FC00B73632 + 066A524B1BC4EF49000E606E + 066A51521BC4BE34000E606E + 066A52D71BC52378000E606E + 061850FB1C95CBF000C522D5 + 066A51241BC4B56D000E606E + 066A53171BC533DD000E606E + 153F6B8B1C2D7BA400C0B960 + 06ABFE341D3FAF800031A0D6 + 061850E71C95CBF000C522D5 + 066A52081BC4E962000E606E + 066A53231BC533F5000E606E + 06E7B2471C0F8D7A0090660C + 061851031C95CBF000C522D5 + 066A51501BC4BE06000E606E + 06CE89901BD84DF5005A5530 + 061850DD1C95CBF000C522D5 + 15D35F6F1C20196E00E3717A + 069CF4D31BCB909A00C66E12 + 066A52F71BC52B13000E606E + 0601BBB41CA4C80D00AEFA81 + 066A51541BC4BE95000E606E + 152AA8A71C2989270030DEEE + 066A52801BC51ED0000E606E + 061850E51C95CBF000C522D5 + 066A522A1BC4EEAC000E606E + 069CF4D11BCB909A00C66E12 + 061851051C95CBF000C522D5 + 066A52451BC4EECD000E606E + BE237C9D1C422FFA00060648 + 066A52D21BC52204000E606E + 066A52371BC4EEBA000E606E + 066A51481BC4BBF4000E606E + 066A53151BC533D5000E606E + 066A52151BC4EE04000E606E + 066A52591BC4EF61000E606E + 153F6B8A1C2D7BA300C0B960 + 15D35F5E1C20187E00E3717A + 9AAE96481CF81F140092E366 + 066A52DB1BC52385000E606E + 15D35F331C20187200E3717A + 065975391BC7CA7B00B8C7DF + 15D35F6B1C20187E00E3717A + 066A53111BC53317000E606E + 066A519B1BC4C390000E606E + 15D35F521C20187E00E3717A + 15D35F651C20187E00E3717A + 061851071C95CBF000C522D5 + 066A52F31BC52B02000E606E + 066A53041BC53177000E606E + 066A51801BC4C373000E606E + 061850F51C95CBF000C522D5 + 06129AA91C8394700099286B + 06C1D07B1C8BFE5C00B73632 + 0618510C1C95CBF000C522D5 + 066A518F1BC4C383000E606E + 060135041C95ED4C00A18C4E + 066A530B1BC531A2000E606E + 06E3C5B81C80EE21004776CD + 153F6B5B1C2B109400C0B960 + 061851091C95CBF000C522D5 + 15D35F251C20186200E3717A + 066A531A1BC533E7000E606E + 065975051BC757A300B8C7DF + 066A517B1BC4C373000E606E + 06C1D07E1C8D0DEA00B73632 + BE2621591C4656EE00A817AB + 066A52561BC4EF61000E606E + 152AA8AB1C2989270030DEEE + 066A52D61BC52378000E606E + 065975021BC7534100B8C7DF + 15D35F351C20187200E3717A + BED5A1F71C48396A0045FDB0 + 066A519E1BC4C390000E606E + 066A52E61BC52A20000E606E + 066A52C81BC521EA000E606E + 066A532C1BC53406000E606E + BE2621571C4656D700A817AB + 066A52261BC4EEAC000E606E + 066A53221BC533F5000E606E + 15D35F541C20187E00E3717A + 06E322C91C69344A00D66F53 + 066A53371BC537CA000E606E + 066A519D1BC4C390000E606E + 069CF4CD1BCB909A00C66E12 + 15D35F1B1C20185500E3717A + 152AA8BD1C298BF00030DEEE + 066A515B1BC4C178000E606E + 066A52811BC51ED0000E606E + BEE6EB041C4D9A4900A2280E + 152AA8B21C2989270030DEEE + 066A52281BC4EEAC000E606E + 065975541BC7DF5100B8C7DF + 06E7B2521C1345E70090660C + 06129AAB1C83B80B0099286B + 066A53121BC53317000E606E + 066A52391BC4EEBA000E606E + 066A526D1BC50E8B000E606E + 152AA8AF1C2989270030DEEE + 066A51911BC4C383000E606E + BE281CC51C502B230042F6D4 + 066A53211BC533F5000E606E + 066A51821BC4C373000E606E + 061850F71C95CBF000C522D5 + 066A525A1BC4EF61000E606E + 066A51841BC4C373000E606E + 066A514E1BC4BDE4000E606E + 06B489ED1C9F6EBD0054245B + 15D35F671C20187E00E3717A + 06D5C05C1C8EA842002D5045 + 15D35F5C1C20187E00E3717A + 152AA8BF1C298C4B0030DEEE + 066A51561BC4BEF5000E606E + 069CF4CF1BCB909A00C66E12 + 15D35F751C201B6B00E3717A + 066A51441BC4BBAF000E606E + BEE6EB011C4D7B7500A2280E + BED5A2011C48396A0045FDB0 + 066A53331BC534F5000E606E + 066A52FE1BC52FA9000E606E + 066A52E71BC52A20000E606E + 152AA8AD1C2989270030DEEE + 152AA8B71C2989270030DEEE + 066A52241BC4EEAC000E606E + 061850ED1C95CBF000C522D5 + 066A50E21BC4AF9F000E606E + 15D35F761C201B6B00E3717A + 06E7B24C1C0FAB500090660C + BED5A1F11C48396A0045FDB0 + BED5A20F1C4839880045FDB0 + 06129AA61C8359FB0099286B + 066A516D1BC4C366000E606E + 066A517E1BC4C373000E606E + 066A519A1BC4C390000E606E + 066A52221BC4EEAC000E606E + 152AA8B51C2989270030DEEE + 066A52EA1BC52A2B000E606E + 066A52291BC4EEAC000E606E + BED5A1FD1C48396A0045FDB0 + 066A514C1BC4BD05000E606E + 066A526A1BC50E7B000E606E + 066A52541BC4EF61000E606E + 066A525C1BC502EB000E606E + 066A52551BC4EF61000E606E + 066A52421BC4EECD000E606E + 06D5C05A1C8E9B3B002D5045 + 064E41B51CA1D2FF00A4A9D1 + 066A52CD1BC521FA000E606E + 15D35F261C20186200E3717A + 06D5C0571C8D6E20002D5045 + 06E323111C694C1D00D66F53 + 066A52231BC4EEAC000E606E + 066A52D11BC52204000E606E + 066A51901BC4C383000E606E + 06ABFE381D3FCCE30031A0D6 + 06E7B24A1C0F92140090660C + 067B67541D45341D00B9A238 + 066A52581BC4EF61000E606E + 066A51691BC4C366000E606E + 066A53201BC533F5000E606E + 066CBCDC1C8D419F004507E2 + 061850DF1C95CBF000C522D5 + 066A52661BC50E7B000E606E + 0601BBB21CA4C7DE00AEFA81 + 066A53391BC5456B000E606E + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 066A50CE1BC4AE63000E606E + + buildActionMask + 2147483647 + files + + 06CE898C1BD841C9005A5530 + BEAC2B311C42D683007F7A2F + 066A52001BC4E0B0000E606E + BDF21708B376E212CEAEC43D + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 066A50CF1BC4AE63000E606E + + buildActionMask + 2147483647 + files + + 060135031C95ED4C00A18C4E + 069CF4D21BCB909A00C66E12 + 066A51831BC4C373000E606E + 15F89F091C211FED00776ACD + 060135071C95ED4C00A18C4E + 066A517D1BC4C373000E606E + 069CF4D01BCB909A00C66E12 + 060135051C95ED4C00A18C4E + 066A517F1BC4C373000E606E + 066A51811BC4C373000E606E + 066A517A1BC4C373000E606E + 069CF4CC1BCB909A00C66E12 + 061850F21C95CBF000C522D5 + 066A50D61BC4AE63000E606E + 061850E01C95CBF000C522D5 + 15D35F621C20187E00E3717A + 066A517C1BC4C373000E606E + 15D35F5B1C20187E00E3717A + 152AA8B11C2989270030DEEE + 152AA8A81C2989270030DEEE + 061850E81C95CBF000C522D5 + 061850DE1C95CBF000C522D5 + 066A52731BC5101A000E606E + 061850FA1C95CBF000C522D5 + 061850E61C95CBF000C522D5 + 061850F61C95CBF000C522D5 + 152AA8AA1C2989270030DEEE + 152AA8B01C2989270030DEEE + 152AA8AC1C2989270030DEEE + 06ABFE331D3FAF800031A0D6 + 152AA8AE1C2989270030DEEE + 152AA8B31C2989270030DEEE + 152AA8B61C2989270030DEEE + 061850DA1C95CBF000C522D5 + BED5A2111C48413C0045FDB0 + BED5A2121C48413C0045FDB0 + 061850EE1C95CBF000C522D5 + 061851081C95CBF000C522D5 + BED5A2131C48413C0045FDB0 + 061851041C95CBF000C522D5 + 15D35F681C20187E00E3717A + 152AA8B81C2989270030DEEE + 061850F41C95CBF000C522D5 + BED5A1FE1C48396A0045FDB0 + 061850EC1C95CBF000C522D5 + 061850E41C95CBF000C522D5 + 061850F01C95CBF000C522D5 + BED5A1F81C48396A0045FDB0 + 061851001C95CBF000C522D5 + 15D35F641C20187E00E3717A + 061851021C95CBF000C522D5 + 0618510A1C95CBF000C522D5 + BED5A2071C4839790045FDB0 + 15D35F571C20187E00E3717A + 15F89F071C211FED00776ACD + 061850E21C95CBF000C522D5 + 15D35F341C20187200E3717A + 15D35F661C20187E00E3717A + 061850EA1C95CBF000C522D5 + 061850FC1C95CBF000C522D5 + 15D35F281C20186200E3717A + 15D35F191C20185500E3717A + 061850DC1C95CBF000C522D5 + 15F89F081C211FED00776ACD + 15D35F1F1C20185500E3717A + 15D35F171C20185500E3717A + 15D35F5F1C20187E00E3717A + 15D35F551C20187E00E3717A + 0618510B1C95CBF000C522D5 + 061850F81C95CBF000C522D5 + 061850FE1C95CBF000C522D5 + 15D35F5D1C20187E00E3717A + 15D35F271C20186200E3717A + 15D35F321C20187200E3717A + 15D35F1A1C20185500E3717A + 15D35F591C20187E00E3717A + 15D35F531C20187E00E3717A + 15D35F611C20187E00E3717A + 061851061C95CBF000C522D5 + 15D35F6A1C20187E00E3717A + 15F89F0A1C211FED00776ACD + 15D35F511C20187E00E3717A + 15D35F1D1C20185500E3717A + 06E3230E1C69445C00D66F53 + 06230F421BC95BD200A4807B + 069CF4CE1BCB909A00C66E12 + + isa + PBXHeadersBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 066A50D01BC4AE63000E606E + + buildActionMask + 2147483647 + files + + 06230F451BC95C0E00A4807B + 0630741B1BD68E370053DEAF + BED5A1D91C4839590045FDB0 + BED5A1D81C4839590045FDB0 + BED5A1D71C4839590045FDB0 + 06230F461BC95C0E00A4807B + 065975511BC7DD3C00B8C7DF + 0659754B1BC7DBA000B8C7DF + BED5A1DC1C4839590045FDB0 + 0630741A1BD68E370053DEAF + 065975221BC7C84E00B8C7DF + 065975211BC7C84E00B8C7DF + 0659753B1BC7D22200B8C7DF + 065975231BC7C84E00B8C7DF + 065975521BC7DD3C00B8C7DF + 065975441BC7D34200B8C7DF + 06E3C58B1C746CCC004776CD + BED5A1DB1C4839590045FDB0 + 06E3C58D1C749320004776CD + 0659754C1BC7DBA000B8C7DF + BEF11DB61C466D800076400A + 063074191BD68E370053DEAF + BED5A1DA1C4839590045FDB0 + + isa + PBXResourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 066A50D11BC4AE63000E606E + + buildConfigurationList + 066A50DA1BC4AE63000E606E + buildPhases + + 5B00FFD27DD7E01F43B31D13 + 066A52091BC4EA95000E606E + 066A50CD1BC4AE63000E606E + 066A50CF1BC4AE63000E606E + 066A50CE1BC4AE63000E606E + 066A50D01BC4AE63000E606E + A2ED258362D73946D3AE7FB4 + + buildRules + + dependencies + + isa + PBXNativeTarget + name + ActorSDK + productName + ActorSDK + productReference + 066A50D21BC4AE63000E606E + productType + com.apple.product-type.framework + + 066A50D21BC4AE63000E606E + + explicitFileType + wrapper.framework + includeInIndex + 0 + isa + PBXFileReference + path + ActorSDK.framework + sourceTree + BUILT_PRODUCTS_DIR + + 066A50D31BC4AE63000E606E + + children + + 066A50D21BC4AE63000E606E + + isa + PBXGroup + name + Products + sourceTree + <group> + + 066A50D41BC4AE63000E606E + + children + + 069CF4151BCA5DB500C66E12 + 065975081BC7C4F300B8C7DF + + isa + PBXGroup + path + ActorSDK + sourceTree + <group> + + 066A50D51BC4AE63000E606E + + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + ActorSDK.h + sourceTree + <group> + + 066A50D61BC4AE63000E606E + + fileRef + 066A50D51BC4AE63000E606E + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 066A50D71BC4AE63000E606E + + isa + PBXFileReference + lastKnownFileType + text.plist.xml + path + Info.plist + sourceTree + <group> + + 066A50D81BC4AE63000E606E + + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + CLANG_CXX_LANGUAGE_STANDARD + gnu++0x + CLANG_CXX_LIBRARY + libc++ + CLANG_ENABLE_MODULES + YES + CLANG_ENABLE_OBJC_ARC + YES + CLANG_WARN_BOOL_CONVERSION + YES + CLANG_WARN_CONSTANT_CONVERSION + YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE + YES_ERROR + CLANG_WARN_EMPTY_BODY + YES + CLANG_WARN_ENUM_CONVERSION + YES + CLANG_WARN_INT_CONVERSION + YES + CLANG_WARN_OBJC_ROOT_CLASS + YES_ERROR + CLANG_WARN_UNREACHABLE_CODE + YES + CLANG_WARN__DUPLICATE_METHOD_MATCH + YES + CODE_SIGN_IDENTITY[sdk=iphoneos*] + iPhone Developer + COPY_PHASE_STRIP + NO + CURRENT_PROJECT_VERSION + 1 + DEBUG_INFORMATION_FORMAT + dwarf + ENABLE_STRICT_OBJC_MSGSEND + YES + ENABLE_TESTABILITY + YES + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_NO_COMMON_BLOCKS + YES + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_WARN_64_TO_32_BIT_CONVERSION + YES + GCC_WARN_ABOUT_RETURN_TYPE + YES_ERROR + GCC_WARN_UNDECLARED_SELECTOR + YES + GCC_WARN_UNINITIALIZED_AUTOS + YES_AGGRESSIVE + GCC_WARN_UNUSED_FUNCTION + YES + GCC_WARN_UNUSED_VARIABLE + YES + IPHONEOS_DEPLOYMENT_TARGET + 8.0 + MTL_ENABLE_DEBUG_INFO + YES + ONLY_ACTIVE_ARCH + YES + SDKROOT + iphoneos + SWIFT_OPTIMIZATION_LEVEL + -Onone + TARGETED_DEVICE_FAMILY + 1,2 + VERSIONING_SYSTEM + apple-generic + VERSION_INFO_PREFIX + + + isa + XCBuildConfiguration + name + Debug + + 066A50D91BC4AE63000E606E + + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + CLANG_CXX_LANGUAGE_STANDARD + gnu++0x + CLANG_CXX_LIBRARY + libc++ + CLANG_ENABLE_MODULES + YES + CLANG_ENABLE_OBJC_ARC + YES + CLANG_WARN_BOOL_CONVERSION + YES + CLANG_WARN_CONSTANT_CONVERSION + YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE + YES_ERROR + CLANG_WARN_EMPTY_BODY + YES + CLANG_WARN_ENUM_CONVERSION + YES + CLANG_WARN_INT_CONVERSION + YES + CLANG_WARN_OBJC_ROOT_CLASS + YES_ERROR + CLANG_WARN_UNREACHABLE_CODE + YES + CLANG_WARN__DUPLICATE_METHOD_MATCH + YES + CODE_SIGN_IDENTITY[sdk=iphoneos*] + iPhone Developer + COPY_PHASE_STRIP + NO + CURRENT_PROJECT_VERSION + 1 + DEBUG_INFORMATION_FORMAT + dwarf-with-dsym + ENABLE_NS_ASSERTIONS + NO + ENABLE_STRICT_OBJC_MSGSEND + YES + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_NO_COMMON_BLOCKS + YES + GCC_WARN_64_TO_32_BIT_CONVERSION + YES + GCC_WARN_ABOUT_RETURN_TYPE + YES_ERROR + GCC_WARN_UNDECLARED_SELECTOR + YES + GCC_WARN_UNINITIALIZED_AUTOS + YES_AGGRESSIVE + GCC_WARN_UNUSED_FUNCTION + YES + GCC_WARN_UNUSED_VARIABLE + YES + IPHONEOS_DEPLOYMENT_TARGET + 8.0 + MTL_ENABLE_DEBUG_INFO + NO + SDKROOT + iphoneos + TARGETED_DEVICE_FAMILY + 1,2 + VALIDATE_PRODUCT + YES + VERSIONING_SYSTEM + apple-generic + VERSION_INFO_PREFIX + + + isa + XCBuildConfiguration + name + Release + + 066A50DA1BC4AE63000E606E + + buildConfigurations + + 066A50DB1BC4AE63000E606E + 066A50DC1BC4AE63000E606E + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + 066A50DB1BC4AE63000E606E + + baseConfigurationReference + E30822B631D108159E8B306B + buildSettings + + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES + YES + CLANG_ENABLE_MODULES + YES + CODE_SIGN_IDENTITY + iPhone Developer + CODE_SIGN_IDENTITY[sdk=iphoneos*] + iPhone Developer + DEBUG_INFORMATION_FORMAT + dwarf-with-dsym + DEFINES_MODULE + YES + DYLIB_COMPATIBILITY_VERSION + 1 + DYLIB_CURRENT_VERSION + 1 + DYLIB_INSTALL_NAME_BASE + @rpath + EMBEDDED_CONTENT_CONTAINS_SWIFT + YES + ENABLE_BITCODE + NO + FRAMEWORK_SEARCH_PATHS + + $(inherited) + $(PROJECT_DIR)/build/Debug-iphoneos + $(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks + + GCC_DYNAMIC_NO_PIC + NO + GCC_LINK_WITH_DYNAMIC_LIBRARIES + YES + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS + NO + INFOPLIST_FILE + $(SRCROOT)/ActorSDK/Sources/Info.plist + INSTALL_PATH + $(LOCAL_LIBRARY_DIR)/Frameworks + IPHONEOS_DEPLOYMENT_TARGET + 8.0 + LD_NO_PIE + NO + LD_RUNPATH_SEARCH_PATHS + $(inherited) @executable_path/Frameworks @loader_path/Frameworks + LIBRARY_SEARCH_PATHS + + $(CONFIGURATION_TEMP_DIR)/j2objc/Objects/ + $(PROJECT_DIR)/ActorSDK/Sources/Utils + $(PROJECT_DIR)/ActorSDK/Sources/Utils/AudioRecorder/libopus/lib + $(inherited) + $(PROJECT_DIR)/ActorSDK/Libs + + MACH_O_TYPE + mh_dylib + ONLY_ACTIVE_ARCH + YES + OTHER_LDFLAGS + + -lactor + $(inherited) + -framework + j2objc + + PRODUCT_BUNDLE_IDENTIFIER + im.actor.ActorSDK + PRODUCT_NAME + ActorSDK + PROVISIONING_PROFILE + + SKIP_INSTALL + YES + STRIP_INSTALLED_PRODUCT + YES + SWIFT_INCLUDE_PATHS + $(PROJECT_DIR)/ActorSDK/Sources/Libs/CommonCrypto $(PROJECT_DIR)/IDZSwiftCommonCrypto/Frameworks/$(PLATFORM_NAME) + SWIFT_OBJC_BRIDGING_HEADER + + SWIFT_OPTIMIZATION_LEVEL + -Onone + SWIFT_VERSION + 3.0 + VALID_ARCHS + arm64 armv7 + WARNING_CFLAGS + -Wno-nullability-completeness + + isa + XCBuildConfiguration + name + Debug + + 066A50DC1BC4AE63000E606E + + baseConfigurationReference + F076508E3899D309954904A3 + buildSettings + + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES + YES + CLANG_ENABLE_MODULES + YES + CODE_SIGN_IDENTITY + iPhone Developer + CODE_SIGN_IDENTITY[sdk=iphoneos*] + iPhone Developer + DEFINES_MODULE + YES + DYLIB_COMPATIBILITY_VERSION + 1 + DYLIB_CURRENT_VERSION + 1 + DYLIB_INSTALL_NAME_BASE + @rpath + EMBEDDED_CONTENT_CONTAINS_SWIFT + YES + ENABLE_BITCODE + NO + FRAMEWORK_SEARCH_PATHS + + $(inherited) + $(PROJECT_DIR)/build/Debug-iphoneos + $(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks + + GCC_DYNAMIC_NO_PIC + NO + GCC_LINK_WITH_DYNAMIC_LIBRARIES + YES + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS + NO + INFOPLIST_FILE + $(SRCROOT)/ActorSDK/Sources/Info.plist + INSTALL_PATH + $(LOCAL_LIBRARY_DIR)/Frameworks + IPHONEOS_DEPLOYMENT_TARGET + 8.0 + LD_NO_PIE + NO + LD_RUNPATH_SEARCH_PATHS + $(inherited) @executable_path/Frameworks @loader_path/Frameworks + LIBRARY_SEARCH_PATHS + + $(CONFIGURATION_TEMP_DIR)/j2objc/Objects/ + $(PROJECT_DIR)/ActorSDK/Sources/Utils + $(PROJECT_DIR)/ActorSDK/Sources/Utils/AudioRecorder/libopus/lib + $(inherited) + $(PROJECT_DIR)/ActorSDK/Libs + + MACH_O_TYPE + mh_dylib + ONLY_ACTIVE_ARCH + YES + OTHER_LDFLAGS + + -lactor + $(inherited) + -framework + j2objc + + PRODUCT_BUNDLE_IDENTIFIER + im.actor.ActorSDK + PRODUCT_NAME + ActorSDK + PROVISIONING_PROFILE + + SKIP_INSTALL + YES + STRIP_INSTALLED_PRODUCT + YES + SWIFT_INCLUDE_PATHS + $(PROJECT_DIR)/ActorSDK/Sources/Libs/CommonCrypto $(PROJECT_DIR)/IDZSwiftCommonCrypto/Frameworks/$(PLATFORM_NAME) + SWIFT_OBJC_BRIDGING_HEADER + + SWIFT_OPTIMIZATION_LEVEL + -Owholemodule + SWIFT_VERSION + 3.0 + VALID_ARCHS + arm64 armv7 + WARNING_CFLAGS + -Wno-nullability-completeness + + isa + XCBuildConfiguration + name + Release + + 066A50E11BC4AF9F000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ActorSDK.swift + sourceTree + <group> + + 066A50E21BC4AF9F000E606E + + fileRef + 066A50E11BC4AF9F000E606E + isa + PBXBuildFile + + 066A511D1BC4B4BD000E606E + + children + + 066A51851BC4C377000E606E + 066A51681BC4C366000E606E + 065975041BC757A300B8C7DF + 066A52051BC4E962000E606E + 066A52041BC4E962000E606E + + isa + PBXGroup + path + ActorCore + sourceTree + <group> + + 066A51201BC4B53C000E606E + + children + + 066A51211BC4B55C000E606E + 066A51551BC4BEF5000E606E + 066A514F1BC4BE06000E606E + 066A51401BC4BB5C000E606E + 066A514B1BC4BD05000E606E + 066A51231BC4B56D000E606E + 066A51491BC4BCE0000E606E + 066A51451BC4BBC3000E606E + 066A51531BC4BE95000E606E + 066A51511BC4BE34000E606E + 066A514D1BC4BDE4000E606E + 066A51431BC4BBAF000E606E + 066A51471BC4BBF4000E606E + 06D5C0591C8E9B3B002D5045 + + isa + PBXGroup + path + SwiftExtensions + sourceTree + <group> + + 066A51211BC4B55C000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AADevice.swift + sourceTree + <group> + + 066A51221BC4B55C000E606E + + fileRef + 066A51211BC4B55C000E606E + isa + PBXBuildFile + + 066A51231BC4B56D000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Colors.swift + sourceTree + <group> + + 066A51241BC4B56D000E606E + + fileRef + 066A51231BC4B56D000E606E + isa + PBXBuildFile + + 066A51401BC4BB5C000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AssosiatedObject.swift + sourceTree + <group> + + 066A51411BC4BB5C000E606E + + fileRef + 066A51401BC4BB5C000E606E + isa + PBXBuildFile + + 066A51431BC4BBAF000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Strings.swift + sourceTree + <group> + + 066A51441BC4BBAF000E606E + + fileRef + 066A51431BC4BBAF000E606E + isa + PBXBuildFile + + 066A51451BC4BBC3000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Fonts.swift + sourceTree + <group> + + 066A51461BC4BBC3000E606E + + fileRef + 066A51451BC4BBC3000E606E + isa + PBXBuildFile + + 066A51471BC4BBF4000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Views.swift + sourceTree + <group> + + 066A51481BC4BBF4000E606E + + fileRef + 066A51471BC4BBF4000E606E + isa + PBXBuildFile + + 066A51491BC4BCE0000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Dispatch.swift + sourceTree + <group> + + 066A514A1BC4BCE0000E606E + + fileRef + 066A51491BC4BCE0000E606E + isa + PBXBuildFile + + 066A514B1BC4BD05000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Collections.swift + sourceTree + <group> + + 066A514C1BC4BD05000E606E + + fileRef + 066A514B1BC4BD05000E606E + isa + PBXBuildFile + + 066A514D1BC4BDE4000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Numbers.swift + sourceTree + <group> + + 066A514E1BC4BDE4000E606E + + fileRef + 066A514D1BC4BDE4000E606E + isa + PBXBuildFile + + 066A514F1BC4BE06000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AARegex.swift + sourceTree + <group> + + 066A51501BC4BE06000E606E + + fileRef + 066A514F1BC4BE06000E606E + isa + PBXBuildFile + + 066A51511BC4BE34000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Logs.swift + sourceTree + <group> + + 066A51521BC4BE34000E606E + + fileRef + 066A51511BC4BE34000E606E + isa + PBXBuildFile + + 066A51531BC4BE95000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Images.swift + sourceTree + <group> + + 066A51541BC4BE95000E606E + + fileRef + 066A51531BC4BE95000E606E + isa + PBXBuildFile + + 066A51551BC4BEF5000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AALocalized.swift + sourceTree + <group> + + 066A51561BC4BEF5000E606E + + fileRef + 066A51551BC4BEF5000E606E + isa + PBXBuildFile + + 066A51571BC4C112000E606E + + children + + 15D35F721C201B5300E3717A + 152AA8901C29887A0030DEEE + 06129AA81C8394700099286B + 06129AAA1C83B80A0099286B + 066A53311BC534F5000E606E + 066A515A1BC4C178000E606E + 066A51581BC4C14A000E606E + 066A51641BC4C366000E606E + 065975381BC7CA7B00B8C7DF + 06C1D07D1C8D0DE900B73632 + + isa + PBXGroup + path + Utils + sourceTree + <group> + + 066A51581BC4C14A000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AASwiftlyLRU.swift + sourceTree + <group> + + 066A51591BC4C14A000E606E + + fileRef + 066A51581BC4C14A000E606E + isa + PBXBuildFile + + 066A515A1BC4C178000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAHashMap.swift + sourceTree + <group> + + 066A515B1BC4C178000E606E + + fileRef + 066A515A1BC4C178000E606E + isa + PBXBuildFile + + 066A51641BC4C366000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AATools.swift + sourceTree + <group> + + 066A51681BC4C366000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ActorCoreExt.swift + sourceTree + <group> + + 066A51691BC4C366000E606E + + fileRef + 066A51641BC4C366000E606E + isa + PBXBuildFile + + 066A516D1BC4C366000E606E + + fileRef + 066A51681BC4C366000E606E + isa + PBXBuildFile + + 066A516E1BC4C369000E606E + + children + + 066A51711BC4C373000E606E + 066A516F1BC4C373000E606E + 066A51701BC4C373000E606E + 066A51721BC4C373000E606E + 066A51731BC4C373000E606E + 066A51741BC4C373000E606E + 066A51751BC4C373000E606E + 066A51761BC4C373000E606E + 066A51771BC4C373000E606E + 066A51781BC4C373000E606E + 066A51791BC4C373000E606E + + isa + PBXGroup + path + FMDB + sourceTree + <group> + + 066A516F1BC4C373000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + FMDatabase.h + sourceTree + <group> + + 066A51701BC4C373000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + FMDatabase.m + sourceTree + <group> + + 066A51711BC4C373000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + FMDatabase+Private.h + sourceTree + <group> + + 066A51721BC4C373000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + FMDatabaseAdditions.h + sourceTree + <group> + + 066A51731BC4C373000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + FMDatabaseAdditions.m + sourceTree + <group> + + 066A51741BC4C373000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + FMDatabasePool.h + sourceTree + <group> + + 066A51751BC4C373000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + FMDatabasePool.m + sourceTree + <group> + + 066A51761BC4C373000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + FMDatabaseQueue.h + sourceTree + <group> + + 066A51771BC4C373000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + FMDatabaseQueue.m + sourceTree + <group> + + 066A51781BC4C373000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + FMResultSet.h + sourceTree + <group> + + 066A51791BC4C373000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + FMResultSet.m + sourceTree + <group> + + 066A517A1BC4C373000E606E + + fileRef + 066A516F1BC4C373000E606E + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 066A517B1BC4C373000E606E + + fileRef + 066A51701BC4C373000E606E + isa + PBXBuildFile + + 066A517C1BC4C373000E606E + + fileRef + 066A51711BC4C373000E606E + isa + PBXBuildFile + + 066A517D1BC4C373000E606E + + fileRef + 066A51721BC4C373000E606E + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 066A517E1BC4C373000E606E + + fileRef + 066A51731BC4C373000E606E + isa + PBXBuildFile + + 066A517F1BC4C373000E606E + + fileRef + 066A51741BC4C373000E606E + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 066A51801BC4C373000E606E + + fileRef + 066A51751BC4C373000E606E + isa + PBXBuildFile + + 066A51811BC4C373000E606E + + fileRef + 066A51761BC4C373000E606E + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 066A51821BC4C373000E606E + + fileRef + 066A51771BC4C373000E606E + isa + PBXBuildFile + + 066A51831BC4C373000E606E + + fileRef + 066A51781BC4C373000E606E + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 066A51841BC4C373000E606E + + fileRef + 066A51791BC4C373000E606E + isa + PBXBuildFile + + 066A51851BC4C377000E606E + + children + + 066A51941BC4C385000E606E + 065975531BC7DF5100B8C7DF + 066A518B1BC4C383000E606E + 066A518A1BC4C383000E606E + 066A51891BC4C383000E606E + 066A51861BC4C383000E606E + 065A06B51C6CEFE00012EA09 + 06129AA51C8359FB0099286B + 0618509F1C95CA2600C522D5 + 06E1648E1C96D99F005AFB94 + 066A51871BC4C383000E606E + 066A51881BC4C383000E606E + 06E322C81C69344A00D66F53 + + isa + PBXGroup + path + Providers + sourceTree + <group> + + 066A51861BC4C383000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + CocoaStorageRuntime.swift + sourceTree + <group> + + 066A51871BC4C383000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + iOSNotificationProvider.swift + sourceTree + <group> + + 066A51881BC4C383000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + iOSPhoneBookProvider.swift + sourceTree + <group> + + 066A51891BC4C383000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + CocoaNetworkRuntime.swift + sourceTree + <group> + + 066A518A1BC4C383000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + CocoaHttpRuntime.swift + sourceTree + <group> + + 066A518B1BC4C383000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + CocoaFileSystemRuntime.swift + sourceTree + <group> + + 066A518D1BC4C383000E606E + + fileRef + 066A51861BC4C383000E606E + isa + PBXBuildFile + + 066A518E1BC4C383000E606E + + fileRef + 066A51871BC4C383000E606E + isa + PBXBuildFile + + 066A518F1BC4C383000E606E + + fileRef + 066A51881BC4C383000E606E + isa + PBXBuildFile + + 066A51901BC4C383000E606E + + fileRef + 066A51891BC4C383000E606E + isa + PBXBuildFile + + 066A51911BC4C383000E606E + + fileRef + 066A518A1BC4C383000E606E + isa + PBXBuildFile + + 066A51921BC4C383000E606E + + fileRef + 066A518B1BC4C383000E606E + isa + PBXBuildFile + + 066A51941BC4C385000E606E + + children + + 066A516E1BC4C369000E606E + 065975011BC7534100B8C7DF + 066A51991BC4C390000E606E + 066A51961BC4C390000E606E + 066A51951BC4C390000E606E + 066A51981BC4C390000E606E + + isa + PBXGroup + path + Storage + sourceTree + <group> + + 066A51951BC4C390000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + FMDBList.swift + sourceTree + <group> + + 066A51961BC4C390000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + FMDBKeyValue.swift + sourceTree + <group> + + 066A51981BC4C390000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + UDPreferencesStorage.swift + sourceTree + <group> + + 066A51991BC4C390000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + FMDBExtensions.swift + sourceTree + <group> + + 066A519A1BC4C390000E606E + + fileRef + 066A51951BC4C390000E606E + isa + PBXBuildFile + + 066A519B1BC4C390000E606E + + fileRef + 066A51961BC4C390000E606E + isa + PBXBuildFile + + 066A519D1BC4C390000E606E + + fileRef + 066A51981BC4C390000E606E + isa + PBXBuildFile + + 066A519E1BC4C390000E606E + + fileRef + 066A51991BC4C390000E606E + isa + PBXBuildFile + + 066A51FF1BC4E0B0000E606E + + isa + PBXFileReference + lastKnownFileType + sourcecode.text-based-dylib-definition + name + libsqlite3.tbd + path + usr/lib/libsqlite3.tbd + sourceTree + SDKROOT + + 066A52001BC4E0B0000E606E + + fileRef + 066A51FF1BC4E0B0000E606E + isa + PBXBuildFile + + 066A52041BC4E962000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + text.script.python + path + convert.py + sourceTree + <group> + + 066A52051BC4E962000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.make + path + Makefile + sourceTree + <group> + + 066A52081BC4E962000E606E + + fileRef + 066A52051BC4E962000E606E + isa + PBXBuildFile + + 066A52091BC4EA95000E606E + + buildActionMask + 2147483647 + files + + inputPaths + + isa + PBXShellScriptBuildPhase + name + Build and Install Actor Core + outputPaths + + runOnlyForDeploymentPostprocessing + 0 + shellPath + /bin/sh + shellScript + set -e -/* Begin PBXBuildFile section */ - 060135031C95ED4C00A18C4E /* YYAsyncLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 060134FD1C95ED4C00A18C4E /* YYAsyncLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 060135041C95ED4C00A18C4E /* YYAsyncLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 060134FE1C95ED4C00A18C4E /* YYAsyncLayer.m */; }; - 060135051C95ED4C00A18C4E /* YYSentinel.h in Headers */ = {isa = PBXBuildFile; fileRef = 060134FF1C95ED4C00A18C4E /* YYSentinel.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 060135061C95ED4C00A18C4E /* YYSentinel.m in Sources */ = {isa = PBXBuildFile; fileRef = 060135001C95ED4C00A18C4E /* YYSentinel.m */; }; - 060135071C95ED4C00A18C4E /* YYTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 060135011C95ED4C00A18C4E /* YYTransaction.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 060135081C95ED4C00A18C4E /* YYTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 060135021C95ED4C00A18C4E /* YYTransaction.m */; }; - 0601BBB21CA4C7DE00AEFA81 /* ElegantPresentations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0601BBB11CA4C7DE00AEFA81 /* ElegantPresentations.swift */; }; - 0601BBB41CA4C80D00AEFA81 /* ElegantPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0601BBB31CA4C80D00AEFA81 /* ElegantPresentationController.swift */; }; - 06129AA61C8359FB0099286B /* CocoaLifecycleRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06129AA51C8359FB0099286B /* CocoaLifecycleRuntime.swift */; }; - 06129AA91C8394700099286B /* AAAudioManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06129AA81C8394700099286B /* AAAudioManager.swift */; }; - 06129AAB1C83B80B0099286B /* AAAudioRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06129AAA1C83B80A0099286B /* AAAudioRouter.swift */; }; - 0618509E1C9582DD00C522D5 /* AABackgroundCellRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0618509D1C9582DD00C522D5 /* AABackgroundCellRenderer.swift */; }; - 061850A01C95CA2600C522D5 /* CocoaDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0618509F1C95CA2600C522D5 /* CocoaDispatcher.swift */; }; - 061850DA1C95CBF000C522D5 /* YYTextContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850A51C95CBF000C522D5 /* YYTextContainerView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850DB1C95CBF000C522D5 /* YYTextContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850A61C95CBF000C522D5 /* YYTextContainerView.m */; }; - 061850DC1C95CBF000C522D5 /* YYTextDebugOption.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850A71C95CBF000C522D5 /* YYTextDebugOption.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850DD1C95CBF000C522D5 /* YYTextDebugOption.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850A81C95CBF000C522D5 /* YYTextDebugOption.m */; }; - 061850DE1C95CBF000C522D5 /* YYTextEffectWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850A91C95CBF000C522D5 /* YYTextEffectWindow.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850DF1C95CBF000C522D5 /* YYTextEffectWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850AA1C95CBF000C522D5 /* YYTextEffectWindow.m */; }; - 061850E01C95CBF000C522D5 /* YYTextInput.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850AB1C95CBF000C522D5 /* YYTextInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850E11C95CBF000C522D5 /* YYTextInput.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850AC1C95CBF000C522D5 /* YYTextInput.m */; }; - 061850E21C95CBF000C522D5 /* YYTextKeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850AD1C95CBF000C522D5 /* YYTextKeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850E31C95CBF000C522D5 /* YYTextKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850AE1C95CBF000C522D5 /* YYTextKeyboardManager.m */; }; - 061850E41C95CBF000C522D5 /* YYTextLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850AF1C95CBF000C522D5 /* YYTextLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850E51C95CBF000C522D5 /* YYTextLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850B01C95CBF000C522D5 /* YYTextLayout.m */; }; - 061850E61C95CBF000C522D5 /* YYTextLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850B11C95CBF000C522D5 /* YYTextLine.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850E71C95CBF000C522D5 /* YYTextLine.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850B21C95CBF000C522D5 /* YYTextLine.m */; }; - 061850E81C95CBF000C522D5 /* YYTextMagnifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850B31C95CBF000C522D5 /* YYTextMagnifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850E91C95CBF000C522D5 /* YYTextMagnifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850B41C95CBF000C522D5 /* YYTextMagnifier.m */; }; - 061850EA1C95CBF000C522D5 /* YYTextSelectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850B51C95CBF000C522D5 /* YYTextSelectionView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850EB1C95CBF000C522D5 /* YYTextSelectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850B61C95CBF000C522D5 /* YYTextSelectionView.m */; }; - 061850EC1C95CBF000C522D5 /* YYTextArchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850B81C95CBF000C522D5 /* YYTextArchiver.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850ED1C95CBF000C522D5 /* YYTextArchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850B91C95CBF000C522D5 /* YYTextArchiver.m */; }; - 061850EE1C95CBF000C522D5 /* YYTextAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850BA1C95CBF000C522D5 /* YYTextAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850EF1C95CBF000C522D5 /* YYTextAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850BB1C95CBF000C522D5 /* YYTextAttribute.m */; }; - 061850F01C95CBF000C522D5 /* YYTextParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850BC1C95CBF000C522D5 /* YYTextParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850F11C95CBF000C522D5 /* YYTextParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850BD1C95CBF000C522D5 /* YYTextParser.m */; }; - 061850F21C95CBF000C522D5 /* YYTextRubyAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850BE1C95CBF000C522D5 /* YYTextRubyAnnotation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850F31C95CBF000C522D5 /* YYTextRubyAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850BF1C95CBF000C522D5 /* YYTextRubyAnnotation.m */; }; - 061850F41C95CBF000C522D5 /* YYTextRunDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850C01C95CBF000C522D5 /* YYTextRunDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850F51C95CBF000C522D5 /* YYTextRunDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850C11C95CBF000C522D5 /* YYTextRunDelegate.m */; }; - 061850F61C95CBF000C522D5 /* NSAttributedString+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850C31C95CBF000C522D5 /* NSAttributedString+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850F71C95CBF000C522D5 /* NSAttributedString+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850C41C95CBF000C522D5 /* NSAttributedString+YYText.m */; }; - 061850F81C95CBF000C522D5 /* NSParagraphStyle+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850C51C95CBF000C522D5 /* NSParagraphStyle+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850F91C95CBF000C522D5 /* NSParagraphStyle+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850C61C95CBF000C522D5 /* NSParagraphStyle+YYText.m */; }; - 061850FA1C95CBF000C522D5 /* UIPasteboard+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850C71C95CBF000C522D5 /* UIPasteboard+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850FB1C95CBF000C522D5 /* UIPasteboard+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850C81C95CBF000C522D5 /* UIPasteboard+YYText.m */; }; - 061850FC1C95CBF000C522D5 /* UIView+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850C91C95CBF000C522D5 /* UIView+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850FD1C95CBF000C522D5 /* UIView+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850CA1C95CBF000C522D5 /* UIView+YYText.m */; }; - 061850FE1C95CBF000C522D5 /* YYTextAsyncLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850CB1C95CBF000C522D5 /* YYTextAsyncLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061850FF1C95CBF000C522D5 /* YYTextAsyncLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850CC1C95CBF000C522D5 /* YYTextAsyncLayer.m */; }; - 061851001C95CBF000C522D5 /* YYTextTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850CD1C95CBF000C522D5 /* YYTextTransaction.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061851011C95CBF000C522D5 /* YYTextTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850CE1C95CBF000C522D5 /* YYTextTransaction.m */; }; - 061851021C95CBF000C522D5 /* YYTextUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850CF1C95CBF000C522D5 /* YYTextUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061851031C95CBF000C522D5 /* YYTextUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850D01C95CBF000C522D5 /* YYTextUtilities.m */; }; - 061851041C95CBF000C522D5 /* YYTextWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850D11C95CBF000C522D5 /* YYTextWeakProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061851051C95CBF000C522D5 /* YYTextWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850D21C95CBF000C522D5 /* YYTextWeakProxy.m */; }; - 061851061C95CBF000C522D5 /* YYDispatchQueuePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850D31C95CBF000C522D5 /* YYDispatchQueuePool.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061851071C95CBF000C522D5 /* YYDispatchQueuePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850D41C95CBF000C522D5 /* YYDispatchQueuePool.m */; }; - 061851081C95CBF000C522D5 /* YYLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850D51C95CBF000C522D5 /* YYLabel.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 061851091C95CBF000C522D5 /* YYLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850D61C95CBF000C522D5 /* YYLabel.m */; }; - 0618510A1C95CBF000C522D5 /* YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850D71C95CBF000C522D5 /* YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0618510B1C95CBF000C522D5 /* YYTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850D81C95CBF000C522D5 /* YYTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0618510C1C95CBF000C522D5 /* YYTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850D91C95CBF000C522D5 /* YYTextView.m */; }; - 06230F411BC95BD200A4807B /* RMPhoneFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 06230F3F1BC95BD200A4807B /* RMPhoneFormat.m */; }; - 06230F421BC95BD200A4807B /* RMPhoneFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 06230F401BC95BD200A4807B /* RMPhoneFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 06230F451BC95C0E00A4807B /* ABPhoneFieldCodes.txt in Resources */ = {isa = PBXBuildFile; fileRef = 06230F431BC95C0E00A4807B /* ABPhoneFieldCodes.txt */; }; - 06230F461BC95C0E00A4807B /* PhoneFormats.dat in Resources */ = {isa = PBXBuildFile; fileRef = 06230F441BC95C0E00A4807B /* PhoneFormats.dat */; }; - 063074191BD68E370053DEAF /* bg_3_preview.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 063074161BD68E370053DEAF /* bg_3_preview.jpg */; }; - 0630741A1BD68E370053DEAF /* bg_2_preview.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 063074171BD68E370053DEAF /* bg_2_preview.jpg */; }; - 0630741B1BD68E370053DEAF /* bg_1_preview.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 063074181BD68E370053DEAF /* bg_1_preview.jpg */; }; - 064E41B51CA1D2FF00A4A9D1 /* AABigAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064E41B41CA1D2FF00A4A9D1 /* AABigAlertController.swift */; }; - 065974A51BC621F100B8C7DF /* AAAuthNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065974A41BC621F100B8C7DF /* AAAuthNavigationController.swift */; }; - 065974A71BC62B3600B8C7DF /* ViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065974A61BC62B3600B8C7DF /* ViewExtensions.swift */; }; - 065975021BC7534100B8C7DF /* FMDBBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065975011BC7534100B8C7DF /* FMDBBridge.swift */; }; - 065975051BC757A300B8C7DF /* ActorRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065975041BC757A300B8C7DF /* ActorRuntime.swift */; }; - 065975071BC7BB4000B8C7DF /* AANavigationBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065975061BC7BB4000B8C7DF /* AANavigationBadge.swift */; }; - 065975211BC7C84E00B8C7DF /* bg_1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 0659751E1BC7C84E00B8C7DF /* bg_1.jpg */; }; - 065975221BC7C84E00B8C7DF /* bg_3.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 0659751F1BC7C84E00B8C7DF /* bg_3.jpg */; }; - 065975231BC7C84E00B8C7DF /* bg_2.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 065975201BC7C84E00B8C7DF /* bg_2.jpg */; }; - 065975391BC7CA7B00B8C7DF /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065975381BC7CA7B00B8C7DF /* Bundle.swift */; }; - 0659753B1BC7D22200B8C7DF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0659753A1BC7D22200B8C7DF /* Images.xcassets */; }; - 065975441BC7D34200B8C7DF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 065975461BC7D34200B8C7DF /* Localizable.strings */; }; - 0659754B1BC7DBA000B8C7DF /* iapetus.caf in Resources */ = {isa = PBXBuildFile; fileRef = 065975491BC7DBA000B8C7DF /* iapetus.caf */; }; - 0659754C1BC7DBA000B8C7DF /* notification.caf in Resources */ = {isa = PBXBuildFile; fileRef = 0659754A1BC7DBA000B8C7DF /* notification.caf */; }; - 065975511BC7DD3C00B8C7DF /* highlight-default.min.css in Resources */ = {isa = PBXBuildFile; fileRef = 0659754E1BC7DD3C00B8C7DF /* highlight-default.min.css */; }; - 065975521BC7DD3C00B8C7DF /* highlight.min.js in Resources */ = {isa = PBXBuildFile; fileRef = 0659754F1BC7DD3C00B8C7DF /* highlight.min.js */; }; - 065975541BC7DF5100B8C7DF /* CocoaAssetsRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065975531BC7DF5100B8C7DF /* CocoaAssetsRuntime.swift */; }; - 065A06B61C6CEFE00012EA09 /* CocoaWebRTCRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065A06B51C6CEFE00012EA09 /* CocoaWebRTCRuntime.swift */; }; - 066A50D61BC4AE63000E606E /* ActorSDK.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A50D51BC4AE63000E606E /* ActorSDK.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 066A50E21BC4AF9F000E606E /* ActorSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A50E11BC4AF9F000E606E /* ActorSDK.swift */; }; - 066A51221BC4B55C000E606E /* AADevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51211BC4B55C000E606E /* AADevice.swift */; }; - 066A51241BC4B56D000E606E /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51231BC4B56D000E606E /* Colors.swift */; }; - 066A51411BC4BB5C000E606E /* AssosiatedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51401BC4BB5C000E606E /* AssosiatedObject.swift */; }; - 066A51441BC4BBAF000E606E /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51431BC4BBAF000E606E /* Strings.swift */; }; - 066A51461BC4BBC3000E606E /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51451BC4BBC3000E606E /* Fonts.swift */; }; - 066A51481BC4BBF4000E606E /* Views.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51471BC4BBF4000E606E /* Views.swift */; }; - 066A514A1BC4BCE0000E606E /* Dispatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51491BC4BCE0000E606E /* Dispatch.swift */; }; - 066A514C1BC4BD05000E606E /* Collections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A514B1BC4BD05000E606E /* Collections.swift */; }; - 066A514E1BC4BDE4000E606E /* Numbers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A514D1BC4BDE4000E606E /* Numbers.swift */; }; - 066A51501BC4BE06000E606E /* AARegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A514F1BC4BE06000E606E /* AARegex.swift */; }; - 066A51521BC4BE34000E606E /* Logs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51511BC4BE34000E606E /* Logs.swift */; }; - 066A51541BC4BE95000E606E /* Images.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51531BC4BE95000E606E /* Images.swift */; }; - 066A51561BC4BEF5000E606E /* AALocalized.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51551BC4BEF5000E606E /* AALocalized.swift */; }; - 066A51591BC4C14A000E606E /* AASwiftlyLRU.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51581BC4C14A000E606E /* AASwiftlyLRU.swift */; }; - 066A515B1BC4C178000E606E /* AAHashMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A515A1BC4C178000E606E /* AAHashMap.swift */; }; - 066A51691BC4C366000E606E /* AATools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51641BC4C366000E606E /* AATools.swift */; }; - 066A516D1BC4C366000E606E /* ActorCoreExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51681BC4C366000E606E /* ActorCoreExt.swift */; }; - 066A517A1BC4C373000E606E /* FMDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A516F1BC4C373000E606E /* FMDatabase.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 066A517B1BC4C373000E606E /* FMDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 066A51701BC4C373000E606E /* FMDatabase.m */; }; - 066A517C1BC4C373000E606E /* FMDatabase+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A51711BC4C373000E606E /* FMDatabase+Private.h */; }; - 066A517D1BC4C373000E606E /* FMDatabaseAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A51721BC4C373000E606E /* FMDatabaseAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 066A517E1BC4C373000E606E /* FMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 066A51731BC4C373000E606E /* FMDatabaseAdditions.m */; }; - 066A517F1BC4C373000E606E /* FMDatabasePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A51741BC4C373000E606E /* FMDatabasePool.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 066A51801BC4C373000E606E /* FMDatabasePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 066A51751BC4C373000E606E /* FMDatabasePool.m */; }; - 066A51811BC4C373000E606E /* FMDatabaseQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A51761BC4C373000E606E /* FMDatabaseQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 066A51821BC4C373000E606E /* FMDatabaseQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 066A51771BC4C373000E606E /* FMDatabaseQueue.m */; }; - 066A51831BC4C373000E606E /* FMResultSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A51781BC4C373000E606E /* FMResultSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 066A51841BC4C373000E606E /* FMResultSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 066A51791BC4C373000E606E /* FMResultSet.m */; }; - 066A518D1BC4C383000E606E /* CocoaStorageRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51861BC4C383000E606E /* CocoaStorageRuntime.swift */; }; - 066A518E1BC4C383000E606E /* iOSNotificationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51871BC4C383000E606E /* iOSNotificationProvider.swift */; }; - 066A518F1BC4C383000E606E /* iOSPhoneBookProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51881BC4C383000E606E /* iOSPhoneBookProvider.swift */; }; - 066A51901BC4C383000E606E /* CocoaNetworkRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51891BC4C383000E606E /* CocoaNetworkRuntime.swift */; }; - 066A51911BC4C383000E606E /* CocoaHttpRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A518A1BC4C383000E606E /* CocoaHttpRuntime.swift */; }; - 066A51921BC4C383000E606E /* CocoaFileSystemRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A518B1BC4C383000E606E /* CocoaFileSystemRuntime.swift */; }; - 066A519A1BC4C390000E606E /* FMDBList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51951BC4C390000E606E /* FMDBList.swift */; }; - 066A519B1BC4C390000E606E /* FMDBKeyValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51961BC4C390000E606E /* FMDBKeyValue.swift */; }; - 066A519D1BC4C390000E606E /* UDPreferencesStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51981BC4C390000E606E /* UDPreferencesStorage.swift */; }; - 066A519E1BC4C390000E606E /* FMDBExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51991BC4C390000E606E /* FMDBExtensions.swift */; }; - 066A52001BC4E0B0000E606E /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 066A51FF1BC4E0B0000E606E /* libsqlite3.tbd */; }; - 066A52081BC4E962000E606E /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 066A52051BC4E962000E606E /* Makefile */; }; - 066A52151BC4EE04000E606E /* AAAvatarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52141BC4EE04000E606E /* AAAvatarView.swift */; }; - 066A52221BC4EEAC000E606E /* AAManagedTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52191BC4EEAC000E606E /* AAManagedTable.swift */; settings = {COMPILER_FLAGS = "-w"; }; }; - 066A52231BC4EEAC000E606E /* AAManagedSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A521A1BC4EEAC000E606E /* AAManagedSection.swift */; }; - 066A52241BC4EEAC000E606E /* AAManagedRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A521B1BC4EEAC000E606E /* AAManagedRange.swift */; }; - 066A52251BC4EEAC000E606E /* ManagedBindedCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A521C1BC4EEAC000E606E /* ManagedBindedCells.swift */; }; - 066A52261BC4EEAC000E606E /* ManagedCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A521D1BC4EEAC000E606E /* ManagedCells.swift */; }; - 066A52271BC4EEAC000E606E /* AAContentTableController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A521E1BC4EEAC000E606E /* AAContentTableController.swift */; }; - 066A52281BC4EEAC000E606E /* AAManagedTableController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A521F1BC4EEAC000E606E /* AAManagedTableController.swift */; }; - 066A52291BC4EEAC000E606E /* ManagedTableExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52201BC4EEAC000E606E /* ManagedTableExtensions.swift */; }; - 066A522A1BC4EEAC000E606E /* ManagedAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52211BC4EEAC000E606E /* ManagedAlerts.swift */; }; - 066A52341BC4EEBA000E606E /* AACommonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A522C1BC4EEBA000E606E /* AACommonCell.swift */; }; - 066A52351BC4EEBA000E606E /* AATextCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A522D1BC4EEBA000E606E /* AATextCell.swift */; }; - 066A52361BC4EEBA000E606E /* AATitledCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A522E1BC4EEBA000E606E /* AATitledCell.swift */; }; - 066A52371BC4EEBA000E606E /* AATableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A522F1BC4EEBA000E606E /* AATableViewCell.swift */; }; - 066A52381BC4EEBA000E606E /* AAHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52301BC4EEBA000E606E /* AAHeaderCell.swift */; }; - 066A52391BC4EEBA000E606E /* AAEditCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52311BC4EEBA000E606E /* AAEditCell.swift */; }; - 066A52401BC4EECD000E606E /* AABigPlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A523A1BC4EECD000E606E /* AABigPlaceholderView.swift */; }; - 066A52421BC4EECD000E606E /* AATableViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A523C1BC4EECD000E606E /* AATableViewHeader.swift */; }; - 066A52431BC4EECD000E606E /* AATableViewSeparator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A523D1BC4EECD000E606E /* AATableViewSeparator.swift */; }; - 066A52451BC4EECD000E606E /* AAAvatarCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A523F1BC4EECD000E606E /* AAAvatarCell.swift */; }; - 066A52481BC4EED5000E606E /* AAProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52461BC4EED5000E606E /* AAProgressView.swift */; }; - 066A524B1BC4EF49000E606E /* AAViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52491BC4EF49000E606E /* AAViewController.swift */; }; - 066A52541BC4EF61000E606E /* AAImagePickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A524D1BC4EF61000E606E /* AAImagePickerController.swift */; }; - 066A52551BC4EF61000E606E /* AANavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A524E1BC4EF61000E606E /* AANavigationController.swift */; }; - 066A52561BC4EF61000E606E /* AATableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A524F1BC4EF61000E606E /* AATableViewController.swift */; }; - 066A52571BC4EF61000E606E /* AACollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52501BC4EF61000E606E /* AACollectionViewController.swift */; }; - 066A52581BC4EF61000E606E /* Alerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52511BC4EF61000E606E /* Alerts.swift */; }; - 066A52591BC4EF61000E606E /* Executions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52521BC4EF61000E606E /* Executions.swift */; }; - 066A525A1BC4EF61000E606E /* Navigations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52531BC4EF61000E606E /* Navigations.swift */; }; - 066A525C1BC502EB000E606E /* ActorSDKDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A525B1BC502EB000E606E /* ActorSDKDelegate.swift */; }; - 066A525E1BC503BB000E606E /* ActorApplicationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A525D1BC503BB000E606E /* ActorApplicationDelegate.swift */; }; - 066A52661BC50E7B000E606E /* AACountryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52611BC50E7B000E606E /* AACountryViewController.swift */; }; - 066A526A1BC50E7B000E606E /* AAAuthViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52651BC50E7B000E606E /* AAAuthViewController.swift */; }; - 066A526D1BC50E8B000E606E /* AAAuthCountryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A526C1BC50E8B000E606E /* AAAuthCountryCell.swift */; }; - 066A52731BC5101A000E606E /* ABPhoneField.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A526F1BC5101A000E606E /* ABPhoneField.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 066A52741BC5101A000E606E /* ABPhoneField.m in Sources */ = {isa = PBXBuildFile; fileRef = 066A52701BC5101A000E606E /* ABPhoneField.m */; }; - 066A527F1BC51ED0000E606E /* AARootSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A527C1BC51ED0000E606E /* AARootSplitViewController.swift */; }; - 066A52801BC51ED0000E606E /* AARootTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A527D1BC51ED0000E606E /* AARootTabViewController.swift */; }; - 066A52811BC51ED0000E606E /* AANoSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A527E1BC51ED0000E606E /* AANoSelectionViewController.swift */; }; - 066A52C71BC521EA000E606E /* AAEditTextController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52C51BC521EA000E606E /* AAEditTextController.swift */; }; - 066A52C81BC521EA000E606E /* AAEditFieldController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52C61BC521EA000E606E /* AAEditFieldController.swift */; }; - 066A52CC1BC521FA000E606E /* AADialogsListContentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52CA1BC521FA000E606E /* AADialogsListContentController.swift */; }; - 066A52CD1BC521FA000E606E /* AADialogsListContentControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52CB1BC521FA000E606E /* AADialogsListContentControllerDelegate.swift */; }; - 066A52D11BC52204000E606E /* AADialogCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52CF1BC52204000E606E /* AADialogCell.swift */; }; - 066A52D21BC52204000E606E /* AADialogSearchCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52D01BC52204000E606E /* AADialogSearchCell.swift */; }; - 066A52D61BC52378000E606E /* AAContactsListContentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52D41BC52378000E606E /* AAContactsListContentController.swift */; }; - 066A52D71BC52378000E606E /* AAContactsListContentControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52D51BC52378000E606E /* AAContactsListContentControllerDelegate.swift */; }; - 066A52DB1BC52385000E606E /* AAContactActionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52D91BC52385000E606E /* AAContactActionCell.swift */; }; - 066A52DC1BC52385000E606E /* AAContactCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52DA1BC52385000E606E /* AAContactCell.swift */; }; - 066A52DF1BC5241F000E606E /* AAWebActionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52DE1BC5241F000E606E /* AAWebActionController.swift */; }; - 066A52E51BC52A20000E606E /* AAGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52E21BC52A20000E606E /* AAGroupViewController.swift */; }; - 066A52E61BC52A20000E606E /* AAAddParticipantViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52E31BC52A20000E606E /* AAAddParticipantViewController.swift */; }; - 066A52E71BC52A20000E606E /* AAInviteLinkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52E41BC52A20000E606E /* AAInviteLinkViewController.swift */; }; - 066A52EA1BC52A2B000E606E /* AAGroupMemberCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52E91BC52A2B000E606E /* AAGroupMemberCell.swift */; }; - 066A52F01BC52B02000E606E /* AASettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52EC1BC52B02000E606E /* AASettingsViewController.swift */; }; - 066A52F11BC52B02000E606E /* AASettingsNotificationsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52ED1BC52B02000E606E /* AASettingsNotificationsViewController.swift */; }; - 066A52F21BC52B02000E606E /* AASettingsPrivacyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52EE1BC52B02000E606E /* AASettingsPrivacyViewController.swift */; }; - 066A52F31BC52B02000E606E /* AASettingsWallpapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52EF1BC52B02000E606E /* AASettingsWallpapper.swift */; }; - 066A52F71BC52B13000E606E /* AAWallpapperPreviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52F51BC52B13000E606E /* AAWallpapperPreviewCell.swift */; }; - 066A52F81BC52B13000E606E /* AAWallpapperSettingsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52F61BC52B13000E606E /* AAWallpapperSettingsCell.swift */; }; - 066A52FD1BC52FA8000E606E /* AAComposeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52FA1BC52FA8000E606E /* AAComposeController.swift */; }; - 066A52FE1BC52FA9000E606E /* AAGroupCreateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52FB1BC52FA8000E606E /* AAGroupCreateViewController.swift */; }; - 066A52FF1BC52FA9000E606E /* AAGroupMembersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52FC1BC52FA8000E606E /* AAGroupMembersController.swift */; }; - 066A53041BC53177000E606E /* AAContactsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53031BC53177000E606E /* AAContactsViewController.swift */; }; - 066A53071BC53183000E606E /* AARecentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53061BC53183000E606E /* AARecentViewController.swift */; }; - 066A530B1BC531A2000E606E /* AAUserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A530A1BC531A2000E606E /* AAUserViewController.swift */; }; - 066A53101BC53317000E606E /* AAWallpapperPreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A530D1BC53317000E606E /* AAWallpapperPreviewController.swift */; }; - 066A53111BC53317000E606E /* AACorePreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A530E1BC53317000E606E /* AACorePreviewController.swift */; }; - 066A53121BC53317000E606E /* AAPhotoPreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A530F1BC53317000E606E /* AAPhotoPreviewController.swift */; }; - 066A53151BC533D5000E606E /* AAConversationContentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53141BC533D5000E606E /* AAConversationContentController.swift */; }; - 066A53171BC533DD000E606E /* AABubbles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53161BC533DD000E606E /* AABubbles.swift */; }; - 066A531A1BC533E7000E606E /* AAAutoCompleteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53191BC533E7000E606E /* AAAutoCompleteCell.swift */; }; - 066A53201BC533F5000E606E /* AABubbleBackgroundProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A531C1BC533F5000E606E /* AABubbleBackgroundProcessor.swift */; }; - 066A53211BC533F5000E606E /* BubbleLayouts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A531D1BC533F5000E606E /* BubbleLayouts.swift */; }; - 066A53221BC533F5000E606E /* AAMessagesFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A531E1BC533F5000E606E /* AAMessagesFlowLayout.swift */; }; - 066A53231BC533F5000E606E /* Caches.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A531F1BC533F5000E606E /* Caches.swift */; }; - 066A532B1BC53406000E606E /* AABubbleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53251BC53406000E606E /* AABubbleCell.swift */; }; - 066A532C1BC53406000E606E /* AABubbleTextCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53261BC53406000E606E /* AABubbleTextCell.swift */; }; - 066A532D1BC53406000E606E /* AABubbleServiceCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53271BC53406000E606E /* AABubbleServiceCell.swift */; }; - 066A532E1BC53406000E606E /* AABubbleBaseFileCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53281BC53406000E606E /* AABubbleBaseFileCell.swift */; }; - 066A532F1BC53406000E606E /* AABubbleMediaCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53291BC53406000E606E /* AABubbleMediaCell.swift */; }; - 066A53301BC53406000E606E /* AABubbleDocumentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A532A1BC53406000E606E /* AABubbleDocumentCell.swift */; }; - 066A53331BC534F5000E606E /* AAFileTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53311BC534F5000E606E /* AAFileTypes.swift */; }; - 066A53371BC537CA000E606E /* ConversationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53361BC537CA000E606E /* ConversationViewController.swift */; }; - 066A53391BC5456B000E606E /* ActorStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53381BC5456B000E606E /* ActorStyle.swift */; }; - 066CBCDC1C8D419F004507E2 /* AAAuthEmailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066CBCDB1C8D419F004507E2 /* AAAuthEmailViewController.swift */; }; - 067B67541D45341D00B9A238 /* AAGroupViewMembersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067B67531D45341D00B9A238 /* AAGroupViewMembersController.swift */; }; - 068AFC391C94A0050055F503 /* AADialogListProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 068AFC381C94A0050055F503 /* AADialogListProcessor.swift */; }; - 069CF4CC1BCB909A00C66E12 /* CLBackspaceDetectingTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 069CF4C41BCB909A00C66E12 /* CLBackspaceDetectingTextField.h */; }; - 069CF4CD1BCB909A00C66E12 /* CLBackspaceDetectingTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 069CF4C51BCB909A00C66E12 /* CLBackspaceDetectingTextField.m */; }; - 069CF4CE1BCB909A00C66E12 /* CLToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 069CF4C61BCB909A00C66E12 /* CLToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 069CF4CF1BCB909A00C66E12 /* CLToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 069CF4C71BCB909A00C66E12 /* CLToken.m */; }; - 069CF4D01BCB909A00C66E12 /* CLTokenInputView.h in Headers */ = {isa = PBXBuildFile; fileRef = 069CF4C81BCB909A00C66E12 /* CLTokenInputView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 069CF4D11BCB909A00C66E12 /* CLTokenInputView.m in Sources */ = {isa = PBXBuildFile; fileRef = 069CF4C91BCB909A00C66E12 /* CLTokenInputView.m */; }; - 069CF4D21BCB909A00C66E12 /* CLTokenView.h in Headers */ = {isa = PBXBuildFile; fileRef = 069CF4CA1BCB909A00C66E12 /* CLTokenView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 069CF4D31BCB909A00C66E12 /* CLTokenView.m in Sources */ = {isa = PBXBuildFile; fileRef = 069CF4CB1BCB909A00C66E12 /* CLTokenView.m */; }; - 06ABFE331D3FAF800031A0D6 /* GCDAsyncSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 06ABFE2F1D3FAF800031A0D6 /* GCDAsyncSocket.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 06ABFE341D3FAF800031A0D6 /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 06ABFE301D3FAF800031A0D6 /* GCDAsyncSocket.m */; }; - 06ABFE381D3FCCE30031A0D6 /* AAGroupEditInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ABFE371D3FCCE30031A0D6 /* AAGroupEditInfoViewController.swift */; }; - 06ABFE3A1D410D2D0031A0D6 /* AAGroupTypeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ABFE391D410D2D0031A0D6 /* AAGroupTypeController.swift */; }; - 06ABFE3D1D41283A0031A0D6 /* AAGroupAdministrationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ABFE3C1D41283A0031A0D6 /* AAGroupAdministrationViewController.swift */; }; - 06B489ED1C9F6EBD0054245B /* AAStickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B489EC1C9F6EBC0054245B /* AAStickerView.swift */; }; - 06C1D0771C8BC9FC00B73632 /* AAAuthNameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C1D0761C8BC9FC00B73632 /* AAAuthNameViewController.swift */; }; - 06C1D07B1C8BFE5C00B73632 /* AAAuthPhoneViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C1D07A1C8BFE5C00B73632 /* AAAuthPhoneViewController.swift */; }; - 06C1D07E1C8D0DEA00B73632 /* Telephony.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C1D07D1C8D0DE900B73632 /* Telephony.swift */; }; - 06CE898C1BD841C9005A5530 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06CE898B1BD841C9005A5530 /* SystemConfiguration.framework */; }; - 06CE89901BD84DF5005A5530 /* ActorSDKAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06CE898F1BD84DF5005A5530 /* ActorSDKAnalytics.swift */; }; - 06D5C0571C8D6E20002D5045 /* AAAuthLogInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06D5C0561C8D6E20002D5045 /* AAAuthLogInViewController.swift */; }; - 06D5C05A1C8E9B3B002D5045 /* Promises.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06D5C0591C8E9B3B002D5045 /* Promises.swift */; }; - 06D5C05C1C8EA842002D5045 /* AAAuthOTPViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06D5C05B1C8EA842002D5045 /* AAAuthOTPViewController.swift */; }; - 06E1648F1C96D99F005AFB94 /* CocoaCrypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E1648E1C96D99F005AFB94 /* CocoaCrypto.swift */; }; - 06E322C91C69344A00D66F53 /* iOSCallsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E322C81C69344A00D66F53 /* iOSCallsProvider.swift */; }; - 06E3230E1C69445C00D66F53 /* WebRTC.h in Headers */ = {isa = PBXBuildFile; fileRef = 06E3230D1C6942C400D66F53 /* WebRTC.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 06E323111C694C1D00D66F53 /* WebRTCExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E323101C694C1D00D66F53 /* WebRTCExt.swift */; }; - 06E323151C6A7AC000D66F53 /* AACallViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E323141C6A7AC000D66F53 /* AACallViewController.swift */; }; - 06E3C58B1C746CCC004776CD /* tone.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 06E3C58A1C746AAC004776CD /* tone.m4a */; }; - 06E3C58D1C749320004776CD /* ringtone.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 06E3C58C1C74931F004776CD /* ringtone.m4a */; }; - 06E3C5B81C80EE21004776CD /* AACircleButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E3C5B71C80EE20004776CD /* AACircleButton.swift */; }; - 06E7B2471C0F8D7A0090660C /* AALocationPickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E7B2461C0F8D7A0090660C /* AALocationPickerController.swift */; }; - 06E7B24A1C0F92140090660C /* AABubbleLocationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E7B2491C0F92140090660C /* AABubbleLocationCell.swift */; }; - 06E7B24C1C0FAB500090660C /* AAMapFastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E7B24B1C0FAB500090660C /* AAMapFastView.swift */; }; - 06E7B2521C1345E70090660C /* AAMapPinPointView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E7B2511C1345E70090660C /* AAMapPinPointView.swift */; }; - 06E7B2541C139B6F0090660C /* AABubbleContactCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E7B2531C139B6F0090660C /* AABubbleContactCell.swift */; }; - 152AA8A71C2989270030DEEE /* SLKInputAccessoryView.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8931C2989270030DEEE /* SLKInputAccessoryView.m */; }; - 152AA8A81C2989270030DEEE /* SLKTextInputbar.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA8941C2989270030DEEE /* SLKTextInputbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 152AA8A91C2989270030DEEE /* SLKTextInputbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8951C2989270030DEEE /* SLKTextInputbar.m */; }; - 152AA8AA1C2989270030DEEE /* SLKTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA8961C2989270030DEEE /* SLKTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 152AA8AB1C2989270030DEEE /* SLKTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8971C2989270030DEEE /* SLKTextView.m */; }; - 152AA8AC1C2989270030DEEE /* SLKTextView+SLKAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA8981C2989270030DEEE /* SLKTextView+SLKAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 152AA8AD1C2989270030DEEE /* SLKTextView+SLKAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8991C2989270030DEEE /* SLKTextView+SLKAdditions.m */; }; - 152AA8AE1C2989270030DEEE /* SLKTextViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA89A1C2989270030DEEE /* SLKTextViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 152AA8AF1C2989270030DEEE /* SLKTextViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA89B1C2989270030DEEE /* SLKTextViewController.m */; }; - 152AA8B01C2989270030DEEE /* SLKTypingIndicatorProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA89C1C2989270030DEEE /* SLKTypingIndicatorProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 152AA8B11C2989270030DEEE /* SLKTypingIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA89D1C2989270030DEEE /* SLKTypingIndicatorView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 152AA8B21C2989270030DEEE /* SLKTypingIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA89E1C2989270030DEEE /* SLKTypingIndicatorView.m */; }; - 152AA8B31C2989270030DEEE /* SLKUIConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA89F1C2989270030DEEE /* SLKUIConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 152AA8B51C2989270030DEEE /* UIResponder+SLKAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8A11C2989270030DEEE /* UIResponder+SLKAdditions.m */; }; - 152AA8B61C2989270030DEEE /* UIScrollView+SLKAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA8A21C2989270030DEEE /* UIScrollView+SLKAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 152AA8B71C2989270030DEEE /* UIScrollView+SLKAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8A31C2989270030DEEE /* UIScrollView+SLKAdditions.m */; }; - 152AA8B81C2989270030DEEE /* UIView+SLKAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA8A41C2989270030DEEE /* UIView+SLKAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 152AA8B91C2989270030DEEE /* UIView+SLKAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8A51C2989270030DEEE /* UIView+SLKAdditions.m */; }; - 152AA8BD1C298BF00030DEEE /* AASettingsSessionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8BC1C298BF00030DEEE /* AASettingsSessionsController.swift */; }; - 152AA8BF1C298C4B0030DEEE /* AASettingsLastSeenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8BE1C298C4B0030DEEE /* AASettingsLastSeenController.swift */; }; - 153F6B5B1C2B109400C0B960 /* AABubbleVoiceCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153F6B5A1C2B109400C0B960 /* AABubbleVoiceCell.swift */; }; - 153F6B5D1C2B3AC500C0B960 /* AABubbleStickerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153F6B5C1C2B3AC500C0B960 /* AABubbleStickerCell.swift */; }; - 153F6B611C2BF8EC00C0B960 /* AAAuthWelcomeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153F6B601C2BF8EC00C0B960 /* AAAuthWelcomeController.swift */; }; - 153F6B8A1C2D7BA300C0B960 /* AATapLabelDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153F6B881C2D7BA300C0B960 /* AATapLabelDelegate.swift */; }; - 153F6B8B1C2D7BA400C0B960 /* AATapLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153F6B891C2D7BA300C0B960 /* AATapLabel.swift */; }; - 15D35F161C20185500E3717A /* diag_range.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F0C1C20185500E3717A /* diag_range.c */; }; - 15D35F171C20185500E3717A /* diag_range.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F0D1C20185500E3717A /* diag_range.h */; }; - 15D35F181C20185500E3717A /* opus_header.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F0E1C20185500E3717A /* opus_header.c */; }; - 15D35F191C20185500E3717A /* opus_header.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F0F1C20185500E3717A /* opus_header.h */; }; - 15D35F1A1C20185500E3717A /* opusenc.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F101C20185500E3717A /* opusenc.h */; }; - 15D35F1B1C20185500E3717A /* opusenc.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F111C20185500E3717A /* opusenc.m */; settings = {COMPILER_FLAGS = "-w"; }; }; - 15D35F1C1C20185500E3717A /* picture.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F121C20185500E3717A /* picture.c */; settings = {COMPILER_FLAGS = "-w"; }; }; - 15D35F1D1C20185500E3717A /* picture.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F131C20185500E3717A /* picture.h */; }; - 15D35F1E1C20185500E3717A /* wav_io.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F141C20185500E3717A /* wav_io.c */; }; - 15D35F1F1C20185500E3717A /* wav_io.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F151C20185500E3717A /* wav_io.h */; }; - 15D35F251C20186200E3717A /* bitwise.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F211C20186200E3717A /* bitwise.c */; }; - 15D35F261C20186200E3717A /* framing.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F221C20186200E3717A /* framing.c */; settings = {COMPILER_FLAGS = "-w"; }; }; - 15D35F271C20186200E3717A /* ogg.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F231C20186200E3717A /* ogg.h */; }; - 15D35F281C20186200E3717A /* os_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F241C20186200E3717A /* os_types.h */; }; - 15D35F301C20187200E3717A /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F2A1C20187200E3717A /* info.c */; settings = {COMPILER_FLAGS = "-w"; }; }; - 15D35F311C20187200E3717A /* internal.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F2B1C20187200E3717A /* internal.c */; }; - 15D35F321C20187200E3717A /* internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F2C1C20187200E3717A /* internal.h */; }; - 15D35F331C20187200E3717A /* opusfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F2D1C20187200E3717A /* opusfile.c */; settings = {COMPILER_FLAGS = "-w"; }; }; - 15D35F341C20187200E3717A /* opusfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F2E1C20187200E3717A /* opusfile.h */; }; - 15D35F351C20187200E3717A /* stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F2F1C20187200E3717A /* stream.c */; }; - 15D35F511C20187E00E3717A /* ASQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F361C20187E00E3717A /* ASQueue.h */; }; - 15D35F521C20187E00E3717A /* ASQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F371C20187E00E3717A /* ASQueue.m */; }; - 15D35F531C20187E00E3717A /* AAOpusAudioRecorder.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F381C20187E00E3717A /* AAOpusAudioRecorder.h */; }; - 15D35F541C20187E00E3717A /* AAOpusAudioRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F391C20187E00E3717A /* AAOpusAudioRecorder.m */; settings = {COMPILER_FLAGS = "-w"; }; }; - 15D35F551C20187E00E3717A /* AAAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F3A1C20187E00E3717A /* AAAlertView.h */; }; - 15D35F561C20187E00E3717A /* AAAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F3B1C20187E00E3717A /* AAAlertView.m */; }; - 15D35F571C20187E00E3717A /* AAAudioRecorder.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F3C1C20187E00E3717A /* AAAudioRecorder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 15D35F591C20187E00E3717A /* AATimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F3E1C20187E00E3717A /* AATimer.h */; }; - 15D35F5A1C20187E00E3717A /* AATimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F3F1C20187E00E3717A /* AATimer.m */; }; - 15D35F5B1C20187E00E3717A /* AAAudioPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F401C20187E00E3717A /* AAAudioPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 15D35F5C1C20187E00E3717A /* AAAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F411C20187E00E3717A /* AAAudioPlayer.m */; }; - 15D35F5D1C20187E00E3717A /* AANativeAudioPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F421C20187E00E3717A /* AANativeAudioPlayer.h */; }; - 15D35F5E1C20187E00E3717A /* AANativeAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F431C20187E00E3717A /* AANativeAudioPlayer.m */; }; - 15D35F5F1C20187E00E3717A /* AAOpusAudioPlayerAU.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F441C20187E00E3717A /* AAOpusAudioPlayerAU.h */; }; - 15D35F601C20187E00E3717A /* AAOpusAudioPlayerAU.mm in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F451C20187E00E3717A /* AAOpusAudioPlayerAU.mm */; settings = {COMPILER_FLAGS = "-w"; }; }; - 15D35F611C20187E00E3717A /* AAAudioBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F461C20187E00E3717A /* AAAudioBuffer.h */; }; - 15D35F621C20187E00E3717A /* AAModernConversationAudioPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F471C20187E00E3717A /* AAModernConversationAudioPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 15D35F631C20187E00E3717A /* AAModernConversationAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F481C20187E00E3717A /* AAModernConversationAudioPlayer.m */; }; - 15D35F641C20187E00E3717A /* AAModernConversationAudioPlayerContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F491C20187E00E3717A /* AAModernConversationAudioPlayerContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 15D35F651C20187E00E3717A /* AAModernConversationAudioPlayerContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F4A1C20187E00E3717A /* AAModernConversationAudioPlayerContext.m */; }; - 15D35F661C20187E00E3717A /* NSObject+TGLock.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F4B1C20187E00E3717A /* NSObject+TGLock.h */; }; - 15D35F671C20187E00E3717A /* NSObject+TGLock.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F4C1C20187E00E3717A /* NSObject+TGLock.m */; }; - 15D35F681C20187E00E3717A /* AAModernViewInlineMediaContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F4D1C20187E00E3717A /* AAModernViewInlineMediaContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 15D35F691C20187E00E3717A /* AAModernViewInlineMediaContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F4E1C20187E00E3717A /* AAModernViewInlineMediaContext.m */; }; - 15D35F6A1C20187E00E3717A /* AATimerTarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F4F1C20187E00E3717A /* AATimerTarget.h */; }; - 15D35F6B1C20187E00E3717A /* AATimerTarget.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F501C20187E00E3717A /* AATimerTarget.m */; }; - 15D35F6F1C20196E00E3717A /* AARecordAudioController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F6E1C20196E00E3717A /* AARecordAudioController.swift */; }; - 15D35F751C201B6B00E3717A /* AACustomPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F731C201B6B00E3717A /* AACustomPresentationController.swift */; }; - 15D35F761C201B6B00E3717A /* AACustomPresentationAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F741C201B6B00E3717A /* AACustomPresentationAnimationController.swift */; }; - 15D35F781C20273D00E3717A /* AAAudioRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F3D1C20187E00E3717A /* AAAudioRecorder.m */; settings = {COMPILER_FLAGS = "-w"; }; }; - 15F89F071C211FED00776ACD /* opus_defines.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F031C211FED00776ACD /* opus_defines.h */; }; - 15F89F081C211FED00776ACD /* opus_multistream.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F041C211FED00776ACD /* opus_multistream.h */; }; - 15F89F091C211FED00776ACD /* opus_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F051C211FED00776ACD /* opus_types.h */; }; - 15F89F0A1C211FED00776ACD /* opus.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F061C211FED00776ACD /* opus.h */; }; - 9AA6A41F1D08568A00957A7F /* AASettingsMediaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AA6A41E1D08568A00957A7F /* AASettingsMediaViewController.swift */; }; - 9AAE96481CF81F140092E366 /* AARingtonesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AAE96471CF81F140092E366 /* AARingtonesViewController.swift */; }; - BDF21708B376E212CEAEC43D /* Pods_ActorSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 354C3EFA48FBFAEAD0DEEE17 /* Pods_ActorSDK.framework */; }; - BE237C9D1C422FFA00060648 /* AAStickersKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE237C9C1C422FFA00060648 /* AAStickersKeyboard.swift */; }; - BE2621571C4656D700A817AB /* AAConvActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2621561C4656D700A817AB /* AAConvActionSheet.swift */; }; - BE2621591C4656EE00A817AB /* AAThumbnailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2621581C4656EE00A817AB /* AAThumbnailView.swift */; }; - BE281CC51C502B230042F6D4 /* AAVoiceRecorderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE281CC41C502B230042F6D4 /* AAVoiceRecorderView.swift */; }; - BE4DBE6C1C5723BE00A31894 /* AttributedLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE4DBE6B1C5723BE00A31894 /* AttributedLabel.swift */; }; - BEAC2B311C42D683007F7A2F /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 15F89F001C211FDE00776ACD /* libopus.a */; }; - BED5A1D71C4839590045FDB0 /* NYTPhotoViewerCloseButtonX.png in Resources */ = {isa = PBXBuildFile; fileRef = BED5A1D11C4839590045FDB0 /* NYTPhotoViewerCloseButtonX.png */; }; - BED5A1D81C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BED5A1D21C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@2x.png */; }; - BED5A1D91C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = BED5A1D31C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@3x.png */; }; - BED5A1DA1C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape.png in Resources */ = {isa = PBXBuildFile; fileRef = BED5A1D41C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape.png */; }; - BED5A1DB1C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BED5A1D51C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@2x.png */; }; - BED5A1DC1C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = BED5A1D61C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@3x.png */; }; - BED5A1F11C48396A0045FDB0 /* NYTPhotoCaptionView.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1DF1C48396A0045FDB0 /* NYTPhotoCaptionView.m */; }; - BED5A1F31C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1E11C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.m */; }; - BED5A1F51C48396A0045FDB0 /* NYTPhotosDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1E31C48396A0045FDB0 /* NYTPhotosDataSource.m */; }; - BED5A1F71C48396A0045FDB0 /* NYTPhotosOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1E51C48396A0045FDB0 /* NYTPhotosOverlayView.m */; }; - BED5A1F81C48396A0045FDB0 /* NYTPhotosViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = BED5A1E61C48396A0045FDB0 /* NYTPhotosViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BED5A1F91C48396A0045FDB0 /* NYTPhotosViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1E71C48396A0045FDB0 /* NYTPhotosViewController.m */; }; - BED5A1FB1C48396A0045FDB0 /* NYTPhotoTransitionAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1E91C48396A0045FDB0 /* NYTPhotoTransitionAnimator.m */; }; - BED5A1FD1C48396A0045FDB0 /* NYTPhotoTransitionController.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1EB1C48396A0045FDB0 /* NYTPhotoTransitionController.m */; }; - BED5A1FE1C48396A0045FDB0 /* NYTPhotoViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = BED5A1EC1C48396A0045FDB0 /* NYTPhotoViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BED5A1FF1C48396A0045FDB0 /* NYTPhotoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1ED1C48396A0045FDB0 /* NYTPhotoViewController.m */; }; - BED5A2011C48396A0045FDB0 /* NYTScalingImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1EF1C48396A0045FDB0 /* NYTScalingImageView.m */; }; - BED5A2071C4839790045FDB0 /* NYTPhoto.h in Headers */ = {isa = PBXBuildFile; fileRef = BED5A2031C4839790045FDB0 /* NYTPhoto.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BED5A20F1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A20D1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.m */; }; - BED5A2111C48413C0045FDB0 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */ = {isa = PBXBuildFile; fileRef = BED5A2041C4839790045FDB0 /* NYTPhotoCaptionViewLayoutWidthHinting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BED5A2121C48413C0045FDB0 /* NYTPhotoContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = BED5A2051C4839790045FDB0 /* NYTPhotoContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BED5A2131C48413C0045FDB0 /* NYTPhotosViewControllerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = BED5A2061C4839790045FDB0 /* NYTPhotosViewControllerDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BEE6EB011C4D7B7500A2280E /* AASettingsWallpapersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEE6EB001C4D7B7500A2280E /* AASettingsWallpapersController.swift */; }; - BEE6EB041C4D9A4900A2280E /* AAWallpapersCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEE6EB031C4D9A4900A2280E /* AAWallpapersCell.swift */; }; - BEF11DB61C466D800076400A /* begin_record.caf in Resources */ = {isa = PBXBuildFile; fileRef = 153F6B3C1C2A9B1900C0B960 /* begin_record.caf */; }; - BEFE68D51C4657360001F2D6 /* AAThumbnailCollectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEFE68D41C4657360001F2D6 /* AAThumbnailCollectionCell.swift */; }; -/* End PBXBuildFile section */ +cd ActorSDK/Sources/ActorCore +make translate +make build -j3 -/* Begin PBXFileReference section */ - 060134FD1C95ED4C00A18C4E /* YYAsyncLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYAsyncLayer.h; sourceTree = ""; }; - 060134FE1C95ED4C00A18C4E /* YYAsyncLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYAsyncLayer.m; sourceTree = ""; }; - 060134FF1C95ED4C00A18C4E /* YYSentinel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYSentinel.h; sourceTree = ""; }; - 060135001C95ED4C00A18C4E /* YYSentinel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYSentinel.m; sourceTree = ""; }; - 060135011C95ED4C00A18C4E /* YYTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTransaction.h; sourceTree = ""; }; - 060135021C95ED4C00A18C4E /* YYTransaction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTransaction.m; sourceTree = ""; }; - 0601BBB11CA4C7DE00AEFA81 /* ElegantPresentations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ElegantPresentations.swift; sourceTree = ""; }; - 0601BBB31CA4C80D00AEFA81 /* ElegantPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ElegantPresentationController.swift; sourceTree = ""; }; - 06129AA51C8359FB0099286B /* CocoaLifecycleRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaLifecycleRuntime.swift; sourceTree = ""; }; - 06129AA81C8394700099286B /* AAAudioManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAudioManager.swift; sourceTree = ""; }; - 06129AAA1C83B80A0099286B /* AAAudioRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAudioRouter.swift; sourceTree = ""; }; - 0618509D1C9582DD00C522D5 /* AABackgroundCellRenderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABackgroundCellRenderer.swift; sourceTree = ""; }; - 0618509F1C95CA2600C522D5 /* CocoaDispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaDispatcher.swift; sourceTree = ""; }; - 061850A51C95CBF000C522D5 /* YYTextContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextContainerView.h; sourceTree = ""; }; - 061850A61C95CBF000C522D5 /* YYTextContainerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextContainerView.m; sourceTree = ""; }; - 061850A71C95CBF000C522D5 /* YYTextDebugOption.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextDebugOption.h; sourceTree = ""; }; - 061850A81C95CBF000C522D5 /* YYTextDebugOption.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextDebugOption.m; sourceTree = ""; }; - 061850A91C95CBF000C522D5 /* YYTextEffectWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextEffectWindow.h; sourceTree = ""; }; - 061850AA1C95CBF000C522D5 /* YYTextEffectWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextEffectWindow.m; sourceTree = ""; }; - 061850AB1C95CBF000C522D5 /* YYTextInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextInput.h; sourceTree = ""; }; - 061850AC1C95CBF000C522D5 /* YYTextInput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextInput.m; sourceTree = ""; }; - 061850AD1C95CBF000C522D5 /* YYTextKeyboardManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextKeyboardManager.h; sourceTree = ""; }; - 061850AE1C95CBF000C522D5 /* YYTextKeyboardManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextKeyboardManager.m; sourceTree = ""; }; - 061850AF1C95CBF000C522D5 /* YYTextLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextLayout.h; sourceTree = ""; }; - 061850B01C95CBF000C522D5 /* YYTextLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextLayout.m; sourceTree = ""; }; - 061850B11C95CBF000C522D5 /* YYTextLine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextLine.h; sourceTree = ""; }; - 061850B21C95CBF000C522D5 /* YYTextLine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextLine.m; sourceTree = ""; }; - 061850B31C95CBF000C522D5 /* YYTextMagnifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextMagnifier.h; sourceTree = ""; }; - 061850B41C95CBF000C522D5 /* YYTextMagnifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextMagnifier.m; sourceTree = ""; }; - 061850B51C95CBF000C522D5 /* YYTextSelectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextSelectionView.h; sourceTree = ""; }; - 061850B61C95CBF000C522D5 /* YYTextSelectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextSelectionView.m; sourceTree = ""; }; - 061850B81C95CBF000C522D5 /* YYTextArchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextArchiver.h; sourceTree = ""; }; - 061850B91C95CBF000C522D5 /* YYTextArchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextArchiver.m; sourceTree = ""; }; - 061850BA1C95CBF000C522D5 /* YYTextAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextAttribute.h; sourceTree = ""; }; - 061850BB1C95CBF000C522D5 /* YYTextAttribute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextAttribute.m; sourceTree = ""; }; - 061850BC1C95CBF000C522D5 /* YYTextParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextParser.h; sourceTree = ""; }; - 061850BD1C95CBF000C522D5 /* YYTextParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextParser.m; sourceTree = ""; }; - 061850BE1C95CBF000C522D5 /* YYTextRubyAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextRubyAnnotation.h; sourceTree = ""; }; - 061850BF1C95CBF000C522D5 /* YYTextRubyAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextRubyAnnotation.m; sourceTree = ""; }; - 061850C01C95CBF000C522D5 /* YYTextRunDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextRunDelegate.h; sourceTree = ""; }; - 061850C11C95CBF000C522D5 /* YYTextRunDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextRunDelegate.m; sourceTree = ""; }; - 061850C31C95CBF000C522D5 /* NSAttributedString+YYText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSAttributedString+YYText.h"; sourceTree = ""; }; - 061850C41C95CBF000C522D5 /* NSAttributedString+YYText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSAttributedString+YYText.m"; sourceTree = ""; }; - 061850C51C95CBF000C522D5 /* NSParagraphStyle+YYText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSParagraphStyle+YYText.h"; sourceTree = ""; }; - 061850C61C95CBF000C522D5 /* NSParagraphStyle+YYText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSParagraphStyle+YYText.m"; sourceTree = ""; }; - 061850C71C95CBF000C522D5 /* UIPasteboard+YYText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIPasteboard+YYText.h"; sourceTree = ""; }; - 061850C81C95CBF000C522D5 /* UIPasteboard+YYText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIPasteboard+YYText.m"; sourceTree = ""; }; - 061850C91C95CBF000C522D5 /* UIView+YYText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+YYText.h"; sourceTree = ""; }; - 061850CA1C95CBF000C522D5 /* UIView+YYText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+YYText.m"; sourceTree = ""; }; - 061850CB1C95CBF000C522D5 /* YYTextAsyncLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextAsyncLayer.h; sourceTree = ""; }; - 061850CC1C95CBF000C522D5 /* YYTextAsyncLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextAsyncLayer.m; sourceTree = ""; }; - 061850CD1C95CBF000C522D5 /* YYTextTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextTransaction.h; sourceTree = ""; }; - 061850CE1C95CBF000C522D5 /* YYTextTransaction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextTransaction.m; sourceTree = ""; }; - 061850CF1C95CBF000C522D5 /* YYTextUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextUtilities.h; sourceTree = ""; }; - 061850D01C95CBF000C522D5 /* YYTextUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextUtilities.m; sourceTree = ""; }; - 061850D11C95CBF000C522D5 /* YYTextWeakProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextWeakProxy.h; sourceTree = ""; }; - 061850D21C95CBF000C522D5 /* YYTextWeakProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextWeakProxy.m; sourceTree = ""; }; - 061850D31C95CBF000C522D5 /* YYDispatchQueuePool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYDispatchQueuePool.h; sourceTree = ""; }; - 061850D41C95CBF000C522D5 /* YYDispatchQueuePool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYDispatchQueuePool.m; sourceTree = ""; }; - 061850D51C95CBF000C522D5 /* YYLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYLabel.h; sourceTree = ""; }; - 061850D61C95CBF000C522D5 /* YYLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYLabel.m; sourceTree = ""; }; - 061850D71C95CBF000C522D5 /* YYText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYText.h; sourceTree = ""; }; - 061850D81C95CBF000C522D5 /* YYTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextView.h; sourceTree = ""; }; - 061850D91C95CBF000C522D5 /* YYTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextView.m; sourceTree = ""; }; - 06230F3F1BC95BD200A4807B /* RMPhoneFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMPhoneFormat.m; sourceTree = ""; }; - 06230F401BC95BD200A4807B /* RMPhoneFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMPhoneFormat.h; sourceTree = ""; }; - 06230F431BC95C0E00A4807B /* ABPhoneFieldCodes.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ABPhoneFieldCodes.txt; sourceTree = ""; }; - 06230F441BC95C0E00A4807B /* PhoneFormats.dat */ = {isa = PBXFileReference; lastKnownFileType = file; path = PhoneFormats.dat; sourceTree = ""; }; - 063074161BD68E370053DEAF /* bg_3_preview.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg_3_preview.jpg; sourceTree = ""; }; - 063074171BD68E370053DEAF /* bg_2_preview.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg_2_preview.jpg; sourceTree = ""; }; - 063074181BD68E370053DEAF /* bg_1_preview.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg_1_preview.jpg; sourceTree = ""; }; - 064E41B41CA1D2FF00A4A9D1 /* AABigAlertController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABigAlertController.swift; sourceTree = ""; }; - 065974A41BC621F100B8C7DF /* AAAuthNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthNavigationController.swift; sourceTree = ""; }; - 065974A61BC62B3600B8C7DF /* ViewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewExtensions.swift; sourceTree = ""; }; - 065975011BC7534100B8C7DF /* FMDBBridge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FMDBBridge.swift; sourceTree = ""; }; - 065975041BC757A300B8C7DF /* ActorRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorRuntime.swift; sourceTree = ""; }; - 065975061BC7BB4000B8C7DF /* AANavigationBadge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AANavigationBadge.swift; sourceTree = ""; }; - 0659751E1BC7C84E00B8C7DF /* bg_1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg_1.jpg; sourceTree = ""; }; - 0659751F1BC7C84E00B8C7DF /* bg_3.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg_3.jpg; sourceTree = ""; }; - 065975201BC7C84E00B8C7DF /* bg_2.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg_2.jpg; sourceTree = ""; }; - 065975381BC7CA7B00B8C7DF /* Bundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = ""; }; - 0659753A1BC7D22200B8C7DF /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 065975451BC7D34200B8C7DF /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = ""; }; - 065975471BC7D34400B8C7DF /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; - 065975481BC7D34600B8C7DF /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; - 065975491BC7DBA000B8C7DF /* iapetus.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = iapetus.caf; sourceTree = ""; }; - 0659754A1BC7DBA000B8C7DF /* notification.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = notification.caf; sourceTree = ""; }; - 0659754D1BC7DCED00B8C7DF /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; - 0659754E1BC7DD3C00B8C7DF /* highlight-default.min.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "highlight-default.min.css"; sourceTree = ""; }; - 0659754F1BC7DD3C00B8C7DF /* highlight.min.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = highlight.min.js; sourceTree = ""; }; - 065975531BC7DF5100B8C7DF /* CocoaAssetsRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaAssetsRuntime.swift; sourceTree = ""; }; - 065A06B51C6CEFE00012EA09 /* CocoaWebRTCRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaWebRTCRuntime.swift; sourceTree = ""; }; - 066A50D21BC4AE63000E606E /* ActorSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ActorSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 066A50D51BC4AE63000E606E /* ActorSDK.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ActorSDK.h; sourceTree = ""; }; - 066A50D71BC4AE63000E606E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 066A50E11BC4AF9F000E606E /* ActorSDK.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorSDK.swift; sourceTree = ""; }; - 066A51211BC4B55C000E606E /* AADevice.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AADevice.swift; sourceTree = ""; }; - 066A51231BC4B56D000E606E /* Colors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; - 066A51401BC4BB5C000E606E /* AssosiatedObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssosiatedObject.swift; sourceTree = ""; }; - 066A51431BC4BBAF000E606E /* Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Strings.swift; sourceTree = ""; }; - 066A51451BC4BBC3000E606E /* Fonts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fonts.swift; sourceTree = ""; }; - 066A51471BC4BBF4000E606E /* Views.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Views.swift; sourceTree = ""; }; - 066A51491BC4BCE0000E606E /* Dispatch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Dispatch.swift; sourceTree = ""; }; - 066A514B1BC4BD05000E606E /* Collections.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Collections.swift; sourceTree = ""; }; - 066A514D1BC4BDE4000E606E /* Numbers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Numbers.swift; sourceTree = ""; }; - 066A514F1BC4BE06000E606E /* AARegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARegex.swift; sourceTree = ""; }; - 066A51511BC4BE34000E606E /* Logs.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logs.swift; sourceTree = ""; }; - 066A51531BC4BE95000E606E /* Images.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Images.swift; sourceTree = ""; }; - 066A51551BC4BEF5000E606E /* AALocalized.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AALocalized.swift; sourceTree = ""; }; - 066A51581BC4C14A000E606E /* AASwiftlyLRU.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASwiftlyLRU.swift; sourceTree = ""; }; - 066A515A1BC4C178000E606E /* AAHashMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAHashMap.swift; sourceTree = ""; }; - 066A51641BC4C366000E606E /* AATools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATools.swift; sourceTree = ""; }; - 066A51681BC4C366000E606E /* ActorCoreExt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorCoreExt.swift; sourceTree = ""; }; - 066A516F1BC4C373000E606E /* FMDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabase.h; sourceTree = ""; }; - 066A51701BC4C373000E606E /* FMDatabase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabase.m; sourceTree = ""; }; - 066A51711BC4C373000E606E /* FMDatabase+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "FMDatabase+Private.h"; sourceTree = ""; }; - 066A51721BC4C373000E606E /* FMDatabaseAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabaseAdditions.h; sourceTree = ""; }; - 066A51731BC4C373000E606E /* FMDatabaseAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabaseAdditions.m; sourceTree = ""; }; - 066A51741BC4C373000E606E /* FMDatabasePool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabasePool.h; sourceTree = ""; }; - 066A51751BC4C373000E606E /* FMDatabasePool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabasePool.m; sourceTree = ""; }; - 066A51761BC4C373000E606E /* FMDatabaseQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabaseQueue.h; sourceTree = ""; }; - 066A51771BC4C373000E606E /* FMDatabaseQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabaseQueue.m; sourceTree = ""; }; - 066A51781BC4C373000E606E /* FMResultSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMResultSet.h; sourceTree = ""; }; - 066A51791BC4C373000E606E /* FMResultSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMResultSet.m; sourceTree = ""; }; - 066A51861BC4C383000E606E /* CocoaStorageRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaStorageRuntime.swift; sourceTree = ""; }; - 066A51871BC4C383000E606E /* iOSNotificationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iOSNotificationProvider.swift; sourceTree = ""; }; - 066A51881BC4C383000E606E /* iOSPhoneBookProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iOSPhoneBookProvider.swift; sourceTree = ""; }; - 066A51891BC4C383000E606E /* CocoaNetworkRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaNetworkRuntime.swift; sourceTree = ""; }; - 066A518A1BC4C383000E606E /* CocoaHttpRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaHttpRuntime.swift; sourceTree = ""; }; - 066A518B1BC4C383000E606E /* CocoaFileSystemRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaFileSystemRuntime.swift; sourceTree = ""; }; - 066A51951BC4C390000E606E /* FMDBList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FMDBList.swift; sourceTree = ""; }; - 066A51961BC4C390000E606E /* FMDBKeyValue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FMDBKeyValue.swift; sourceTree = ""; }; - 066A51981BC4C390000E606E /* UDPreferencesStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UDPreferencesStorage.swift; sourceTree = ""; }; - 066A51991BC4C390000E606E /* FMDBExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FMDBExtensions.swift; sourceTree = ""; }; - 066A51FF1BC4E0B0000E606E /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; - 066A52041BC4E962000E606E /* convert.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = convert.py; sourceTree = ""; }; - 066A52051BC4E962000E606E /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; - 066A52141BC4EE04000E606E /* AAAvatarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAvatarView.swift; sourceTree = ""; }; - 066A52191BC4EEAC000E606E /* AAManagedTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAManagedTable.swift; sourceTree = ""; }; - 066A521A1BC4EEAC000E606E /* AAManagedSection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAManagedSection.swift; sourceTree = ""; }; - 066A521B1BC4EEAC000E606E /* AAManagedRange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAManagedRange.swift; sourceTree = ""; }; - 066A521C1BC4EEAC000E606E /* ManagedBindedCells.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedBindedCells.swift; sourceTree = ""; }; - 066A521D1BC4EEAC000E606E /* ManagedCells.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedCells.swift; sourceTree = ""; }; - 066A521E1BC4EEAC000E606E /* AAContentTableController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAContentTableController.swift; sourceTree = ""; }; - 066A521F1BC4EEAC000E606E /* AAManagedTableController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAManagedTableController.swift; sourceTree = ""; }; - 066A52201BC4EEAC000E606E /* ManagedTableExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedTableExtensions.swift; sourceTree = ""; }; - 066A52211BC4EEAC000E606E /* ManagedAlerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedAlerts.swift; sourceTree = ""; }; - 066A522C1BC4EEBA000E606E /* AACommonCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACommonCell.swift; sourceTree = ""; }; - 066A522D1BC4EEBA000E606E /* AATextCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATextCell.swift; sourceTree = ""; }; - 066A522E1BC4EEBA000E606E /* AATitledCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATitledCell.swift; sourceTree = ""; }; - 066A522F1BC4EEBA000E606E /* AATableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATableViewCell.swift; sourceTree = ""; }; - 066A52301BC4EEBA000E606E /* AAHeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAHeaderCell.swift; sourceTree = ""; }; - 066A52311BC4EEBA000E606E /* AAEditCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAEditCell.swift; sourceTree = ""; }; - 066A523A1BC4EECD000E606E /* AABigPlaceholderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABigPlaceholderView.swift; sourceTree = ""; }; - 066A523C1BC4EECD000E606E /* AATableViewHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATableViewHeader.swift; sourceTree = ""; }; - 066A523D1BC4EECD000E606E /* AATableViewSeparator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATableViewSeparator.swift; sourceTree = ""; }; - 066A523F1BC4EECD000E606E /* AAAvatarCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAvatarCell.swift; sourceTree = ""; }; - 066A52461BC4EED5000E606E /* AAProgressView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAProgressView.swift; sourceTree = ""; }; - 066A52491BC4EF49000E606E /* AAViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAViewController.swift; sourceTree = ""; }; - 066A524D1BC4EF61000E606E /* AAImagePickerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAImagePickerController.swift; sourceTree = ""; }; - 066A524E1BC4EF61000E606E /* AANavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AANavigationController.swift; sourceTree = ""; }; - 066A524F1BC4EF61000E606E /* AATableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATableViewController.swift; sourceTree = ""; }; - 066A52501BC4EF61000E606E /* AACollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACollectionViewController.swift; sourceTree = ""; }; - 066A52511BC4EF61000E606E /* Alerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Alerts.swift; sourceTree = ""; }; - 066A52521BC4EF61000E606E /* Executions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Executions.swift; sourceTree = ""; }; - 066A52531BC4EF61000E606E /* Navigations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Navigations.swift; sourceTree = ""; }; - 066A525B1BC502EB000E606E /* ActorSDKDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorSDKDelegate.swift; sourceTree = ""; }; - 066A525D1BC503BB000E606E /* ActorApplicationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorApplicationDelegate.swift; sourceTree = ""; }; - 066A52611BC50E7B000E606E /* AACountryViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACountryViewController.swift; sourceTree = ""; }; - 066A52651BC50E7B000E606E /* AAAuthViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthViewController.swift; sourceTree = ""; }; - 066A526C1BC50E8B000E606E /* AAAuthCountryCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthCountryCell.swift; sourceTree = ""; }; - 066A526F1BC5101A000E606E /* ABPhoneField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ABPhoneField.h; sourceTree = ""; }; - 066A52701BC5101A000E606E /* ABPhoneField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ABPhoneField.m; sourceTree = ""; }; - 066A527C1BC51ED0000E606E /* AARootSplitViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARootSplitViewController.swift; sourceTree = ""; }; - 066A527D1BC51ED0000E606E /* AARootTabViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARootTabViewController.swift; sourceTree = ""; }; - 066A527E1BC51ED0000E606E /* AANoSelectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AANoSelectionViewController.swift; sourceTree = ""; }; - 066A52C51BC521EA000E606E /* AAEditTextController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAEditTextController.swift; sourceTree = ""; }; - 066A52C61BC521EA000E606E /* AAEditFieldController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAEditFieldController.swift; sourceTree = ""; }; - 066A52CA1BC521FA000E606E /* AADialogsListContentController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AADialogsListContentController.swift; sourceTree = ""; }; - 066A52CB1BC521FA000E606E /* AADialogsListContentControllerDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AADialogsListContentControllerDelegate.swift; sourceTree = ""; }; - 066A52CF1BC52204000E606E /* AADialogCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AADialogCell.swift; sourceTree = ""; }; - 066A52D01BC52204000E606E /* AADialogSearchCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AADialogSearchCell.swift; sourceTree = ""; }; - 066A52D41BC52378000E606E /* AAContactsListContentController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAContactsListContentController.swift; sourceTree = ""; }; - 066A52D51BC52378000E606E /* AAContactsListContentControllerDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAContactsListContentControllerDelegate.swift; sourceTree = ""; }; - 066A52D91BC52385000E606E /* AAContactActionCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAContactActionCell.swift; sourceTree = ""; }; - 066A52DA1BC52385000E606E /* AAContactCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAContactCell.swift; sourceTree = ""; }; - 066A52DE1BC5241F000E606E /* AAWebActionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAWebActionController.swift; sourceTree = ""; }; - 066A52E21BC52A20000E606E /* AAGroupViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupViewController.swift; sourceTree = ""; }; - 066A52E31BC52A20000E606E /* AAAddParticipantViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAddParticipantViewController.swift; sourceTree = ""; }; - 066A52E41BC52A20000E606E /* AAInviteLinkViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAInviteLinkViewController.swift; sourceTree = ""; }; - 066A52E91BC52A2B000E606E /* AAGroupMemberCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupMemberCell.swift; sourceTree = ""; }; - 066A52EC1BC52B02000E606E /* AASettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsViewController.swift; sourceTree = ""; }; - 066A52ED1BC52B02000E606E /* AASettingsNotificationsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsNotificationsViewController.swift; sourceTree = ""; }; - 066A52EE1BC52B02000E606E /* AASettingsPrivacyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsPrivacyViewController.swift; sourceTree = ""; }; - 066A52EF1BC52B02000E606E /* AASettingsWallpapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsWallpapper.swift; sourceTree = ""; }; - 066A52F51BC52B13000E606E /* AAWallpapperPreviewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAWallpapperPreviewCell.swift; sourceTree = ""; }; - 066A52F61BC52B13000E606E /* AAWallpapperSettingsCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAWallpapperSettingsCell.swift; sourceTree = ""; }; - 066A52FA1BC52FA8000E606E /* AAComposeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAComposeController.swift; sourceTree = ""; }; - 066A52FB1BC52FA8000E606E /* AAGroupCreateViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupCreateViewController.swift; sourceTree = ""; }; - 066A52FC1BC52FA8000E606E /* AAGroupMembersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupMembersController.swift; sourceTree = ""; }; - 066A53031BC53177000E606E /* AAContactsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAContactsViewController.swift; sourceTree = ""; }; - 066A53061BC53183000E606E /* AARecentViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARecentViewController.swift; sourceTree = ""; }; - 066A530A1BC531A2000E606E /* AAUserViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAUserViewController.swift; sourceTree = ""; }; - 066A530D1BC53317000E606E /* AAWallpapperPreviewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAWallpapperPreviewController.swift; sourceTree = ""; }; - 066A530E1BC53317000E606E /* AACorePreviewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACorePreviewController.swift; sourceTree = ""; }; - 066A530F1BC53317000E606E /* AAPhotoPreviewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAPhotoPreviewController.swift; sourceTree = ""; }; - 066A53141BC533D5000E606E /* AAConversationContentController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAConversationContentController.swift; sourceTree = ""; }; - 066A53161BC533DD000E606E /* AABubbles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbles.swift; sourceTree = ""; }; - 066A53191BC533E7000E606E /* AAAutoCompleteCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAutoCompleteCell.swift; sourceTree = ""; }; - 066A531C1BC533F5000E606E /* AABubbleBackgroundProcessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleBackgroundProcessor.swift; sourceTree = ""; }; - 066A531D1BC533F5000E606E /* BubbleLayouts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BubbleLayouts.swift; sourceTree = ""; }; - 066A531E1BC533F5000E606E /* AAMessagesFlowLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAMessagesFlowLayout.swift; sourceTree = ""; }; - 066A531F1BC533F5000E606E /* Caches.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Caches.swift; sourceTree = ""; }; - 066A53251BC53406000E606E /* AABubbleCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleCell.swift; sourceTree = ""; }; - 066A53261BC53406000E606E /* AABubbleTextCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleTextCell.swift; sourceTree = ""; }; - 066A53271BC53406000E606E /* AABubbleServiceCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleServiceCell.swift; sourceTree = ""; }; - 066A53281BC53406000E606E /* AABubbleBaseFileCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleBaseFileCell.swift; sourceTree = ""; }; - 066A53291BC53406000E606E /* AABubbleMediaCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleMediaCell.swift; sourceTree = ""; }; - 066A532A1BC53406000E606E /* AABubbleDocumentCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleDocumentCell.swift; sourceTree = ""; }; - 066A53311BC534F5000E606E /* AAFileTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAFileTypes.swift; sourceTree = ""; }; - 066A53361BC537CA000E606E /* ConversationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConversationViewController.swift; sourceTree = ""; }; - 066A53381BC5456B000E606E /* ActorStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorStyle.swift; sourceTree = ""; }; - 066CBCDB1C8D419F004507E2 /* AAAuthEmailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthEmailViewController.swift; sourceTree = ""; }; - 067B67531D45341D00B9A238 /* AAGroupViewMembersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupViewMembersController.swift; sourceTree = ""; }; - 068AFC381C94A0050055F503 /* AADialogListProcessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AADialogListProcessor.swift; sourceTree = ""; }; - 069CF4C41BCB909A00C66E12 /* CLBackspaceDetectingTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLBackspaceDetectingTextField.h; sourceTree = ""; }; - 069CF4C51BCB909A00C66E12 /* CLBackspaceDetectingTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLBackspaceDetectingTextField.m; sourceTree = ""; }; - 069CF4C61BCB909A00C66E12 /* CLToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLToken.h; sourceTree = ""; }; - 069CF4C71BCB909A00C66E12 /* CLToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLToken.m; sourceTree = ""; }; - 069CF4C81BCB909A00C66E12 /* CLTokenInputView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLTokenInputView.h; sourceTree = ""; }; - 069CF4C91BCB909A00C66E12 /* CLTokenInputView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLTokenInputView.m; sourceTree = ""; }; - 069CF4CA1BCB909A00C66E12 /* CLTokenView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLTokenView.h; sourceTree = ""; }; - 069CF4CB1BCB909A00C66E12 /* CLTokenView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLTokenView.m; sourceTree = ""; }; - 06ABFE2F1D3FAF800031A0D6 /* GCDAsyncSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDAsyncSocket.h; sourceTree = ""; }; - 06ABFE301D3FAF800031A0D6 /* GCDAsyncSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDAsyncSocket.m; sourceTree = ""; }; - 06ABFE371D3FCCE30031A0D6 /* AAGroupEditInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupEditInfoViewController.swift; sourceTree = ""; }; - 06ABFE391D410D2D0031A0D6 /* AAGroupTypeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupTypeController.swift; sourceTree = ""; }; - 06ABFE3C1D41283A0031A0D6 /* AAGroupAdministrationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupAdministrationViewController.swift; sourceTree = ""; }; - 06B489EC1C9F6EBC0054245B /* AAStickerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAStickerView.swift; sourceTree = ""; }; - 06C1D0761C8BC9FC00B73632 /* AAAuthNameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthNameViewController.swift; sourceTree = ""; }; - 06C1D07A1C8BFE5C00B73632 /* AAAuthPhoneViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthPhoneViewController.swift; sourceTree = ""; }; - 06C1D07D1C8D0DE900B73632 /* Telephony.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Telephony.swift; sourceTree = ""; }; - 06CE898B1BD841C9005A5530 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 06CE898F1BD84DF5005A5530 /* ActorSDKAnalytics.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorSDKAnalytics.swift; sourceTree = ""; }; - 06D5C0561C8D6E20002D5045 /* AAAuthLogInViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthLogInViewController.swift; sourceTree = ""; }; - 06D5C0591C8E9B3B002D5045 /* Promises.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Promises.swift; sourceTree = ""; }; - 06D5C05B1C8EA842002D5045 /* AAAuthOTPViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthOTPViewController.swift; sourceTree = ""; }; - 06E1648E1C96D99F005AFB94 /* CocoaCrypto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaCrypto.swift; sourceTree = ""; }; - 06E164931C96FF3D005AFB94 /* module.map */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = module.map; sourceTree = ""; }; - 06E322C81C69344A00D66F53 /* iOSCallsProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iOSCallsProvider.swift; sourceTree = ""; }; - 06E3230D1C6942C400D66F53 /* WebRTC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebRTC.h; sourceTree = ""; }; - 06E323101C694C1D00D66F53 /* WebRTCExt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebRTCExt.swift; sourceTree = ""; }; - 06E323141C6A7AC000D66F53 /* AACallViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AACallViewController.swift; path = Calls/AACallViewController.swift; sourceTree = ""; }; - 06E3C58A1C746AAC004776CD /* tone.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = tone.m4a; sourceTree = ""; }; - 06E3C58C1C74931F004776CD /* ringtone.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = ringtone.m4a; sourceTree = ""; }; - 06E3C5B71C80EE20004776CD /* AACircleButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACircleButton.swift; sourceTree = ""; }; - 06E7B2461C0F8D7A0090660C /* AALocationPickerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AALocationPickerController.swift; sourceTree = ""; }; - 06E7B2491C0F92140090660C /* AABubbleLocationCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleLocationCell.swift; sourceTree = ""; }; - 06E7B24B1C0FAB500090660C /* AAMapFastView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAMapFastView.swift; sourceTree = ""; }; - 06E7B2511C1345E70090660C /* AAMapPinPointView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAMapPinPointView.swift; sourceTree = ""; }; - 06E7B2531C139B6F0090660C /* AABubbleContactCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleContactCell.swift; sourceTree = ""; }; - 152AA8921C2989270030DEEE /* SLKInputAccessoryView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKInputAccessoryView.h; sourceTree = ""; }; - 152AA8931C2989270030DEEE /* SLKInputAccessoryView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SLKInputAccessoryView.m; sourceTree = ""; }; - 152AA8941C2989270030DEEE /* SLKTextInputbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKTextInputbar.h; sourceTree = ""; }; - 152AA8951C2989270030DEEE /* SLKTextInputbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SLKTextInputbar.m; sourceTree = ""; }; - 152AA8961C2989270030DEEE /* SLKTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKTextView.h; sourceTree = ""; }; - 152AA8971C2989270030DEEE /* SLKTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SLKTextView.m; sourceTree = ""; }; - 152AA8981C2989270030DEEE /* SLKTextView+SLKAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SLKTextView+SLKAdditions.h"; sourceTree = ""; }; - 152AA8991C2989270030DEEE /* SLKTextView+SLKAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SLKTextView+SLKAdditions.m"; sourceTree = ""; }; - 152AA89A1C2989270030DEEE /* SLKTextViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKTextViewController.h; sourceTree = ""; }; - 152AA89B1C2989270030DEEE /* SLKTextViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SLKTextViewController.m; sourceTree = ""; }; - 152AA89C1C2989270030DEEE /* SLKTypingIndicatorProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKTypingIndicatorProtocol.h; sourceTree = ""; }; - 152AA89D1C2989270030DEEE /* SLKTypingIndicatorView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKTypingIndicatorView.h; sourceTree = ""; }; - 152AA89E1C2989270030DEEE /* SLKTypingIndicatorView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SLKTypingIndicatorView.m; sourceTree = ""; }; - 152AA89F1C2989270030DEEE /* SLKUIConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKUIConstants.h; sourceTree = ""; }; - 152AA8A01C2989270030DEEE /* UIResponder+SLKAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIResponder+SLKAdditions.h"; sourceTree = ""; }; - 152AA8A11C2989270030DEEE /* UIResponder+SLKAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIResponder+SLKAdditions.m"; sourceTree = ""; }; - 152AA8A21C2989270030DEEE /* UIScrollView+SLKAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+SLKAdditions.h"; sourceTree = ""; }; - 152AA8A31C2989270030DEEE /* UIScrollView+SLKAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+SLKAdditions.m"; sourceTree = ""; }; - 152AA8A41C2989270030DEEE /* UIView+SLKAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+SLKAdditions.h"; sourceTree = ""; }; - 152AA8A51C2989270030DEEE /* UIView+SLKAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+SLKAdditions.m"; sourceTree = ""; }; - 152AA8BC1C298BF00030DEEE /* AASettingsSessionsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsSessionsController.swift; sourceTree = ""; }; - 152AA8BE1C298C4B0030DEEE /* AASettingsLastSeenController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsLastSeenController.swift; sourceTree = ""; }; - 153F6B3C1C2A9B1900C0B960 /* begin_record.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = begin_record.caf; sourceTree = ""; }; - 153F6B5A1C2B109400C0B960 /* AABubbleVoiceCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleVoiceCell.swift; sourceTree = ""; }; - 153F6B5C1C2B3AC500C0B960 /* AABubbleStickerCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleStickerCell.swift; sourceTree = ""; }; - 153F6B601C2BF8EC00C0B960 /* AAAuthWelcomeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AAAuthWelcomeController.swift; path = Auth/AAAuthWelcomeController.swift; sourceTree = ""; }; - 153F6B881C2D7BA300C0B960 /* AATapLabelDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATapLabelDelegate.swift; sourceTree = ""; }; - 153F6B891C2D7BA300C0B960 /* AATapLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATapLabel.swift; sourceTree = ""; }; - 15D35F0C1C20185500E3717A /* diag_range.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = diag_range.c; sourceTree = ""; }; - 15D35F0D1C20185500E3717A /* diag_range.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = diag_range.h; sourceTree = ""; }; - 15D35F0E1C20185500E3717A /* opus_header.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = opus_header.c; sourceTree = ""; }; - 15D35F0F1C20185500E3717A /* opus_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_header.h; sourceTree = ""; }; - 15D35F101C20185500E3717A /* opusenc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opusenc.h; sourceTree = ""; }; - 15D35F111C20185500E3717A /* opusenc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = opusenc.m; sourceTree = ""; }; - 15D35F121C20185500E3717A /* picture.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = picture.c; sourceTree = ""; }; - 15D35F131C20185500E3717A /* picture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = picture.h; sourceTree = ""; }; - 15D35F141C20185500E3717A /* wav_io.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wav_io.c; sourceTree = ""; }; - 15D35F151C20185500E3717A /* wav_io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_io.h; sourceTree = ""; }; - 15D35F211C20186200E3717A /* bitwise.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitwise.c; sourceTree = ""; }; - 15D35F221C20186200E3717A /* framing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = framing.c; sourceTree = ""; }; - 15D35F231C20186200E3717A /* ogg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ogg.h; sourceTree = ""; }; - 15D35F241C20186200E3717A /* os_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = os_types.h; sourceTree = ""; }; - 15D35F2A1C20187200E3717A /* info.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = info.c; sourceTree = ""; }; - 15D35F2B1C20187200E3717A /* internal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = internal.c; sourceTree = ""; }; - 15D35F2C1C20187200E3717A /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = ""; }; - 15D35F2D1C20187200E3717A /* opusfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = opusfile.c; sourceTree = ""; }; - 15D35F2E1C20187200E3717A /* opusfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opusfile.h; sourceTree = ""; }; - 15D35F2F1C20187200E3717A /* stream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stream.c; sourceTree = ""; }; - 15D35F361C20187E00E3717A /* ASQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASQueue.h; sourceTree = ""; }; - 15D35F371C20187E00E3717A /* ASQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASQueue.m; sourceTree = ""; }; - 15D35F381C20187E00E3717A /* AAOpusAudioRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAOpusAudioRecorder.h; sourceTree = ""; }; - 15D35F391C20187E00E3717A /* AAOpusAudioRecorder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAOpusAudioRecorder.m; sourceTree = ""; }; - 15D35F3A1C20187E00E3717A /* AAAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAAlertView.h; sourceTree = ""; }; - 15D35F3B1C20187E00E3717A /* AAAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAAlertView.m; sourceTree = ""; }; - 15D35F3C1C20187E00E3717A /* AAAudioRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAAudioRecorder.h; sourceTree = ""; }; - 15D35F3D1C20187E00E3717A /* AAAudioRecorder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAAudioRecorder.m; sourceTree = ""; }; - 15D35F3E1C20187E00E3717A /* AATimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AATimer.h; sourceTree = ""; }; - 15D35F3F1C20187E00E3717A /* AATimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AATimer.m; sourceTree = ""; }; - 15D35F401C20187E00E3717A /* AAAudioPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAAudioPlayer.h; sourceTree = ""; }; - 15D35F411C20187E00E3717A /* AAAudioPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAAudioPlayer.m; sourceTree = ""; }; - 15D35F421C20187E00E3717A /* AANativeAudioPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AANativeAudioPlayer.h; sourceTree = ""; }; - 15D35F431C20187E00E3717A /* AANativeAudioPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AANativeAudioPlayer.m; sourceTree = ""; }; - 15D35F441C20187E00E3717A /* AAOpusAudioPlayerAU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAOpusAudioPlayerAU.h; sourceTree = ""; }; - 15D35F451C20187E00E3717A /* AAOpusAudioPlayerAU.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AAOpusAudioPlayerAU.mm; sourceTree = ""; }; - 15D35F461C20187E00E3717A /* AAAudioBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAAudioBuffer.h; sourceTree = ""; }; - 15D35F471C20187E00E3717A /* AAModernConversationAudioPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAModernConversationAudioPlayer.h; sourceTree = ""; }; - 15D35F481C20187E00E3717A /* AAModernConversationAudioPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAModernConversationAudioPlayer.m; sourceTree = ""; }; - 15D35F491C20187E00E3717A /* AAModernConversationAudioPlayerContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAModernConversationAudioPlayerContext.h; sourceTree = ""; }; - 15D35F4A1C20187E00E3717A /* AAModernConversationAudioPlayerContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAModernConversationAudioPlayerContext.m; sourceTree = ""; }; - 15D35F4B1C20187E00E3717A /* NSObject+TGLock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+TGLock.h"; sourceTree = ""; }; - 15D35F4C1C20187E00E3717A /* NSObject+TGLock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+TGLock.m"; sourceTree = ""; }; - 15D35F4D1C20187E00E3717A /* AAModernViewInlineMediaContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAModernViewInlineMediaContext.h; sourceTree = ""; }; - 15D35F4E1C20187E00E3717A /* AAModernViewInlineMediaContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAModernViewInlineMediaContext.m; sourceTree = ""; }; - 15D35F4F1C20187E00E3717A /* AATimerTarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AATimerTarget.h; sourceTree = ""; }; - 15D35F501C20187E00E3717A /* AATimerTarget.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AATimerTarget.m; sourceTree = ""; }; - 15D35F6E1C20196E00E3717A /* AARecordAudioController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARecordAudioController.swift; sourceTree = ""; }; - 15D35F731C201B6B00E3717A /* AACustomPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACustomPresentationController.swift; sourceTree = ""; }; - 15D35F741C201B6B00E3717A /* AACustomPresentationAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACustomPresentationAnimationController.swift; sourceTree = ""; }; - 15F89F001C211FDE00776ACD /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libopus.a; sourceTree = ""; }; - 15F89F031C211FED00776ACD /* opus_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_defines.h; sourceTree = ""; }; - 15F89F041C211FED00776ACD /* opus_multistream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_multistream.h; sourceTree = ""; }; - 15F89F051C211FED00776ACD /* opus_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_types.h; sourceTree = ""; }; - 15F89F061C211FED00776ACD /* opus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus.h; sourceTree = ""; }; - 15F89F0F1C21317400776ACD /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; - 354C3EFA48FBFAEAD0DEEE17 /* Pods_ActorSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ActorSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9AA6A41E1D08568A00957A7F /* AASettingsMediaViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsMediaViewController.swift; sourceTree = ""; }; - 9AAE96471CF81F140092E366 /* AARingtonesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARingtonesViewController.swift; sourceTree = ""; }; - BE237C9C1C422FFA00060648 /* AAStickersKeyboard.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAStickersKeyboard.swift; sourceTree = ""; }; - BE2621561C4656D700A817AB /* AAConvActionSheet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAConvActionSheet.swift; sourceTree = ""; }; - BE2621581C4656EE00A817AB /* AAThumbnailView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAThumbnailView.swift; sourceTree = ""; }; - BE281CC41C502B230042F6D4 /* AAVoiceRecorderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAVoiceRecorderView.swift; sourceTree = ""; }; - BE4DBE6B1C5723BE00A31894 /* AttributedLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributedLabel.swift; sourceTree = ""; }; - BED5A1D11C4839590045FDB0 /* NYTPhotoViewerCloseButtonX.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = NYTPhotoViewerCloseButtonX.png; sourceTree = ""; }; - BED5A1D21C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "NYTPhotoViewerCloseButtonX@2x.png"; sourceTree = ""; }; - BED5A1D31C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "NYTPhotoViewerCloseButtonX@3x.png"; sourceTree = ""; }; - BED5A1D41C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = NYTPhotoViewerCloseButtonXLandscape.png; sourceTree = ""; }; - BED5A1D51C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "NYTPhotoViewerCloseButtonXLandscape@2x.png"; sourceTree = ""; }; - BED5A1D61C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "NYTPhotoViewerCloseButtonXLandscape@3x.png"; sourceTree = ""; }; - BED5A1DE1C48396A0045FDB0 /* NYTPhotoCaptionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoCaptionView.h; sourceTree = ""; }; - BED5A1DF1C48396A0045FDB0 /* NYTPhotoCaptionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoCaptionView.m; sourceTree = ""; }; - BED5A1E01C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoDismissalInteractionController.h; sourceTree = ""; }; - BED5A1E11C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoDismissalInteractionController.m; sourceTree = ""; }; - BED5A1E21C48396A0045FDB0 /* NYTPhotosDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotosDataSource.h; sourceTree = ""; }; - BED5A1E31C48396A0045FDB0 /* NYTPhotosDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosDataSource.m; sourceTree = ""; }; - BED5A1E41C48396A0045FDB0 /* NYTPhotosOverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotosOverlayView.h; sourceTree = ""; }; - BED5A1E51C48396A0045FDB0 /* NYTPhotosOverlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosOverlayView.m; sourceTree = ""; }; - BED5A1E61C48396A0045FDB0 /* NYTPhotosViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotosViewController.h; sourceTree = ""; }; - BED5A1E71C48396A0045FDB0 /* NYTPhotosViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosViewController.m; sourceTree = ""; }; - BED5A1E81C48396A0045FDB0 /* NYTPhotoTransitionAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoTransitionAnimator.h; sourceTree = ""; }; - BED5A1E91C48396A0045FDB0 /* NYTPhotoTransitionAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoTransitionAnimator.m; sourceTree = ""; }; - BED5A1EA1C48396A0045FDB0 /* NYTPhotoTransitionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoTransitionController.h; sourceTree = ""; }; - BED5A1EB1C48396A0045FDB0 /* NYTPhotoTransitionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoTransitionController.m; sourceTree = ""; }; - BED5A1EC1C48396A0045FDB0 /* NYTPhotoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoViewController.h; sourceTree = ""; }; - BED5A1ED1C48396A0045FDB0 /* NYTPhotoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoViewController.m; sourceTree = ""; }; - BED5A1EE1C48396A0045FDB0 /* NYTScalingImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTScalingImageView.h; sourceTree = ""; }; - BED5A1EF1C48396A0045FDB0 /* NYTScalingImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTScalingImageView.m; sourceTree = ""; }; - BED5A2031C4839790045FDB0 /* NYTPhoto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhoto.h; sourceTree = ""; }; - BED5A2041C4839790045FDB0 /* NYTPhotoCaptionViewLayoutWidthHinting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoCaptionViewLayoutWidthHinting.h; sourceTree = ""; }; - BED5A2051C4839790045FDB0 /* NYTPhotoContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoContainer.h; sourceTree = ""; }; - BED5A2061C4839790045FDB0 /* NYTPhotosViewControllerDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotosViewControllerDataSource.h; sourceTree = ""; }; - BED5A20C1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSBundle+NYTPhotoViewer.h"; sourceTree = ""; }; - BED5A20D1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSBundle+NYTPhotoViewer.m"; sourceTree = ""; }; - BEE6EB001C4D7B7500A2280E /* AASettingsWallpapersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsWallpapersController.swift; sourceTree = ""; }; - BEE6EB031C4D9A4900A2280E /* AAWallpapersCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAWallpapersCell.swift; sourceTree = ""; }; - BEFE68D41C4657360001F2D6 /* AAThumbnailCollectionCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAThumbnailCollectionCell.swift; sourceTree = ""; }; - E30822B631D108159E8B306B /* Pods-ActorSDK.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorSDK.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK.debug.xcconfig"; sourceTree = ""; }; - F076508E3899D309954904A3 /* Pods-ActorSDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorSDK.release.xcconfig"; path = "Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ +cd "${CONFIGURATION_TEMP_DIR}/j2objc/" +python "${PROJECT_DIR}/ActorSDK/Sources/ActorCore/convert.py" "${PROJECT_DIR}/ActorSDK/Sources/ActorCore/ActorCore.h" -/* Begin PBXFrameworksBuildPhase section */ - 066A50CE1BC4AE63000E606E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 06CE898C1BD841C9005A5530 /* SystemConfiguration.framework in Frameworks */, - BEAC2B311C42D683007F7A2F /* libopus.a in Frameworks */, - 066A52001BC4E0B0000E606E /* libsqlite3.tbd in Frameworks */, - BDF21708B376E212CEAEC43D /* Pods_ActorSDK.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ +cp -af "${PODS_ROOT}/libjingle_peerconnection/libjingle_peerconnection/Headers/" "${CONFIGURATION_BUILD_DIR}/ActorSDK.framework/Headers/" -/* Begin PBXGroup section */ - 061850A31C95CBF000C522D5 /* YYKit */ = { - isa = PBXGroup; - children = ( - 061850A41C95CBF000C522D5 /* Component */, - 061850B71C95CBF000C522D5 /* String */, - 061850C21C95CBF000C522D5 /* Utility */, - 061850D31C95CBF000C522D5 /* YYDispatchQueuePool.h */, - 061850D41C95CBF000C522D5 /* YYDispatchQueuePool.m */, - 061850D51C95CBF000C522D5 /* YYLabel.h */, - 061850D61C95CBF000C522D5 /* YYLabel.m */, - 061850D71C95CBF000C522D5 /* YYText.h */, - 061850D81C95CBF000C522D5 /* YYTextView.h */, - 061850D91C95CBF000C522D5 /* YYTextView.m */, - 060134FD1C95ED4C00A18C4E /* YYAsyncLayer.h */, - 060134FE1C95ED4C00A18C4E /* YYAsyncLayer.m */, - 060134FF1C95ED4C00A18C4E /* YYSentinel.h */, - 060135001C95ED4C00A18C4E /* YYSentinel.m */, - 060135011C95ED4C00A18C4E /* YYTransaction.h */, - 060135021C95ED4C00A18C4E /* YYTransaction.m */, - ); - name = YYKit; - path = Libs/YYKit; - sourceTree = ""; - }; - 061850A41C95CBF000C522D5 /* Component */ = { - isa = PBXGroup; - children = ( - 061850A51C95CBF000C522D5 /* YYTextContainerView.h */, - 061850A61C95CBF000C522D5 /* YYTextContainerView.m */, - 061850A71C95CBF000C522D5 /* YYTextDebugOption.h */, - 061850A81C95CBF000C522D5 /* YYTextDebugOption.m */, - 061850A91C95CBF000C522D5 /* YYTextEffectWindow.h */, - 061850AA1C95CBF000C522D5 /* YYTextEffectWindow.m */, - 061850AB1C95CBF000C522D5 /* YYTextInput.h */, - 061850AC1C95CBF000C522D5 /* YYTextInput.m */, - 061850AD1C95CBF000C522D5 /* YYTextKeyboardManager.h */, - 061850AE1C95CBF000C522D5 /* YYTextKeyboardManager.m */, - 061850AF1C95CBF000C522D5 /* YYTextLayout.h */, - 061850B01C95CBF000C522D5 /* YYTextLayout.m */, - 061850B11C95CBF000C522D5 /* YYTextLine.h */, - 061850B21C95CBF000C522D5 /* YYTextLine.m */, - 061850B31C95CBF000C522D5 /* YYTextMagnifier.h */, - 061850B41C95CBF000C522D5 /* YYTextMagnifier.m */, - 061850B51C95CBF000C522D5 /* YYTextSelectionView.h */, - 061850B61C95CBF000C522D5 /* YYTextSelectionView.m */, - ); - path = Component; - sourceTree = ""; - }; - 061850B71C95CBF000C522D5 /* String */ = { - isa = PBXGroup; - children = ( - 061850B81C95CBF000C522D5 /* YYTextArchiver.h */, - 061850B91C95CBF000C522D5 /* YYTextArchiver.m */, - 061850BA1C95CBF000C522D5 /* YYTextAttribute.h */, - 061850BB1C95CBF000C522D5 /* YYTextAttribute.m */, - 061850BC1C95CBF000C522D5 /* YYTextParser.h */, - 061850BD1C95CBF000C522D5 /* YYTextParser.m */, - 061850BE1C95CBF000C522D5 /* YYTextRubyAnnotation.h */, - 061850BF1C95CBF000C522D5 /* YYTextRubyAnnotation.m */, - 061850C01C95CBF000C522D5 /* YYTextRunDelegate.h */, - 061850C11C95CBF000C522D5 /* YYTextRunDelegate.m */, - ); - path = String; - sourceTree = ""; - }; - 061850C21C95CBF000C522D5 /* Utility */ = { - isa = PBXGroup; - children = ( - 061850C31C95CBF000C522D5 /* NSAttributedString+YYText.h */, - 061850C41C95CBF000C522D5 /* NSAttributedString+YYText.m */, - 061850C51C95CBF000C522D5 /* NSParagraphStyle+YYText.h */, - 061850C61C95CBF000C522D5 /* NSParagraphStyle+YYText.m */, - 061850C71C95CBF000C522D5 /* UIPasteboard+YYText.h */, - 061850C81C95CBF000C522D5 /* UIPasteboard+YYText.m */, - 061850C91C95CBF000C522D5 /* UIView+YYText.h */, - 061850CA1C95CBF000C522D5 /* UIView+YYText.m */, - 061850CB1C95CBF000C522D5 /* YYTextAsyncLayer.h */, - 061850CC1C95CBF000C522D5 /* YYTextAsyncLayer.m */, - 061850CD1C95CBF000C522D5 /* YYTextTransaction.h */, - 061850CE1C95CBF000C522D5 /* YYTextTransaction.m */, - 061850CF1C95CBF000C522D5 /* YYTextUtilities.h */, - 061850D01C95CBF000C522D5 /* YYTextUtilities.m */, - 061850D11C95CBF000C522D5 /* YYTextWeakProxy.h */, - 061850D21C95CBF000C522D5 /* YYTextWeakProxy.m */, - ); - path = Utility; - sourceTree = ""; - }; - 065975081BC7C4F300B8C7DF /* Resources */ = { - isa = PBXGroup; - children = ( - 0659751D1BC7C84200B8C7DF /* Backgrounds */, - 065975501BC7DD3C00B8C7DF /* Highlighter */, - 06230F431BC95C0E00A4807B /* ABPhoneFieldCodes.txt */, - 0659753A1BC7D22200B8C7DF /* Images.xcassets */, - 06E3C58C1C74931F004776CD /* ringtone.m4a */, - 065975461BC7D34200B8C7DF /* Localizable.strings */, - 06230F441BC95C0E00A4807B /* PhoneFormats.dat */, - 153F6B3C1C2A9B1900C0B960 /* begin_record.caf */, - 065975491BC7DBA000B8C7DF /* iapetus.caf */, - 0659754A1BC7DBA000B8C7DF /* notification.caf */, - 06E3C58A1C746AAC004776CD /* tone.m4a */, - ); - path = Resources; - sourceTree = ""; - }; - 0659751D1BC7C84200B8C7DF /* Backgrounds */ = { - isa = PBXGroup; - children = ( - 0659751E1BC7C84E00B8C7DF /* bg_1.jpg */, - 063074181BD68E370053DEAF /* bg_1_preview.jpg */, - 065975201BC7C84E00B8C7DF /* bg_2.jpg */, - 063074171BD68E370053DEAF /* bg_2_preview.jpg */, - 0659751F1BC7C84E00B8C7DF /* bg_3.jpg */, - 063074161BD68E370053DEAF /* bg_3_preview.jpg */, - ); - path = Backgrounds; - sourceTree = ""; - }; - 065975501BC7DD3C00B8C7DF /* Highlighter */ = { - isa = PBXGroup; - children = ( - 0659754E1BC7DD3C00B8C7DF /* highlight-default.min.css */, - 0659754F1BC7DD3C00B8C7DF /* highlight.min.js */, - ); - path = Highlighter; - sourceTree = ""; - }; - 066A50C81BC4AE63000E606E = { - isa = PBXGroup; - children = ( - 066A50D41BC4AE63000E606E /* ActorSDK */, - 2F428D134E194A828C3DF863 /* Frameworks */, - 066A50D31BC4AE63000E606E /* Products */, - F0BB28A250FF185B1F4D414D /* Pods */, - ); - sourceTree = ""; - }; - 066A50D31BC4AE63000E606E /* Products */ = { - isa = PBXGroup; - children = ( - 066A50D21BC4AE63000E606E /* ActorSDK.framework */, - ); - name = Products; - sourceTree = ""; - }; - 066A50D41BC4AE63000E606E /* ActorSDK */ = { - isa = PBXGroup; - children = ( - 069CF4151BCA5DB500C66E12 /* Sources */, - 065975081BC7C4F300B8C7DF /* Resources */, - ); - path = ActorSDK; - sourceTree = ""; - }; - 066A511D1BC4B4BD000E606E /* ActorCore */ = { - isa = PBXGroup; - children = ( - 066A51851BC4C377000E606E /* Providers */, - 066A51681BC4C366000E606E /* ActorCoreExt.swift */, - 065975041BC757A300B8C7DF /* ActorRuntime.swift */, - 066A52051BC4E962000E606E /* Makefile */, - 066A52041BC4E962000E606E /* convert.py */, - ); - path = ActorCore; - sourceTree = ""; - }; - 066A51201BC4B53C000E606E /* SwiftExtensions */ = { - isa = PBXGroup; - children = ( - 066A51211BC4B55C000E606E /* AADevice.swift */, - 066A51551BC4BEF5000E606E /* AALocalized.swift */, - 066A514F1BC4BE06000E606E /* AARegex.swift */, - 066A51401BC4BB5C000E606E /* AssosiatedObject.swift */, - 066A514B1BC4BD05000E606E /* Collections.swift */, - 066A51231BC4B56D000E606E /* Colors.swift */, - 066A51491BC4BCE0000E606E /* Dispatch.swift */, - 066A51451BC4BBC3000E606E /* Fonts.swift */, - 066A51531BC4BE95000E606E /* Images.swift */, - 066A51511BC4BE34000E606E /* Logs.swift */, - 066A514D1BC4BDE4000E606E /* Numbers.swift */, - 066A51431BC4BBAF000E606E /* Strings.swift */, - 066A51471BC4BBF4000E606E /* Views.swift */, - 06D5C0591C8E9B3B002D5045 /* Promises.swift */, - ); - path = SwiftExtensions; - sourceTree = ""; - }; - 066A51571BC4C112000E606E /* Utils */ = { - isa = PBXGroup; - children = ( - 15D35F721C201B5300E3717A /* Categories */, - 152AA8901C29887A0030DEEE /* Extensions */, - 06129AA81C8394700099286B /* AAAudioManager.swift */, - 06129AAA1C83B80A0099286B /* AAAudioRouter.swift */, - 066A53311BC534F5000E606E /* AAFileTypes.swift */, - 066A515A1BC4C178000E606E /* AAHashMap.swift */, - 066A51581BC4C14A000E606E /* AASwiftlyLRU.swift */, - 066A51641BC4C366000E606E /* AATools.swift */, - 065975381BC7CA7B00B8C7DF /* Bundle.swift */, - 06C1D07D1C8D0DE900B73632 /* Telephony.swift */, - ); - path = Utils; - sourceTree = ""; - }; - 066A516E1BC4C369000E606E /* FMDB */ = { - isa = PBXGroup; - children = ( - 066A51711BC4C373000E606E /* FMDatabase+Private.h */, - 066A516F1BC4C373000E606E /* FMDatabase.h */, - 066A51701BC4C373000E606E /* FMDatabase.m */, - 066A51721BC4C373000E606E /* FMDatabaseAdditions.h */, - 066A51731BC4C373000E606E /* FMDatabaseAdditions.m */, - 066A51741BC4C373000E606E /* FMDatabasePool.h */, - 066A51751BC4C373000E606E /* FMDatabasePool.m */, - 066A51761BC4C373000E606E /* FMDatabaseQueue.h */, - 066A51771BC4C373000E606E /* FMDatabaseQueue.m */, - 066A51781BC4C373000E606E /* FMResultSet.h */, - 066A51791BC4C373000E606E /* FMResultSet.m */, - ); - path = FMDB; - sourceTree = ""; - }; - 066A51851BC4C377000E606E /* Providers */ = { - isa = PBXGroup; - children = ( - 066A51941BC4C385000E606E /* Storage */, - 065975531BC7DF5100B8C7DF /* CocoaAssetsRuntime.swift */, - 066A518B1BC4C383000E606E /* CocoaFileSystemRuntime.swift */, - 066A518A1BC4C383000E606E /* CocoaHttpRuntime.swift */, - 066A51891BC4C383000E606E /* CocoaNetworkRuntime.swift */, - 066A51861BC4C383000E606E /* CocoaStorageRuntime.swift */, - 065A06B51C6CEFE00012EA09 /* CocoaWebRTCRuntime.swift */, - 06129AA51C8359FB0099286B /* CocoaLifecycleRuntime.swift */, - 0618509F1C95CA2600C522D5 /* CocoaDispatcher.swift */, - 06E1648E1C96D99F005AFB94 /* CocoaCrypto.swift */, - 066A51871BC4C383000E606E /* iOSNotificationProvider.swift */, - 066A51881BC4C383000E606E /* iOSPhoneBookProvider.swift */, - 06E322C81C69344A00D66F53 /* iOSCallsProvider.swift */, - ); - path = Providers; - sourceTree = ""; - }; - 066A51941BC4C385000E606E /* Storage */ = { - isa = PBXGroup; - children = ( - 066A516E1BC4C369000E606E /* FMDB */, - 065975011BC7534100B8C7DF /* FMDBBridge.swift */, - 066A51991BC4C390000E606E /* FMDBExtensions.swift */, - 066A51961BC4C390000E606E /* FMDBKeyValue.swift */, - 066A51951BC4C390000E606E /* FMDBList.swift */, - 066A51981BC4C390000E606E /* UDPreferencesStorage.swift */, - ); - path = Storage; - sourceTree = ""; - }; - 066A52131BC4EDEB000E606E /* Views */ = { - isa = PBXGroup; - children = ( - 069CF4C31BCB908C00C66E12 /* CLTokenInputView */, - 066A52321BC4EEBA000E606E /* Cells */, - 066A52141BC4EE04000E606E /* AAAvatarView.swift */, - 06B489EC1C9F6EBC0054245B /* AAStickerView.swift */, - 066A523A1BC4EECD000E606E /* AABigPlaceholderView.swift */, - 06E7B24B1C0FAB500090660C /* AAMapFastView.swift */, - 06E7B2511C1345E70090660C /* AAMapPinPointView.swift */, - 066A52461BC4EED5000E606E /* AAProgressView.swift */, - 066A523C1BC4EECD000E606E /* AATableViewHeader.swift */, - 066A523D1BC4EECD000E606E /* AATableViewSeparator.swift */, - 06E3C5B71C80EE20004776CD /* AACircleButton.swift */, - 065974A61BC62B3600B8C7DF /* ViewExtensions.swift */, - ); - path = Views; - sourceTree = ""; - }; - 066A52181BC4EE9A000E606E /* Managed Runtime */ = { - isa = PBXGroup; - children = ( - 066A52501BC4EF61000E606E /* AACollectionViewController.swift */, - 066A521E1BC4EEAC000E606E /* AAContentTableController.swift */, - 066A524D1BC4EF61000E606E /* AAImagePickerController.swift */, - 066A521B1BC4EEAC000E606E /* AAManagedRange.swift */, - 066A521A1BC4EEAC000E606E /* AAManagedSection.swift */, - 066A52191BC4EEAC000E606E /* AAManagedTable.swift */, - 066A521F1BC4EEAC000E606E /* AAManagedTableController.swift */, - 066A524E1BC4EF61000E606E /* AANavigationController.swift */, - 066A524F1BC4EF61000E606E /* AATableViewController.swift */, - 066A52491BC4EF49000E606E /* AAViewController.swift */, - 066A52511BC4EF61000E606E /* Alerts.swift */, - 066A52521BC4EF61000E606E /* Executions.swift */, - 066A52211BC4EEAC000E606E /* ManagedAlerts.swift */, - 066A521C1BC4EEAC000E606E /* ManagedBindedCells.swift */, - 066A521D1BC4EEAC000E606E /* ManagedCells.swift */, - 066A52201BC4EEAC000E606E /* ManagedTableExtensions.swift */, - 066A52531BC4EF61000E606E /* Navigations.swift */, - ); - path = "Managed Runtime"; - sourceTree = ""; - }; - 066A52321BC4EEBA000E606E /* Cells */ = { - isa = PBXGroup; - children = ( - 066A523F1BC4EECD000E606E /* AAAvatarCell.swift */, - 066A522C1BC4EEBA000E606E /* AACommonCell.swift */, - 066A52311BC4EEBA000E606E /* AAEditCell.swift */, - 066A52301BC4EEBA000E606E /* AAHeaderCell.swift */, - 066A522F1BC4EEBA000E606E /* AATableViewCell.swift */, - 066A522D1BC4EEBA000E606E /* AATextCell.swift */, - 066A522E1BC4EEBA000E606E /* AATitledCell.swift */, - 0618509D1C9582DD00C522D5 /* AABackgroundCellRenderer.swift */, - ); - path = Cells; - sourceTree = ""; - }; - 066A525F1BC50E53000E606E /* Controllers */ = { - isa = PBXGroup; - children = ( - 06C1D0751C8BC55100B73632 /* Welcome */, - 066A52601BC50E6B000E606E /* Auth */, - 066A52F91BC52FA0000E606E /* Compose */, - 066A53021BC53171000E606E /* Contacts */, - 066A53351BC537BF000E606E /* Conversation */, - 066A52E11BC52A16000E606E /* Group */, - 06E7B2451C0F8D410090660C /* Location */, - 066A53051BC5317B000E606E /* Recent */, - 066A527B1BC51EC6000E606E /* Root */, - 9AAE96461CF81F140092E366 /* Ringtones */, - 066A52EB1BC52AF8000E606E /* Settings */, - 066A53091BC53197000E606E /* User */, - 06E323131C6A7AA300D66F53 /* Calls */, - 066A52C41BC521D5000E606E /* Content */, - 066A52181BC4EE9A000E606E /* Managed Runtime */, - ); - path = Controllers; - sourceTree = ""; - }; - 066A52601BC50E6B000E606E /* Auth */ = { - isa = PBXGroup; - children = ( - 066A526B1BC50E83000E606E /* Cells */, - 066A526E1BC51007000E606E /* Views */, - 066CBCDA1C8D4121004507E2 /* Controllers */, - 06D5C0561C8D6E20002D5045 /* AAAuthLogInViewController.swift */, - 06C1D0761C8BC9FC00B73632 /* AAAuthNameViewController.swift */, - 06C1D07A1C8BFE5C00B73632 /* AAAuthPhoneViewController.swift */, - 066CBCDB1C8D419F004507E2 /* AAAuthEmailViewController.swift */, - 06D5C05B1C8EA842002D5045 /* AAAuthOTPViewController.swift */, - ); - path = Auth; - sourceTree = ""; - }; - 066A526B1BC50E83000E606E /* Cells */ = { - isa = PBXGroup; - children = ( - 066A526C1BC50E8B000E606E /* AAAuthCountryCell.swift */, - ); - path = Cells; - sourceTree = ""; - }; - 066A526E1BC51007000E606E /* Views */ = { - isa = PBXGroup; - children = ( - 066A526F1BC5101A000E606E /* ABPhoneField.h */, - 066A52701BC5101A000E606E /* ABPhoneField.m */, - 06230F401BC95BD200A4807B /* RMPhoneFormat.h */, - 06230F3F1BC95BD200A4807B /* RMPhoneFormat.m */, - ); - path = Views; - sourceTree = ""; - }; - 066A527B1BC51EC6000E606E /* Root */ = { - isa = PBXGroup; - children = ( - 066A527E1BC51ED0000E606E /* AANoSelectionViewController.swift */, - 066A527C1BC51ED0000E606E /* AARootSplitViewController.swift */, - 066A527D1BC51ED0000E606E /* AARootTabViewController.swift */, - ); - path = Root; - sourceTree = ""; - }; - 066A52C41BC521D5000E606E /* Content */ = { - isa = PBXGroup; - children = ( - 066A52D31BC5236B000E606E /* Contacts List */, - 066A53131BC533C5000E606E /* Conversation */, - 066A52C91BC521F1000E606E /* Dialogs List */, - 066A52E01BC52422000E606E /* Input */, - 066A530C1BC5330D000E606E /* Previews */, - 066A52DD1BC52419000E606E /* WebActions */, - ); - path = Content; - sourceTree = ""; - }; - 066A52C91BC521F1000E606E /* Dialogs List */ = { - isa = PBXGroup; - children = ( - 066A52CE1BC521FD000E606E /* Cells */, - 066A52CA1BC521FA000E606E /* AADialogsListContentController.swift */, - 066A52CB1BC521FA000E606E /* AADialogsListContentControllerDelegate.swift */, - ); - path = "Dialogs List"; - sourceTree = ""; - }; - 066A52CE1BC521FD000E606E /* Cells */ = { - isa = PBXGroup; - children = ( - 066A52CF1BC52204000E606E /* AADialogCell.swift */, - 066A52D01BC52204000E606E /* AADialogSearchCell.swift */, - 068AFC381C94A0050055F503 /* AADialogListProcessor.swift */, - ); - path = Cells; - sourceTree = ""; - }; - 066A52D31BC5236B000E606E /* Contacts List */ = { - isa = PBXGroup; - children = ( - 066A52D81BC5237B000E606E /* Cells */, - 066A52D41BC52378000E606E /* AAContactsListContentController.swift */, - 066A52D51BC52378000E606E /* AAContactsListContentControllerDelegate.swift */, - ); - path = "Contacts List"; - sourceTree = ""; - }; - 066A52D81BC5237B000E606E /* Cells */ = { - isa = PBXGroup; - children = ( - 066A52D91BC52385000E606E /* AAContactActionCell.swift */, - 066A52DA1BC52385000E606E /* AAContactCell.swift */, - ); - path = Cells; - sourceTree = ""; - }; - 066A52DD1BC52419000E606E /* WebActions */ = { - isa = PBXGroup; - children = ( - 066A52DE1BC5241F000E606E /* AAWebActionController.swift */, - ); - path = WebActions; - sourceTree = ""; - }; - 066A52E01BC52422000E606E /* Input */ = { - isa = PBXGroup; - children = ( - 066A52C61BC521EA000E606E /* AAEditFieldController.swift */, - 066A52C51BC521EA000E606E /* AAEditTextController.swift */, - ); - path = Input; - sourceTree = ""; - }; - 066A52E11BC52A16000E606E /* Group */ = { - isa = PBXGroup; - children = ( - 066A52E81BC52A25000E606E /* Cells */, - 066A52E21BC52A20000E606E /* AAGroupViewController.swift */, - 06ABFE371D3FCCE30031A0D6 /* AAGroupEditInfoViewController.swift */, - 067B67531D45341D00B9A238 /* AAGroupViewMembersController.swift */, - 06ABFE3C1D41283A0031A0D6 /* AAGroupAdministrationViewController.swift */, - 06ABFE391D410D2D0031A0D6 /* AAGroupTypeController.swift */, - 066A52E31BC52A20000E606E /* AAAddParticipantViewController.swift */, - 066A52E41BC52A20000E606E /* AAInviteLinkViewController.swift */, - ); - path = Group; - sourceTree = ""; - }; - 066A52E81BC52A25000E606E /* Cells */ = { - isa = PBXGroup; - children = ( - 066A52E91BC52A2B000E606E /* AAGroupMemberCell.swift */, - ); - path = Cells; - sourceTree = ""; - }; - 066A52EB1BC52AF8000E606E /* Settings */ = { - isa = PBXGroup; - children = ( - BEE6EAFF1C4D7B5600A2280E /* Wallpapers */, - 066A52F41BC52B09000E606E /* Cells */, - 066A52EC1BC52B02000E606E /* AASettingsViewController.swift */, - 066A52ED1BC52B02000E606E /* AASettingsNotificationsViewController.swift */, - 066A52EE1BC52B02000E606E /* AASettingsPrivacyViewController.swift */, - 152AA8BE1C298C4B0030DEEE /* AASettingsLastSeenController.swift */, - 152AA8BC1C298BF00030DEEE /* AASettingsSessionsController.swift */, - 9AA6A41E1D08568A00957A7F /* AASettingsMediaViewController.swift */, - 066A52EF1BC52B02000E606E /* AASettingsWallpapper.swift */, - ); - path = Settings; - sourceTree = ""; - }; - 066A52F41BC52B09000E606E /* Cells */ = { - isa = PBXGroup; - children = ( - 066A52F51BC52B13000E606E /* AAWallpapperPreviewCell.swift */, - 066A52F61BC52B13000E606E /* AAWallpapperSettingsCell.swift */, - ); - path = Cells; - sourceTree = ""; - }; - 066A52F91BC52FA0000E606E /* Compose */ = { - isa = PBXGroup; - children = ( - 066A52FA1BC52FA8000E606E /* AAComposeController.swift */, - 066A52FB1BC52FA8000E606E /* AAGroupCreateViewController.swift */, - 066A52FC1BC52FA8000E606E /* AAGroupMembersController.swift */, - ); - path = Compose; - sourceTree = ""; - }; - 066A53021BC53171000E606E /* Contacts */ = { - isa = PBXGroup; - children = ( - 066A53031BC53177000E606E /* AAContactsViewController.swift */, - ); - path = Contacts; - sourceTree = ""; - }; - 066A53051BC5317B000E606E /* Recent */ = { - isa = PBXGroup; - children = ( - 066A53061BC53183000E606E /* AARecentViewController.swift */, - ); - path = Recent; - sourceTree = ""; - }; - 066A53091BC53197000E606E /* User */ = { - isa = PBXGroup; - children = ( - 066A530A1BC531A2000E606E /* AAUserViewController.swift */, - ); - path = User; - sourceTree = ""; - }; - 066A530C1BC5330D000E606E /* Previews */ = { - isa = PBXGroup; - children = ( - 066A530E1BC53317000E606E /* AACorePreviewController.swift */, - 066A530F1BC53317000E606E /* AAPhotoPreviewController.swift */, - 066A530D1BC53317000E606E /* AAWallpapperPreviewController.swift */, - ); - path = Previews; - sourceTree = ""; - }; - 066A53131BC533C5000E606E /* Conversation */ = { - isa = PBXGroup; - children = ( - 066A53241BC533FD000E606E /* Cell */, - 066A531B1BC533EB000E606E /* Layouting */, - 066A53181BC533E0000E606E /* Suggestion */, - 15D35F6D1C20196700E3717A /* Views */, - 066A53161BC533DD000E606E /* AABubbles.swift */, - 066A53141BC533D5000E606E /* AAConversationContentController.swift */, - 065975061BC7BB4000B8C7DF /* AANavigationBadge.swift */, - ); - path = Conversation; - sourceTree = ""; - }; - 066A53181BC533E0000E606E /* Suggestion */ = { - isa = PBXGroup; - children = ( - 066A53191BC533E7000E606E /* AAAutoCompleteCell.swift */, - ); - path = Suggestion; - sourceTree = ""; - }; - 066A531B1BC533EB000E606E /* Layouting */ = { - isa = PBXGroup; - children = ( - 066A531C1BC533F5000E606E /* AABubbleBackgroundProcessor.swift */, - 066A531E1BC533F5000E606E /* AAMessagesFlowLayout.swift */, - 066A531D1BC533F5000E606E /* BubbleLayouts.swift */, - 066A531F1BC533F5000E606E /* Caches.swift */, - ); - path = Layouting; - sourceTree = ""; - }; - 066A53241BC533FD000E606E /* Cell */ = { - isa = PBXGroup; - children = ( - 066A53251BC53406000E606E /* AABubbleCell.swift */, - 066A53261BC53406000E606E /* AABubbleTextCell.swift */, - 066A53281BC53406000E606E /* AABubbleBaseFileCell.swift */, - 153F6B5C1C2B3AC500C0B960 /* AABubbleStickerCell.swift */, - 066A532A1BC53406000E606E /* AABubbleDocumentCell.swift */, - 066A53291BC53406000E606E /* AABubbleMediaCell.swift */, - 153F6B5A1C2B109400C0B960 /* AABubbleVoiceCell.swift */, - 066A53271BC53406000E606E /* AABubbleServiceCell.swift */, - 06E7B2491C0F92140090660C /* AABubbleLocationCell.swift */, - 06E7B2531C139B6F0090660C /* AABubbleContactCell.swift */, - ); - path = Cell; - sourceTree = ""; - }; - 066A53351BC537BF000E606E /* Conversation */ = { - isa = PBXGroup; - children = ( - 066A53361BC537CA000E606E /* ConversationViewController.swift */, - ); - path = Conversation; - sourceTree = ""; - }; - 066CBCDA1C8D4121004507E2 /* Controllers */ = { - isa = PBXGroup; - children = ( - 066A52651BC50E7B000E606E /* AAAuthViewController.swift */, - 065974A41BC621F100B8C7DF /* AAAuthNavigationController.swift */, - 066A52611BC50E7B000E606E /* AACountryViewController.swift */, - 064E41B41CA1D2FF00A4A9D1 /* AABigAlertController.swift */, - ); - name = Controllers; - sourceTree = ""; - }; - 069CF4151BCA5DB500C66E12 /* Sources */ = { - isa = PBXGroup; - children = ( - 066A525F1BC50E53000E606E /* Controllers */, - 066A511D1BC4B4BD000E606E /* ActorCore */, - 066A51201BC4B53C000E606E /* SwiftExtensions */, - 066A51571BC4C112000E606E /* Utils */, - 06E322CB1C69392F00D66F53 /* Libs */, - 066A52131BC4EDEB000E606E /* Views */, - 066A525D1BC503BB000E606E /* ActorApplicationDelegate.swift */, - 066A50D51BC4AE63000E606E /* ActorSDK.h */, - 066A50E11BC4AF9F000E606E /* ActorSDK.swift */, - 06CE898F1BD84DF5005A5530 /* ActorSDKAnalytics.swift */, - 066A525B1BC502EB000E606E /* ActorSDKDelegate.swift */, - 066A53381BC5456B000E606E /* ActorStyle.swift */, - 066A50D71BC4AE63000E606E /* Info.plist */, - ); - path = Sources; - sourceTree = ""; - }; - 069CF4C31BCB908C00C66E12 /* CLTokenInputView */ = { - isa = PBXGroup; - children = ( - 069CF4C41BCB909A00C66E12 /* CLBackspaceDetectingTextField.h */, - 069CF4C51BCB909A00C66E12 /* CLBackspaceDetectingTextField.m */, - 069CF4C61BCB909A00C66E12 /* CLToken.h */, - 069CF4C71BCB909A00C66E12 /* CLToken.m */, - 069CF4C81BCB909A00C66E12 /* CLTokenInputView.h */, - 069CF4C91BCB909A00C66E12 /* CLTokenInputView.m */, - 069CF4CA1BCB909A00C66E12 /* CLTokenView.h */, - 069CF4CB1BCB909A00C66E12 /* CLTokenView.m */, - ); - path = CLTokenInputView; - sourceTree = ""; - }; - 06ABFE261D3FAF1A0031A0D6 /* CocoaAsyncSocket */ = { - isa = PBXGroup; - children = ( - 06ABFE2F1D3FAF800031A0D6 /* GCDAsyncSocket.h */, - 06ABFE301D3FAF800031A0D6 /* GCDAsyncSocket.m */, - ); - name = CocoaAsyncSocket; - sourceTree = ""; - }; - 06C1D0751C8BC55100B73632 /* Welcome */ = { - isa = PBXGroup; - children = ( - 153F6B601C2BF8EC00C0B960 /* AAAuthWelcomeController.swift */, - ); - name = Welcome; - sourceTree = ""; - }; - 06E164921C96FF15005AFB94 /* CommonCrypto */ = { - isa = PBXGroup; - children = ( - 06E164931C96FF3D005AFB94 /* module.map */, - ); - name = CommonCrypto; - path = Libs/CommonCrypto; - sourceTree = ""; - }; - 06E322CB1C69392F00D66F53 /* Libs */ = { - isa = PBXGroup; - children = ( - 06ABFE261D3FAF1A0031A0D6 /* CocoaAsyncSocket */, - 06E164921C96FF15005AFB94 /* CommonCrypto */, - 061850A31C95CBF000C522D5 /* YYKit */, - 15D35F0A1C20182900E3717A /* AudioRecorder */, - 06E3230D1C6942C400D66F53 /* WebRTC.h */, - 06E323101C694C1D00D66F53 /* WebRTCExt.swift */, - 0601BBB11CA4C7DE00AEFA81 /* ElegantPresentations.swift */, - 0601BBB31CA4C80D00AEFA81 /* ElegantPresentationController.swift */, - ); - name = Libs; - sourceTree = ""; - }; - 06E323131C6A7AA300D66F53 /* Calls */ = { - isa = PBXGroup; - children = ( - 06E323141C6A7AC000D66F53 /* AACallViewController.swift */, - ); - name = Calls; - sourceTree = ""; - }; - 06E7B2451C0F8D410090660C /* Location */ = { - isa = PBXGroup; - children = ( - 06E7B2461C0F8D7A0090660C /* AALocationPickerController.swift */, - ); - path = Location; - sourceTree = ""; - }; - 152AA8901C29887A0030DEEE /* Extensions */ = { - isa = PBXGroup; - children = ( - BE4DBE6B1C5723BE00A31894 /* AttributedLabel.swift */, - BED5A1CF1C4839200045FDB0 /* NYTPhotoViewer */, - 152AA8911C29891B0030DEEE /* SlackTextViewController */, - 153F6B871C2D7B9700C0B960 /* TapedLabel */, - ); - path = Extensions; - sourceTree = ""; - }; - 152AA8911C29891B0030DEEE /* SlackTextViewController */ = { - isa = PBXGroup; - children = ( - 153F6B471C2B03A400C0B960 /* Ext */, - 152AA8921C2989270030DEEE /* SLKInputAccessoryView.h */, - 152AA8931C2989270030DEEE /* SLKInputAccessoryView.m */, - 152AA8941C2989270030DEEE /* SLKTextInputbar.h */, - 152AA8951C2989270030DEEE /* SLKTextInputbar.m */, - 152AA8981C2989270030DEEE /* SLKTextView+SLKAdditions.h */, - 152AA8991C2989270030DEEE /* SLKTextView+SLKAdditions.m */, - 152AA8961C2989270030DEEE /* SLKTextView.h */, - 152AA8971C2989270030DEEE /* SLKTextView.m */, - 152AA89A1C2989270030DEEE /* SLKTextViewController.h */, - 152AA89B1C2989270030DEEE /* SLKTextViewController.m */, - 152AA89C1C2989270030DEEE /* SLKTypingIndicatorProtocol.h */, - 152AA89D1C2989270030DEEE /* SLKTypingIndicatorView.h */, - 152AA89E1C2989270030DEEE /* SLKTypingIndicatorView.m */, - 152AA89F1C2989270030DEEE /* SLKUIConstants.h */, - 152AA8A01C2989270030DEEE /* UIResponder+SLKAdditions.h */, - 152AA8A11C2989270030DEEE /* UIResponder+SLKAdditions.m */, - 152AA8A21C2989270030DEEE /* UIScrollView+SLKAdditions.h */, - 152AA8A31C2989270030DEEE /* UIScrollView+SLKAdditions.m */, - 152AA8A41C2989270030DEEE /* UIView+SLKAdditions.h */, - 152AA8A51C2989270030DEEE /* UIView+SLKAdditions.m */, - ); - path = SlackTextViewController; - sourceTree = ""; - }; - 153F6B471C2B03A400C0B960 /* Ext */ = { - isa = PBXGroup; - children = ( - ); - path = Ext; - sourceTree = ""; - }; - 153F6B871C2D7B9700C0B960 /* TapedLabel */ = { - isa = PBXGroup; - children = ( - 153F6B891C2D7BA300C0B960 /* AATapLabel.swift */, - 153F6B881C2D7BA300C0B960 /* AATapLabelDelegate.swift */, - ); - path = TapedLabel; - sourceTree = ""; - }; - 15D35F0A1C20182900E3717A /* AudioRecorder */ = { - isa = PBXGroup; - children = ( - 15F89EFE1C211FCE00776ACD /* libopus */, - 15D35F201C20185B00E3717A /* ogg */, - 15D35F0B1C20184700E3717A /* opusenc */, - 15D35F291C20186400E3717A /* opusfile */, - 15D35F3A1C20187E00E3717A /* AAAlertView.h */, - 15D35F3B1C20187E00E3717A /* AAAlertView.m */, - 15D35F461C20187E00E3717A /* AAAudioBuffer.h */, - 15D35F401C20187E00E3717A /* AAAudioPlayer.h */, - 15D35F411C20187E00E3717A /* AAAudioPlayer.m */, - 15D35F3C1C20187E00E3717A /* AAAudioRecorder.h */, - 15D35F3D1C20187E00E3717A /* AAAudioRecorder.m */, - 15D35F471C20187E00E3717A /* AAModernConversationAudioPlayer.h */, - 15D35F481C20187E00E3717A /* AAModernConversationAudioPlayer.m */, - 15D35F491C20187E00E3717A /* AAModernConversationAudioPlayerContext.h */, - 15D35F4A1C20187E00E3717A /* AAModernConversationAudioPlayerContext.m */, - 15D35F4D1C20187E00E3717A /* AAModernViewInlineMediaContext.h */, - 15D35F4E1C20187E00E3717A /* AAModernViewInlineMediaContext.m */, - 15D35F421C20187E00E3717A /* AANativeAudioPlayer.h */, - 15D35F431C20187E00E3717A /* AANativeAudioPlayer.m */, - 15D35F441C20187E00E3717A /* AAOpusAudioPlayerAU.h */, - 15D35F451C20187E00E3717A /* AAOpusAudioPlayerAU.mm */, - 15D35F381C20187E00E3717A /* AAOpusAudioRecorder.h */, - 15D35F391C20187E00E3717A /* AAOpusAudioRecorder.m */, - 15D35F3E1C20187E00E3717A /* AATimer.h */, - 15D35F3F1C20187E00E3717A /* AATimer.m */, - 15D35F4F1C20187E00E3717A /* AATimerTarget.h */, - 15D35F501C20187E00E3717A /* AATimerTarget.m */, - 15D35F361C20187E00E3717A /* ASQueue.h */, - 15D35F371C20187E00E3717A /* ASQueue.m */, - 15D35F4B1C20187E00E3717A /* NSObject+TGLock.h */, - 15D35F4C1C20187E00E3717A /* NSObject+TGLock.m */, - ); - name = AudioRecorder; - path = Utils/AudioRecorder; - sourceTree = ""; - }; - 15D35F0B1C20184700E3717A /* opusenc */ = { - isa = PBXGroup; - children = ( - 15D35F0C1C20185500E3717A /* diag_range.c */, - 15D35F0D1C20185500E3717A /* diag_range.h */, - 15D35F0E1C20185500E3717A /* opus_header.c */, - 15D35F0F1C20185500E3717A /* opus_header.h */, - 15D35F101C20185500E3717A /* opusenc.h */, - 15D35F111C20185500E3717A /* opusenc.m */, - 15D35F121C20185500E3717A /* picture.c */, - 15D35F131C20185500E3717A /* picture.h */, - 15D35F141C20185500E3717A /* wav_io.c */, - 15D35F151C20185500E3717A /* wav_io.h */, - ); - path = opusenc; - sourceTree = ""; - }; - 15D35F201C20185B00E3717A /* ogg */ = { - isa = PBXGroup; - children = ( - 15D35F211C20186200E3717A /* bitwise.c */, - 15D35F221C20186200E3717A /* framing.c */, - 15D35F231C20186200E3717A /* ogg.h */, - 15D35F241C20186200E3717A /* os_types.h */, - ); - path = ogg; - sourceTree = ""; - }; - 15D35F291C20186400E3717A /* opusfile */ = { - isa = PBXGroup; - children = ( - 15D35F2A1C20187200E3717A /* info.c */, - 15D35F2B1C20187200E3717A /* internal.c */, - 15D35F2C1C20187200E3717A /* internal.h */, - 15D35F2D1C20187200E3717A /* opusfile.c */, - 15D35F2E1C20187200E3717A /* opusfile.h */, - 15D35F2F1C20187200E3717A /* stream.c */, - ); - path = opusfile; - sourceTree = ""; - }; - 15D35F6D1C20196700E3717A /* Views */ = { - isa = PBXGroup; - children = ( - BE281CC31C502B070042F6D4 /* VoiceView */, - BE2621551C46569800A817AB /* AttachmentView */, - 15D35F6E1C20196E00E3717A /* AARecordAudioController.swift */, - BE237C9C1C422FFA00060648 /* AAStickersKeyboard.swift */, - ); - path = Views; - sourceTree = ""; - }; - 15D35F721C201B5300E3717A /* Categories */ = { - isa = PBXGroup; - children = ( - 15D35F741C201B6B00E3717A /* AACustomPresentationAnimationController.swift */, - 15D35F731C201B6B00E3717A /* AACustomPresentationController.swift */, - ); - path = Categories; - sourceTree = ""; - }; - 15F89EFE1C211FCE00776ACD /* libopus */ = { - isa = PBXGroup; - children = ( - 15F89F021C211FE100776ACD /* headers */, - 15F89EFF1C211FD700776ACD /* lib */, - ); - path = libopus; - sourceTree = ""; - }; - 15F89EFF1C211FD700776ACD /* lib */ = { - isa = PBXGroup; - children = ( - 15F89F001C211FDE00776ACD /* libopus.a */, - ); - path = lib; - sourceTree = ""; - }; - 15F89F021C211FE100776ACD /* headers */ = { - isa = PBXGroup; - children = ( - 15F89F061C211FED00776ACD /* opus.h */, - 15F89F031C211FED00776ACD /* opus_defines.h */, - 15F89F041C211FED00776ACD /* opus_multistream.h */, - 15F89F051C211FED00776ACD /* opus_types.h */, - ); - path = headers; - sourceTree = ""; - }; - 2F428D134E194A828C3DF863 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 06CE898B1BD841C9005A5530 /* SystemConfiguration.framework */, - 066A51FF1BC4E0B0000E606E /* libsqlite3.tbd */, - 354C3EFA48FBFAEAD0DEEE17 /* Pods_ActorSDK.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9AAE96461CF81F140092E366 /* Ringtones */ = { - isa = PBXGroup; - children = ( - 9AAE96471CF81F140092E366 /* AARingtonesViewController.swift */, - ); - path = Ringtones; - sourceTree = ""; - }; - BE2621551C46569800A817AB /* AttachmentView */ = { - isa = PBXGroup; - children = ( - BE2621561C4656D700A817AB /* AAConvActionSheet.swift */, - BE2621581C4656EE00A817AB /* AAThumbnailView.swift */, - BEFE68D41C4657360001F2D6 /* AAThumbnailCollectionCell.swift */, - ); - name = AttachmentView; - sourceTree = ""; - }; - BE281CC31C502B070042F6D4 /* VoiceView */ = { - isa = PBXGroup; - children = ( - BE281CC41C502B230042F6D4 /* AAVoiceRecorderView.swift */, - ); - name = VoiceView; - sourceTree = ""; - }; - BED5A1CF1C4839200045FDB0 /* NYTPhotoViewer */ = { - isa = PBXGroup; - children = ( - BED5A1DD1C4839610045FDB0 /* Classes */, - BED5A1D01C4839510045FDB0 /* Assets */, - ); - name = NYTPhotoViewer; - sourceTree = ""; - }; - BED5A1D01C4839510045FDB0 /* Assets */ = { - isa = PBXGroup; - children = ( - BED5A1D11C4839590045FDB0 /* NYTPhotoViewerCloseButtonX.png */, - BED5A1D21C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@2x.png */, - BED5A1D31C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@3x.png */, - BED5A1D41C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape.png */, - BED5A1D51C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@2x.png */, - BED5A1D61C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@3x.png */, - ); - name = Assets; - sourceTree = ""; - }; - BED5A1DD1C4839610045FDB0 /* Classes */ = { - isa = PBXGroup; - children = ( - BED5A20B1C48397F0045FDB0 /* ResourseLoading */, - BED5A2021C4839710045FDB0 /* Protocols */, - BED5A1DE1C48396A0045FDB0 /* NYTPhotoCaptionView.h */, - BED5A1DF1C48396A0045FDB0 /* NYTPhotoCaptionView.m */, - BED5A1E01C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.h */, - BED5A1E11C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.m */, - BED5A1E21C48396A0045FDB0 /* NYTPhotosDataSource.h */, - BED5A1E31C48396A0045FDB0 /* NYTPhotosDataSource.m */, - BED5A1E41C48396A0045FDB0 /* NYTPhotosOverlayView.h */, - BED5A1E51C48396A0045FDB0 /* NYTPhotosOverlayView.m */, - BED5A1E61C48396A0045FDB0 /* NYTPhotosViewController.h */, - BED5A1E71C48396A0045FDB0 /* NYTPhotosViewController.m */, - BED5A1E81C48396A0045FDB0 /* NYTPhotoTransitionAnimator.h */, - BED5A1E91C48396A0045FDB0 /* NYTPhotoTransitionAnimator.m */, - BED5A1EA1C48396A0045FDB0 /* NYTPhotoTransitionController.h */, - BED5A1EB1C48396A0045FDB0 /* NYTPhotoTransitionController.m */, - BED5A1EC1C48396A0045FDB0 /* NYTPhotoViewController.h */, - BED5A1ED1C48396A0045FDB0 /* NYTPhotoViewController.m */, - BED5A1EE1C48396A0045FDB0 /* NYTScalingImageView.h */, - BED5A1EF1C48396A0045FDB0 /* NYTScalingImageView.m */, - ); - name = Classes; - sourceTree = ""; - }; - BED5A2021C4839710045FDB0 /* Protocols */ = { - isa = PBXGroup; - children = ( - BED5A2031C4839790045FDB0 /* NYTPhoto.h */, - BED5A2041C4839790045FDB0 /* NYTPhotoCaptionViewLayoutWidthHinting.h */, - BED5A2051C4839790045FDB0 /* NYTPhotoContainer.h */, - BED5A2061C4839790045FDB0 /* NYTPhotosViewControllerDataSource.h */, - ); - name = Protocols; - sourceTree = ""; - }; - BED5A20B1C48397F0045FDB0 /* ResourseLoading */ = { - isa = PBXGroup; - children = ( - BED5A20C1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.h */, - BED5A20D1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.m */, - ); - name = ResourseLoading; - sourceTree = ""; - }; - BEE6EAFF1C4D7B5600A2280E /* Wallpapers */ = { - isa = PBXGroup; - children = ( - BEE6EB021C4D9A1B00A2280E /* Cells */, - BEE6EB001C4D7B7500A2280E /* AASettingsWallpapersController.swift */, - ); - name = Wallpapers; - sourceTree = ""; - }; - BEE6EB021C4D9A1B00A2280E /* Cells */ = { - isa = PBXGroup; - children = ( - BEE6EB031C4D9A4900A2280E /* AAWallpapersCell.swift */, - ); - name = Cells; - sourceTree = ""; - }; - F0BB28A250FF185B1F4D414D /* Pods */ = { - isa = PBXGroup; - children = ( - E30822B631D108159E8B306B /* Pods-ActorSDK.debug.xcconfig */, - F076508E3899D309954904A3 /* Pods-ActorSDK.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ +cp -a "${CONFIGURATION_TEMP_DIR}/j2objc/Public/" "${CONFIGURATION_BUILD_DIR}/ActorSDK.framework/Headers/" -/* Begin PBXHeadersBuildPhase section */ - 066A50CF1BC4AE63000E606E /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 060135031C95ED4C00A18C4E /* YYAsyncLayer.h in Headers */, - 069CF4D21BCB909A00C66E12 /* CLTokenView.h in Headers */, - 066A51831BC4C373000E606E /* FMResultSet.h in Headers */, - 15F89F091C211FED00776ACD /* opus_types.h in Headers */, - 060135071C95ED4C00A18C4E /* YYTransaction.h in Headers */, - 066A517D1BC4C373000E606E /* FMDatabaseAdditions.h in Headers */, - 069CF4D01BCB909A00C66E12 /* CLTokenInputView.h in Headers */, - 060135051C95ED4C00A18C4E /* YYSentinel.h in Headers */, - 066A517F1BC4C373000E606E /* FMDatabasePool.h in Headers */, - 066A51811BC4C373000E606E /* FMDatabaseQueue.h in Headers */, - 066A517A1BC4C373000E606E /* FMDatabase.h in Headers */, - 069CF4CC1BCB909A00C66E12 /* CLBackspaceDetectingTextField.h in Headers */, - 061850F21C95CBF000C522D5 /* YYTextRubyAnnotation.h in Headers */, - 066A50D61BC4AE63000E606E /* ActorSDK.h in Headers */, - 061850E01C95CBF000C522D5 /* YYTextInput.h in Headers */, - 15D35F621C20187E00E3717A /* AAModernConversationAudioPlayer.h in Headers */, - 066A517C1BC4C373000E606E /* FMDatabase+Private.h in Headers */, - 15D35F5B1C20187E00E3717A /* AAAudioPlayer.h in Headers */, - 152AA8B11C2989270030DEEE /* SLKTypingIndicatorView.h in Headers */, - 152AA8A81C2989270030DEEE /* SLKTextInputbar.h in Headers */, - 061850E81C95CBF000C522D5 /* YYTextMagnifier.h in Headers */, - 061850DE1C95CBF000C522D5 /* YYTextEffectWindow.h in Headers */, - 066A52731BC5101A000E606E /* ABPhoneField.h in Headers */, - 061850FA1C95CBF000C522D5 /* UIPasteboard+YYText.h in Headers */, - 061850E61C95CBF000C522D5 /* YYTextLine.h in Headers */, - 061850F61C95CBF000C522D5 /* NSAttributedString+YYText.h in Headers */, - 152AA8AA1C2989270030DEEE /* SLKTextView.h in Headers */, - 152AA8B01C2989270030DEEE /* SLKTypingIndicatorProtocol.h in Headers */, - 152AA8AC1C2989270030DEEE /* SLKTextView+SLKAdditions.h in Headers */, - 06ABFE331D3FAF800031A0D6 /* GCDAsyncSocket.h in Headers */, - 152AA8AE1C2989270030DEEE /* SLKTextViewController.h in Headers */, - 152AA8B31C2989270030DEEE /* SLKUIConstants.h in Headers */, - 152AA8B61C2989270030DEEE /* UIScrollView+SLKAdditions.h in Headers */, - 061850DA1C95CBF000C522D5 /* YYTextContainerView.h in Headers */, - BED5A2111C48413C0045FDB0 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */, - BED5A2121C48413C0045FDB0 /* NYTPhotoContainer.h in Headers */, - 061850EE1C95CBF000C522D5 /* YYTextAttribute.h in Headers */, - 061851081C95CBF000C522D5 /* YYLabel.h in Headers */, - BED5A2131C48413C0045FDB0 /* NYTPhotosViewControllerDataSource.h in Headers */, - 061851041C95CBF000C522D5 /* YYTextWeakProxy.h in Headers */, - 15D35F681C20187E00E3717A /* AAModernViewInlineMediaContext.h in Headers */, - 152AA8B81C2989270030DEEE /* UIView+SLKAdditions.h in Headers */, - 061850F41C95CBF000C522D5 /* YYTextRunDelegate.h in Headers */, - BED5A1FE1C48396A0045FDB0 /* NYTPhotoViewController.h in Headers */, - 061850EC1C95CBF000C522D5 /* YYTextArchiver.h in Headers */, - 061850E41C95CBF000C522D5 /* YYTextLayout.h in Headers */, - 061850F01C95CBF000C522D5 /* YYTextParser.h in Headers */, - BED5A1F81C48396A0045FDB0 /* NYTPhotosViewController.h in Headers */, - 061851001C95CBF000C522D5 /* YYTextTransaction.h in Headers */, - 15D35F641C20187E00E3717A /* AAModernConversationAudioPlayerContext.h in Headers */, - 061851021C95CBF000C522D5 /* YYTextUtilities.h in Headers */, - 0618510A1C95CBF000C522D5 /* YYText.h in Headers */, - BED5A2071C4839790045FDB0 /* NYTPhoto.h in Headers */, - 15D35F571C20187E00E3717A /* AAAudioRecorder.h in Headers */, - 15F89F071C211FED00776ACD /* opus_defines.h in Headers */, - 061850E21C95CBF000C522D5 /* YYTextKeyboardManager.h in Headers */, - 15D35F341C20187200E3717A /* opusfile.h in Headers */, - 15D35F661C20187E00E3717A /* NSObject+TGLock.h in Headers */, - 061850EA1C95CBF000C522D5 /* YYTextSelectionView.h in Headers */, - 061850FC1C95CBF000C522D5 /* UIView+YYText.h in Headers */, - 15D35F281C20186200E3717A /* os_types.h in Headers */, - 15D35F191C20185500E3717A /* opus_header.h in Headers */, - 061850DC1C95CBF000C522D5 /* YYTextDebugOption.h in Headers */, - 15F89F081C211FED00776ACD /* opus_multistream.h in Headers */, - 15D35F1F1C20185500E3717A /* wav_io.h in Headers */, - 15D35F171C20185500E3717A /* diag_range.h in Headers */, - 15D35F5F1C20187E00E3717A /* AAOpusAudioPlayerAU.h in Headers */, - 15D35F551C20187E00E3717A /* AAAlertView.h in Headers */, - 0618510B1C95CBF000C522D5 /* YYTextView.h in Headers */, - 061850F81C95CBF000C522D5 /* NSParagraphStyle+YYText.h in Headers */, - 061850FE1C95CBF000C522D5 /* YYTextAsyncLayer.h in Headers */, - 15D35F5D1C20187E00E3717A /* AANativeAudioPlayer.h in Headers */, - 15D35F271C20186200E3717A /* ogg.h in Headers */, - 15D35F321C20187200E3717A /* internal.h in Headers */, - 15D35F1A1C20185500E3717A /* opusenc.h in Headers */, - 15D35F591C20187E00E3717A /* AATimer.h in Headers */, - 15D35F531C20187E00E3717A /* AAOpusAudioRecorder.h in Headers */, - 15D35F611C20187E00E3717A /* AAAudioBuffer.h in Headers */, - 061851061C95CBF000C522D5 /* YYDispatchQueuePool.h in Headers */, - 15D35F6A1C20187E00E3717A /* AATimerTarget.h in Headers */, - 15F89F0A1C211FED00776ACD /* opus.h in Headers */, - 15D35F511C20187E00E3717A /* ASQueue.h in Headers */, - 15D35F1D1C20185500E3717A /* picture.h in Headers */, - 06E3230E1C69445C00D66F53 /* WebRTC.h in Headers */, - 06230F421BC95BD200A4807B /* RMPhoneFormat.h in Headers */, - 069CF4CE1BCB909A00C66E12 /* CLToken.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ -/* Begin PBXNativeTarget section */ - 066A50D11BC4AE63000E606E /* ActorSDK */ = { - isa = PBXNativeTarget; - buildConfigurationList = 066A50DA1BC4AE63000E606E /* Build configuration list for PBXNativeTarget "ActorSDK" */; - buildPhases = ( - 5B00FFD27DD7E01F43B31D13 /* [CP] Check Pods Manifest.lock */, - 066A52091BC4EA95000E606E /* Build and Install Actor Core */, - 066A50CD1BC4AE63000E606E /* Sources */, - 066A50CF1BC4AE63000E606E /* Headers */, - 066A50CE1BC4AE63000E606E /* Frameworks */, - 066A50D01BC4AE63000E606E /* Resources */, - A2ED258362D73946D3AE7FB4 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ActorSDK; - productName = ActorSDK; - productReference = 066A50D21BC4AE63000E606E /* ActorSDK.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 066A50C91BC4AE63000E606E /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0700; - ORGANIZATIONNAME = "Steve Kite"; - TargetAttributes = { - 066A50D11BC4AE63000E606E = { - CreatedOnToolsVersion = 7.0; - DevelopmentTeam = HVJR44Y5B6; - LastSwiftMigration = 0800; - }; - }; - }; - buildConfigurationList = 066A50CC1BC4AE63000E606E /* Build configuration list for PBXProject "ActorSDK" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ru, - "zh-Hans", - Base, - es, - ); - mainGroup = 066A50C81BC4AE63000E606E; - productRefGroup = 066A50D31BC4AE63000E606E /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 066A50D11BC4AE63000E606E /* ActorSDK */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 066A50D01BC4AE63000E606E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 06230F451BC95C0E00A4807B /* ABPhoneFieldCodes.txt in Resources */, - 0630741B1BD68E370053DEAF /* bg_1_preview.jpg in Resources */, - BED5A1D91C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@3x.png in Resources */, - BED5A1D81C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@2x.png in Resources */, - BED5A1D71C4839590045FDB0 /* NYTPhotoViewerCloseButtonX.png in Resources */, - 06230F461BC95C0E00A4807B /* PhoneFormats.dat in Resources */, - 065975511BC7DD3C00B8C7DF /* highlight-default.min.css in Resources */, - 0659754B1BC7DBA000B8C7DF /* iapetus.caf in Resources */, - BED5A1DC1C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@3x.png in Resources */, - 0630741A1BD68E370053DEAF /* bg_2_preview.jpg in Resources */, - 065975221BC7C84E00B8C7DF /* bg_3.jpg in Resources */, - 065975211BC7C84E00B8C7DF /* bg_1.jpg in Resources */, - 0659753B1BC7D22200B8C7DF /* Images.xcassets in Resources */, - 065975231BC7C84E00B8C7DF /* bg_2.jpg in Resources */, - 065975521BC7DD3C00B8C7DF /* highlight.min.js in Resources */, - 065975441BC7D34200B8C7DF /* Localizable.strings in Resources */, - 06E3C58B1C746CCC004776CD /* tone.m4a in Resources */, - BED5A1DB1C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@2x.png in Resources */, - 06E3C58D1C749320004776CD /* ringtone.m4a in Resources */, - 0659754C1BC7DBA000B8C7DF /* notification.caf in Resources */, - BEF11DB61C466D800076400A /* begin_record.caf in Resources */, - 063074191BD68E370053DEAF /* bg_3_preview.jpg in Resources */, - BED5A1DA1C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 066A52091BC4EA95000E606E /* Build and Install Actor Core */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Build and Install Actor Core"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "set -e\n\ncd ActorSDK/Sources/ActorCore\nmake translate\nmake build -j3\n\ncd \"${CONFIGURATION_TEMP_DIR}/j2objc/\"\npython \"${PROJECT_DIR}/ActorSDK/Sources/ActorCore/convert.py\" \"${PROJECT_DIR}/ActorSDK/Sources/ActorCore/ActorCore.h\"\n\ncp -af \"${PODS_ROOT}/libjingle_peerconnection/libjingle_peerconnection/Headers/\" \"${CONFIGURATION_BUILD_DIR}/ActorSDK.framework/Headers/\"\n\ncp -a \"${CONFIGURATION_TEMP_DIR}/j2objc/Public/\" \"${CONFIGURATION_BUILD_DIR}/ActorSDK.framework/Headers/\"\n\n\ncp -a \"${PROJECT_DIR}/../sdk-core/core/core-shared/src/main/resources/\" \"${CONFIGURATION_BUILD_DIR}/ActorSDK.framework/\""; - }; - 5B00FFD27DD7E01F43B31D13 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - A2ED258362D73946D3AE7FB4 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 066A50CD1BC4AE63000E606E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 15D35F781C20273D00E3717A /* AAAudioRecorder.m in Sources */, - 15D35F181C20185500E3717A /* opus_header.c in Sources */, - 066A52F81BC52B13000E606E /* AAWallpapperSettingsCell.swift in Sources */, - BEFE68D51C4657360001F2D6 /* AAThumbnailCollectionCell.swift in Sources */, - 066A51591BC4C14A000E606E /* AASwiftlyLRU.swift in Sources */, - 061850F11C95CBF000C522D5 /* YYTextParser.m in Sources */, - BED5A1FB1C48396A0045FDB0 /* NYTPhotoTransitionAnimator.m in Sources */, - 15D35F161C20185500E3717A /* diag_range.c in Sources */, - 061850E11C95CBF000C522D5 /* YYTextInput.m in Sources */, - 9AA6A41F1D08568A00957A7F /* AASettingsMediaViewController.swift in Sources */, - 066A525E1BC503BB000E606E /* ActorApplicationDelegate.swift in Sources */, - 061850F31C95CBF000C522D5 /* YYTextRubyAnnotation.m in Sources */, - BED5A1F91C48396A0045FDB0 /* NYTPhotosViewController.m in Sources */, - 066A53101BC53317000E606E /* AAWallpapperPreviewController.swift in Sources */, - 152AA8B91C2989270030DEEE /* UIView+SLKAdditions.m in Sources */, - 066A52F21BC52B02000E606E /* AASettingsPrivacyViewController.swift in Sources */, - 15D35F561C20187E00E3717A /* AAAlertView.m in Sources */, - 060135061C95ED4C00A18C4E /* YYSentinel.m in Sources */, - 061850DB1C95CBF000C522D5 /* YYTextContainerView.m in Sources */, - 15D35F301C20187200E3717A /* info.c in Sources */, - 066A532E1BC53406000E606E /* AABubbleBaseFileCell.swift in Sources */, - 06ABFE3D1D41283A0031A0D6 /* AAGroupAdministrationViewController.swift in Sources */, - 066A514A1BC4BCE0000E606E /* Dispatch.swift in Sources */, - 066A52401BC4EECD000E606E /* AABigPlaceholderView.swift in Sources */, - BED5A1F51C48396A0045FDB0 /* NYTPhotosDataSource.m in Sources */, - 066A52FF1BC52FA9000E606E /* AAGroupMembersController.swift in Sources */, - 066A53301BC53406000E606E /* AABubbleDocumentCell.swift in Sources */, - 066A52FD1BC52FA8000E606E /* AAComposeController.swift in Sources */, - 066A52351BC4EEBA000E606E /* AATextCell.swift in Sources */, - 061850A01C95CA2600C522D5 /* CocoaDispatcher.swift in Sources */, - 066A51461BC4BBC3000E606E /* Fonts.swift in Sources */, - 066A52271BC4EEAC000E606E /* AAContentTableController.swift in Sources */, - 066A51411BC4BB5C000E606E /* AssosiatedObject.swift in Sources */, - 066A52E51BC52A20000E606E /* AAGroupViewController.swift in Sources */, - 0618509E1C9582DD00C522D5 /* AABackgroundCellRenderer.swift in Sources */, - 15D35F691C20187E00E3717A /* AAModernViewInlineMediaContext.m in Sources */, - 066A52251BC4EEAC000E606E /* ManagedBindedCells.swift in Sources */, - 15D35F601C20187E00E3717A /* AAOpusAudioPlayerAU.mm in Sources */, - 061850EB1C95CBF000C522D5 /* YYTextSelectionView.m in Sources */, - 15D35F1C1C20185500E3717A /* picture.c in Sources */, - 066A532B1BC53406000E606E /* AABubbleCell.swift in Sources */, - 061850E91C95CBF000C522D5 /* YYTextMagnifier.m in Sources */, - 06E323151C6A7AC000D66F53 /* AACallViewController.swift in Sources */, - 066A52C71BC521EA000E606E /* AAEditTextController.swift in Sources */, - 061850FD1C95CBF000C522D5 /* UIView+YYText.m in Sources */, - 153F6B5D1C2B3AC500C0B960 /* AABubbleStickerCell.swift in Sources */, - 15D35F1E1C20185500E3717A /* wav_io.c in Sources */, - 065974A51BC621F100B8C7DF /* AAAuthNavigationController.swift in Sources */, - 068AFC391C94A0050055F503 /* AADialogListProcessor.swift in Sources */, - BED5A1FF1C48396A0045FDB0 /* NYTPhotoViewController.m in Sources */, - 066A518E1BC4C383000E606E /* iOSNotificationProvider.swift in Sources */, - 06E7B2541C139B6F0090660C /* AABubbleContactCell.swift in Sources */, - 066A52CC1BC521FA000E606E /* AADialogsListContentController.swift in Sources */, - 061850E31C95CBF000C522D5 /* YYTextKeyboardManager.m in Sources */, - 066A52571BC4EF61000E606E /* AACollectionViewController.swift in Sources */, - 066A532F1BC53406000E606E /* AABubbleMediaCell.swift in Sources */, - 06ABFE3A1D410D2D0031A0D6 /* AAGroupTypeController.swift in Sources */, - 15D35F631C20187E00E3717A /* AAModernConversationAudioPlayer.m in Sources */, - 066A527F1BC51ED0000E606E /* AARootSplitViewController.swift in Sources */, - 066A52481BC4EED5000E606E /* AAProgressView.swift in Sources */, - 066A51921BC4C383000E606E /* CocoaFileSystemRuntime.swift in Sources */, - 066A52DC1BC52385000E606E /* AAContactCell.swift in Sources */, - 065975071BC7BB4000B8C7DF /* AANavigationBadge.swift in Sources */, - 066A518D1BC4C383000E606E /* CocoaStorageRuntime.swift in Sources */, - 066A52F01BC52B02000E606E /* AASettingsViewController.swift in Sources */, - 060135081C95ED4C00A18C4E /* YYTransaction.m in Sources */, - 066A52741BC5101A000E606E /* ABPhoneField.m in Sources */, - 153F6B611C2BF8EC00C0B960 /* AAAuthWelcomeController.swift in Sources */, - 152AA8A91C2989270030DEEE /* SLKTextInputbar.m in Sources */, - BED5A1F31C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.m in Sources */, - 066A53071BC53183000E606E /* AARecentViewController.swift in Sources */, - 061850EF1C95CBF000C522D5 /* YYTextAttribute.m in Sources */, - 06230F411BC95BD200A4807B /* RMPhoneFormat.m in Sources */, - BE4DBE6C1C5723BE00A31894 /* AttributedLabel.swift in Sources */, - 066A52361BC4EEBA000E606E /* AATitledCell.swift in Sources */, - 066A52431BC4EECD000E606E /* AATableViewSeparator.swift in Sources */, - 061851011C95CBF000C522D5 /* YYTextTransaction.m in Sources */, - 066A52341BC4EEBA000E606E /* AACommonCell.swift in Sources */, - 15D35F311C20187200E3717A /* internal.c in Sources */, - 061850F91C95CBF000C522D5 /* NSParagraphStyle+YYText.m in Sources */, - 06E1648F1C96D99F005AFB94 /* CocoaCrypto.swift in Sources */, - 066A52DF1BC5241F000E606E /* AAWebActionController.swift in Sources */, - 066A51221BC4B55C000E606E /* AADevice.swift in Sources */, - 066A532D1BC53406000E606E /* AABubbleServiceCell.swift in Sources */, - 065974A71BC62B3600B8C7DF /* ViewExtensions.swift in Sources */, - 066A52F11BC52B02000E606E /* AASettingsNotificationsViewController.swift in Sources */, - 061850FF1C95CBF000C522D5 /* YYTextAsyncLayer.m in Sources */, - 065A06B61C6CEFE00012EA09 /* CocoaWebRTCRuntime.swift in Sources */, - 15D35F5A1C20187E00E3717A /* AATimer.m in Sources */, - 066A52381BC4EEBA000E606E /* AAHeaderCell.swift in Sources */, - 06C1D0771C8BC9FC00B73632 /* AAAuthNameViewController.swift in Sources */, - 066A524B1BC4EF49000E606E /* AAViewController.swift in Sources */, - 066A51521BC4BE34000E606E /* Logs.swift in Sources */, - 066A52D71BC52378000E606E /* AAContactsListContentControllerDelegate.swift in Sources */, - 061850FB1C95CBF000C522D5 /* UIPasteboard+YYText.m in Sources */, - 066A51241BC4B56D000E606E /* Colors.swift in Sources */, - 066A53171BC533DD000E606E /* AABubbles.swift in Sources */, - 153F6B8B1C2D7BA400C0B960 /* AATapLabel.swift in Sources */, - 06ABFE341D3FAF800031A0D6 /* GCDAsyncSocket.m in Sources */, - 061850E71C95CBF000C522D5 /* YYTextLine.m in Sources */, - 066A52081BC4E962000E606E /* Makefile in Sources */, - 066A53231BC533F5000E606E /* Caches.swift in Sources */, - 06E7B2471C0F8D7A0090660C /* AALocationPickerController.swift in Sources */, - 061851031C95CBF000C522D5 /* YYTextUtilities.m in Sources */, - 066A51501BC4BE06000E606E /* AARegex.swift in Sources */, - 06CE89901BD84DF5005A5530 /* ActorSDKAnalytics.swift in Sources */, - 061850DD1C95CBF000C522D5 /* YYTextDebugOption.m in Sources */, - 15D35F6F1C20196E00E3717A /* AARecordAudioController.swift in Sources */, - 069CF4D31BCB909A00C66E12 /* CLTokenView.m in Sources */, - 066A52F71BC52B13000E606E /* AAWallpapperPreviewCell.swift in Sources */, - 0601BBB41CA4C80D00AEFA81 /* ElegantPresentationController.swift in Sources */, - 066A51541BC4BE95000E606E /* Images.swift in Sources */, - 152AA8A71C2989270030DEEE /* SLKInputAccessoryView.m in Sources */, - 066A52801BC51ED0000E606E /* AARootTabViewController.swift in Sources */, - 061850E51C95CBF000C522D5 /* YYTextLayout.m in Sources */, - 066A522A1BC4EEAC000E606E /* ManagedAlerts.swift in Sources */, - 069CF4D11BCB909A00C66E12 /* CLTokenInputView.m in Sources */, - 061851051C95CBF000C522D5 /* YYTextWeakProxy.m in Sources */, - 066A52451BC4EECD000E606E /* AAAvatarCell.swift in Sources */, - BE237C9D1C422FFA00060648 /* AAStickersKeyboard.swift in Sources */, - 066A52D21BC52204000E606E /* AADialogSearchCell.swift in Sources */, - 066A52371BC4EEBA000E606E /* AATableViewCell.swift in Sources */, - 066A51481BC4BBF4000E606E /* Views.swift in Sources */, - 066A53151BC533D5000E606E /* AAConversationContentController.swift in Sources */, - 066A52151BC4EE04000E606E /* AAAvatarView.swift in Sources */, - 066A52591BC4EF61000E606E /* Executions.swift in Sources */, - 153F6B8A1C2D7BA300C0B960 /* AATapLabelDelegate.swift in Sources */, - 15D35F5E1C20187E00E3717A /* AANativeAudioPlayer.m in Sources */, - 9AAE96481CF81F140092E366 /* AARingtonesViewController.swift in Sources */, - 066A52DB1BC52385000E606E /* AAContactActionCell.swift in Sources */, - 15D35F331C20187200E3717A /* opusfile.c in Sources */, - 065975391BC7CA7B00B8C7DF /* Bundle.swift in Sources */, - 15D35F6B1C20187E00E3717A /* AATimerTarget.m in Sources */, - 066A53111BC53317000E606E /* AACorePreviewController.swift in Sources */, - 066A519B1BC4C390000E606E /* FMDBKeyValue.swift in Sources */, - 15D35F521C20187E00E3717A /* ASQueue.m in Sources */, - 15D35F651C20187E00E3717A /* AAModernConversationAudioPlayerContext.m in Sources */, - 061851071C95CBF000C522D5 /* YYDispatchQueuePool.m in Sources */, - 066A52F31BC52B02000E606E /* AASettingsWallpapper.swift in Sources */, - 066A53041BC53177000E606E /* AAContactsViewController.swift in Sources */, - 066A51801BC4C373000E606E /* FMDatabasePool.m in Sources */, - 061850F51C95CBF000C522D5 /* YYTextRunDelegate.m in Sources */, - 06129AA91C8394700099286B /* AAAudioManager.swift in Sources */, - 06C1D07B1C8BFE5C00B73632 /* AAAuthPhoneViewController.swift in Sources */, - 0618510C1C95CBF000C522D5 /* YYTextView.m in Sources */, - 066A518F1BC4C383000E606E /* iOSPhoneBookProvider.swift in Sources */, - 060135041C95ED4C00A18C4E /* YYAsyncLayer.m in Sources */, - 066A530B1BC531A2000E606E /* AAUserViewController.swift in Sources */, - 06E3C5B81C80EE21004776CD /* AACircleButton.swift in Sources */, - 153F6B5B1C2B109400C0B960 /* AABubbleVoiceCell.swift in Sources */, - 061851091C95CBF000C522D5 /* YYLabel.m in Sources */, - 15D35F251C20186200E3717A /* bitwise.c in Sources */, - 066A531A1BC533E7000E606E /* AAAutoCompleteCell.swift in Sources */, - 065975051BC757A300B8C7DF /* ActorRuntime.swift in Sources */, - 066A517B1BC4C373000E606E /* FMDatabase.m in Sources */, - 06C1D07E1C8D0DEA00B73632 /* Telephony.swift in Sources */, - BE2621591C4656EE00A817AB /* AAThumbnailView.swift in Sources */, - 066A52561BC4EF61000E606E /* AATableViewController.swift in Sources */, - 152AA8AB1C2989270030DEEE /* SLKTextView.m in Sources */, - 066A52D61BC52378000E606E /* AAContactsListContentController.swift in Sources */, - 065975021BC7534100B8C7DF /* FMDBBridge.swift in Sources */, - 15D35F351C20187200E3717A /* stream.c in Sources */, - BED5A1F71C48396A0045FDB0 /* NYTPhotosOverlayView.m in Sources */, - 066A519E1BC4C390000E606E /* FMDBExtensions.swift in Sources */, - 066A52E61BC52A20000E606E /* AAAddParticipantViewController.swift in Sources */, - 066A52C81BC521EA000E606E /* AAEditFieldController.swift in Sources */, - 066A532C1BC53406000E606E /* AABubbleTextCell.swift in Sources */, - BE2621571C4656D700A817AB /* AAConvActionSheet.swift in Sources */, - 066A52261BC4EEAC000E606E /* ManagedCells.swift in Sources */, - 066A53221BC533F5000E606E /* AAMessagesFlowLayout.swift in Sources */, - 15D35F541C20187E00E3717A /* AAOpusAudioRecorder.m in Sources */, - 06E322C91C69344A00D66F53 /* iOSCallsProvider.swift in Sources */, - 066A53371BC537CA000E606E /* ConversationViewController.swift in Sources */, - 066A519D1BC4C390000E606E /* UDPreferencesStorage.swift in Sources */, - 069CF4CD1BCB909A00C66E12 /* CLBackspaceDetectingTextField.m in Sources */, - 15D35F1B1C20185500E3717A /* opusenc.m in Sources */, - 152AA8BD1C298BF00030DEEE /* AASettingsSessionsController.swift in Sources */, - 066A515B1BC4C178000E606E /* AAHashMap.swift in Sources */, - 066A52811BC51ED0000E606E /* AANoSelectionViewController.swift in Sources */, - BEE6EB041C4D9A4900A2280E /* AAWallpapersCell.swift in Sources */, - 152AA8B21C2989270030DEEE /* SLKTypingIndicatorView.m in Sources */, - 066A52281BC4EEAC000E606E /* AAManagedTableController.swift in Sources */, - 065975541BC7DF5100B8C7DF /* CocoaAssetsRuntime.swift in Sources */, - 06E7B2521C1345E70090660C /* AAMapPinPointView.swift in Sources */, - 06129AAB1C83B80B0099286B /* AAAudioRouter.swift in Sources */, - 066A53121BC53317000E606E /* AAPhotoPreviewController.swift in Sources */, - 066A52391BC4EEBA000E606E /* AAEditCell.swift in Sources */, - 066A526D1BC50E8B000E606E /* AAAuthCountryCell.swift in Sources */, - 152AA8AF1C2989270030DEEE /* SLKTextViewController.m in Sources */, - 066A51911BC4C383000E606E /* CocoaHttpRuntime.swift in Sources */, - BE281CC51C502B230042F6D4 /* AAVoiceRecorderView.swift in Sources */, - 066A53211BC533F5000E606E /* BubbleLayouts.swift in Sources */, - 066A51821BC4C373000E606E /* FMDatabaseQueue.m in Sources */, - 061850F71C95CBF000C522D5 /* NSAttributedString+YYText.m in Sources */, - 066A525A1BC4EF61000E606E /* Navigations.swift in Sources */, - 066A51841BC4C373000E606E /* FMResultSet.m in Sources */, - 066A514E1BC4BDE4000E606E /* Numbers.swift in Sources */, - 06B489ED1C9F6EBD0054245B /* AAStickerView.swift in Sources */, - 15D35F671C20187E00E3717A /* NSObject+TGLock.m in Sources */, - 06D5C05C1C8EA842002D5045 /* AAAuthOTPViewController.swift in Sources */, - 15D35F5C1C20187E00E3717A /* AAAudioPlayer.m in Sources */, - 152AA8BF1C298C4B0030DEEE /* AASettingsLastSeenController.swift in Sources */, - 066A51561BC4BEF5000E606E /* AALocalized.swift in Sources */, - 069CF4CF1BCB909A00C66E12 /* CLToken.m in Sources */, - 15D35F751C201B6B00E3717A /* AACustomPresentationController.swift in Sources */, - 066A51441BC4BBAF000E606E /* Strings.swift in Sources */, - BEE6EB011C4D7B7500A2280E /* AASettingsWallpapersController.swift in Sources */, - BED5A2011C48396A0045FDB0 /* NYTScalingImageView.m in Sources */, - 066A53331BC534F5000E606E /* AAFileTypes.swift in Sources */, - 066A52FE1BC52FA9000E606E /* AAGroupCreateViewController.swift in Sources */, - 066A52E71BC52A20000E606E /* AAInviteLinkViewController.swift in Sources */, - 152AA8AD1C2989270030DEEE /* SLKTextView+SLKAdditions.m in Sources */, - 152AA8B71C2989270030DEEE /* UIScrollView+SLKAdditions.m in Sources */, - 066A52241BC4EEAC000E606E /* AAManagedRange.swift in Sources */, - 061850ED1C95CBF000C522D5 /* YYTextArchiver.m in Sources */, - 066A50E21BC4AF9F000E606E /* ActorSDK.swift in Sources */, - 15D35F761C201B6B00E3717A /* AACustomPresentationAnimationController.swift in Sources */, - 06E7B24C1C0FAB500090660C /* AAMapFastView.swift in Sources */, - BED5A1F11C48396A0045FDB0 /* NYTPhotoCaptionView.m in Sources */, - BED5A20F1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.m in Sources */, - 06129AA61C8359FB0099286B /* CocoaLifecycleRuntime.swift in Sources */, - 066A516D1BC4C366000E606E /* ActorCoreExt.swift in Sources */, - 066A517E1BC4C373000E606E /* FMDatabaseAdditions.m in Sources */, - 066A519A1BC4C390000E606E /* FMDBList.swift in Sources */, - 066A52221BC4EEAC000E606E /* AAManagedTable.swift in Sources */, - 152AA8B51C2989270030DEEE /* UIResponder+SLKAdditions.m in Sources */, - 066A52EA1BC52A2B000E606E /* AAGroupMemberCell.swift in Sources */, - 066A52291BC4EEAC000E606E /* ManagedTableExtensions.swift in Sources */, - BED5A1FD1C48396A0045FDB0 /* NYTPhotoTransitionController.m in Sources */, - 066A514C1BC4BD05000E606E /* Collections.swift in Sources */, - 066A526A1BC50E7B000E606E /* AAAuthViewController.swift in Sources */, - 066A52541BC4EF61000E606E /* AAImagePickerController.swift in Sources */, - 066A525C1BC502EB000E606E /* ActorSDKDelegate.swift in Sources */, - 066A52551BC4EF61000E606E /* AANavigationController.swift in Sources */, - 066A52421BC4EECD000E606E /* AATableViewHeader.swift in Sources */, - 06D5C05A1C8E9B3B002D5045 /* Promises.swift in Sources */, - 064E41B51CA1D2FF00A4A9D1 /* AABigAlertController.swift in Sources */, - 066A52CD1BC521FA000E606E /* AADialogsListContentControllerDelegate.swift in Sources */, - 15D35F261C20186200E3717A /* framing.c in Sources */, - 06D5C0571C8D6E20002D5045 /* AAAuthLogInViewController.swift in Sources */, - 06E323111C694C1D00D66F53 /* WebRTCExt.swift in Sources */, - 066A52231BC4EEAC000E606E /* AAManagedSection.swift in Sources */, - 066A52D11BC52204000E606E /* AADialogCell.swift in Sources */, - 066A51901BC4C383000E606E /* CocoaNetworkRuntime.swift in Sources */, - 06ABFE381D3FCCE30031A0D6 /* AAGroupEditInfoViewController.swift in Sources */, - 06E7B24A1C0F92140090660C /* AABubbleLocationCell.swift in Sources */, - 067B67541D45341D00B9A238 /* AAGroupViewMembersController.swift in Sources */, - 066A52581BC4EF61000E606E /* Alerts.swift in Sources */, - 066A51691BC4C366000E606E /* AATools.swift in Sources */, - 066A53201BC533F5000E606E /* AABubbleBackgroundProcessor.swift in Sources */, - 066CBCDC1C8D419F004507E2 /* AAAuthEmailViewController.swift in Sources */, - 061850DF1C95CBF000C522D5 /* YYTextEffectWindow.m in Sources */, - 066A52661BC50E7B000E606E /* AACountryViewController.swift in Sources */, - 0601BBB21CA4C7DE00AEFA81 /* ElegantPresentations.swift in Sources */, - 066A53391BC5456B000E606E /* ActorStyle.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 065975461BC7D34200B8C7DF /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 0659754D1BC7DCED00B8C7DF /* Base */, - 15F89F0F1C21317400776ACD /* es */, - 065975451BC7D34200B8C7DF /* pt */, - 065975471BC7D34400B8C7DF /* ru */, - 065975481BC7D34600B8C7DF /* zh-Hans */, - ); - name = Localizable.strings; - path = .; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 066A50D81BC4AE63000E606E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 066A50D91BC4AE63000E606E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 066A50DB1BC4AE63000E606E /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E30822B631D108159E8B306B /* Pods-ActorSDK.debug.xcconfig */; - buildSettings = { - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/build/Debug-iphoneos", - "$(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks", - ); - GCC_DYNAMIC_NO_PIC = NO; - GCC_LINK_WITH_DYNAMIC_LIBRARIES = YES; - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; - INFOPLIST_FILE = "$(SRCROOT)/ActorSDK/Sources/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_NO_PIE = NO; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(CONFIGURATION_TEMP_DIR)/j2objc/Objects/", - "$(PROJECT_DIR)/ActorSDK/Sources/Utils", - "$(PROJECT_DIR)/ActorSDK/Sources/Utils/AudioRecorder/libopus/lib", - "$(inherited)", - "$(PROJECT_DIR)/ActorSDK/Libs", - ); - MACH_O_TYPE = mh_dylib; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = ( - "-lactor", - "$(inherited)", - "-framework", - j2objc, - ); - PRODUCT_BUNDLE_IDENTIFIER = im.actor.ActorSDK; - PRODUCT_NAME = ActorSDK; - PROVISIONING_PROFILE = ""; - SKIP_INSTALL = YES; - STRIP_INSTALLED_PRODUCT = YES; - SWIFT_INCLUDE_PATHS = "$(PROJECT_DIR)/ActorSDK/Sources/Libs/CommonCrypto $(PROJECT_DIR)/IDZSwiftCommonCrypto/Frameworks/$(PLATFORM_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - VALID_ARCHS = "arm64 armv7"; - WARNING_CFLAGS = "-Wno-nullability-completeness"; - }; - name = Debug; - }; - 066A50DC1BC4AE63000E606E /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F076508E3899D309954904A3 /* Pods-ActorSDK.release.xcconfig */; - buildSettings = { - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/build/Debug-iphoneos", - "$(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks", - ); - GCC_DYNAMIC_NO_PIC = NO; - GCC_LINK_WITH_DYNAMIC_LIBRARIES = YES; - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; - INFOPLIST_FILE = "$(SRCROOT)/ActorSDK/Sources/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_NO_PIE = NO; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(CONFIGURATION_TEMP_DIR)/j2objc/Objects/", - "$(PROJECT_DIR)/ActorSDK/Sources/Utils", - "$(PROJECT_DIR)/ActorSDK/Sources/Utils/AudioRecorder/libopus/lib", - "$(inherited)", - "$(PROJECT_DIR)/ActorSDK/Libs", - ); - MACH_O_TYPE = mh_dylib; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = ( - "-lactor", - "$(inherited)", - "-framework", - j2objc, - ); - PRODUCT_BUNDLE_IDENTIFIER = im.actor.ActorSDK; - PRODUCT_NAME = ActorSDK; - PROVISIONING_PROFILE = ""; - SKIP_INSTALL = YES; - STRIP_INSTALLED_PRODUCT = YES; - SWIFT_INCLUDE_PATHS = "$(PROJECT_DIR)/ActorSDK/Sources/Libs/CommonCrypto $(PROJECT_DIR)/IDZSwiftCommonCrypto/Frameworks/$(PLATFORM_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; - VALID_ARCHS = "arm64 armv7"; - WARNING_CFLAGS = "-Wno-nullability-completeness"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 066A50CC1BC4AE63000E606E /* Build configuration list for PBXProject "ActorSDK" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 066A50D81BC4AE63000E606E /* Debug */, - 066A50D91BC4AE63000E606E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 066A50DA1BC4AE63000E606E /* Build configuration list for PBXNativeTarget "ActorSDK" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 066A50DB1BC4AE63000E606E /* Debug */, - 066A50DC1BC4AE63000E606E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 066A50C91BC4AE63000E606E /* Project object */; -} +cp -a "${PROJECT_DIR}/../sdk-core/core/core-shared/src/main/resources/" "${CONFIGURATION_BUILD_DIR}/ActorSDK.framework/" + + 066A52131BC4EDEB000E606E + + children + + 069CF4C31BCB908C00C66E12 + 066A52321BC4EEBA000E606E + 066A52141BC4EE04000E606E + 06B489EC1C9F6EBC0054245B + 066A523A1BC4EECD000E606E + 06E7B24B1C0FAB500090660C + 06E7B2511C1345E70090660C + 066A52461BC4EED5000E606E + 066A523C1BC4EECD000E606E + 066A523D1BC4EECD000E606E + 06E3C5B71C80EE20004776CD + 065974A61BC62B3600B8C7DF + + isa + PBXGroup + path + Views + sourceTree + <group> + + 066A52141BC4EE04000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAvatarView.swift + sourceTree + <group> + + 066A52151BC4EE04000E606E + + fileRef + 066A52141BC4EE04000E606E + isa + PBXBuildFile + + 066A52181BC4EE9A000E606E + + children + + 066A52501BC4EF61000E606E + 066A521E1BC4EEAC000E606E + 066A524D1BC4EF61000E606E + 066A521B1BC4EEAC000E606E + 066A521A1BC4EEAC000E606E + 066A52191BC4EEAC000E606E + 066A521F1BC4EEAC000E606E + 066A524E1BC4EF61000E606E + 066A524F1BC4EF61000E606E + 066A52491BC4EF49000E606E + 066A52511BC4EF61000E606E + 066A52521BC4EF61000E606E + 066A52211BC4EEAC000E606E + 066A521C1BC4EEAC000E606E + 066A521D1BC4EEAC000E606E + 066A52201BC4EEAC000E606E + 066A52531BC4EF61000E606E + + isa + PBXGroup + path + Managed Runtime + sourceTree + <group> + + 066A52191BC4EEAC000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAManagedTable.swift + sourceTree + <group> + + 066A521A1BC4EEAC000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAManagedSection.swift + sourceTree + <group> + + 066A521B1BC4EEAC000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAManagedRange.swift + sourceTree + <group> + + 066A521C1BC4EEAC000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ManagedBindedCells.swift + sourceTree + <group> + + 066A521D1BC4EEAC000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ManagedCells.swift + sourceTree + <group> + + 066A521E1BC4EEAC000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAContentTableController.swift + sourceTree + <group> + + 066A521F1BC4EEAC000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAManagedTableController.swift + sourceTree + <group> + + 066A52201BC4EEAC000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ManagedTableExtensions.swift + sourceTree + <group> + + 066A52211BC4EEAC000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ManagedAlerts.swift + sourceTree + <group> + + 066A52221BC4EEAC000E606E + + fileRef + 066A52191BC4EEAC000E606E + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -w + + + 066A52231BC4EEAC000E606E + + fileRef + 066A521A1BC4EEAC000E606E + isa + PBXBuildFile + + 066A52241BC4EEAC000E606E + + fileRef + 066A521B1BC4EEAC000E606E + isa + PBXBuildFile + + 066A52251BC4EEAC000E606E + + fileRef + 066A521C1BC4EEAC000E606E + isa + PBXBuildFile + + 066A52261BC4EEAC000E606E + + fileRef + 066A521D1BC4EEAC000E606E + isa + PBXBuildFile + + 066A52271BC4EEAC000E606E + + fileRef + 066A521E1BC4EEAC000E606E + isa + PBXBuildFile + + 066A52281BC4EEAC000E606E + + fileRef + 066A521F1BC4EEAC000E606E + isa + PBXBuildFile + + 066A52291BC4EEAC000E606E + + fileRef + 066A52201BC4EEAC000E606E + isa + PBXBuildFile + + 066A522A1BC4EEAC000E606E + + fileRef + 066A52211BC4EEAC000E606E + isa + PBXBuildFile + + 066A522C1BC4EEBA000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AACommonCell.swift + sourceTree + <group> + + 066A522D1BC4EEBA000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AATextCell.swift + sourceTree + <group> + + 066A522E1BC4EEBA000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AATitledCell.swift + sourceTree + <group> + + 066A522F1BC4EEBA000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AATableViewCell.swift + sourceTree + <group> + + 066A52301BC4EEBA000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAHeaderCell.swift + sourceTree + <group> + + 066A52311BC4EEBA000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAEditCell.swift + sourceTree + <group> + + 066A52321BC4EEBA000E606E + + children + + 066A523F1BC4EECD000E606E + 066A522C1BC4EEBA000E606E + 066A52311BC4EEBA000E606E + 066A52301BC4EEBA000E606E + 066A522F1BC4EEBA000E606E + 066A522D1BC4EEBA000E606E + 066A522E1BC4EEBA000E606E + 0618509D1C9582DD00C522D5 + + isa + PBXGroup + path + Cells + sourceTree + <group> + + 066A52341BC4EEBA000E606E + + fileRef + 066A522C1BC4EEBA000E606E + isa + PBXBuildFile + + 066A52351BC4EEBA000E606E + + fileRef + 066A522D1BC4EEBA000E606E + isa + PBXBuildFile + + 066A52361BC4EEBA000E606E + + fileRef + 066A522E1BC4EEBA000E606E + isa + PBXBuildFile + + 066A52371BC4EEBA000E606E + + fileRef + 066A522F1BC4EEBA000E606E + isa + PBXBuildFile + + 066A52381BC4EEBA000E606E + + fileRef + 066A52301BC4EEBA000E606E + isa + PBXBuildFile + + 066A52391BC4EEBA000E606E + + fileRef + 066A52311BC4EEBA000E606E + isa + PBXBuildFile + + 066A523A1BC4EECD000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABigPlaceholderView.swift + sourceTree + <group> + + 066A523C1BC4EECD000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AATableViewHeader.swift + sourceTree + <group> + + 066A523D1BC4EECD000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AATableViewSeparator.swift + sourceTree + <group> + + 066A523F1BC4EECD000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAvatarCell.swift + sourceTree + <group> + + 066A52401BC4EECD000E606E + + fileRef + 066A523A1BC4EECD000E606E + isa + PBXBuildFile + + 066A52421BC4EECD000E606E + + fileRef + 066A523C1BC4EECD000E606E + isa + PBXBuildFile + + 066A52431BC4EECD000E606E + + fileRef + 066A523D1BC4EECD000E606E + isa + PBXBuildFile + + 066A52451BC4EECD000E606E + + fileRef + 066A523F1BC4EECD000E606E + isa + PBXBuildFile + + 066A52461BC4EED5000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAProgressView.swift + sourceTree + <group> + + 066A52481BC4EED5000E606E + + fileRef + 066A52461BC4EED5000E606E + isa + PBXBuildFile + + 066A52491BC4EF49000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAViewController.swift + sourceTree + <group> + + 066A524B1BC4EF49000E606E + + fileRef + 066A52491BC4EF49000E606E + isa + PBXBuildFile + + 066A524D1BC4EF61000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAImagePickerController.swift + sourceTree + <group> + + 066A524E1BC4EF61000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AANavigationController.swift + sourceTree + <group> + + 066A524F1BC4EF61000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AATableViewController.swift + sourceTree + <group> + + 066A52501BC4EF61000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AACollectionViewController.swift + sourceTree + <group> + + 066A52511BC4EF61000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Alerts.swift + sourceTree + <group> + + 066A52521BC4EF61000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Executions.swift + sourceTree + <group> + + 066A52531BC4EF61000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Navigations.swift + sourceTree + <group> + + 066A52541BC4EF61000E606E + + fileRef + 066A524D1BC4EF61000E606E + isa + PBXBuildFile + + 066A52551BC4EF61000E606E + + fileRef + 066A524E1BC4EF61000E606E + isa + PBXBuildFile + + 066A52561BC4EF61000E606E + + fileRef + 066A524F1BC4EF61000E606E + isa + PBXBuildFile + + 066A52571BC4EF61000E606E + + fileRef + 066A52501BC4EF61000E606E + isa + PBXBuildFile + + 066A52581BC4EF61000E606E + + fileRef + 066A52511BC4EF61000E606E + isa + PBXBuildFile + + 066A52591BC4EF61000E606E + + fileRef + 066A52521BC4EF61000E606E + isa + PBXBuildFile + + 066A525A1BC4EF61000E606E + + fileRef + 066A52531BC4EF61000E606E + isa + PBXBuildFile + + 066A525B1BC502EB000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ActorSDKDelegate.swift + sourceTree + <group> + + 066A525C1BC502EB000E606E + + fileRef + 066A525B1BC502EB000E606E + isa + PBXBuildFile + + 066A525D1BC503BB000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ActorApplicationDelegate.swift + sourceTree + <group> + + 066A525E1BC503BB000E606E + + fileRef + 066A525D1BC503BB000E606E + isa + PBXBuildFile + + 066A525F1BC50E53000E606E + + children + + 06C1D0751C8BC55100B73632 + 066A52601BC50E6B000E606E + 066A52F91BC52FA0000E606E + 066A53021BC53171000E606E + 066A53351BC537BF000E606E + 066A52E11BC52A16000E606E + 06E7B2451C0F8D410090660C + 066A53051BC5317B000E606E + 066A527B1BC51EC6000E606E + 9AAE96461CF81F140092E366 + 066A52EB1BC52AF8000E606E + 066A53091BC53197000E606E + 06E323131C6A7AA300D66F53 + 066A52C41BC521D5000E606E + 066A52181BC4EE9A000E606E + + isa + PBXGroup + path + Controllers + sourceTree + <group> + + 066A52601BC50E6B000E606E + + children + + 066A526B1BC50E83000E606E + 066A526E1BC51007000E606E + 066CBCDA1C8D4121004507E2 + 06D5C0561C8D6E20002D5045 + 06C1D0761C8BC9FC00B73632 + 06C1D07A1C8BFE5C00B73632 + 066CBCDB1C8D419F004507E2 + 06D5C05B1C8EA842002D5045 + + isa + PBXGroup + path + Auth + sourceTree + <group> + + 066A52611BC50E7B000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AACountryViewController.swift + sourceTree + <group> + + 066A52651BC50E7B000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAuthViewController.swift + sourceTree + <group> + + 066A52661BC50E7B000E606E + + fileRef + 066A52611BC50E7B000E606E + isa + PBXBuildFile + + 066A526A1BC50E7B000E606E + + fileRef + 066A52651BC50E7B000E606E + isa + PBXBuildFile + + 066A526B1BC50E83000E606E + + children + + 066A526C1BC50E8B000E606E + + isa + PBXGroup + path + Cells + sourceTree + <group> + + 066A526C1BC50E8B000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAuthCountryCell.swift + sourceTree + <group> + + 066A526D1BC50E8B000E606E + + fileRef + 066A526C1BC50E8B000E606E + isa + PBXBuildFile + + 066A526E1BC51007000E606E + + children + + 066A526F1BC5101A000E606E + 066A52701BC5101A000E606E + 06230F401BC95BD200A4807B + 06230F3F1BC95BD200A4807B + + isa + PBXGroup + path + Views + sourceTree + <group> + + 066A526F1BC5101A000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + ABPhoneField.h + sourceTree + <group> + + 066A52701BC5101A000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + ABPhoneField.m + sourceTree + <group> + + 066A52731BC5101A000E606E + + fileRef + 066A526F1BC5101A000E606E + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 066A52741BC5101A000E606E + + fileRef + 066A52701BC5101A000E606E + isa + PBXBuildFile + + 066A527B1BC51EC6000E606E + + children + + 066A527E1BC51ED0000E606E + 066A527C1BC51ED0000E606E + 066A527D1BC51ED0000E606E + + isa + PBXGroup + path + Root + sourceTree + <group> + + 066A527C1BC51ED0000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AARootSplitViewController.swift + sourceTree + <group> + + 066A527D1BC51ED0000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AARootTabViewController.swift + sourceTree + <group> + + 066A527E1BC51ED0000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AANoSelectionViewController.swift + sourceTree + <group> + + 066A527F1BC51ED0000E606E + + fileRef + 066A527C1BC51ED0000E606E + isa + PBXBuildFile + + 066A52801BC51ED0000E606E + + fileRef + 066A527D1BC51ED0000E606E + isa + PBXBuildFile + + 066A52811BC51ED0000E606E + + fileRef + 066A527E1BC51ED0000E606E + isa + PBXBuildFile + + 066A52C41BC521D5000E606E + + children + + 066A52D31BC5236B000E606E + 066A53131BC533C5000E606E + 066A52C91BC521F1000E606E + 066A52E01BC52422000E606E + 066A530C1BC5330D000E606E + 066A52DD1BC52419000E606E + + isa + PBXGroup + path + Content + sourceTree + <group> + + 066A52C51BC521EA000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAEditTextController.swift + sourceTree + <group> + + 066A52C61BC521EA000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAEditFieldController.swift + sourceTree + <group> + + 066A52C71BC521EA000E606E + + fileRef + 066A52C51BC521EA000E606E + isa + PBXBuildFile + + 066A52C81BC521EA000E606E + + fileRef + 066A52C61BC521EA000E606E + isa + PBXBuildFile + + 066A52C91BC521F1000E606E + + children + + 066A52CE1BC521FD000E606E + 066A52CA1BC521FA000E606E + 066A52CB1BC521FA000E606E + + isa + PBXGroup + path + Dialogs List + sourceTree + <group> + + 066A52CA1BC521FA000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AADialogsListContentController.swift + sourceTree + <group> + + 066A52CB1BC521FA000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AADialogsListContentControllerDelegate.swift + sourceTree + <group> + + 066A52CC1BC521FA000E606E + + fileRef + 066A52CA1BC521FA000E606E + isa + PBXBuildFile + + 066A52CD1BC521FA000E606E + + fileRef + 066A52CB1BC521FA000E606E + isa + PBXBuildFile + + 066A52CE1BC521FD000E606E + + children + + 066A52CF1BC52204000E606E + 066A52D01BC52204000E606E + 068AFC381C94A0050055F503 + + isa + PBXGroup + path + Cells + sourceTree + <group> + + 066A52CF1BC52204000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AADialogCell.swift + sourceTree + <group> + + 066A52D01BC52204000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AADialogSearchCell.swift + sourceTree + <group> + + 066A52D11BC52204000E606E + + fileRef + 066A52CF1BC52204000E606E + isa + PBXBuildFile + + 066A52D21BC52204000E606E + + fileRef + 066A52D01BC52204000E606E + isa + PBXBuildFile + + 066A52D31BC5236B000E606E + + children + + 066A52D81BC5237B000E606E + 066A52D41BC52378000E606E + 066A52D51BC52378000E606E + + isa + PBXGroup + path + Contacts List + sourceTree + <group> + + 066A52D41BC52378000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAContactsListContentController.swift + sourceTree + <group> + + 066A52D51BC52378000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAContactsListContentControllerDelegate.swift + sourceTree + <group> + + 066A52D61BC52378000E606E + + fileRef + 066A52D41BC52378000E606E + isa + PBXBuildFile + + 066A52D71BC52378000E606E + + fileRef + 066A52D51BC52378000E606E + isa + PBXBuildFile + + 066A52D81BC5237B000E606E + + children + + 066A52D91BC52385000E606E + 066A52DA1BC52385000E606E + + isa + PBXGroup + path + Cells + sourceTree + <group> + + 066A52D91BC52385000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAContactActionCell.swift + sourceTree + <group> + + 066A52DA1BC52385000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAContactCell.swift + sourceTree + <group> + + 066A52DB1BC52385000E606E + + fileRef + 066A52D91BC52385000E606E + isa + PBXBuildFile + + 066A52DC1BC52385000E606E + + fileRef + 066A52DA1BC52385000E606E + isa + PBXBuildFile + + 066A52DD1BC52419000E606E + + children + + 066A52DE1BC5241F000E606E + + isa + PBXGroup + path + WebActions + sourceTree + <group> + + 066A52DE1BC5241F000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAWebActionController.swift + sourceTree + <group> + + 066A52DF1BC5241F000E606E + + fileRef + 066A52DE1BC5241F000E606E + isa + PBXBuildFile + + 066A52E01BC52422000E606E + + children + + 066A52C61BC521EA000E606E + 066A52C51BC521EA000E606E + + isa + PBXGroup + path + Input + sourceTree + <group> + + 066A52E11BC52A16000E606E + + children + + 066A52E81BC52A25000E606E + 066A52E21BC52A20000E606E + 06ABFE371D3FCCE30031A0D6 + 067B67531D45341D00B9A238 + 06ABFE3C1D41283A0031A0D6 + 06ABFE391D410D2D0031A0D6 + 066A52E31BC52A20000E606E + 066A52E41BC52A20000E606E + + isa + PBXGroup + path + Group + sourceTree + <group> + + 066A52E21BC52A20000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAGroupViewController.swift + sourceTree + <group> + + 066A52E31BC52A20000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAddParticipantViewController.swift + sourceTree + <group> + + 066A52E41BC52A20000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAInviteLinkViewController.swift + sourceTree + <group> + + 066A52E51BC52A20000E606E + + fileRef + 066A52E21BC52A20000E606E + isa + PBXBuildFile + + 066A52E61BC52A20000E606E + + fileRef + 066A52E31BC52A20000E606E + isa + PBXBuildFile + + 066A52E71BC52A20000E606E + + fileRef + 066A52E41BC52A20000E606E + isa + PBXBuildFile + + 066A52E81BC52A25000E606E + + children + + 066A52E91BC52A2B000E606E + + isa + PBXGroup + path + Cells + sourceTree + <group> + + 066A52E91BC52A2B000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAGroupMemberCell.swift + sourceTree + <group> + + 066A52EA1BC52A2B000E606E + + fileRef + 066A52E91BC52A2B000E606E + isa + PBXBuildFile + + 066A52EB1BC52AF8000E606E + + children + + BEE6EAFF1C4D7B5600A2280E + 066A52F41BC52B09000E606E + 066A52EC1BC52B02000E606E + 066A52ED1BC52B02000E606E + 066A52EE1BC52B02000E606E + 152AA8BE1C298C4B0030DEEE + 152AA8BC1C298BF00030DEEE + 9AA6A41E1D08568A00957A7F + 066A52EF1BC52B02000E606E + + isa + PBXGroup + path + Settings + sourceTree + <group> + + 066A52EC1BC52B02000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AASettingsViewController.swift + sourceTree + <group> + + 066A52ED1BC52B02000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AASettingsNotificationsViewController.swift + sourceTree + <group> + + 066A52EE1BC52B02000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AASettingsPrivacyViewController.swift + sourceTree + <group> + + 066A52EF1BC52B02000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AASettingsWallpapper.swift + sourceTree + <group> + + 066A52F01BC52B02000E606E + + fileRef + 066A52EC1BC52B02000E606E + isa + PBXBuildFile + + 066A52F11BC52B02000E606E + + fileRef + 066A52ED1BC52B02000E606E + isa + PBXBuildFile + + 066A52F21BC52B02000E606E + + fileRef + 066A52EE1BC52B02000E606E + isa + PBXBuildFile + + 066A52F31BC52B02000E606E + + fileRef + 066A52EF1BC52B02000E606E + isa + PBXBuildFile + + 066A52F41BC52B09000E606E + + children + + 066A52F51BC52B13000E606E + 066A52F61BC52B13000E606E + + isa + PBXGroup + path + Cells + sourceTree + <group> + + 066A52F51BC52B13000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAWallpapperPreviewCell.swift + sourceTree + <group> + + 066A52F61BC52B13000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAWallpapperSettingsCell.swift + sourceTree + <group> + + 066A52F71BC52B13000E606E + + fileRef + 066A52F51BC52B13000E606E + isa + PBXBuildFile + + 066A52F81BC52B13000E606E + + fileRef + 066A52F61BC52B13000E606E + isa + PBXBuildFile + + 066A52F91BC52FA0000E606E + + children + + 066A52FA1BC52FA8000E606E + 066A52FB1BC52FA8000E606E + 066A52FC1BC52FA8000E606E + + isa + PBXGroup + path + Compose + sourceTree + <group> + + 066A52FA1BC52FA8000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAComposeController.swift + sourceTree + <group> + + 066A52FB1BC52FA8000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAGroupCreateViewController.swift + sourceTree + <group> + + 066A52FC1BC52FA8000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAGroupMembersController.swift + sourceTree + <group> + + 066A52FD1BC52FA8000E606E + + fileRef + 066A52FA1BC52FA8000E606E + isa + PBXBuildFile + + 066A52FE1BC52FA9000E606E + + fileRef + 066A52FB1BC52FA8000E606E + isa + PBXBuildFile + + 066A52FF1BC52FA9000E606E + + fileRef + 066A52FC1BC52FA8000E606E + isa + PBXBuildFile + + 066A53021BC53171000E606E + + children + + 066A53031BC53177000E606E + + isa + PBXGroup + path + Contacts + sourceTree + <group> + + 066A53031BC53177000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAContactsViewController.swift + sourceTree + <group> + + 066A53041BC53177000E606E + + fileRef + 066A53031BC53177000E606E + isa + PBXBuildFile + + 066A53051BC5317B000E606E + + children + + 066A53061BC53183000E606E + + isa + PBXGroup + path + Recent + sourceTree + <group> + + 066A53061BC53183000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AARecentViewController.swift + sourceTree + <group> + + 066A53071BC53183000E606E + + fileRef + 066A53061BC53183000E606E + isa + PBXBuildFile + + 066A53091BC53197000E606E + + children + + 066A530A1BC531A2000E606E + + isa + PBXGroup + path + User + sourceTree + <group> + + 066A530A1BC531A2000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAUserViewController.swift + sourceTree + <group> + + 066A530B1BC531A2000E606E + + fileRef + 066A530A1BC531A2000E606E + isa + PBXBuildFile + + 066A530C1BC5330D000E606E + + children + + 066A530E1BC53317000E606E + 066A530F1BC53317000E606E + 066A530D1BC53317000E606E + + isa + PBXGroup + path + Previews + sourceTree + <group> + + 066A530D1BC53317000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAWallpapperPreviewController.swift + sourceTree + <group> + + 066A530E1BC53317000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AACorePreviewController.swift + sourceTree + <group> + + 066A530F1BC53317000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAPhotoPreviewController.swift + sourceTree + <group> + + 066A53101BC53317000E606E + + fileRef + 066A530D1BC53317000E606E + isa + PBXBuildFile + + 066A53111BC53317000E606E + + fileRef + 066A530E1BC53317000E606E + isa + PBXBuildFile + + 066A53121BC53317000E606E + + fileRef + 066A530F1BC53317000E606E + isa + PBXBuildFile + + 066A53131BC533C5000E606E + + children + + 066A53241BC533FD000E606E + 066A531B1BC533EB000E606E + 066A53181BC533E0000E606E + 15D35F6D1C20196700E3717A + 066A53161BC533DD000E606E + 066A53141BC533D5000E606E + 065975061BC7BB4000B8C7DF + + isa + PBXGroup + path + Conversation + sourceTree + <group> + + 066A53141BC533D5000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAConversationContentController.swift + sourceTree + <group> + + 066A53151BC533D5000E606E + + fileRef + 066A53141BC533D5000E606E + isa + PBXBuildFile + + 066A53161BC533DD000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABubbles.swift + sourceTree + <group> + + 066A53171BC533DD000E606E + + fileRef + 066A53161BC533DD000E606E + isa + PBXBuildFile + + 066A53181BC533E0000E606E + + children + + 066A53191BC533E7000E606E + + isa + PBXGroup + path + Suggestion + sourceTree + <group> + + 066A53191BC533E7000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAutoCompleteCell.swift + sourceTree + <group> + + 066A531A1BC533E7000E606E + + fileRef + 066A53191BC533E7000E606E + isa + PBXBuildFile + + 066A531B1BC533EB000E606E + + children + + 066A531C1BC533F5000E606E + 066A531E1BC533F5000E606E + 066A531D1BC533F5000E606E + 066A531F1BC533F5000E606E + + isa + PBXGroup + path + Layouting + sourceTree + <group> + + 066A531C1BC533F5000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABubbleBackgroundProcessor.swift + sourceTree + <group> + + 066A531D1BC533F5000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + BubbleLayouts.swift + sourceTree + <group> + + 066A531E1BC533F5000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAMessagesFlowLayout.swift + sourceTree + <group> + + 066A531F1BC533F5000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Caches.swift + sourceTree + <group> + + 066A53201BC533F5000E606E + + fileRef + 066A531C1BC533F5000E606E + isa + PBXBuildFile + + 066A53211BC533F5000E606E + + fileRef + 066A531D1BC533F5000E606E + isa + PBXBuildFile + + 066A53221BC533F5000E606E + + fileRef + 066A531E1BC533F5000E606E + isa + PBXBuildFile + + 066A53231BC533F5000E606E + + fileRef + 066A531F1BC533F5000E606E + isa + PBXBuildFile + + 066A53241BC533FD000E606E + + children + + 066A53251BC53406000E606E + 066A53261BC53406000E606E + 066A53281BC53406000E606E + 153F6B5C1C2B3AC500C0B960 + 066A532A1BC53406000E606E + 066A53291BC53406000E606E + 153F6B5A1C2B109400C0B960 + 066A53271BC53406000E606E + 06E7B2491C0F92140090660C + 06E7B2531C139B6F0090660C + + isa + PBXGroup + path + Cell + sourceTree + <group> + + 066A53251BC53406000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABubbleCell.swift + sourceTree + <group> + + 066A53261BC53406000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABubbleTextCell.swift + sourceTree + <group> + + 066A53271BC53406000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABubbleServiceCell.swift + sourceTree + <group> + + 066A53281BC53406000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABubbleBaseFileCell.swift + sourceTree + <group> + + 066A53291BC53406000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABubbleMediaCell.swift + sourceTree + <group> + + 066A532A1BC53406000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABubbleDocumentCell.swift + sourceTree + <group> + + 066A532B1BC53406000E606E + + fileRef + 066A53251BC53406000E606E + isa + PBXBuildFile + + 066A532C1BC53406000E606E + + fileRef + 066A53261BC53406000E606E + isa + PBXBuildFile + + 066A532D1BC53406000E606E + + fileRef + 066A53271BC53406000E606E + isa + PBXBuildFile + + 066A532E1BC53406000E606E + + fileRef + 066A53281BC53406000E606E + isa + PBXBuildFile + + 066A532F1BC53406000E606E + + fileRef + 066A53291BC53406000E606E + isa + PBXBuildFile + + 066A53301BC53406000E606E + + fileRef + 066A532A1BC53406000E606E + isa + PBXBuildFile + + 066A53311BC534F5000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAFileTypes.swift + sourceTree + <group> + + 066A53331BC534F5000E606E + + fileRef + 066A53311BC534F5000E606E + isa + PBXBuildFile + + 066A53351BC537BF000E606E + + children + + 066A53361BC537CA000E606E + + isa + PBXGroup + path + Conversation + sourceTree + <group> + + 066A53361BC537CA000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ConversationViewController.swift + sourceTree + <group> + + 066A53371BC537CA000E606E + + fileRef + 066A53361BC537CA000E606E + isa + PBXBuildFile + + 066A53381BC5456B000E606E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ActorStyle.swift + sourceTree + <group> + + 066A53391BC5456B000E606E + + fileRef + 066A53381BC5456B000E606E + isa + PBXBuildFile + + 066CBCDA1C8D4121004507E2 + + children + + 066A52651BC50E7B000E606E + 065974A41BC621F100B8C7DF + 066A52611BC50E7B000E606E + 064E41B41CA1D2FF00A4A9D1 + + isa + PBXGroup + name + Controllers + sourceTree + <group> + + 066CBCDB1C8D419F004507E2 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAuthEmailViewController.swift + sourceTree + <group> + + 066CBCDC1C8D419F004507E2 + + fileRef + 066CBCDB1C8D419F004507E2 + isa + PBXBuildFile + + 067B67531D45341D00B9A238 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAGroupViewMembersController.swift + sourceTree + <group> + + 067B67541D45341D00B9A238 + + fileRef + 067B67531D45341D00B9A238 + isa + PBXBuildFile + + 068AFC381C94A0050055F503 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AADialogListProcessor.swift + sourceTree + <group> + + 068AFC391C94A0050055F503 + + fileRef + 068AFC381C94A0050055F503 + isa + PBXBuildFile + + 069CF4151BCA5DB500C66E12 + + children + + 066A525F1BC50E53000E606E + 066A511D1BC4B4BD000E606E + 066A51201BC4B53C000E606E + 066A51571BC4C112000E606E + 06E322CB1C69392F00D66F53 + 066A52131BC4EDEB000E606E + 066A525D1BC503BB000E606E + 066A50D51BC4AE63000E606E + 066A50E11BC4AF9F000E606E + 06CE898F1BD84DF5005A5530 + 066A525B1BC502EB000E606E + 066A53381BC5456B000E606E + 066A50D71BC4AE63000E606E + + isa + PBXGroup + path + Sources + sourceTree + <group> + + 069CF4C31BCB908C00C66E12 + + children + + 069CF4C41BCB909A00C66E12 + 069CF4C51BCB909A00C66E12 + 069CF4C61BCB909A00C66E12 + 069CF4C71BCB909A00C66E12 + 069CF4C81BCB909A00C66E12 + 069CF4C91BCB909A00C66E12 + 069CF4CA1BCB909A00C66E12 + 069CF4CB1BCB909A00C66E12 + + isa + PBXGroup + path + CLTokenInputView + sourceTree + <group> + + 069CF4C41BCB909A00C66E12 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + CLBackspaceDetectingTextField.h + sourceTree + <group> + + 069CF4C51BCB909A00C66E12 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + CLBackspaceDetectingTextField.m + sourceTree + <group> + + 069CF4C61BCB909A00C66E12 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + CLToken.h + sourceTree + <group> + + 069CF4C71BCB909A00C66E12 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + CLToken.m + sourceTree + <group> + + 069CF4C81BCB909A00C66E12 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + CLTokenInputView.h + sourceTree + <group> + + 069CF4C91BCB909A00C66E12 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + CLTokenInputView.m + sourceTree + <group> + + 069CF4CA1BCB909A00C66E12 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + CLTokenView.h + sourceTree + <group> + + 069CF4CB1BCB909A00C66E12 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + CLTokenView.m + sourceTree + <group> + + 069CF4CC1BCB909A00C66E12 + + fileRef + 069CF4C41BCB909A00C66E12 + isa + PBXBuildFile + + 069CF4CD1BCB909A00C66E12 + + fileRef + 069CF4C51BCB909A00C66E12 + isa + PBXBuildFile + + 069CF4CE1BCB909A00C66E12 + + fileRef + 069CF4C61BCB909A00C66E12 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 069CF4CF1BCB909A00C66E12 + + fileRef + 069CF4C71BCB909A00C66E12 + isa + PBXBuildFile + + 069CF4D01BCB909A00C66E12 + + fileRef + 069CF4C81BCB909A00C66E12 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 069CF4D11BCB909A00C66E12 + + fileRef + 069CF4C91BCB909A00C66E12 + isa + PBXBuildFile + + 069CF4D21BCB909A00C66E12 + + fileRef + 069CF4CA1BCB909A00C66E12 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 069CF4D31BCB909A00C66E12 + + fileRef + 069CF4CB1BCB909A00C66E12 + isa + PBXBuildFile + + 06ABFE261D3FAF1A0031A0D6 + + children + + 06ABFE2F1D3FAF800031A0D6 + 06ABFE301D3FAF800031A0D6 + + isa + PBXGroup + name + CocoaAsyncSocket + sourceTree + <group> + + 06ABFE2F1D3FAF800031A0D6 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + GCDAsyncSocket.h + sourceTree + <group> + + 06ABFE301D3FAF800031A0D6 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + GCDAsyncSocket.m + sourceTree + <group> + + 06ABFE331D3FAF800031A0D6 + + fileRef + 06ABFE2F1D3FAF800031A0D6 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 06ABFE341D3FAF800031A0D6 + + fileRef + 06ABFE301D3FAF800031A0D6 + isa + PBXBuildFile + + 06ABFE371D3FCCE30031A0D6 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAGroupEditInfoViewController.swift + sourceTree + <group> + + 06ABFE381D3FCCE30031A0D6 + + fileRef + 06ABFE371D3FCCE30031A0D6 + isa + PBXBuildFile + + 06ABFE391D410D2D0031A0D6 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAGroupTypeController.swift + sourceTree + <group> + + 06ABFE3A1D410D2D0031A0D6 + + fileRef + 06ABFE391D410D2D0031A0D6 + isa + PBXBuildFile + + 06ABFE3C1D41283A0031A0D6 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAGroupAdministrationViewController.swift + sourceTree + <group> + + 06ABFE3D1D41283A0031A0D6 + + fileRef + 06ABFE3C1D41283A0031A0D6 + isa + PBXBuildFile + + 06B489EC1C9F6EBC0054245B + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAStickerView.swift + sourceTree + <group> + + 06B489ED1C9F6EBD0054245B + + fileRef + 06B489EC1C9F6EBC0054245B + isa + PBXBuildFile + + 06C1D0751C8BC55100B73632 + + children + + 153F6B601C2BF8EC00C0B960 + + isa + PBXGroup + name + Welcome + sourceTree + <group> + + 06C1D0761C8BC9FC00B73632 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAuthNameViewController.swift + sourceTree + <group> + + 06C1D0771C8BC9FC00B73632 + + fileRef + 06C1D0761C8BC9FC00B73632 + isa + PBXBuildFile + + 06C1D07A1C8BFE5C00B73632 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAuthPhoneViewController.swift + sourceTree + <group> + + 06C1D07B1C8BFE5C00B73632 + + fileRef + 06C1D07A1C8BFE5C00B73632 + isa + PBXBuildFile + + 06C1D07D1C8D0DE900B73632 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Telephony.swift + sourceTree + <group> + + 06C1D07E1C8D0DEA00B73632 + + fileRef + 06C1D07D1C8D0DE900B73632 + isa + PBXBuildFile + + 06CE898B1BD841C9005A5530 + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + SystemConfiguration.framework + path + System/Library/Frameworks/SystemConfiguration.framework + sourceTree + SDKROOT + + 06CE898C1BD841C9005A5530 + + fileRef + 06CE898B1BD841C9005A5530 + isa + PBXBuildFile + + 06CE898F1BD84DF5005A5530 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + ActorSDKAnalytics.swift + sourceTree + <group> + + 06CE89901BD84DF5005A5530 + + fileRef + 06CE898F1BD84DF5005A5530 + isa + PBXBuildFile + + 06D5C0561C8D6E20002D5045 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAuthLogInViewController.swift + sourceTree + <group> + + 06D5C0571C8D6E20002D5045 + + fileRef + 06D5C0561C8D6E20002D5045 + isa + PBXBuildFile + + 06D5C0591C8E9B3B002D5045 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + Promises.swift + sourceTree + <group> + + 06D5C05A1C8E9B3B002D5045 + + fileRef + 06D5C0591C8E9B3B002D5045 + isa + PBXBuildFile + + 06D5C05B1C8EA842002D5045 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAAuthOTPViewController.swift + sourceTree + <group> + + 06D5C05C1C8EA842002D5045 + + fileRef + 06D5C05B1C8EA842002D5045 + isa + PBXBuildFile + + 06E1648E1C96D99F005AFB94 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + CocoaCrypto.swift + sourceTree + <group> + + 06E1648F1C96D99F005AFB94 + + fileRef + 06E1648E1C96D99F005AFB94 + isa + PBXBuildFile + + 06E164921C96FF15005AFB94 + + children + + 06E164931C96FF3D005AFB94 + + isa + PBXGroup + name + CommonCrypto + path + Libs/CommonCrypto + sourceTree + <group> + + 06E164931C96FF3D005AFB94 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.module-map + path + module.map + sourceTree + <group> + + 06E322C81C69344A00D66F53 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + iOSCallsProvider.swift + sourceTree + <group> + + 06E322C91C69344A00D66F53 + + fileRef + 06E322C81C69344A00D66F53 + isa + PBXBuildFile + + 06E322CB1C69392F00D66F53 + + children + + 06ABFE261D3FAF1A0031A0D6 + 06E164921C96FF15005AFB94 + 061850A31C95CBF000C522D5 + 15D35F0A1C20182900E3717A + 06E3230D1C6942C400D66F53 + 06E323101C694C1D00D66F53 + 0601BBB11CA4C7DE00AEFA81 + 0601BBB31CA4C80D00AEFA81 + + isa + PBXGroup + name + Libs + sourceTree + <group> + + 06E3230D1C6942C400D66F53 + + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + WebRTC.h + sourceTree + <group> + + 06E3230E1C69445C00D66F53 + + fileRef + 06E3230D1C6942C400D66F53 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 06E323101C694C1D00D66F53 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + WebRTCExt.swift + sourceTree + <group> + + 06E323111C694C1D00D66F53 + + fileRef + 06E323101C694C1D00D66F53 + isa + PBXBuildFile + + 06E323131C6A7AA300D66F53 + + children + + 06E323141C6A7AC000D66F53 + + isa + PBXGroup + name + Calls + sourceTree + <group> + + 06E323141C6A7AC000D66F53 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + name + AACallViewController.swift + path + Calls/AACallViewController.swift + sourceTree + <group> + + 06E323151C6A7AC000D66F53 + + fileRef + 06E323141C6A7AC000D66F53 + isa + PBXBuildFile + + 06E3C58A1C746AAC004776CD + + isa + PBXFileReference + lastKnownFileType + file + path + tone.m4a + sourceTree + <group> + + 06E3C58B1C746CCC004776CD + + fileRef + 06E3C58A1C746AAC004776CD + isa + PBXBuildFile + + 06E3C58C1C74931F004776CD + + isa + PBXFileReference + lastKnownFileType + file + path + ringtone.m4a + sourceTree + <group> + + 06E3C58D1C749320004776CD + + fileRef + 06E3C58C1C74931F004776CD + isa + PBXBuildFile + + 06E3C5B71C80EE20004776CD + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AACircleButton.swift + sourceTree + <group> + + 06E3C5B81C80EE21004776CD + + fileRef + 06E3C5B71C80EE20004776CD + isa + PBXBuildFile + + 06E7B2451C0F8D410090660C + + children + + 06E7B2461C0F8D7A0090660C + + isa + PBXGroup + path + Location + sourceTree + <group> + + 06E7B2461C0F8D7A0090660C + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AALocationPickerController.swift + sourceTree + <group> + + 06E7B2471C0F8D7A0090660C + + fileRef + 06E7B2461C0F8D7A0090660C + isa + PBXBuildFile + + 06E7B2491C0F92140090660C + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABubbleLocationCell.swift + sourceTree + <group> + + 06E7B24A1C0F92140090660C + + fileRef + 06E7B2491C0F92140090660C + isa + PBXBuildFile + + 06E7B24B1C0FAB500090660C + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAMapFastView.swift + sourceTree + <group> + + 06E7B24C1C0FAB500090660C + + fileRef + 06E7B24B1C0FAB500090660C + isa + PBXBuildFile + + 06E7B2511C1345E70090660C + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAMapPinPointView.swift + sourceTree + <group> + + 06E7B2521C1345E70090660C + + fileRef + 06E7B2511C1345E70090660C + isa + PBXBuildFile + + 06E7B2531C139B6F0090660C + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABubbleContactCell.swift + sourceTree + <group> + + 06E7B2541C139B6F0090660C + + fileRef + 06E7B2531C139B6F0090660C + isa + PBXBuildFile + + 152AA8901C29887A0030DEEE + + children + + BE4DBE6B1C5723BE00A31894 + BED5A1CF1C4839200045FDB0 + 152AA8911C29891B0030DEEE + 153F6B871C2D7B9700C0B960 + + isa + PBXGroup + path + Extensions + sourceTree + <group> + + 152AA8911C29891B0030DEEE + + children + + 153F6B471C2B03A400C0B960 + 152AA8921C2989270030DEEE + 152AA8931C2989270030DEEE + 152AA8941C2989270030DEEE + 152AA8951C2989270030DEEE + 152AA8981C2989270030DEEE + 152AA8991C2989270030DEEE + 152AA8961C2989270030DEEE + 152AA8971C2989270030DEEE + 152AA89A1C2989270030DEEE + 152AA89B1C2989270030DEEE + 152AA89C1C2989270030DEEE + 152AA89D1C2989270030DEEE + 152AA89E1C2989270030DEEE + 152AA89F1C2989270030DEEE + 152AA8A01C2989270030DEEE + 152AA8A11C2989270030DEEE + 152AA8A21C2989270030DEEE + 152AA8A31C2989270030DEEE + 152AA8A41C2989270030DEEE + 152AA8A51C2989270030DEEE + + isa + PBXGroup + path + SlackTextViewController + sourceTree + <group> + + 152AA8921C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + SLKInputAccessoryView.h + sourceTree + <group> + + 152AA8931C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + SLKInputAccessoryView.m + sourceTree + <group> + + 152AA8941C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + SLKTextInputbar.h + sourceTree + <group> + + 152AA8951C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + SLKTextInputbar.m + sourceTree + <group> + + 152AA8961C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + SLKTextView.h + sourceTree + <group> + + 152AA8971C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + SLKTextView.m + sourceTree + <group> + + 152AA8981C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + SLKTextView+SLKAdditions.h + sourceTree + <group> + + 152AA8991C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + SLKTextView+SLKAdditions.m + sourceTree + <group> + + 152AA89A1C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + SLKTextViewController.h + sourceTree + <group> + + 152AA89B1C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + SLKTextViewController.m + sourceTree + <group> + + 152AA89C1C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + SLKTypingIndicatorProtocol.h + sourceTree + <group> + + 152AA89D1C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + SLKTypingIndicatorView.h + sourceTree + <group> + + 152AA89E1C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + SLKTypingIndicatorView.m + sourceTree + <group> + + 152AA89F1C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + SLKUIConstants.h + sourceTree + <group> + + 152AA8A01C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + UIResponder+SLKAdditions.h + sourceTree + <group> + + 152AA8A11C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + UIResponder+SLKAdditions.m + sourceTree + <group> + + 152AA8A21C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + UIScrollView+SLKAdditions.h + sourceTree + <group> + + 152AA8A31C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + UIScrollView+SLKAdditions.m + sourceTree + <group> + + 152AA8A41C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + UIView+SLKAdditions.h + sourceTree + <group> + + 152AA8A51C2989270030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + UIView+SLKAdditions.m + sourceTree + <group> + + 152AA8A71C2989270030DEEE + + fileRef + 152AA8931C2989270030DEEE + isa + PBXBuildFile + + 152AA8A81C2989270030DEEE + + fileRef + 152AA8941C2989270030DEEE + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 152AA8A91C2989270030DEEE + + fileRef + 152AA8951C2989270030DEEE + isa + PBXBuildFile + + 152AA8AA1C2989270030DEEE + + fileRef + 152AA8961C2989270030DEEE + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 152AA8AB1C2989270030DEEE + + fileRef + 152AA8971C2989270030DEEE + isa + PBXBuildFile + + 152AA8AC1C2989270030DEEE + + fileRef + 152AA8981C2989270030DEEE + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 152AA8AD1C2989270030DEEE + + fileRef + 152AA8991C2989270030DEEE + isa + PBXBuildFile + + 152AA8AE1C2989270030DEEE + + fileRef + 152AA89A1C2989270030DEEE + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 152AA8AF1C2989270030DEEE + + fileRef + 152AA89B1C2989270030DEEE + isa + PBXBuildFile + + 152AA8B01C2989270030DEEE + + fileRef + 152AA89C1C2989270030DEEE + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 152AA8B11C2989270030DEEE + + fileRef + 152AA89D1C2989270030DEEE + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 152AA8B21C2989270030DEEE + + fileRef + 152AA89E1C2989270030DEEE + isa + PBXBuildFile + + 152AA8B31C2989270030DEEE + + fileRef + 152AA89F1C2989270030DEEE + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 152AA8B51C2989270030DEEE + + fileRef + 152AA8A11C2989270030DEEE + isa + PBXBuildFile + + 152AA8B61C2989270030DEEE + + fileRef + 152AA8A21C2989270030DEEE + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 152AA8B71C2989270030DEEE + + fileRef + 152AA8A31C2989270030DEEE + isa + PBXBuildFile + + 152AA8B81C2989270030DEEE + + fileRef + 152AA8A41C2989270030DEEE + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 152AA8B91C2989270030DEEE + + fileRef + 152AA8A51C2989270030DEEE + isa + PBXBuildFile + + 152AA8BC1C298BF00030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AASettingsSessionsController.swift + sourceTree + <group> + + 152AA8BD1C298BF00030DEEE + + fileRef + 152AA8BC1C298BF00030DEEE + isa + PBXBuildFile + + 152AA8BE1C298C4B0030DEEE + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AASettingsLastSeenController.swift + sourceTree + <group> + + 152AA8BF1C298C4B0030DEEE + + fileRef + 152AA8BE1C298C4B0030DEEE + isa + PBXBuildFile + + 153F6B3C1C2A9B1900C0B960 + + isa + PBXFileReference + lastKnownFileType + file + path + begin_record.caf + sourceTree + <group> + + 153F6B471C2B03A400C0B960 + + children + + isa + PBXGroup + path + Ext + sourceTree + <group> + + 153F6B5A1C2B109400C0B960 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABubbleVoiceCell.swift + sourceTree + <group> + + 153F6B5B1C2B109400C0B960 + + fileRef + 153F6B5A1C2B109400C0B960 + isa + PBXBuildFile + + 153F6B5C1C2B3AC500C0B960 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AABubbleStickerCell.swift + sourceTree + <group> + + 153F6B5D1C2B3AC500C0B960 + + fileRef + 153F6B5C1C2B3AC500C0B960 + isa + PBXBuildFile + + 153F6B601C2BF8EC00C0B960 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + name + AAAuthWelcomeController.swift + path + Auth/AAAuthWelcomeController.swift + sourceTree + <group> + + 153F6B611C2BF8EC00C0B960 + + fileRef + 153F6B601C2BF8EC00C0B960 + isa + PBXBuildFile + + 153F6B871C2D7B9700C0B960 + + children + + 153F6B891C2D7BA300C0B960 + 153F6B881C2D7BA300C0B960 + + isa + PBXGroup + path + TapedLabel + sourceTree + <group> + + 153F6B881C2D7BA300C0B960 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AATapLabelDelegate.swift + sourceTree + <group> + + 153F6B891C2D7BA300C0B960 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AATapLabel.swift + sourceTree + <group> + + 153F6B8A1C2D7BA300C0B960 + + fileRef + 153F6B881C2D7BA300C0B960 + isa + PBXBuildFile + + 153F6B8B1C2D7BA400C0B960 + + fileRef + 153F6B891C2D7BA300C0B960 + isa + PBXBuildFile + + 15D35F0A1C20182900E3717A + + children + + 15F89EFE1C211FCE00776ACD + 15D35F201C20185B00E3717A + 15D35F0B1C20184700E3717A + 15D35F291C20186400E3717A + 15D35F3A1C20187E00E3717A + 15D35F3B1C20187E00E3717A + 15D35F461C20187E00E3717A + 15D35F401C20187E00E3717A + 15D35F411C20187E00E3717A + 15D35F3C1C20187E00E3717A + 15D35F3D1C20187E00E3717A + 15D35F471C20187E00E3717A + 15D35F481C20187E00E3717A + 15D35F491C20187E00E3717A + 15D35F4A1C20187E00E3717A + 15D35F4D1C20187E00E3717A + 15D35F4E1C20187E00E3717A + 15D35F421C20187E00E3717A + 15D35F431C20187E00E3717A + 15D35F441C20187E00E3717A + 15D35F451C20187E00E3717A + 15D35F381C20187E00E3717A + 15D35F391C20187E00E3717A + 15D35F3E1C20187E00E3717A + 15D35F3F1C20187E00E3717A + 15D35F4F1C20187E00E3717A + 15D35F501C20187E00E3717A + 15D35F361C20187E00E3717A + 15D35F371C20187E00E3717A + 15D35F4B1C20187E00E3717A + 15D35F4C1C20187E00E3717A + + isa + PBXGroup + name + AudioRecorder + path + Utils/AudioRecorder + sourceTree + <group> + + 15D35F0B1C20184700E3717A + + children + + 15D35F0C1C20185500E3717A + 15D35F0D1C20185500E3717A + 15D35F0E1C20185500E3717A + 15D35F0F1C20185500E3717A + 15D35F101C20185500E3717A + 15D35F111C20185500E3717A + 15D35F121C20185500E3717A + 15D35F131C20185500E3717A + 15D35F141C20185500E3717A + 15D35F151C20185500E3717A + + isa + PBXGroup + path + opusenc + sourceTree + <group> + + 15D35F0C1C20185500E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.c + path + diag_range.c + sourceTree + <group> + + 15D35F0D1C20185500E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + diag_range.h + sourceTree + <group> + + 15D35F0E1C20185500E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.c + path + opus_header.c + sourceTree + <group> + + 15D35F0F1C20185500E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + opus_header.h + sourceTree + <group> + + 15D35F101C20185500E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + opusenc.h + sourceTree + <group> + + 15D35F111C20185500E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + opusenc.m + sourceTree + <group> + + 15D35F121C20185500E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.c + path + picture.c + sourceTree + <group> + + 15D35F131C20185500E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + picture.h + sourceTree + <group> + + 15D35F141C20185500E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.c + path + wav_io.c + sourceTree + <group> + + 15D35F151C20185500E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + wav_io.h + sourceTree + <group> + + 15D35F161C20185500E3717A + + fileRef + 15D35F0C1C20185500E3717A + isa + PBXBuildFile + + 15D35F171C20185500E3717A + + fileRef + 15D35F0D1C20185500E3717A + isa + PBXBuildFile + + 15D35F181C20185500E3717A + + fileRef + 15D35F0E1C20185500E3717A + isa + PBXBuildFile + + 15D35F191C20185500E3717A + + fileRef + 15D35F0F1C20185500E3717A + isa + PBXBuildFile + + 15D35F1A1C20185500E3717A + + fileRef + 15D35F101C20185500E3717A + isa + PBXBuildFile + + 15D35F1B1C20185500E3717A + + fileRef + 15D35F111C20185500E3717A + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -w + + + 15D35F1C1C20185500E3717A + + fileRef + 15D35F121C20185500E3717A + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -w + + + 15D35F1D1C20185500E3717A + + fileRef + 15D35F131C20185500E3717A + isa + PBXBuildFile + + 15D35F1E1C20185500E3717A + + fileRef + 15D35F141C20185500E3717A + isa + PBXBuildFile + + 15D35F1F1C20185500E3717A + + fileRef + 15D35F151C20185500E3717A + isa + PBXBuildFile + + 15D35F201C20185B00E3717A + + children + + 15D35F211C20186200E3717A + 15D35F221C20186200E3717A + 15D35F231C20186200E3717A + 15D35F241C20186200E3717A + + isa + PBXGroup + path + ogg + sourceTree + <group> + + 15D35F211C20186200E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.c + path + bitwise.c + sourceTree + <group> + + 15D35F221C20186200E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.c + path + framing.c + sourceTree + <group> + + 15D35F231C20186200E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + ogg.h + sourceTree + <group> + + 15D35F241C20186200E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + os_types.h + sourceTree + <group> + + 15D35F251C20186200E3717A + + fileRef + 15D35F211C20186200E3717A + isa + PBXBuildFile + + 15D35F261C20186200E3717A + + fileRef + 15D35F221C20186200E3717A + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -w + + + 15D35F271C20186200E3717A + + fileRef + 15D35F231C20186200E3717A + isa + PBXBuildFile + + 15D35F281C20186200E3717A + + fileRef + 15D35F241C20186200E3717A + isa + PBXBuildFile + + 15D35F291C20186400E3717A + + children + + 15D35F2A1C20187200E3717A + 15D35F2B1C20187200E3717A + 15D35F2C1C20187200E3717A + 15D35F2D1C20187200E3717A + 15D35F2E1C20187200E3717A + 15D35F2F1C20187200E3717A + + isa + PBXGroup + path + opusfile + sourceTree + <group> + + 15D35F2A1C20187200E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.c + path + info.c + sourceTree + <group> + + 15D35F2B1C20187200E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.c + path + internal.c + sourceTree + <group> + + 15D35F2C1C20187200E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + internal.h + sourceTree + <group> + + 15D35F2D1C20187200E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.c + path + opusfile.c + sourceTree + <group> + + 15D35F2E1C20187200E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + opusfile.h + sourceTree + <group> + + 15D35F2F1C20187200E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.c + path + stream.c + sourceTree + <group> + + 15D35F301C20187200E3717A + + fileRef + 15D35F2A1C20187200E3717A + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -w + + + 15D35F311C20187200E3717A + + fileRef + 15D35F2B1C20187200E3717A + isa + PBXBuildFile + + 15D35F321C20187200E3717A + + fileRef + 15D35F2C1C20187200E3717A + isa + PBXBuildFile + + 15D35F331C20187200E3717A + + fileRef + 15D35F2D1C20187200E3717A + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -w + + + 15D35F341C20187200E3717A + + fileRef + 15D35F2E1C20187200E3717A + isa + PBXBuildFile + + 15D35F351C20187200E3717A + + fileRef + 15D35F2F1C20187200E3717A + isa + PBXBuildFile + + 15D35F361C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + ASQueue.h + sourceTree + <group> + + 15D35F371C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + ASQueue.m + sourceTree + <group> + + 15D35F381C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AAOpusAudioRecorder.h + sourceTree + <group> + + 15D35F391C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + AAOpusAudioRecorder.m + sourceTree + <group> + + 15D35F3A1C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AAAlertView.h + sourceTree + <group> + + 15D35F3B1C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + AAAlertView.m + sourceTree + <group> + + 15D35F3C1C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AAAudioRecorder.h + sourceTree + <group> + + 15D35F3D1C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + AAAudioRecorder.m + sourceTree + <group> + + 15D35F3E1C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AATimer.h + sourceTree + <group> + + 15D35F3F1C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + AATimer.m + sourceTree + <group> + + 15D35F401C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AAAudioPlayer.h + sourceTree + <group> + + 15D35F411C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + AAAudioPlayer.m + sourceTree + <group> + + 15D35F421C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AANativeAudioPlayer.h + sourceTree + <group> + + 15D35F431C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + AANativeAudioPlayer.m + sourceTree + <group> + + 15D35F441C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AAOpusAudioPlayerAU.h + sourceTree + <group> + + 15D35F451C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.cpp.objcpp + path + AAOpusAudioPlayerAU.mm + sourceTree + <group> + + 15D35F461C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AAAudioBuffer.h + sourceTree + <group> + + 15D35F471C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AAModernConversationAudioPlayer.h + sourceTree + <group> + + 15D35F481C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + AAModernConversationAudioPlayer.m + sourceTree + <group> + + 15D35F491C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AAModernConversationAudioPlayerContext.h + sourceTree + <group> + + 15D35F4A1C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + AAModernConversationAudioPlayerContext.m + sourceTree + <group> + + 15D35F4B1C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NSObject+TGLock.h + sourceTree + <group> + + 15D35F4C1C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NSObject+TGLock.m + sourceTree + <group> + + 15D35F4D1C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AAModernViewInlineMediaContext.h + sourceTree + <group> + + 15D35F4E1C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + AAModernViewInlineMediaContext.m + sourceTree + <group> + + 15D35F4F1C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + AATimerTarget.h + sourceTree + <group> + + 15D35F501C20187E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + AATimerTarget.m + sourceTree + <group> + + 15D35F511C20187E00E3717A + + fileRef + 15D35F361C20187E00E3717A + isa + PBXBuildFile + + 15D35F521C20187E00E3717A + + fileRef + 15D35F371C20187E00E3717A + isa + PBXBuildFile + + 15D35F531C20187E00E3717A + + fileRef + 15D35F381C20187E00E3717A + isa + PBXBuildFile + + 15D35F541C20187E00E3717A + + fileRef + 15D35F391C20187E00E3717A + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -w + + + 15D35F551C20187E00E3717A + + fileRef + 15D35F3A1C20187E00E3717A + isa + PBXBuildFile + + 15D35F561C20187E00E3717A + + fileRef + 15D35F3B1C20187E00E3717A + isa + PBXBuildFile + + 15D35F571C20187E00E3717A + + fileRef + 15D35F3C1C20187E00E3717A + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 15D35F591C20187E00E3717A + + fileRef + 15D35F3E1C20187E00E3717A + isa + PBXBuildFile + + 15D35F5A1C20187E00E3717A + + fileRef + 15D35F3F1C20187E00E3717A + isa + PBXBuildFile + + 15D35F5B1C20187E00E3717A + + fileRef + 15D35F401C20187E00E3717A + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 15D35F5C1C20187E00E3717A + + fileRef + 15D35F411C20187E00E3717A + isa + PBXBuildFile + + 15D35F5D1C20187E00E3717A + + fileRef + 15D35F421C20187E00E3717A + isa + PBXBuildFile + + 15D35F5E1C20187E00E3717A + + fileRef + 15D35F431C20187E00E3717A + isa + PBXBuildFile + + 15D35F5F1C20187E00E3717A + + fileRef + 15D35F441C20187E00E3717A + isa + PBXBuildFile + + 15D35F601C20187E00E3717A + + fileRef + 15D35F451C20187E00E3717A + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -w + + + 15D35F611C20187E00E3717A + + fileRef + 15D35F461C20187E00E3717A + isa + PBXBuildFile + + 15D35F621C20187E00E3717A + + fileRef + 15D35F471C20187E00E3717A + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 15D35F631C20187E00E3717A + + fileRef + 15D35F481C20187E00E3717A + isa + PBXBuildFile + + 15D35F641C20187E00E3717A + + fileRef + 15D35F491C20187E00E3717A + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 15D35F651C20187E00E3717A + + fileRef + 15D35F4A1C20187E00E3717A + isa + PBXBuildFile + + 15D35F661C20187E00E3717A + + fileRef + 15D35F4B1C20187E00E3717A + isa + PBXBuildFile + + 15D35F671C20187E00E3717A + + fileRef + 15D35F4C1C20187E00E3717A + isa + PBXBuildFile + + 15D35F681C20187E00E3717A + + fileRef + 15D35F4D1C20187E00E3717A + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + 15D35F691C20187E00E3717A + + fileRef + 15D35F4E1C20187E00E3717A + isa + PBXBuildFile + + 15D35F6A1C20187E00E3717A + + fileRef + 15D35F4F1C20187E00E3717A + isa + PBXBuildFile + + 15D35F6B1C20187E00E3717A + + fileRef + 15D35F501C20187E00E3717A + isa + PBXBuildFile + + 15D35F6D1C20196700E3717A + + children + + BE281CC31C502B070042F6D4 + BE2621551C46569800A817AB + 15D35F6E1C20196E00E3717A + BE237C9C1C422FFA00060648 + + isa + PBXGroup + path + Views + sourceTree + <group> + + 15D35F6E1C20196E00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AARecordAudioController.swift + sourceTree + <group> + + 15D35F6F1C20196E00E3717A + + fileRef + 15D35F6E1C20196E00E3717A + isa + PBXBuildFile + + 15D35F721C201B5300E3717A + + children + + 15D35F741C201B6B00E3717A + 15D35F731C201B6B00E3717A + + isa + PBXGroup + path + Categories + sourceTree + <group> + + 15D35F731C201B6B00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AACustomPresentationController.swift + sourceTree + <group> + + 15D35F741C201B6B00E3717A + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AACustomPresentationAnimationController.swift + sourceTree + <group> + + 15D35F751C201B6B00E3717A + + fileRef + 15D35F731C201B6B00E3717A + isa + PBXBuildFile + + 15D35F761C201B6B00E3717A + + fileRef + 15D35F741C201B6B00E3717A + isa + PBXBuildFile + + 15D35F781C20273D00E3717A + + fileRef + 15D35F3D1C20187E00E3717A + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -w + + + 15F89EFE1C211FCE00776ACD + + children + + 15F89F021C211FE100776ACD + 15F89EFF1C211FD700776ACD + + isa + PBXGroup + path + libopus + sourceTree + <group> + + 15F89EFF1C211FD700776ACD + + children + + 15F89F001C211FDE00776ACD + + isa + PBXGroup + path + lib + sourceTree + <group> + + 15F89F001C211FDE00776ACD + + isa + PBXFileReference + lastKnownFileType + archive.ar + path + libopus.a + sourceTree + <group> + + 15F89F021C211FE100776ACD + + children + + 15F89F061C211FED00776ACD + 15F89F031C211FED00776ACD + 15F89F041C211FED00776ACD + 15F89F051C211FED00776ACD + + isa + PBXGroup + path + headers + sourceTree + <group> + + 15F89F031C211FED00776ACD + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + opus_defines.h + sourceTree + <group> + + 15F89F041C211FED00776ACD + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + opus_multistream.h + sourceTree + <group> + + 15F89F051C211FED00776ACD + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + opus_types.h + sourceTree + <group> + + 15F89F061C211FED00776ACD + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + opus.h + sourceTree + <group> + + 15F89F071C211FED00776ACD + + fileRef + 15F89F031C211FED00776ACD + isa + PBXBuildFile + + 15F89F081C211FED00776ACD + + fileRef + 15F89F041C211FED00776ACD + isa + PBXBuildFile + + 15F89F091C211FED00776ACD + + fileRef + 15F89F051C211FED00776ACD + isa + PBXBuildFile + + 15F89F0A1C211FED00776ACD + + fileRef + 15F89F061C211FED00776ACD + isa + PBXBuildFile + + 15F89F0F1C21317400776ACD + + isa + PBXFileReference + lastKnownFileType + text.plist.strings + name + es + path + es.lproj/Localizable.strings + sourceTree + <group> + + 2F428D134E194A828C3DF863 + + children + + 06CE898B1BD841C9005A5530 + 066A51FF1BC4E0B0000E606E + 354C3EFA48FBFAEAD0DEEE17 + + isa + PBXGroup + name + Frameworks + sourceTree + <group> + + 354C3EFA48FBFAEAD0DEEE17 + + explicitFileType + wrapper.framework + includeInIndex + 0 + isa + PBXFileReference + path + Pods_ActorSDK.framework + sourceTree + BUILT_PRODUCTS_DIR + + 5B00FFD27DD7E01F43B31D13 + + buildActionMask + 2147483647 + files + + inputPaths + + isa + PBXShellScriptBuildPhase + name + [CP] Check Pods Manifest.lock + outputPaths + + runOnlyForDeploymentPostprocessing + 0 + shellPath + /bin/sh + shellScript + diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null +if [[ $? != 0 ]] ; then + cat << EOM +error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. +EOM + exit 1 +fi + + showEnvVarsInLog + 0 + + 9AA6A41E1D08568A00957A7F + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AASettingsMediaViewController.swift + sourceTree + <group> + + 9AA6A41F1D08568A00957A7F + + fileRef + 9AA6A41E1D08568A00957A7F + isa + PBXBuildFile + + 9AAE96461CF81F140092E366 + + children + + 9AAE96471CF81F140092E366 + + isa + PBXGroup + path + Ringtones + sourceTree + <group> + + 9AAE96471CF81F140092E366 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AARingtonesViewController.swift + sourceTree + <group> + + 9AAE96481CF81F140092E366 + + fileRef + 9AAE96471CF81F140092E366 + isa + PBXBuildFile + + A2ED258362D73946D3AE7FB4 + + buildActionMask + 2147483647 + files + + inputPaths + + isa + PBXShellScriptBuildPhase + name + [CP] Copy Pods Resources + outputPaths + + runOnlyForDeploymentPostprocessing + 0 + shellPath + /bin/sh + shellScript + "${SRCROOT}/Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK-resources.sh" + + showEnvVarsInLog + 0 + + BDF21708B376E212CEAEC43D + + fileRef + 354C3EFA48FBFAEAD0DEEE17 + isa + PBXBuildFile + + BE237C9C1C422FFA00060648 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAStickersKeyboard.swift + sourceTree + <group> + + BE237C9D1C422FFA00060648 + + fileRef + BE237C9C1C422FFA00060648 + isa + PBXBuildFile + + BE2621551C46569800A817AB + + children + + BE2621561C4656D700A817AB + BE2621581C4656EE00A817AB + BEFE68D41C4657360001F2D6 + + isa + PBXGroup + name + AttachmentView + sourceTree + <group> + + BE2621561C4656D700A817AB + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAConvActionSheet.swift + sourceTree + <group> + + BE2621571C4656D700A817AB + + fileRef + BE2621561C4656D700A817AB + isa + PBXBuildFile + + BE2621581C4656EE00A817AB + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAThumbnailView.swift + sourceTree + <group> + + BE2621591C4656EE00A817AB + + fileRef + BE2621581C4656EE00A817AB + isa + PBXBuildFile + + BE281CC31C502B070042F6D4 + + children + + BE281CC41C502B230042F6D4 + + isa + PBXGroup + name + VoiceView + sourceTree + <group> + + BE281CC41C502B230042F6D4 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAVoiceRecorderView.swift + sourceTree + <group> + + BE281CC51C502B230042F6D4 + + fileRef + BE281CC41C502B230042F6D4 + isa + PBXBuildFile + + BE4DBE6B1C5723BE00A31894 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AttributedLabel.swift + sourceTree + <group> + + BE4DBE6C1C5723BE00A31894 + + fileRef + BE4DBE6B1C5723BE00A31894 + isa + PBXBuildFile + + BEAC2B311C42D683007F7A2F + + fileRef + 15F89F001C211FDE00776ACD + isa + PBXBuildFile + + BED5A1CF1C4839200045FDB0 + + children + + BED5A1DD1C4839610045FDB0 + BED5A1D01C4839510045FDB0 + + isa + PBXGroup + name + NYTPhotoViewer + sourceTree + <group> + + BED5A1D01C4839510045FDB0 + + children + + BED5A1D11C4839590045FDB0 + BED5A1D21C4839590045FDB0 + BED5A1D31C4839590045FDB0 + BED5A1D41C4839590045FDB0 + BED5A1D51C4839590045FDB0 + BED5A1D61C4839590045FDB0 + + isa + PBXGroup + name + Assets + sourceTree + <group> + + BED5A1D11C4839590045FDB0 + + isa + PBXFileReference + lastKnownFileType + image.png + path + NYTPhotoViewerCloseButtonX.png + sourceTree + <group> + + BED5A1D21C4839590045FDB0 + + isa + PBXFileReference + lastKnownFileType + image.png + path + NYTPhotoViewerCloseButtonX@2x.png + sourceTree + <group> + + BED5A1D31C4839590045FDB0 + + isa + PBXFileReference + lastKnownFileType + image.png + path + NYTPhotoViewerCloseButtonX@3x.png + sourceTree + <group> + + BED5A1D41C4839590045FDB0 + + isa + PBXFileReference + lastKnownFileType + image.png + path + NYTPhotoViewerCloseButtonXLandscape.png + sourceTree + <group> + + BED5A1D51C4839590045FDB0 + + isa + PBXFileReference + lastKnownFileType + image.png + path + NYTPhotoViewerCloseButtonXLandscape@2x.png + sourceTree + <group> + + BED5A1D61C4839590045FDB0 + + isa + PBXFileReference + lastKnownFileType + image.png + path + NYTPhotoViewerCloseButtonXLandscape@3x.png + sourceTree + <group> + + BED5A1D71C4839590045FDB0 + + fileRef + BED5A1D11C4839590045FDB0 + isa + PBXBuildFile + + BED5A1D81C4839590045FDB0 + + fileRef + BED5A1D21C4839590045FDB0 + isa + PBXBuildFile + + BED5A1D91C4839590045FDB0 + + fileRef + BED5A1D31C4839590045FDB0 + isa + PBXBuildFile + + BED5A1DA1C4839590045FDB0 + + fileRef + BED5A1D41C4839590045FDB0 + isa + PBXBuildFile + + BED5A1DB1C4839590045FDB0 + + fileRef + BED5A1D51C4839590045FDB0 + isa + PBXBuildFile + + BED5A1DC1C4839590045FDB0 + + fileRef + BED5A1D61C4839590045FDB0 + isa + PBXBuildFile + + BED5A1DD1C4839610045FDB0 + + children + + BED5A20B1C48397F0045FDB0 + BED5A2021C4839710045FDB0 + BED5A1DE1C48396A0045FDB0 + BED5A1DF1C48396A0045FDB0 + BED5A1E01C48396A0045FDB0 + BED5A1E11C48396A0045FDB0 + BED5A1E21C48396A0045FDB0 + BED5A1E31C48396A0045FDB0 + BED5A1E41C48396A0045FDB0 + BED5A1E51C48396A0045FDB0 + BED5A1E61C48396A0045FDB0 + BED5A1E71C48396A0045FDB0 + BED5A1E81C48396A0045FDB0 + BED5A1E91C48396A0045FDB0 + BED5A1EA1C48396A0045FDB0 + BED5A1EB1C48396A0045FDB0 + BED5A1EC1C48396A0045FDB0 + BED5A1ED1C48396A0045FDB0 + BED5A1EE1C48396A0045FDB0 + BED5A1EF1C48396A0045FDB0 + + isa + PBXGroup + name + Classes + sourceTree + <group> + + BED5A1DE1C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTPhotoCaptionView.h + sourceTree + <group> + + BED5A1DF1C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NYTPhotoCaptionView.m + sourceTree + <group> + + BED5A1E01C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTPhotoDismissalInteractionController.h + sourceTree + <group> + + BED5A1E11C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NYTPhotoDismissalInteractionController.m + sourceTree + <group> + + BED5A1E21C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTPhotosDataSource.h + sourceTree + <group> + + BED5A1E31C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NYTPhotosDataSource.m + sourceTree + <group> + + BED5A1E41C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTPhotosOverlayView.h + sourceTree + <group> + + BED5A1E51C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NYTPhotosOverlayView.m + sourceTree + <group> + + BED5A1E61C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTPhotosViewController.h + sourceTree + <group> + + BED5A1E71C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NYTPhotosViewController.m + sourceTree + <group> + + BED5A1E81C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTPhotoTransitionAnimator.h + sourceTree + <group> + + BED5A1E91C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NYTPhotoTransitionAnimator.m + sourceTree + <group> + + BED5A1EA1C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTPhotoTransitionController.h + sourceTree + <group> + + BED5A1EB1C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NYTPhotoTransitionController.m + sourceTree + <group> + + BED5A1EC1C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTPhotoViewController.h + sourceTree + <group> + + BED5A1ED1C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NYTPhotoViewController.m + sourceTree + <group> + + BED5A1EE1C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTScalingImageView.h + sourceTree + <group> + + BED5A1EF1C48396A0045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NYTScalingImageView.m + sourceTree + <group> + + BED5A1F11C48396A0045FDB0 + + fileRef + BED5A1DF1C48396A0045FDB0 + isa + PBXBuildFile + + BED5A1F31C48396A0045FDB0 + + fileRef + BED5A1E11C48396A0045FDB0 + isa + PBXBuildFile + + BED5A1F51C48396A0045FDB0 + + fileRef + BED5A1E31C48396A0045FDB0 + isa + PBXBuildFile + + BED5A1F71C48396A0045FDB0 + + fileRef + BED5A1E51C48396A0045FDB0 + isa + PBXBuildFile + + BED5A1F81C48396A0045FDB0 + + fileRef + BED5A1E61C48396A0045FDB0 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + BED5A1F91C48396A0045FDB0 + + fileRef + BED5A1E71C48396A0045FDB0 + isa + PBXBuildFile + + BED5A1FB1C48396A0045FDB0 + + fileRef + BED5A1E91C48396A0045FDB0 + isa + PBXBuildFile + + BED5A1FD1C48396A0045FDB0 + + fileRef + BED5A1EB1C48396A0045FDB0 + isa + PBXBuildFile + + BED5A1FE1C48396A0045FDB0 + + fileRef + BED5A1EC1C48396A0045FDB0 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + BED5A1FF1C48396A0045FDB0 + + fileRef + BED5A1ED1C48396A0045FDB0 + isa + PBXBuildFile + + BED5A2011C48396A0045FDB0 + + fileRef + BED5A1EF1C48396A0045FDB0 + isa + PBXBuildFile + + BED5A2021C4839710045FDB0 + + children + + BED5A2031C4839790045FDB0 + BED5A2041C4839790045FDB0 + BED5A2051C4839790045FDB0 + BED5A2061C4839790045FDB0 + + isa + PBXGroup + name + Protocols + sourceTree + <group> + + BED5A2031C4839790045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTPhoto.h + sourceTree + <group> + + BED5A2041C4839790045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTPhotoCaptionViewLayoutWidthHinting.h + sourceTree + <group> + + BED5A2051C4839790045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTPhotoContainer.h + sourceTree + <group> + + BED5A2061C4839790045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NYTPhotosViewControllerDataSource.h + sourceTree + <group> + + BED5A2071C4839790045FDB0 + + fileRef + BED5A2031C4839790045FDB0 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + BED5A20B1C48397F0045FDB0 + + children + + BED5A20C1C4839880045FDB0 + BED5A20D1C4839880045FDB0 + + isa + PBXGroup + name + ResourseLoading + sourceTree + <group> + + BED5A20C1C4839880045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + NSBundle+NYTPhotoViewer.h + sourceTree + <group> + + BED5A20D1C4839880045FDB0 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + NSBundle+NYTPhotoViewer.m + sourceTree + <group> + + BED5A20F1C4839880045FDB0 + + fileRef + BED5A20D1C4839880045FDB0 + isa + PBXBuildFile + + BED5A2111C48413C0045FDB0 + + fileRef + BED5A2041C4839790045FDB0 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + BED5A2121C48413C0045FDB0 + + fileRef + BED5A2051C4839790045FDB0 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + BED5A2131C48413C0045FDB0 + + fileRef + BED5A2061C4839790045FDB0 + isa + PBXBuildFile + settings + + ATTRIBUTES + + Public + + + + BEE6EAFF1C4D7B5600A2280E + + children + + BEE6EB021C4D9A1B00A2280E + BEE6EB001C4D7B7500A2280E + + isa + PBXGroup + name + Wallpapers + sourceTree + <group> + + BEE6EB001C4D7B7500A2280E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AASettingsWallpapersController.swift + sourceTree + <group> + + BEE6EB011C4D7B7500A2280E + + fileRef + BEE6EB001C4D7B7500A2280E + isa + PBXBuildFile + + BEE6EB021C4D9A1B00A2280E + + children + + BEE6EB031C4D9A4900A2280E + + isa + PBXGroup + name + Cells + sourceTree + <group> + + BEE6EB031C4D9A4900A2280E + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAWallpapersCell.swift + sourceTree + <group> + + BEE6EB041C4D9A4900A2280E + + fileRef + BEE6EB031C4D9A4900A2280E + isa + PBXBuildFile + + BEF11DB61C466D800076400A + + fileRef + 153F6B3C1C2A9B1900C0B960 + isa + PBXBuildFile + + BEFE68D41C4657360001F2D6 + + fileEncoding + 4 + isa + PBXFileReference + lastKnownFileType + sourcecode.swift + path + AAThumbnailCollectionCell.swift + sourceTree + <group> + + BEFE68D51C4657360001F2D6 + + fileRef + BEFE68D41C4657360001F2D6 + isa + PBXBuildFile + + E30822B631D108159E8B306B + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + name + Pods-ActorSDK.debug.xcconfig + path + Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK.debug.xcconfig + sourceTree + <group> + + F076508E3899D309954904A3 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + name + Pods-ActorSDK.release.xcconfig + path + Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK.release.xcconfig + sourceTree + <group> + + F0BB28A250FF185B1F4D414D + + children + + E30822B631D108159E8B306B + F076508E3899D309954904A3 + + isa + PBXGroup + name + Pods + sourceTree + <group> + + + rootObject + 066A50C91BC4AE63000E606E + + diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/AppIcon.appiconset/Contents.json b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/AppIcon.appiconset/Contents.json index 1539cc727a..377da0fece 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "size" : "29x29", "idiom" : "iphone", @@ -36,6 +46,16 @@ "filename" : "Icon-60@3x.png", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "size" : "29x29", "idiom" : "ipad", diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift index 0783be8354..dbf4b30544 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift @@ -93,14 +93,28 @@ open class ConversationViewController: backgroundView.backgroundColor = appStyle.chatBgColor // Custom background if available - if let bg = Actor.getSelectedWallpaper() { + + var bg = Actor.getSelectedWallpaper(); + if (bg == nil){ + bg = "local:bg_1.jpg" + } + + if let bg = bg { + var image:UIImage? if bg.startsWith("local:") { - backgroundView.image = UIImage.bundled(bg.skip(6)) + image = UIImage.bundled(bg.skip(6)) } else { let path = CocoaFiles.pathFromDescriptor(bg.skip(5)) - backgroundView.image = UIImage(contentsOfFile:path) + image = UIImage(contentsOfFile:path) + } + + if(image == nil){ + image = UIImage.bundled("bg_1.jpg") } + backgroundView.image = image } + + view.insertSubview(backgroundView, at: 0) From c1ab292676228f4e8ce5695b4ba8f975a994a7dd Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Tue, 11 Oct 2016 20:31:49 +0300 Subject: [PATCH 122/253] fix(iOS) fix edit dialogs crash --- .../ActorApp.xcodeproj/project.pbxproj | 1824 ++++++----------- .../Resources/Base.lproj/Localizable.strings | 5 + .../AADialogsListContentController.swift | 2 + .../Dialogs List/Cells/AADialogCell.swift | 18 +- .../Managed Runtime/ManagedAlerts.swift | 6 +- 5 files changed, 635 insertions(+), 1220 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj index e83e6d07cc..287d566845 100644 --- a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj @@ -1,1211 +1,619 @@ - - - - - archiveVersion - 1 - classes - - objectVersion - 46 - objects - - 06230F031BC7FF2F00A4807B - - isa - PBXFileReference - lastKnownFileType - wrapper.pb-project - path - ActorSDK.xcodeproj - sourceTree - <group> - - 06230F041BC7FF2F00A4807B - - children - - 06230F081BC7FF3000A4807B - - isa - PBXGroup - name - Products - sourceTree - <group> - - 06230F071BC7FF3000A4807B - - containerPortal - 06230F031BC7FF2F00A4807B - isa - PBXContainerItemProxy - proxyType - 2 - remoteGlobalIDString - 066A50D21BC4AE63000E606E - remoteInfo - ActorSDK - - 06230F081BC7FF3000A4807B - - fileType - wrapper.framework - isa - PBXReferenceProxy - path - ActorSDK.framework - remoteRef - 06230F071BC7FF3000A4807B - sourceTree - BUILT_PRODUCTS_DIR - - 06230F091BC7FF3500A4807B - - fileRef - 06230F081BC7FF3000A4807B - isa - PBXBuildFile - - 06230F0A1BC7FF3500A4807B - - fileRef - 06230F081BC7FF3000A4807B - isa - PBXBuildFile - settings - - ATTRIBUTES - - CodeSignOnCopy - RemoveHeadersOnCopy - - - - 06230F0B1BC7FF3500A4807B - - containerPortal - 06230F031BC7FF2F00A4807B - isa - PBXContainerItemProxy - proxyType - 1 - remoteGlobalIDString - 066A50D11BC4AE63000E606E - remoteInfo - ActorSDK - - 06230F0C1BC7FF3500A4807B - - isa - PBXTargetDependency - name - ActorSDK - targetProxy - 06230F0B1BC7FF3500A4807B - - 06230F0D1BC7FF3500A4807B - - buildActionMask - 2147483647 - dstPath - - dstSubfolderSpec - 10 - files - - 06230F0A1BC7FF3500A4807B - - isa - PBXCopyFilesBuildPhase - name - Embed Frameworks - runOnlyForDeploymentPostprocessing - 0 - - 065974E11BC6926C00B8C7DF - - explicitFileType - wrapper.framework - isa - PBXFileReference - name - ActorSDK.framework - path - /Users/ex3ndr/Library/Developer/Xcode/DerivedData/ActorApp-clcqncodqhdxutfqgjvteqywzxue/Build/Products/Debug-iphoneos/ActorSDK.framework - sourceTree - <absolute> - - 068B397A1C85386A002BFF73 - - isa - PBXFileReference - lastKnownFileType - file - name - ringtone.m4a - path - Resources/ringtone.m4a - sourceTree - <group> - - 068B397B1C85386A002BFF73 - - fileRef - 068B397A1C85386A002BFF73 - isa - PBXBuildFile - - 068C6E4E1BBC4BF900182516 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - file.storyboard - name - Launch Screen.storyboard - path - Supporting Files/Launch Screen.storyboard - sourceTree - <group> - - 068C6E4F1BBC4BF900182516 - - fileRef - 068C6E4E1BBC4BF900182516 - isa - PBXBuildFile - - 06CE898D1BD841D0005A5530 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - SystemConfiguration.framework - path - System/Library/Frameworks/SystemConfiguration.framework - sourceTree - SDKROOT - - 06CE898E1BD841D0005A5530 - - fileRef - 06CE898D1BD841D0005A5530 - isa - PBXBuildFile - - 06E7B24E1C109C4B0090660C - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - MapKit.framework - path - System/Library/Frameworks/MapKit.framework - sourceTree - SDKROOT - - 06E7B24F1C109C4B0090660C - - fileRef - 06E7B24E1C109C4B0090660C - isa - PBXBuildFile - - 06FC5E741BAB2DCC0071F153 - - buildActionMask - 2147483647 - files - - inputPaths - - isa - PBXShellScriptBuildPhase - name - Configure Crashlytics - outputPaths - - runOnlyForDeploymentPostprocessing - 0 - shellPath - /bin/sh - shellScript - # Initialization of Crashlytics +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { -# Getting build secret -BUILD_SECRET=$FABRIC_BUILD_SECRET +/* Begin PBXBuildFile section */ + 06230F091BC7FF3500A4807B /* ActorSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06230F081BC7FF3000A4807B /* ActorSDK.framework */; }; + 06230F0A1BC7FF3500A4807B /* ActorSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 06230F081BC7FF3000A4807B /* ActorSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 068B397B1C85386A002BFF73 /* ringtone.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 068B397A1C85386A002BFF73 /* ringtone.m4a */; }; + 068C6E4F1BBC4BF900182516 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 068C6E4E1BBC4BF900182516 /* Launch Screen.storyboard */; }; + 06CE898E1BD841D0005A5530 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06CE898D1BD841D0005A5530 /* SystemConfiguration.framework */; }; + 06E7B24F1C109C4B0090660C /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06E7B24E1C109C4B0090660C /* MapKit.framework */; }; + 2CE3FEBEF881B465BDE1045A959BFB0A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2ACD33B73078EB46A22D2D4C45BF1E6E /* Images.xcassets */; }; + 34279C7FB8E40393FEAC939F6474BE2E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 148837AEB986AFDE519BEBD3686AB073 /* main.m */; }; + A88F4C381ED2B98E99A68937 /* Pods_ActorApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */; }; + DFE814D1E12D2647AF2DBA3F76405F06 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A521812020DAAAA325065ADC32B7DEB /* AppDelegate.swift */; }; + F45B35E37C8CB7140417EA87AAFEFDA2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 13C57576F07AC8694C15B51DFDFDC4C6 /* InfoPlist.strings */; }; +/* End PBXBuildFile section */ -# Getting api key from Info.plist -API_KEY=$(/usr/libexec/PlistBuddy "${PRODUCT_SETTINGS_PATH}" -c "Print :Fabric:APIKey") +/* Begin PBXContainerItemProxy section */ + 06230F071BC7FF3000A4807B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 066A50D21BC4AE63000E606E; + remoteInfo = ActorSDK; + }; + 06230F0B1BC7FF3500A4807B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 066A50D11BC4AE63000E606E; + remoteInfo = ActorSDK; + }; +/* End PBXContainerItemProxy section */ -if [ -n "$BUILD_SECRET" ]; then - if [[ $? -ne 0 ]]; then - echo "Crashlytics not installed, skipping" - else - if [ -n "$API_KEY" ]; then - echo "Uploading symbols to crashlytics" "$API_KEY" "$BUILD_SECRET" - "${PODS_ROOT}/Fabric/Fabric.framework/run" "$API_KEY" "$BUILD_SECRET" - else - echo "Crashlytics not installed, skipping" - fi - fi -else - echo "Crashlytics build secret not set, skipping" -fi - - 13C57576F07AC8694C15B51DFDFDC4C6 - - children - - 8B0B56F75C11CA3A0404AB4417F9B41B - 7C171D4472C8F54A2AA0315EA0C69FED - 6238B42B2462DBE201B457C54CA819D7 - 6EE6E889CD9BA13B5A0828221608DB9A - 15F89F101C21317400776ACD - - isa - PBXVariantGroup - name - InfoPlist.strings - path - Resources/Localizable - sourceTree - <group> - - 148837AEB986AFDE519BEBD3686AB073 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - name - main.m - path - Supporting Files/main.m - sourceTree - <group> - - 15F89F101C21317400776ACD - - isa - PBXFileReference - lastKnownFileType - text.plist.strings - name - es - path - es.lproj/InfoPlist.strings - sourceTree - <group> - - 1ACEA023B930E6F261DAC0A6BDB410C1 - - children - - DE8D1D9859D2C4D4C7EC7AD74BB65F0E - 148837AEB986AFDE519BEBD3686AB073 - F76A77E9428111C798E69B43EA06A281 - - isa - PBXGroup - name - Supporting Files - sourceTree - <group> - - 2A521812020DAAAA325065ADC32B7DEB - - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AppDelegate.swift - sourceTree - <group> - - 2ACD33B73078EB46A22D2D4C45BF1E6E - - isa - PBXFileReference - lastKnownFileType - folder.assetcatalog - name - Images.xcassets - path - Resources/Images.xcassets - sourceTree - <group> - - 2CE3FEBEF881B465BDE1045A959BFB0A - - fileRef - 2ACD33B73078EB46A22D2D4C45BF1E6E - isa - PBXBuildFile - - 34279C7FB8E40393FEAC939F6474BE2E - - fileRef - 148837AEB986AFDE519BEBD3686AB073 - isa - PBXBuildFile - - 3A4CF5A8B873DEC01817A2C1107BF8FD - - attributes - - LastSwiftUpdateCheck - 0700 - LastUpgradeCheck - 0730 - ORGANIZATIONNAME - Actor LLC - TargetAttributes - - EA6B7348F8364542DDD264F741AAAA19 - - CreatedOnToolsVersion - 6.4 - DevelopmentTeam - HVJR44Y5B6 - LastSwiftMigration - 0800 - SystemCapabilities - - com.apple.Maps.iOS - - enabled - 1 - - com.apple.Push - - enabled - 1 - - com.apple.iCloud - - enabled - 1 - - - - - - buildConfigurationList - 6A6B0DB51CB7FEB1D7D881E55C02AD30 - compatibilityVersion - Xcode 3.2 - developmentRegion - English - hasScannedForEncodings - 0 - isa - PBXProject - knownRegions - - en - Base - zh-Hans - pt - ru - es - - mainGroup - D873D85572C6C400293E0DF69DBA58DD - productRefGroup - C83A7EEB1948C38ECEFC1D330C57A7B1 - projectDirPath - - projectReferences - - - ProductGroup - 06230F041BC7FF2F00A4807B - ProjectRef - 06230F031BC7FF2F00A4807B - - - projectRoot - - targets - - EA6B7348F8364542DDD264F741AAAA19 - - - 404790AFDFFBD618E6175093 - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text.xcconfig - name - Pods-ActorApp.release.xcconfig - path - Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp.release.xcconfig - sourceTree - <group> - - 4533F91FE5E247335BA76B35E6FC28C1 - - buildActionMask - 2147483647 - files - - 06CE898E1BD841D0005A5530 - 06E7B24F1C109C4B0090660C - 06230F091BC7FF3500A4807B - A88F4C381ED2B98E99A68937 - - isa - PBXFrameworksBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 4DE2EA6053BDD0185E284AA71245C654 - - baseConfigurationReference - 9B2EEB8CEF2E94D58EA09D9D - buildSettings - - ALWAYS_SEARCH_USER_PATHS - YES - ASSETCATALOG_COMPILER_APPICON_NAME - AppIcon - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME - LaunchImage - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES - YES - CLANG_MODULES_AUTOLINK - YES - CODE_SIGN_ENTITLEMENTS - ActorApp/Supporting Files/ActorApp.entitlements - CODE_SIGN_IDENTITY - iPhone Developer - CODE_SIGN_IDENTITY[sdk=iphoneos*] - iPhone Developer - DEBUG_INFORMATION_FORMAT - dwarf-with-dsym - EMBEDDED_CONTENT_CONTAINS_SWIFT - YES - ENABLE_BITCODE - NO - FABRIC_BUILD_SECRET - - FRAMEWORK_SEARCH_PATHS - - $(inherited) - $(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks - $(PROJECT_DIR)/build/Debug-iphoneos - - GCC_OPTIMIZATION_LEVEL - 0 - INFOPLIST_FILE - ActorApp/Supporting Files/Info.plist - IPHONEOS_DEPLOYMENT_TARGET - 8.0 - J2OBJC_VERSION - 0.9.8.2.1 - LD_RUNPATH_SEARCH_PATHS - $(inherited) @executable_path/Frameworks @loader_path/Frameworks - LIBRARY_SEARCH_PATHS - $(inherited) - ONLY_ACTIVE_ARCH - YES - OTHER_LDFLAGS - $(inherited) - PRODUCT_BUNDLE_IDENTIFIER - im.actor.sdk.dev - PRODUCT_NAME - $(TARGET_NAME) - PROVISIONING_PROFILE - - SDK_PATH - ../actor-sdk - SWIFT_OBJC_BRIDGING_HEADER - - SWIFT_OPTIMIZATION_LEVEL - -Onone - SWIFT_VERSION - 3.0 - USER_HEADER_SEARCH_PATHS - - - isa - XCBuildConfiguration - name - Debug - - 50CB7471D350DF82230B74B5952FA7BD - - buildActionMask - 2147483647 - files - - DFE814D1E12D2647AF2DBA3F76405F06 - 34279C7FB8E40393FEAC939F6474BE2E - - isa - PBXSourcesBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 58731A67470ABB64477A86D26A0C38CA - - buildConfigurations - - 4DE2EA6053BDD0185E284AA71245C654 - EE9DE1CA46805369DC88E0A5B8F7445D - - defaultConfigurationIsVisible - 0 - defaultConfigurationName - Release - isa - XCConfigurationList - - 6238B42B2462DBE201B457C54CA819D7 - - isa - PBXFileReference - lastKnownFileType - text.plist.strings - name - ru - path - ru.lproj/InfoPlist.strings - sourceTree - <group> - - 65E498AE225CBED71E8F3CD1CA2767B7 - - explicitFileType - wrapper.application - includeInIndex - 0 - isa - PBXFileReference - path - ActorApp.app - sourceTree - BUILT_PRODUCTS_DIR - - 6A6B0DB51CB7FEB1D7D881E55C02AD30 - - buildConfigurations - - F6DBA7973E222F542FEC4D7E41CCEAA8 - C8EA64248333B842F7E13CD5378F81D3 - - defaultConfigurationIsVisible - 0 - defaultConfigurationName - Release - isa - XCConfigurationList - - 6EE6E889CD9BA13B5A0828221608DB9A - - isa - PBXFileReference - lastKnownFileType - text.plist.strings - name - zh-Hans - path - zh-Hans.lproj/InfoPlist.strings - sourceTree - <group> - - 712B269FC35BFB6C85DF769C - - buildActionMask - 2147483647 - files - - inputPaths - - isa - PBXShellScriptBuildPhase - name - [CP] Check Pods Manifest.lock - outputPaths - - runOnlyForDeploymentPostprocessing - 0 - shellPath - /bin/sh - shellScript - diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null -if [[ $? != 0 ]] ; then - cat << EOM -error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. -EOM - exit 1 -fi - - showEnvVarsInLog - 0 - - 75DC9F2DE93F0AFA6A85B53C4B694EAE - - children - - 068B397A1C85386A002BFF73 - 2ACD33B73078EB46A22D2D4C45BF1E6E - 13C57576F07AC8694C15B51DFDFDC4C6 - 068C6E4E1BBC4BF900182516 - - isa - PBXGroup - name - Resources - sourceTree - <group> - - 7C171D4472C8F54A2AA0315EA0C69FED - - isa - PBXFileReference - lastKnownFileType - text.plist.strings - name - pt - path - pt.lproj/InfoPlist.strings - sourceTree - <group> - - 851EE1A34619AE6677649A27 - - buildActionMask - 2147483647 - files - - inputPaths - - isa - PBXShellScriptBuildPhase - name - Embed Pods Frameworks - outputPaths - - runOnlyForDeploymentPostprocessing - 0 - shellPath - /bin/sh - shellScript - "${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-frameworks.sh" - - showEnvVarsInLog - 0 - - 86C48777C0FD262E78F8BEC9253C9914 - - children - - 06E7B24E1C109C4B0090660C - 06CE898D1BD841D0005A5530 - 06230F031BC7FF2F00A4807B - 065974E11BC6926C00B8C7DF - A275ED497CA570AD01FB66A7 - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - 8B0B56F75C11CA3A0404AB4417F9B41B - - isa - PBXFileReference - lastKnownFileType - text.plist.strings - name - Base - path - Base.lproj/InfoPlist.strings - sourceTree - <group> - - 9B2EEB8CEF2E94D58EA09D9D - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text.xcconfig - name - Pods-ActorApp.debug.xcconfig - path - Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp.debug.xcconfig - sourceTree - <group> - - A275ED497CA570AD01FB66A7 - - explicitFileType - wrapper.framework - includeInIndex - 0 - isa - PBXFileReference - path - Pods_ActorApp.framework - sourceTree - BUILT_PRODUCTS_DIR - - A88F4C381ED2B98E99A68937 - - fileRef - A275ED497CA570AD01FB66A7 - isa - PBXBuildFile - - AAA022A9BD9362E00B0F9BDE - - buildActionMask - 2147483647 - files - - inputPaths - - isa - PBXShellScriptBuildPhase - name - [CP] Embed Pods Frameworks - outputPaths - - runOnlyForDeploymentPostprocessing - 0 - shellPath - /bin/sh - shellScript - "${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-frameworks.sh" - - showEnvVarsInLog - 0 - - B094A1F03E91E4354C789DE8702D2FB4 - - buildActionMask - 2147483647 - files - - 2CE3FEBEF881B465BDE1045A959BFB0A - F45B35E37C8CB7140417EA87AAFEFDA2 - 068B397B1C85386A002BFF73 - 068C6E4F1BBC4BF900182516 - - isa - PBXResourcesBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - BFFF6424C537CA65F6346593 - - children - - 9B2EEB8CEF2E94D58EA09D9D - 404790AFDFFBD618E6175093 - - isa - PBXGroup - name - Pods - sourceTree - <group> - - C83A7EEB1948C38ECEFC1D330C57A7B1 - - children - - 65E498AE225CBED71E8F3CD1CA2767B7 - - isa - PBXGroup - name - Products - sourceTree - <group> - - C8EA64248333B842F7E13CD5378F81D3 - - buildSettings - - ALWAYS_SEARCH_USER_PATHS - NO - CLANG_CXX_LANGUAGE_STANDARD - gnu++0x - CLANG_CXX_LIBRARY - libc++ - CLANG_ENABLE_MODULES - YES - CLANG_ENABLE_OBJC_ARC - YES - CLANG_WARN_BOOL_CONVERSION - YES - CLANG_WARN_CONSTANT_CONVERSION - YES - CLANG_WARN_DIRECT_OBJC_ISA_USAGE - YES_ERROR - CLANG_WARN_EMPTY_BODY - YES - CLANG_WARN_ENUM_CONVERSION - YES - CLANG_WARN_INT_CONVERSION - YES - CLANG_WARN_OBJC_ROOT_CLASS - YES_ERROR - CLANG_WARN_UNREACHABLE_CODE - YES - CLANG_WARN__DUPLICATE_METHOD_MATCH - YES - CODE_SIGN_IDENTITY[sdk=iphoneos*] - iPhone Developer - COPY_PHASE_STRIP - NO - DEBUG_INFORMATION_FORMAT - dwarf-with-dsym - ENABLE_NS_ASSERTIONS - NO - ENABLE_STRICT_OBJC_MSGSEND - YES - GCC_C_LANGUAGE_STANDARD - gnu99 - GCC_NO_COMMON_BLOCKS - YES - GCC_WARN_64_TO_32_BIT_CONVERSION - YES - GCC_WARN_ABOUT_RETURN_TYPE - YES_ERROR - GCC_WARN_UNDECLARED_SELECTOR - YES - GCC_WARN_UNINITIALIZED_AUTOS - YES_AGGRESSIVE - GCC_WARN_UNUSED_FUNCTION - YES - GCC_WARN_UNUSED_VARIABLE - YES - IPHONEOS_DEPLOYMENT_TARGET - 8.0 - MTL_ENABLE_DEBUG_INFO - NO - OTHER_LDFLAGS - $(inherited) - SDKROOT - iphoneos - TARGETED_DEVICE_FAMILY - 1,2 - VALIDATE_PRODUCT - YES - - isa - XCBuildConfiguration - name - Release - - D0310FF36675D7510E52D86CDA8E2C6C - - children - - 75DC9F2DE93F0AFA6A85B53C4B694EAE - 1ACEA023B930E6F261DAC0A6BDB410C1 - 2A521812020DAAAA325065ADC32B7DEB - - isa - PBXGroup - path - ActorApp - sourceTree - <group> - - D873D85572C6C400293E0DF69DBA58DD - - children - - D0310FF36675D7510E52D86CDA8E2C6C - 86C48777C0FD262E78F8BEC9253C9914 - C83A7EEB1948C38ECEFC1D330C57A7B1 - BFFF6424C537CA65F6346593 - - isa - PBXGroup - sourceTree - <group> - - DE8D1D9859D2C4D4C7EC7AD74BB65F0E - - isa - PBXFileReference - lastKnownFileType - text.plist.xml - name - Info.plist - path - Supporting Files/Info.plist - sourceTree - <group> - - DFE814D1E12D2647AF2DBA3F76405F06 - - fileRef - 2A521812020DAAAA325065ADC32B7DEB - isa - PBXBuildFile - - EA6B7348F8364542DDD264F741AAAA19 - - buildConfigurationList - 58731A67470ABB64477A86D26A0C38CA - buildPhases - - 712B269FC35BFB6C85DF769C - 50CB7471D350DF82230B74B5952FA7BD - 4533F91FE5E247335BA76B35E6FC28C1 - B094A1F03E91E4354C789DE8702D2FB4 - 06FC5E741BAB2DCC0071F153 - 06230F0D1BC7FF3500A4807B - AAA022A9BD9362E00B0F9BDE - EFFD470B63C1BB419D199F19 - 851EE1A34619AE6677649A27 - - buildRules - - dependencies - - 06230F0C1BC7FF3500A4807B - - isa - PBXNativeTarget - name - ActorApp - productName - ActorApp - productReference - 65E498AE225CBED71E8F3CD1CA2767B7 - productType - com.apple.product-type.application - - EE9DE1CA46805369DC88E0A5B8F7445D - - baseConfigurationReference - 404790AFDFFBD618E6175093 - buildSettings - - ALWAYS_SEARCH_USER_PATHS - YES - ASSETCATALOG_COMPILER_APPICON_NAME - AppIcon - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME - LaunchImage - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES - YES - CLANG_MODULES_AUTOLINK - YES - CODE_SIGN_ENTITLEMENTS - ActorApp/Supporting Files/ActorApp.entitlements - CODE_SIGN_IDENTITY - iPhone Developer - CODE_SIGN_IDENTITY[sdk=iphoneos*] - iPhone Developer - EMBEDDED_CONTENT_CONTAINS_SWIFT - YES - ENABLE_BITCODE - NO - FABRIC_BUILD_SECRET - - FRAMEWORK_SEARCH_PATHS - - $(inherited) - $(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks - $(PROJECT_DIR)/build/Debug-iphoneos - - GCC_OPTIMIZATION_LEVEL - 0 - INFOPLIST_FILE - ActorApp/Supporting Files/Info.plist - IPHONEOS_DEPLOYMENT_TARGET - 8.0 - J2OBJC_VERSION - 0.9.8.2.1 - LD_RUNPATH_SEARCH_PATHS - $(inherited) @executable_path/Frameworks @loader_path/Frameworks - LIBRARY_SEARCH_PATHS - $(inherited) - OTHER_LDFLAGS - $(inherited) - PRODUCT_BUNDLE_IDENTIFIER - im.actor.sdk.dev - PRODUCT_NAME - $(TARGET_NAME) - PROVISIONING_PROFILE - - SDK_PATH - ../actor-sdk - SWIFT_OBJC_BRIDGING_HEADER - - SWIFT_OPTIMIZATION_LEVEL - -Onone - SWIFT_VERSION - 3.0 - USER_HEADER_SEARCH_PATHS - - - isa - XCBuildConfiguration - name - Release - - EFFD470B63C1BB419D199F19 - - buildActionMask - 2147483647 - files - - inputPaths - - isa - PBXShellScriptBuildPhase - name - [CP] Copy Pods Resources - outputPaths - - runOnlyForDeploymentPostprocessing - 0 - shellPath - /bin/sh - shellScript - "${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-resources.sh" - - showEnvVarsInLog - 0 - - F45B35E37C8CB7140417EA87AAFEFDA2 - - fileRef - 13C57576F07AC8694C15B51DFDFDC4C6 - isa - PBXBuildFile - - F6DBA7973E222F542FEC4D7E41CCEAA8 - - buildSettings - - ALWAYS_SEARCH_USER_PATHS - NO - CLANG_CXX_LANGUAGE_STANDARD - gnu++0x - CLANG_CXX_LIBRARY - libc++ - CLANG_ENABLE_MODULES - YES - CLANG_ENABLE_OBJC_ARC - YES - CLANG_WARN_BOOL_CONVERSION - YES - CLANG_WARN_CONSTANT_CONVERSION - YES - CLANG_WARN_DIRECT_OBJC_ISA_USAGE - YES_ERROR - CLANG_WARN_EMPTY_BODY - YES - CLANG_WARN_ENUM_CONVERSION - YES - CLANG_WARN_INT_CONVERSION - YES - CLANG_WARN_OBJC_ROOT_CLASS - YES_ERROR - CLANG_WARN_UNREACHABLE_CODE - YES - CLANG_WARN__DUPLICATE_METHOD_MATCH - YES - CODE_SIGN_IDENTITY[sdk=iphoneos*] - iPhone Developer - COPY_PHASE_STRIP - NO - DEBUG_INFORMATION_FORMAT - dwarf-with-dsym - ENABLE_STRICT_OBJC_MSGSEND - YES - ENABLE_TESTABILITY - YES - GCC_C_LANGUAGE_STANDARD - gnu99 - GCC_DYNAMIC_NO_PIC - NO - GCC_NO_COMMON_BLOCKS - YES - GCC_OPTIMIZATION_LEVEL - 0 - GCC_PREPROCESSOR_DEFINITIONS - - DEBUG=1 - $(inherited) - - GCC_SYMBOLS_PRIVATE_EXTERN - NO - GCC_WARN_64_TO_32_BIT_CONVERSION - YES - GCC_WARN_ABOUT_RETURN_TYPE - YES_ERROR - GCC_WARN_UNDECLARED_SELECTOR - YES - GCC_WARN_UNINITIALIZED_AUTOS - YES_AGGRESSIVE - GCC_WARN_UNUSED_FUNCTION - YES - GCC_WARN_UNUSED_VARIABLE - YES - IPHONEOS_DEPLOYMENT_TARGET - 8.0 - MTL_ENABLE_DEBUG_INFO - YES - ONLY_ACTIVE_ARCH - YES - OTHER_LDFLAGS - $(inherited) - SDKROOT - iphoneos - SWIFT_OPTIMIZATION_LEVEL - -Onone - TARGETED_DEVICE_FAMILY - 1,2 - - isa - XCBuildConfiguration - name - Debug - - F76A77E9428111C798E69B43EA06A281 - - isa - PBXFileReference - lastKnownFileType - text.xml - name - ActorApp.entitlements - path - Supporting Files/ActorApp.entitlements - sourceTree - <group> - - - rootObject - 3A4CF5A8B873DEC01817A2C1107BF8FD - - +/* Begin PBXCopyFilesBuildPhase section */ + 06230F0D1BC7FF3500A4807B /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 06230F0A1BC7FF3500A4807B /* ActorSDK.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = ActorSDK.xcodeproj; sourceTree = ""; }; + 065974E11BC6926C00B8C7DF /* ActorSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; name = ActorSDK.framework; path = "/Users/ex3ndr/Library/Developer/Xcode/DerivedData/ActorApp-clcqncodqhdxutfqgjvteqywzxue/Build/Products/Debug-iphoneos/ActorSDK.framework"; sourceTree = ""; }; + 068B397A1C85386A002BFF73 /* ringtone.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; name = ringtone.m4a; path = Resources/ringtone.m4a; sourceTree = ""; }; + 068C6E4E1BBC4BF900182516 /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = "Launch Screen.storyboard"; path = "Supporting Files/Launch Screen.storyboard"; sourceTree = ""; }; + 06CE898D1BD841D0005A5530 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 06E7B24E1C109C4B0090660C /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; }; + 148837AEB986AFDE519BEBD3686AB073 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = "Supporting Files/main.m"; sourceTree = ""; }; + 15F89F101C21317400776ACD /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; + 1A5742321DAD4CFF0064C87A /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = ActorSDK/Resources/Base.lproj/Localizable.strings; sourceTree = ""; }; + 2A521812020DAAAA325065ADC32B7DEB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 2ACD33B73078EB46A22D2D4C45BF1E6E /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Resources/Images.xcassets; sourceTree = ""; }; + 404790AFDFFBD618E6175093 /* Pods-ActorApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorApp.release.xcconfig"; path = "Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp.release.xcconfig"; sourceTree = ""; }; + 6238B42B2462DBE201B457C54CA819D7 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + 65E498AE225CBED71E8F3CD1CA2767B7 /* ActorApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ActorApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 6EE6E889CD9BA13B5A0828221608DB9A /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; + 7C171D4472C8F54A2AA0315EA0C69FED /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = ""; }; + 8B0B56F75C11CA3A0404AB4417F9B41B /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; + 9B2EEB8CEF2E94D58EA09D9D /* Pods-ActorApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorApp.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp.debug.xcconfig"; sourceTree = ""; }; + A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ActorApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DE8D1D9859D2C4D4C7EC7AD74BB65F0E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "Supporting Files/Info.plist"; sourceTree = ""; }; + F76A77E9428111C798E69B43EA06A281 /* ActorApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = ActorApp.entitlements; path = "Supporting Files/ActorApp.entitlements"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4533F91FE5E247335BA76B35E6FC28C1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 06CE898E1BD841D0005A5530 /* SystemConfiguration.framework in Frameworks */, + 06E7B24F1C109C4B0090660C /* MapKit.framework in Frameworks */, + 06230F091BC7FF3500A4807B /* ActorSDK.framework in Frameworks */, + A88F4C381ED2B98E99A68937 /* Pods_ActorApp.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 06230F041BC7FF2F00A4807B /* Products */ = { + isa = PBXGroup; + children = ( + 06230F081BC7FF3000A4807B /* ActorSDK.framework */, + ); + name = Products; + sourceTree = ""; + }; + 1ACEA023B930E6F261DAC0A6BDB410C1 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + DE8D1D9859D2C4D4C7EC7AD74BB65F0E /* Info.plist */, + 148837AEB986AFDE519BEBD3686AB073 /* main.m */, + F76A77E9428111C798E69B43EA06A281 /* ActorApp.entitlements */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 75DC9F2DE93F0AFA6A85B53C4B694EAE /* Resources */ = { + isa = PBXGroup; + children = ( + 068B397A1C85386A002BFF73 /* ringtone.m4a */, + 2ACD33B73078EB46A22D2D4C45BF1E6E /* Images.xcassets */, + 13C57576F07AC8694C15B51DFDFDC4C6 /* InfoPlist.strings */, + 068C6E4E1BBC4BF900182516 /* Launch Screen.storyboard */, + ); + name = Resources; + sourceTree = ""; + }; + 86C48777C0FD262E78F8BEC9253C9914 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 06E7B24E1C109C4B0090660C /* MapKit.framework */, + 06CE898D1BD841D0005A5530 /* SystemConfiguration.framework */, + 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */, + 065974E11BC6926C00B8C7DF /* ActorSDK.framework */, + A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + BFFF6424C537CA65F6346593 /* Pods */ = { + isa = PBXGroup; + children = ( + 9B2EEB8CEF2E94D58EA09D9D /* Pods-ActorApp.debug.xcconfig */, + 404790AFDFFBD618E6175093 /* Pods-ActorApp.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + C83A7EEB1948C38ECEFC1D330C57A7B1 /* Products */ = { + isa = PBXGroup; + children = ( + 65E498AE225CBED71E8F3CD1CA2767B7 /* ActorApp.app */, + ); + name = Products; + sourceTree = ""; + }; + D0310FF36675D7510E52D86CDA8E2C6C /* ActorApp */ = { + isa = PBXGroup; + children = ( + 75DC9F2DE93F0AFA6A85B53C4B694EAE /* Resources */, + 1ACEA023B930E6F261DAC0A6BDB410C1 /* Supporting Files */, + 2A521812020DAAAA325065ADC32B7DEB /* AppDelegate.swift */, + ); + path = ActorApp; + sourceTree = ""; + }; + D873D85572C6C400293E0DF69DBA58DD = { + isa = PBXGroup; + children = ( + 1A5742311DAD4CFF0064C87A /* Localizable.strings */, + D0310FF36675D7510E52D86CDA8E2C6C /* ActorApp */, + 86C48777C0FD262E78F8BEC9253C9914 /* Frameworks */, + C83A7EEB1948C38ECEFC1D330C57A7B1 /* Products */, + BFFF6424C537CA65F6346593 /* Pods */, + ); + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + EA6B7348F8364542DDD264F741AAAA19 /* ActorApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 58731A67470ABB64477A86D26A0C38CA /* Build configuration list for PBXNativeTarget "ActorApp" */; + buildPhases = ( + 712B269FC35BFB6C85DF769C /* [CP] Check Pods Manifest.lock */, + 50CB7471D350DF82230B74B5952FA7BD /* Sources */, + 4533F91FE5E247335BA76B35E6FC28C1 /* Frameworks */, + B094A1F03E91E4354C789DE8702D2FB4 /* Resources */, + 06FC5E741BAB2DCC0071F153 /* Configure Crashlytics */, + 06230F0D1BC7FF3500A4807B /* Embed Frameworks */, + AAA022A9BD9362E00B0F9BDE /* [CP] Embed Pods Frameworks */, + EFFD470B63C1BB419D199F19 /* [CP] Copy Pods Resources */, + 851EE1A34619AE6677649A27 /* Embed Pods Frameworks */, + 1A5742381DAD4FD80064C87A /* 📦 Embeded pods framework */, + 1A5742391DAD50070064C87A /* 📦 Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 06230F0C1BC7FF3500A4807B /* PBXTargetDependency */, + ); + name = ActorApp; + productName = ActorApp; + productReference = 65E498AE225CBED71E8F3CD1CA2767B7 /* ActorApp.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 3A4CF5A8B873DEC01817A2C1107BF8FD /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0730; + ORGANIZATIONNAME = "Actor LLC"; + TargetAttributes = { + EA6B7348F8364542DDD264F741AAAA19 = { + CreatedOnToolsVersion = 6.4; + DevelopmentTeam = HVJR44Y5B6; + LastSwiftMigration = 0800; + SystemCapabilities = { + com.apple.Maps.iOS = { + enabled = 1; + }; + com.apple.Push = { + enabled = 1; + }; + com.apple.iCloud = { + enabled = 1; + }; + }; + }; + }; + }; + buildConfigurationList = 6A6B0DB51CB7FEB1D7D881E55C02AD30 /* Build configuration list for PBXProject "ActorApp" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + "zh-Hans", + pt, + ru, + es, + ); + mainGroup = D873D85572C6C400293E0DF69DBA58DD; + productRefGroup = C83A7EEB1948C38ECEFC1D330C57A7B1 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 06230F041BC7FF2F00A4807B /* Products */; + ProjectRef = 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + EA6B7348F8364542DDD264F741AAAA19 /* ActorApp */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 06230F081BC7FF3000A4807B /* ActorSDK.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = ActorSDK.framework; + remoteRef = 06230F071BC7FF3000A4807B /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + B094A1F03E91E4354C789DE8702D2FB4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2CE3FEBEF881B465BDE1045A959BFB0A /* Images.xcassets in Resources */, + F45B35E37C8CB7140417EA87AAFEFDA2 /* InfoPlist.strings in Resources */, + 068B397B1C85386A002BFF73 /* ringtone.m4a in Resources */, + 068C6E4F1BBC4BF900182516 /* Launch Screen.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 06FC5E741BAB2DCC0071F153 /* Configure Crashlytics */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Configure Crashlytics"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Initialization of Crashlytics\n\n# Getting build secret\nBUILD_SECRET=$FABRIC_BUILD_SECRET\n\n# Getting api key from Info.plist\nAPI_KEY=$(/usr/libexec/PlistBuddy \"${PRODUCT_SETTINGS_PATH}\" -c \"Print :Fabric:APIKey\")\n\nif [ -n \"$BUILD_SECRET\" ]; then\n if [[ $? -ne 0 ]]; then\n echo \"Crashlytics not installed, skipping\"\n else\n if [ -n \"$API_KEY\" ]; then\n echo \"Uploading symbols to crashlytics\" \"$API_KEY\" \"$BUILD_SECRET\"\n \"${PODS_ROOT}/Fabric/Fabric.framework/run\" \"$API_KEY\" \"$BUILD_SECRET\"\n else\n echo \"Crashlytics not installed, skipping\"\n fi\n fi\nelse\n echo \"Crashlytics build secret not set, skipping\"\nfi"; + }; + 1A5742381DAD4FD80064C87A /* 📦 Embeded pods framework */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Embeded pods framework"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-frameworks.sh\""; + }; + 1A5742391DAD50070064C87A /* 📦 Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-resources.sh\""; + }; + 712B269FC35BFB6C85DF769C /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + 851EE1A34619AE6677649A27 /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + AAA022A9BD9362E00B0F9BDE /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + EFFD470B63C1BB419D199F19 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 50CB7471D350DF82230B74B5952FA7BD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DFE814D1E12D2647AF2DBA3F76405F06 /* AppDelegate.swift in Sources */, + 34279C7FB8E40393FEAC939F6474BE2E /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 06230F0C1BC7FF3500A4807B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ActorSDK; + targetProxy = 06230F0B1BC7FF3500A4807B /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 13C57576F07AC8694C15B51DFDFDC4C6 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 8B0B56F75C11CA3A0404AB4417F9B41B /* Base */, + 7C171D4472C8F54A2AA0315EA0C69FED /* pt */, + 6238B42B2462DBE201B457C54CA819D7 /* ru */, + 6EE6E889CD9BA13B5A0828221608DB9A /* zh-Hans */, + 15F89F101C21317400776ACD /* es */, + ); + name = InfoPlist.strings; + path = Resources/Localizable; + sourceTree = ""; + }; + 1A5742311DAD4CFF0064C87A /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 1A5742321DAD4CFF0064C87A /* Base */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 4DE2EA6053BDD0185E284AA71245C654 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9B2EEB8CEF2E94D58EA09D9D /* Pods-ActorApp.debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_MODULES_AUTOLINK = YES; + CODE_SIGN_ENTITLEMENTS = "ActorApp/Supporting Files/ActorApp.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + ENABLE_BITCODE = NO; + FABRIC_BUILD_SECRET = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks", + "$(PROJECT_DIR)/build/Debug-iphoneos", + ); + GCC_OPTIMIZATION_LEVEL = 0; + INFOPLIST_FILE = "ActorApp/Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + J2OBJC_VERSION = 0.9.8.2.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = im.actor.sdk.dev; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SDK_PATH = "../actor-sdk"; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + USER_HEADER_SEARCH_PATHS = ""; + }; + name = Debug; + }; + C8EA64248333B842F7E13CD5378F81D3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = "$(inherited)"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + EE9DE1CA46805369DC88E0A5B8F7445D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 404790AFDFFBD618E6175093 /* Pods-ActorApp.release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_MODULES_AUTOLINK = YES; + CODE_SIGN_ENTITLEMENTS = "ActorApp/Supporting Files/ActorApp.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + ENABLE_BITCODE = NO; + FABRIC_BUILD_SECRET = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks", + "$(PROJECT_DIR)/build/Debug-iphoneos", + ); + GCC_OPTIMIZATION_LEVEL = 0; + INFOPLIST_FILE = "ActorApp/Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + J2OBJC_VERSION = 0.9.8.2.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; + OTHER_LDFLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = im.actor.sdk.dev; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SDK_PATH = "../actor-sdk"; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + USER_HEADER_SEARCH_PATHS = ""; + }; + name = Release; + }; + F6DBA7973E222F542FEC4D7E41CCEAA8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "$(inherited)"; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 58731A67470ABB64477A86D26A0C38CA /* Build configuration list for PBXNativeTarget "ActorApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4DE2EA6053BDD0185E284AA71245C654 /* Debug */, + EE9DE1CA46805369DC88E0A5B8F7445D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6A6B0DB51CB7FEB1D7D881E55C02AD30 /* Build configuration list for PBXProject "ActorApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F6DBA7973E222F542FEC4D7E41CCEAA8 /* Debug */, + C8EA64248333B842F7E13CD5378F81D3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 3A4CF5A8B873DEC01817A2C1107BF8FD /* Project object */; +} diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings index 69e74bcce2..697eb3df9b 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings @@ -699,6 +699,11 @@ "ActionDeleteMessage" = "Are you sure want to delete chat?"; +"ActionDeleteGroupTitle" = "Remove Group"; + +"ActionDeleteChannelTitle" = "Remove Channel"; + +"ActionDeleteChatlTitle" = "Remove Chat"; "ActionDeleteChannel" = "Delete Channel"; diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/AADialogsListContentController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/AADialogsListContentController.swift index 49927e5a09..f6da1e3821 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/AADialogsListContentController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/AADialogsListContentController.swift @@ -110,6 +110,7 @@ open class AADialogsListContentController: AAContentTableController, UISearchBar }) } + a.title = AALocalized(isChannel ? "ActionDeleteChannelTitle" : "ActionDeleteGroupTitle") // Cancel a.cancel = AALocalized("ActionCancel") }) @@ -122,6 +123,7 @@ open class AADialogsListContentController: AAContentTableController, UISearchBar a.destructive(AALocalized("ActionDelete"), closure: { self.executeSafe(Actor.deleteChatCommand(with: dialog.peer)) }) + a.title = AALocalized("ActionDeleteChatTitle") a.cancel = AALocalized("ActionCancel") }) } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift index 997c414f50..15dcfb001f 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift @@ -176,15 +176,15 @@ open class AADialogCell: AATableViewCell, AABindedCell { setNeedsLayout() } - open override func willTransition(to state: UITableViewCellStateMask) { - super.willTransition(to: state) - - if state.contains(UITableViewCellStateMask.showingEditControlMask) { - isEditing = true - } else { - isEditing = false - } - } +// open override func willTransition(to state: UITableViewCellStateMask) { +// super.willTransition(to: state) +// +// if state.contains(UITableViewCellStateMask.showingEditControlMask) { +// isEditing = true +// } else { +// isEditing = false +// } +// } open override func layoutSubviews() { super.layoutSubviews() diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/ManagedAlerts.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/ManagedAlerts.swift index bb19fb9792..036a5eb68e 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/ManagedAlerts.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/ManagedAlerts.swift @@ -13,7 +13,7 @@ public extension UIViewController { closure(s) let controller = UIAlertController(title: AALocalized(s.title), message: AALocalized(s.message), preferredStyle: .actionSheet) - + for i in s.actions { controller.addAction(UIAlertAction(title: AALocalized(i.title), style: i.isDestructive ? UIAlertActionStyle.destructive : UIAlertActionStyle.default, handler: { (c) -> Void in i.closure() @@ -38,8 +38,8 @@ public extension UIViewController { open class AAAlertSetting { open var cancel: String! - open var title: String! - open var message: String! + open var title: String! = "" + open var message: String! = "" fileprivate var actions = [AlertActions]() From 1ea657c9261dbe339854a7d8e3578f5d9ce2e2ad Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Tue, 11 Oct 2016 20:57:47 +0300 Subject: [PATCH 123/253] chore(iOS) make stickers button optional --- actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift | 4 ++++ .../sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift | 7 +++++++ .../Conversation/ConversationViewController.swift | 4 +++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift index 5f6c72d8ad..f3ba9666e6 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift @@ -52,4 +52,8 @@ open class AppDelegate : ActorApplicationDelegate { open override func actorRootInitialControllerIndex() -> Int? { return 0 } + + open override func showStickersButton() -> Bool{ + return false + } } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift index e303b1e088..1a1ced4725 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift @@ -40,6 +40,7 @@ public protocol ActorSDKDelegate { /// Root Intial controller func actorRootInitialControllerIndex() -> Int? + /// Configuration of bubble cells func actorConfigureBubbleLayouters(_ builtIn: [AABubbleLayouter]) -> [AABubbleLayouter] @@ -60,6 +61,8 @@ public protocol ActorSDKDelegate { /// Called after header is created in settings page func actorSettingsSupportDidCreated(_ controller: AASettingsViewController, section: AAManagedSection) + + func showStickersButton() -> Bool } /// Default empty implementation of SDK Delegate @@ -136,4 +139,8 @@ open class ActorSDKDelegateDefault: NSObject, ActorSDKDelegate { open func actorSettingsSupportDidCreated(_ controller: AASettingsViewController, section: AAManagedSection) { } + + open func showStickersButton() -> Bool{ + return true + } } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift index dbf4b30544..28f83f3890 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift @@ -159,7 +159,9 @@ open class ConversationViewController: self.stickersButton.tintColor = UIColor.lightGray.withAlphaComponent(0.5) self.stickersButton.setImage(UIImage.bundled("sticker_button"), for: UIControlState()) self.stickersButton.addTarget(self, action: #selector(ConversationViewController.changeKeyboard), for: UIControlEvents.touchUpInside) - self.textInputbar.addSubview(stickersButton) + if(ActorSDK.sharedActor().delegate.showStickersButton()){ + self.textInputbar.addSubview(stickersButton) + } // From 99c9b491362b07cb8b7f5deccf92209dd33ce72f Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Tue, 11 Oct 2016 21:29:16 +0300 Subject: [PATCH 124/253] feat(iOS) implement on client privacy --- .../sdk-core-ios/ActorApp/AppDelegate.swift | 4 ++ .../ActorSDK/Sources/ActorSDK.swift | 3 + .../ActorSDK/Sources/ActorSDKDelegate.swift | 6 ++ .../User/AAUserViewController.swift | 71 ++++++++++--------- 4 files changed, 50 insertions(+), 34 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift index f3ba9666e6..b785d6e0a8 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift @@ -56,4 +56,8 @@ open class AppDelegate : ActorApplicationDelegate { open override func showStickersButton() -> Bool{ return false } + + open override func useOnClientPrivacy() -> Bool{ + return true + } } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift index 3e2960a482..29f151c290 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift @@ -240,6 +240,9 @@ import ReachabilitySwift for key in trustedKeys { builder.addTrustedKey(key) } + + builder.setOnClientPrivacyEnabled(jboolean(delegate.useOnClientPrivacy())) + builder.setApiConfiguration(ACApiConfiguration(appTitle: appTitle, withAppId: jint(apiId), withAppKey: apiKey, withDeviceTitle: deviceName, withDeviceId: deviceKey)) // Providers diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift index 1a1ced4725..fa6e48d793 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift @@ -63,6 +63,8 @@ public protocol ActorSDKDelegate { func actorSettingsSupportDidCreated(_ controller: AASettingsViewController, section: AAManagedSection) func showStickersButton() -> Bool + + func useOnClientPrivacy() -> Bool } /// Default empty implementation of SDK Delegate @@ -143,4 +145,8 @@ open class ActorSDKDelegateDefault: NSObject, ActorSDKDelegate { open func showStickersButton() -> Bool{ return true } + + open func useOnClientPrivacy() -> Bool{ + return false + } } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift index 7aed0a7234..655b6a89b9 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/User/AAUserViewController.swift @@ -103,43 +103,46 @@ open class AAUserViewController: AAContentTableController { s.titled("ProfileUsername", content: "@\(n)") } - // Contact: Phones - s.arrays { (r: AAManagedArrayRows) -> () in - r.height = 55 - r.data = self.user.getPhonesModel().get().toSwiftArray() - r.bindData = { (c: AATitledCell, d: ACUserPhone) -> () in - c.setContent(AALocalized("SettingsMobilePhone"), content: "+\(d.phone)", isAction: false) - } - r.bindCopy = { (d: ACUserPhone) -> String? in - return "+\(d.phone)" - } - r.selectAction = { (c: ACUserPhone) -> Bool in - let phoneNumber = c.phone - let hasPhone = UIApplication.shared.canOpenURL(URL(string: "telprompt://")!) - if (!hasPhone) { - UIPasteboard.general.string = "+\(phoneNumber)" - self.alertUser("NumberCopied") - } else { - ActorSDK.sharedActor().openUrl("telprompt://+\(phoneNumber)") + if !ActorSDK.sharedActor().delegate.useOnClientPrivacy() || self.user.isInPhoneBookModel().get().booleanValue() { + // Contact: Phones + s.arrays { (r: AAManagedArrayRows) -> () in + r.height = 55 + r.data = self.user.getPhonesModel().get().toSwiftArray() + r.bindData = { (c: AATitledCell, d: ACUserPhone) -> () in + c.setContent(AALocalized("SettingsMobilePhone"), content: "+\(d.phone)", isAction: false) + } + r.bindCopy = { (d: ACUserPhone) -> String? in + return "+\(d.phone)" + } + r.selectAction = { (c: ACUserPhone) -> Bool in + let phoneNumber = c.phone + let hasPhone = UIApplication.shared.canOpenURL(URL(string: "telprompt://")!) + if (!hasPhone) { + UIPasteboard.general.string = "+\(phoneNumber)" + self.alertUser("NumberCopied") + } else { + ActorSDK.sharedActor().openUrl("telprompt://+\(phoneNumber)") + } + return true } - return true - } - } - - // Contact: Emails - s.arrays { (r: AAManagedArrayRows) -> () in - r.height = 55 - r.data = self.user.getEmailsModel().get().toSwiftArray() - r.bindData = { (c: AATitledCell, d: ACUserEmail) -> () in - c.setContent(d.title, content: d.email, isAction: false) - } - r.bindCopy = { (d: ACUserEmail) -> String? in - return d.email } - r.selectAction = { (c: ACUserEmail) -> Bool in - ActorSDK.sharedActor().openUrl("mailto:\(c.email)") - return true + + // Contact: Emails + s.arrays { (r: AAManagedArrayRows) -> () in + r.height = 55 + r.data = self.user.getEmailsModel().get().toSwiftArray() + r.bindData = { (c: AATitledCell, d: ACUserEmail) -> () in + c.setContent(d.title, content: d.email, isAction: false) + } + r.bindCopy = { (d: ACUserEmail) -> String? in + return d.email + } + r.selectAction = { (c: ACUserEmail) -> Bool in + ActorSDK.sharedActor().openUrl("mailto:\(c.email)") + return true + } } + } // Contact: About From 9289b527d76beeef396e7555611095d2fc95d928 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 11 Oct 2016 16:32:20 -0300 Subject: [PATCH 125/253] alteracoes --- actor-server/version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 2c281834d1..ec08738e9b 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.4-SNAPSHOT" +version in ThisBuild := "3.0.5-SNAPSHOT" From a6e1c1e36de6987e648743b215c5f506d8b961a5 Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Wed, 12 Oct 2016 20:21:06 +0300 Subject: [PATCH 126/253] fix(iOS): kick from gtoup/channel strings, recover default background, possible fix video record and send --- .../Resources/Base.lproj/Localizable.strings | 6 ++++ .../Sources/ActorCore/ActorCoreExt.swift | 2 +- .../ActorSDK/Sources/ActorStyle.swift | 2 ++ .../AAWallpapperPreviewController.swift | 14 ++++++--- .../ConversationViewController.swift | 29 ++++++------------- .../Group/AAGroupViewController.swift | 7 +++-- .../AANavigationController.swift | 1 + .../Settings/AAWallpapersCell.swift | 14 ++++----- .../Cells/AAWallpapperSettingsCell.swift | 20 ++++++------- 9 files changed, 50 insertions(+), 45 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings index 697eb3df9b..2626a6fa2d 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings @@ -377,6 +377,12 @@ "GroupMemberKickAction" = "Kick"; +"ChannelMemberKick" = "Kick from Channel"; + +"ChannelMemberKickMessage" = "Are you sure you want to kick {name} from this channel?"; + +"ChannelMemberKickAction" = "Kick"; + "GroupMemberWrite" = "Write a Message"; "GroupMemberCall" = "Phone Call"; diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift index 227689bf8b..3dccbb452e 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift @@ -34,7 +34,7 @@ public extension ACCocoaMessenger { if let videoData = try? Data(contentsOf: url) { // if data have on this local path url go to upload - let descriptor = "/tmp/"+UUID().uuidString + let descriptor = "/tmp/"+UUID().uuidString + ".mp4" let path = CocoaFiles.pathFromDescriptor(descriptor); try? videoData.write(to: URL(fileURLWithPath: path), options: [.atomic]) // write to file diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorStyle.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorStyle.swift index 5bf8b5e8bb..8c11051b85 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorStyle.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorStyle.swift @@ -52,6 +52,8 @@ open class ActorStyle { open var navigationBgColor: UIColor = UIColor(red: 247.0/255.0, green: 247.0/255.0, blue: 247.0/255.0, alpha: 1) /// Main Navigation bar hairline color open var navigationHairlineHidden = false + /// Main Navigation bar hairline color + open var navigationIsTransluent = false /// Navigation Bar icons colors open var navigationTintColor: UIColor = UIColor(rgb: 0x5085CB) /// Navigation Bar title color diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Previews/AAWallpapperPreviewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Previews/AAWallpapperPreviewController.swift index 0b1ce59da1..aec71a02c5 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Previews/AAWallpapperPreviewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Previews/AAWallpapperPreviewController.swift @@ -10,16 +10,21 @@ open class AAWallpapperPreviewController: AAViewController { fileprivate let cancelButton = UIButton() fileprivate let setButton = UIButton() - fileprivate let imageName: String + fileprivate let imageName: String? fileprivate let selectedImage: UIImage fileprivate var fromName: Bool - public init(imageName: String) { + public init(imageName: String?) { self.imageName = imageName self.selectedImage = UIImage() self.fromName = true super.init() - imageView.image = UIImage.bundled(imageName)! + if(imageName != nil){ + imageView.image = UIImage.bundled(imageName!)! + }else{ + imageView.backgroundColor = ActorSDK.sharedActor().style.chatBgColor + } + imageView.contentMode = .scaleAspectFill imageView.clipsToBounds = true cancelButton.backgroundColor = appStyle.vcPanelBgColor @@ -81,7 +86,8 @@ open class AAWallpapperPreviewController: AAViewController { self.dismiss(animated: true, completion: nil) if self.fromName == true { - Actor.changeSelectedWallpaper("local:\(imageName)") + + Actor.changeSelectedWallpaper(imageName != nil ? "local:\(imageName!)" : "default") } else { dispatchBackground({ () -> Void in diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift index 28f83f3890..f5ad4a4367 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift @@ -93,27 +93,16 @@ open class ConversationViewController: backgroundView.backgroundColor = appStyle.chatBgColor // Custom background if available - - var bg = Actor.getSelectedWallpaper(); - if (bg == nil){ - bg = "local:bg_1.jpg" - } - - if let bg = bg { - var image:UIImage? - if bg.startsWith("local:") { - image = UIImage.bundled(bg.skip(6)) - } else { - let path = CocoaFiles.pathFromDescriptor(bg.skip(5)) - image = UIImage(contentsOfFile:path) - } - - if(image == nil){ - image = UIImage.bundled("bg_1.jpg") - } - backgroundView.image = image + if let bg = Actor.getSelectedWallpaper(){ + if bg != "default" { + if bg.startsWith("local:") { + backgroundView.image = UIImage.bundled(bg.skip(6)) + } else { + let path = CocoaFiles.pathFromDescriptor(bg.skip(5)) + backgroundView.image = UIImage(contentsOfFile:path) + } + } } - view.insertSubview(backgroundView, at: 0) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewController.swift index 2e1be90ce5..a16d839c24 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewController.swift @@ -288,10 +288,11 @@ open class AAGroupViewController: AAContentTableController { (self.group.isCanKickInvited.get().booleanValue() && d.inviterUid == Actor.myUid())) if canKick { + let isChannel = self.group.groupType == ACGroupType.channel() let name = Actor.getUserWithUid(d.uid).getNameModel().get() - a.destructive("GroupMemberKick") { () -> () in - self.confirmDestructive(AALocalized("GroupMemberKickMessage") - .replace("{name}", dest: name!), action: AALocalized("GroupMemberKickAction")) { + a.destructive(isChannel ? "ChannelMemberKick" : "GroupMemberKick") { () -> () in + self.confirmDestructive(AALocalized(isChannel ? "ChannelMemberKickMessage" : "GroupMemberKickMessage") + .replace("{name}", dest: name!), action: AALocalized(isChannel ? "ChannelMemberKickAction" : "GroupMemberKickAction")) { self.executeSafe(Actor.kickMemberCommand(withGid: jint(self.gid), withUid: user.getId())) } } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AANavigationController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AANavigationController.swift index 50afafe6c3..36187eb3b3 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AANavigationController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AANavigationController.swift @@ -60,6 +60,7 @@ open class AANavigationController: UINavigationController { [NSForegroundColorAttributeName: ActorSDK.sharedActor().style.navigationTitleColor] navigationBar.tintColor = ActorSDK.sharedActor().style.navigationTintColor navigationBar.barTintColor = ActorSDK.sharedActor().style.navigationBgColor + navigationBar.isTranslucent = ActorSDK.sharedActor().style.navigationIsTransluent navigationBar.hairlineHidden = ActorSDK.sharedActor().style.navigationHairlineHidden view.backgroundColor = ActorSDK.sharedActor().style.vcBgColor diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Settings/AAWallpapersCell.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Settings/AAWallpapersCell.swift index a7f1fae686..539f479acd 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Settings/AAWallpapersCell.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Settings/AAWallpapersCell.swift @@ -10,25 +10,25 @@ open class AAWallpapersCell: AATableViewCell { fileprivate let wallpapper2 = UIImageView() fileprivate let wallpapper3 = UIImageView() - open var wallpapperDidTap: ((_ name: String) -> ())? + open var wallpapperDidTap: ((_ name: String?) -> ())? public override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) wallpapper1.clipsToBounds = true wallpapper1.contentMode = .scaleAspectFill - wallpapper1.image = UIImage.bundled("bg_1_preview.jpg")! - wallpapper1.viewDidTap = { [unowned self] () -> () in self.wallpapperDidTap?("bg_1.jpg") } + wallpapper1.backgroundColor = ActorSDK.sharedActor().style.chatBgColor + wallpapper1.viewDidTap = { [unowned self] () -> () in self.wallpapperDidTap?(nil) } wallpapper2.clipsToBounds = true wallpapper2.contentMode = .scaleAspectFill - wallpapper2.image = UIImage.bundled("bg_2_preview.jpg")! - wallpapper2.viewDidTap = { [unowned self] () -> () in self.wallpapperDidTap?("bg_2.jpg") } + wallpapper2.image = UIImage.bundled("bg_1_preview.jpg")! + wallpapper2.viewDidTap = { [unowned self] () -> () in self.wallpapperDidTap?("bg_1.jpg") } wallpapper3.clipsToBounds = true wallpapper3.contentMode = .scaleAspectFill - wallpapper3.image = UIImage.bundled("bg_3_preview.jpg")! - wallpapper3.viewDidTap = { [unowned self] () -> () in self.wallpapperDidTap?("bg_3.jpg") } + wallpapper3.image = UIImage.bundled("bg_2_preview.jpg")! + wallpapper3.viewDidTap = { [unowned self] () -> () in self.wallpapperDidTap?("bg_2.jpg") } self.contentView.addSubview(wallpapper1) self.contentView.addSubview(wallpapper2) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Settings/Cells/AAWallpapperSettingsCell.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Settings/Cells/AAWallpapperSettingsCell.swift index 55ab87f8b0..635373f3ba 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Settings/Cells/AAWallpapperSettingsCell.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Settings/Cells/AAWallpapperSettingsCell.swift @@ -16,27 +16,27 @@ open class AAWallpapperSettingsCell: AATableViewCell { fileprivate let label = UILabel() fileprivate let disclose = UIImageView() - open var wallpapperDidTap: ((_ name: String) -> ())? + open var wallpapperDidTap: ((_ name: String?) -> ())? public override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) wallpapper1.clipsToBounds = true wallpapper1.contentMode = .scaleAspectFill - wallpapper1.image = UIImage.bundled("bg_1_preview.jpg")! - wallpapper1.viewDidTap = { [unowned self] () -> () in self.wallpapperDidTap?("bg_1.jpg") } + wallpapper1.backgroundColor = ActorSDK.sharedActor().style.chatBgColor + wallpapper1.viewDidTap = { [unowned self] () -> () in self.wallpapperDidTap?(nil) } wallpapper1Icon.image = UIImage.bundled("ImageSelectedOn") wallpapper2.clipsToBounds = true wallpapper2.contentMode = .scaleAspectFill - wallpapper2.image = UIImage.bundled("bg_2_preview.jpg")! - wallpapper2.viewDidTap = { [unowned self] () -> () in self.wallpapperDidTap?("bg_2.jpg") } + wallpapper2.image = UIImage.bundled("bg_1_preview.jpg")! + wallpapper2.viewDidTap = { [unowned self] () -> () in self.wallpapperDidTap?("bg_1.jpg") } wallpapper2Icon.image = UIImage.bundled("ImageSelectedOn") wallpapper3.clipsToBounds = true wallpapper3.contentMode = .scaleAspectFill - wallpapper3.image = UIImage.bundled("bg_3_preview.jpg")! - wallpapper3.viewDidTap = { [unowned self] () -> () in self.wallpapperDidTap?("bg_3.jpg") } + wallpapper3.image = UIImage.bundled("bg_2_preview.jpg")! + wallpapper3.viewDidTap = { [unowned self] () -> () in self.wallpapperDidTap?("bg_2.jpg") } wallpapper3Icon.image = UIImage.bundled("ImageSelectedOn") label.font = UIFont.systemFont(ofSize: 17) @@ -85,8 +85,8 @@ open class AAWallpapperSettingsCell: AATableViewCell { } open func bind() { - wallpapper1Icon.isHidden = ActorSDK.sharedActor().messenger.getSelectedWallpaper() != "local:bg_1.jpg" - wallpapper2Icon.isHidden = ActorSDK.sharedActor().messenger.getSelectedWallpaper() != "local:bg_2.jpg" - wallpapper3Icon.isHidden = ActorSDK.sharedActor().messenger.getSelectedWallpaper() != "local:bg_3.jpg" + wallpapper1Icon.isHidden = ActorSDK.sharedActor().messenger.getSelectedWallpaper() != "default" + wallpapper2Icon.isHidden = ActorSDK.sharedActor().messenger.getSelectedWallpaper() != "local:bg_1.jpg" + wallpapper3Icon.isHidden = ActorSDK.sharedActor().messenger.getSelectedWallpaper() != "local:bg_2.jpg" } } From ba7aa7733c219d034b28048d57112d8f09096a09 Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Thu, 13 Oct 2016 15:13:28 +0300 Subject: [PATCH 127/253] fix(iOS): kickfrom group strings, cancel add to channel --- .../Conversation/ConversationViewController.swift | 6 ++++++ .../Controllers/Group/AAAddParticipantViewController.swift | 5 +---- .../Controllers/Group/AAGroupViewMembersController.swift | 7 ++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift index f5ad4a4367..7a705e84d0 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift @@ -7,6 +7,7 @@ import UIKit import MobileCoreServices import AddressBook import AddressBookUI +import AVFoundation open class ConversationViewController: AAConversationContentController, @@ -804,6 +805,11 @@ open class ConversationViewController: //////////////////////////////////////////////////////////// func pickImage(_ source: UIImagePickerControllerSourceType) { + + if(source == .camera && (AVAudioSession.sharedInstance().recordPermission() == AVAudioSessionRecordPermission.undetermined || AVAudioSession.sharedInstance().recordPermission() == AVAudioSessionRecordPermission.denied)){ + AVAudioSession.sharedInstance().requestRecordPermission({_ in (Bool).self}) + } + let pickerController = AAImagePickerController() pickerController.sourceType = source pickerController.mediaTypes = [kUTTypeImage as String,kUTTypeMovie as String] diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAAddParticipantViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAAddParticipantViewController.swift index ec1d12a89f..06ad1e22b0 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAAddParticipantViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAAddParticipantViewController.swift @@ -22,10 +22,7 @@ open class AAAddParticipantViewController: AAContactsListContentController, AACo title = AALocalized("GroupAddParticipantTitle") -// navigationItem.leftBarButtonItem = UIBarButtonItem( -// title: AALocalized("NavigationCancel"), -// style: UIBarButtonItemStyle.plain, -// target: self, action: #selector(AAViewController.dismiss)) + navigationItem.leftBarButtonItem = UIBarButtonItem(title: AALocalized("NavigationCancel"), style: .plain, target: self, action: #selector(AAViewController.dismissController)) } open func willAddContacts(_ controller: AAContactsListContentController, section: AAManagedSection) { diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewMembersController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewMembersController.swift index a2499c9217..a3bf7c9bd9 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewMembersController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewMembersController.swift @@ -108,10 +108,11 @@ open class AAGroupViewMembersController: AAContentTableController { (self.group.isCanKickInvited.get().booleanValue() && d.inviterUid == Actor.myUid())) if canKick { + let isChannel = self.group.groupType == ACGroupType.channel() let name = Actor.getUserWithUid(d.uid).getNameModel().get() - a.destructive("GroupMemberKick") { () -> () in - self.confirmDestructive(AALocalized("GroupMemberKickMessage") - .replace("{name}", dest: name!), action: AALocalized("GroupMemberKickAction")) { + a.destructive(isChannel ? "ChannelMemberKick" : "GroupMemberKick") { () -> () in + self.confirmDestructive(AALocalized(isChannel ? "ChannelMemberKickMessage" : "GroupMemberKickMessage") + .replace("{name}", dest: name!), action: AALocalized(isChannel ? "ChannelMemberKickAction" : "GroupMemberKickAction")) { self.executeSafe(Actor.kickMemberCommand(withGid: jint(self.gid), withUid: user.getId())) } } From ae1154cc7fff9086d72d11b44f7da5f52c541afd Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Thu, 13 Oct 2016 15:56:25 +0300 Subject: [PATCH 128/253] fix(iOS): files naming, fixes video playing --- .../Sources/ActorCore/Providers/CocoaFileSystemRuntime.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/CocoaFileSystemRuntime.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/CocoaFileSystemRuntime.swift index a535530a83..0f6cca975a 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/CocoaFileSystemRuntime.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/CocoaFileSystemRuntime.swift @@ -29,7 +29,7 @@ open class CocoaFiles { return CocoaFile(path: fileName) } - func commitTempFile(_ sourceFile: ARFileSystemReference!, withFileId fileId: jlong, withFileName fileName: String!) -> ARFileSystemReference! { + func commitTempFile(_ sourceFile: ARFileSystemReference!, withFileId fileId: jlong, withFileName fileName: String) -> ARFileSystemReference! { // Finding file available name From 638e097a8425eb24d524f8e0a78c6a485790158a Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Thu, 13 Oct 2016 16:33:44 +0300 Subject: [PATCH 129/253] fix(iOS): remove from members list after kick --- .../Controllers/Group/AAGroupViewMembersController.swift | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewMembersController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewMembersController.swift index a3bf7c9bd9..913ddf9008 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewMembersController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewMembersController.swift @@ -41,7 +41,9 @@ open class AAGroupViewMembersController: AAContentTableController { Actor.onUserVisible(withUid: d.uid) } + var id = 0 r.itemShown = { (index, d) in + id = index if index > r.data.count - 10 { self.loadMore() } @@ -113,7 +115,10 @@ open class AAGroupViewMembersController: AAContentTableController { a.destructive(isChannel ? "ChannelMemberKick" : "GroupMemberKick") { () -> () in self.confirmDestructive(AALocalized(isChannel ? "ChannelMemberKickMessage" : "GroupMemberKickMessage") .replace("{name}", dest: name!), action: AALocalized(isChannel ? "ChannelMemberKickAction" : "GroupMemberKickAction")) { - self.executeSafe(Actor.kickMemberCommand(withGid: jint(self.gid), withUid: user.getId())) + self.executeSafe(Actor.kickMemberCommand(withGid: jint(self.gid), withUid: user.getId()), successBlock: { (r) in + self.membersRow.data.remove(at: id) + self.tableView.reloadData() + }) } } } @@ -149,6 +154,8 @@ open class AAGroupViewMembersController: AAContentTableController { } } + + func didAddPressed() { navigateNext(AAAddParticipantViewController(gid: self.gid)) } From d11deb9bbccc6033e4b5ddf460553accf35b1120 Mon Sep 17 00:00:00 2001 From: diego Date: Fri, 14 Oct 2016 18:26:54 -0300 Subject: [PATCH 130/253] alteracoes --- actor-server/version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/version.sbt b/actor-server/version.sbt index ec08738e9b..8a99e1b41c 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.5-SNAPSHOT" +version in ThisBuild := "3.0.6-SNAPSHOT" From 8a0c0840d3d5389bf8e5539c795732a3873cfbb0 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Fri, 21 Oct 2016 09:51:13 -0200 Subject: [PATCH 131/253] alteracoes' --- actor-sdk/sdk-core-android/android-app/build.gradle | 2 +- actor-sdk/sdk-core-android/android-google-maps/build.gradle | 2 +- actor-sdk/sdk-core-android/android-google-push/build.gradle | 2 +- actor-sdk/sdk-core-android/android-sdk/build.gradle | 2 +- actor-sdk/sdk-core/core/core-android/build.gradle | 2 +- actor-sdk/sdk-core/runtime/runtime-android/build.gradle | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-app/build.gradle b/actor-sdk/sdk-core-android/android-app/build.gradle index d36cd4e308..d5d477387b 100644 --- a/actor-sdk/sdk-core-android/android-app/build.gradle +++ b/actor-sdk/sdk-core-android/android-app/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:2.2.2' classpath 'me.tatarka:gradle-retrolambda:3.2.5' classpath "com.google.gms:google-services:3.0.0" } diff --git a/actor-sdk/sdk-core-android/android-google-maps/build.gradle b/actor-sdk/sdk-core-android/android-google-maps/build.gradle index 62f0762abd..d4f955c0fa 100644 --- a/actor-sdk/sdk-core-android/android-google-maps/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-maps/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:2.2.2' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" classpath 'me.tatarka:gradle-retrolambda:3.2.5' diff --git a/actor-sdk/sdk-core-android/android-google-push/build.gradle b/actor-sdk/sdk-core-android/android-google-push/build.gradle index cb45209a09..d816908fbc 100644 --- a/actor-sdk/sdk-core-android/android-google-push/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-push/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:2.2.2' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" classpath 'me.tatarka:gradle-retrolambda:3.2.5' diff --git a/actor-sdk/sdk-core-android/android-sdk/build.gradle b/actor-sdk/sdk-core-android/android-sdk/build.gradle index a3cf447fa3..d31784d911 100644 --- a/actor-sdk/sdk-core-android/android-sdk/build.gradle +++ b/actor-sdk/sdk-core-android/android-sdk/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:2.2.2' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" classpath 'me.tatarka:gradle-retrolambda:3.2.5' diff --git a/actor-sdk/sdk-core/core/core-android/build.gradle b/actor-sdk/sdk-core/core/core-android/build.gradle index a3ea540536..55bd15783c 100644 --- a/actor-sdk/sdk-core/core/core-android/build.gradle +++ b/actor-sdk/sdk-core/core/core-android/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:2.2.2' classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } diff --git a/actor-sdk/sdk-core/runtime/runtime-android/build.gradle b/actor-sdk/sdk-core/runtime/runtime-android/build.gradle index dc30bcee10..4784fed81a 100644 --- a/actor-sdk/sdk-core/runtime/runtime-android/build.gradle +++ b/actor-sdk/sdk-core/runtime/runtime-android/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:2.2.2' classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } From f77668d4813291dadeedd81ffa6f5509ddd0524e Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Fri, 21 Oct 2016 16:37:35 -0200 Subject: [PATCH 132/253] alteracoes --- .../src/main/java/im/actor/Application.java | 3 +- .../controllers/auth/BaseAuthFragment.java | 68 ++++++------ .../sdk/controllers/auth/SignInFragment.java | 35 +----- .../controllers/auth/SignPhoneFragment.java | 6 +- .../sdk/controllers/auth/SignUpFragment.java | 8 +- .../src/main/java/im/actor/sdk/util/Mask.java | 104 ++++++++++++++++++ .../src/main/res/layout/fragment_sign_in.xml | 10 +- .../main/res/layout/fragment_sign_phone.xml | 4 +- .../android-sdk/src/main/res/menu/sign_up.xml | 8 +- 9 files changed, 167 insertions(+), 79 deletions(-) create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Mask.java diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index d39abf3ab0..9fe1b9051b 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -29,6 +29,7 @@ import im.actor.sdk.ActorSDKApplication; import im.actor.sdk.ActorStyle; import im.actor.sdk.BaseActorSDKDelegate; +import im.actor.sdk.controllers.auth.AuthActivity; import im.actor.sdk.controllers.conversation.attach.AbsAttachFragment; import im.actor.sdk.controllers.conversation.messages.BubbleLayouter; import im.actor.sdk.controllers.conversation.messages.DefaultLayouter; @@ -86,7 +87,7 @@ public void onConfigureActorSDK() { // ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://64.137.236.110:9070"}); - + ActorSDK.sharedActor().setAuthType(AuthActivity.AUTH_TYPE_PHONE); // ActorSDK.sharedActor().setTwitter(""); // ActorSDK.sharedActor().setHomePage("http://www.foo.com"); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/BaseAuthFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/BaseAuthFragment.java index def1393158..9a862c9e45 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/BaseAuthFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/BaseAuthFragment.java @@ -249,40 +249,40 @@ public boolean onOptionsItemSelected(MenuItem item) { } else if (i == R.id.sign_up) { startSignUp(); return true; - } else if (i == R.id.change_endpoint) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setTitle(R.string.auth_change_endpoint); - - final EditText input = new EditText(getActivity()); - input.setText("tcp://"); - input.setSelection(input.getText().length()); - - int padding = Screen.dp(25); - FrameLayout inputContainer = new FrameLayout(getActivity()); - FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - params.setMargins(padding, padding, padding, 0); - inputContainer.addView(input, params); - builder.setView(inputContainer); - - builder.setPositiveButton(R.string.dialog_ok, (dialog, which) -> { - try { - messenger().changeEndpoint(input.getText().toString()); - } catch (ConnectionEndpointArray.UnknownSchemeException e) { - Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_LONG).show(); - } - }); - builder.setNegativeButton(R.string.auth_reset_default_endpoint, (dialog, which) -> { - try { - messenger().changeEndpoint(null); - } catch (ConnectionEndpointArray.UnknownSchemeException e) { - e.printStackTrace(); - } - }); - - builder.show(); - input.requestFocus(); - - return true; +// } else if (i == R.id.change_endpoint) { +// AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); +// builder.setTitle(R.string.auth_change_endpoint); +// +// final EditText input = new EditText(getActivity()); +// input.setText("tcp://"); +// input.setSelection(input.getText().length()); +// +// int padding = Screen.dp(25); +// FrameLayout inputContainer = new FrameLayout(getActivity()); +// FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); +// params.setMargins(padding, padding, padding, 0); +// inputContainer.addView(input, params); +// builder.setView(inputContainer); +// +// builder.setPositiveButton(R.string.dialog_ok, (dialog, which) -> { +// try { +// messenger().changeEndpoint(input.getText().toString()); +// } catch (ConnectionEndpointArray.UnknownSchemeException e) { +// Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_LONG).show(); +// } +// }); +// builder.setNegativeButton(R.string.auth_reset_default_endpoint, (dialog, which) -> { +// try { +// messenger().changeEndpoint(null); +// } catch (ConnectionEndpointArray.UnknownSchemeException e) { +// e.printStackTrace(); +// } +// }); +// +// builder.show(); +// input.requestFocus(); +// +// return true; } else { return super.onOptionsItemSelected(item); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java index cb316ff905..761aeb2a5b 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java @@ -3,6 +3,8 @@ import android.app.AlertDialog; import android.graphics.drawable.StateListDrawable; import android.os.Bundle; +import android.telephony.PhoneNumberFormattingTextWatcher; +import android.text.TextWatcher; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; @@ -20,6 +22,7 @@ import im.actor.sdk.R; import im.actor.sdk.util.Fonts; import im.actor.sdk.util.KeyboardHelper; +import im.actor.sdk.util.Mask; import im.actor.sdk.view.SelectorFactory; import static im.actor.sdk.util.ActorSDKMessenger.messenger; @@ -45,33 +48,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa initView(v); -// Get domain logo - -// logoActor = ActorSystem.system().actorOf(Props.create(LogoActor.class, new ActorCreator() { -// @Override -// public LogoActor create() { -// return new LogoActor(); -// } -// }), "actor/logo_actor"); -// -// logoActor.send(new LogoActor.AddCallback(new LogoActor.LogoCallBack() { -// @Override -// public void onDownloaded(final Drawable logoDrawable) { -// getActivity().runOnUiThread(new Runnable() { -// @Override -// public void run() { -// if (logoDrawable != null) { -// logo.setImageDrawable(logoDrawable); -// logo.measure(0, 0); -// expand(logo, logo.getMeasuredHeight()); -// } else { -// expand(logo, 0); -// } -// } -// }); -// } -// })); - return v; } @@ -122,6 +98,7 @@ public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { hint.setText(getString(R.string.sign_in_hint_phone_only)); signIdEditText.setHint(getString(R.string.sign_in_edit_text_hint_phone_only)); signIdEditText.setInputType(EditorInfo.TYPE_CLASS_PHONE); + signIdEditText.addTextChangedListener(Mask.telephoneMask(signIdEditText)); } else if ((availableAuthType & AuthActivity.AUTH_TYPE_EMAIL) == AuthActivity.AUTH_TYPE_EMAIL) { hint.setText(getString(R.string.sign_in_hint_email_only)); signIdEditText.setHint(getString(R.string.sign_in_edit_text_hint_email_only)); @@ -130,7 +107,6 @@ public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { } } - Button singUp = (Button) v.findViewById(R.id.button_sign_up); singUp.setTextColor(style.getTextSecondaryColor()); onClick(singUp, new View.OnClickListener() { @@ -165,7 +141,8 @@ private void requestCode() { startEmailAuth(rawId); } else { try { - startPhoneAuth(Long.parseLong(rawId.replace("+", ""))); + // startPhoneAuth(Long.parseLong("55"+rawId.replace("+", ""))); + startPhoneAuth(Long.parseLong("55"+rawId.replaceAll("[^0-9]*", ""))); } catch (Exception e) { new AlertDialog.Builder(getActivity()) .setMessage(message) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignPhoneFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignPhoneFragment.java index 47eebfbe08..08093d78ab 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignPhoneFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignPhoneFragment.java @@ -23,6 +23,7 @@ import im.actor.sdk.ActorSDK; import im.actor.sdk.R; import im.actor.sdk.util.Devices; +import im.actor.sdk.util.Mask; import im.actor.sdk.util.country.Country; import im.actor.sdk.util.country.Countries; import im.actor.sdk.util.Fonts; @@ -177,7 +178,10 @@ public void afterTextChanged(Editable s) { phoneNumberEditText = (BackspaceKeyEditText) v.findViewById(R.id.tv_phone_number); phoneNumberEditText.setTextColor(ActorSDK.sharedActor().style.getTextPrimaryColor()); - phoneNumberEditText.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); + //phoneNumberEditText.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); + + phoneNumberEditText.addTextChangedListener(Mask.telephoneMask(phoneNumberEditText)); + phoneNumberEditText.setBackspaceListener(new BackspaceKeyEditText.BackspacePressListener() { @Override public boolean onBackspacePressed() { diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignUpFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignUpFragment.java index 58342c54e4..091476f205 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignUpFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignUpFragment.java @@ -99,9 +99,9 @@ public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); menu.clear(); getActivity().getMenuInflater().inflate(R.menu.sign_up, menu); - MenuItem item = menu.findItem(R.id.change_endpoint); - if (item != null) { - item.setVisible(ActorSDK.sharedActor().isUseAlternateEndpointsEnabled()); - } +// MenuItem item = menu.findItem(R.id.change_endpoint); +// if (item != null) { +// item.setVisible(ActorSDK.sharedActor().isUseAlternateEndpointsEnabled()); +// } } } \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Mask.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Mask.java new file mode 100644 index 0000000000..aa416293df --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Mask.java @@ -0,0 +1,104 @@ +package im.actor.sdk.util; + +import android.text.Editable; +import android.text.InputType; +import android.text.TextWatcher; +import android.text.method.NumberKeyListener; +import android.widget.EditText; + +/** + * Created by 98379720172 on 18/08/2016. + */ +public abstract class Mask { + + private static int positioning[] = { 1, 2, 3, 6, 7, 8, 9, 11, 12, 13, 14, 15 }; + + private final static KeylistenerNumber keylistenerNumber = new KeylistenerNumber(); + + private static class KeylistenerNumber extends NumberKeyListener { + public int getInputType() { + return InputType.TYPE_CLASS_NUMBER + | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; + + } + @Override + protected char[] getAcceptedChars() { + return new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; + } + } + + public static TextWatcher telephoneMask(final EditText ediTxt) { + + final int maxNumberLength = 11; + + ediTxt.setKeyListener(keylistenerNumber); + ediTxt.setText("( ) - "); + + ediTxt.postDelayed(()->{ + ediTxt.setSelection(1); + },50); + + return new TextWatcher() { + boolean isUpdating; + String old = ""; + + public void onTextChanged(CharSequence s, int start, int before, + int count) { + } + + public void beforeTextChanged(CharSequence s, int start, int count, + int after) { + } + + public void afterTextChanged(Editable s) { + String current = s.toString(); + + if (isUpdating) { + isUpdating = false; + return; + + } + + String number = current.replaceAll("[^0-9]*", ""); + if (number.length() > 11) + number = number.substring(0, 11); + + int length = number.length(); + + String paddedNumber = padNumber(number, maxNumberLength); + + + String ddd = ""; + String part1 = ""; + String part2 = ""; + + if(length < 11){ + ddd = paddedNumber.substring(0, 2); + part1 = paddedNumber.substring(2, 6); + part2 = paddedNumber.substring(6, 11).trim(); + }else{ + ddd = paddedNumber.substring(0, 2); + part1 = paddedNumber.substring(2, 7); + part2 = paddedNumber.substring(7, 11).trim(); + } + + + String phone = "(" + ddd + ") " + part1 + "-" + part2; + + isUpdating = true; + + ediTxt.setText(phone); + ediTxt.setSelection(positioning[length]); + } + }; + } + + private static String padNumber(String number, int maxLength) { + String padded = new String(number); + for (int i = 0; i < maxLength - number.length(); i++) + padded += " "; + return padded; + + } + +} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml index 508f4f513e..b99a146836 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml @@ -41,7 +41,6 @@ android:paddingLeft="4dp" android:paddingRight="4dp"> - + android:textColorHint="#a6a6a6" + android:inputType="number|phone" + android:digits="0123456789" + android:textAlignment="center" + android:gravity="center_horizontal" + android:textSize="20sp" + android:background="@android:color/transparent"/> diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_phone.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_phone.xml index 230010b354..3768baa09f 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_phone.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_phone.xml @@ -72,8 +72,7 @@ android:imeOptions="actionGo" android:inputType="phone" android:maxLength="4" - android:maxLines="1" - android:singleLine="true" /> + android:maxLines="1"/> diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/menu/sign_up.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/menu/sign_up.xml index 154df3d205..eb34be12d6 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/menu/sign_up.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/menu/sign_up.xml @@ -12,9 +12,9 @@ android:title="@string/tour_sign_in" app:showAsAction="always" /> - + + + + \ No newline at end of file From d7ff3996afc1f251685b30edd06f6c3750ea0aef Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Fri, 21 Oct 2016 16:47:34 -0200 Subject: [PATCH 133/253] alteracoes --- .../android-sdk/src/main/res/layout/fragment_sign_in.xml | 3 +-- .../src/main/res/layout/fragment_sign_phone.xml | 8 +++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml index b99a146836..b22db6bd1d 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml @@ -46,7 +46,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginRight="12dp" - android:hint="@string/sign_in_edit_text_hint" android:imeOptions="actionGo" android:maxLines="1" android:textColorHint="#a6a6a6" @@ -54,7 +53,7 @@ android:digits="0123456789" android:textAlignment="center" android:gravity="center_horizontal" - android:textSize="20sp" + android:textSize="30sp" android:background="@android:color/transparent"/> diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_phone.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_phone.xml index 3768baa09f..a91ae1c792 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_phone.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_phone.xml @@ -68,7 +68,7 @@ android:id="@+id/tv_country_code" android:layout_width="70dp" android:layout_height="wrap_content" - android:gravity="center" + android:gravity="center_horizontal" android:imeOptions="actionGo" android:inputType="phone" android:maxLength="4" @@ -78,12 +78,10 @@ android:id="@+id/tv_phone_number" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginRight="12dp" - android:hint="@string/auth_phone_number_hint" + android:layout_marginRight="15dp" android:imeOptions="actionGo" android:inputType="phone" - android:maxLines="1" - android:textColorHint="#a6a6a6" /> + android:maxLines="1"/> From b8ca23156d7bfac054e91565e27f1e9493011976 Mon Sep 17 00:00:00 2001 From: diego Date: Fri, 21 Oct 2016 22:11:56 -0200 Subject: [PATCH 134/253] ajustes no numero do telefone na tela de login --- .../android-app/src/main/java/im/actor/Application.java | 2 +- .../main/java/im/actor/sdk/controllers/auth/SignInFragment.java | 2 +- .../android-sdk/src/main/res/layout/fragment_sign_in.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index 9fe1b9051b..9c3d7b46e1 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -86,7 +86,7 @@ public void onConfigureActorSDK() { }); // ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); - ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://64.137.236.110:9070"}); + ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://64.137.170.2:9070"}); ActorSDK.sharedActor().setAuthType(AuthActivity.AUTH_TYPE_PHONE); // ActorSDK.sharedActor().setTwitter(""); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java index 761aeb2a5b..39a4627f20 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java @@ -157,7 +157,7 @@ private void requestCode() { public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); menu.clear(); - getActivity().getMenuInflater().inflate(R.menu.sign_in, menu); + // getActivity().getMenuInflater().inflate(R.menu.sign_in, menu); // MenuItem item = menu.findItem(R.id.change_endpoint); // if (item != null) { // item.setVisible(ActorSDK.sharedActor().isUseAlternateEndpointsEnabled()); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml index b22db6bd1d..92cbe3dfae 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml @@ -52,7 +52,7 @@ android:inputType="number|phone" android:digits="0123456789" android:textAlignment="center" - android:gravity="center_horizontal" + android:gravity="center" android:textSize="30sp" android:background="@android:color/transparent"/> From 1775aac17998d3538b3609a1035545413192c5f2 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sat, 22 Oct 2016 22:17:20 -0200 Subject: [PATCH 135/253] alteracoes --- actor-server/version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 8a99e1b41c..e11861a4ef 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.6-SNAPSHOT" +version in ThisBuild := "3.0.7-SNAPSHOT" From 36239ba4771bc17a875b6829bac532a1107a826b Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 23 Oct 2016 11:36:21 -0200 Subject: [PATCH 136/253] alteracoes --- .../src/main/java/im/actor/sdk/util/Mask.java | 14 +++++++------- .../src/main/res/layout/fragment_sign_in.xml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Mask.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Mask.java index aa416293df..e9a545a31f 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Mask.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Mask.java @@ -32,7 +32,7 @@ public static TextWatcher telephoneMask(final EditText ediTxt) { final int maxNumberLength = 11; ediTxt.setKeyListener(keylistenerNumber); - ediTxt.setText("( ) - "); + ediTxt.setText("(--) ----- ----"); ediTxt.postDelayed(()->{ ediTxt.setSelection(1); @@ -67,23 +67,22 @@ public void afterTextChanged(Editable s) { String paddedNumber = padNumber(number, maxNumberLength); - String ddd = ""; String part1 = ""; String part2 = ""; + String phone = ""; if(length < 11){ ddd = paddedNumber.substring(0, 2); part1 = paddedNumber.substring(2, 6); - part2 = paddedNumber.substring(6, 11).trim(); + part2 = paddedNumber.substring(6, paddedNumber.length()).trim(); }else{ ddd = paddedNumber.substring(0, 2); part1 = paddedNumber.substring(2, 7); - part2 = paddedNumber.substring(7, 11).trim(); + part2 = paddedNumber.substring(7, paddedNumber.length()).trim(); } - - String phone = "(" + ddd + ") " + part1 + "-" + part2; + phone = "(" + ddd + ") " + part1 + " " + part2; isUpdating = true; @@ -96,7 +95,8 @@ public void afterTextChanged(Editable s) { private static String padNumber(String number, int maxLength) { String padded = new String(number); for (int i = 0; i < maxLength - number.length(); i++) - padded += " "; + padded += "-"; + return padded; } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml index 92cbe3dfae..c4bcfb0193 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/fragment_sign_in.xml @@ -52,7 +52,7 @@ android:inputType="number|phone" android:digits="0123456789" android:textAlignment="center" - android:gravity="center" + android:gravity="center_vertical|center_horizontal" android:textSize="30sp" android:background="@android:color/transparent"/> From 2ee784ed15e642981f145016da6301c83482f03f Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 25 Oct 2016 16:24:34 -0200 Subject: [PATCH 137/253] alteracoes --- .../sdk/controllers/auth/AuthActivity.java | 17 +++++++++++++- .../auth/SMSActivationObservable.java | 23 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SMSActivationObservable.java diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java index 6058d95483..f72b2d1183 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java @@ -8,6 +8,9 @@ import android.support.v4.app.Fragment; import android.view.MenuItem; +import java.util.Observable; +import java.util.Observer; + import im.actor.core.AuthState; import im.actor.core.entity.AuthCodeRes; import im.actor.core.entity.AuthRes; @@ -31,7 +34,7 @@ import static im.actor.sdk.util.ActorSDKMessenger.messenger; -public class AuthActivity extends BaseFragmentActivity { +public class AuthActivity extends BaseFragmentActivity implements Observer{ public static final String AUTH_TYPE_KEY = "auth_type"; public static final String SIGN_TYPE_KEY = "sign_type"; @@ -80,6 +83,8 @@ public Actor create() { String savedState = preferences.getString("auth_state"); state = Enum.valueOf(AuthState.class, savedState != null ? savedState : "AUTH_START"); updateState(state, true); + + SMSActivationObservable.getInstance().addObserver(this); } @@ -477,6 +482,16 @@ public String getCurrentCode() { public String getTransactionHash() { return transactionHash; } + + @Override + public void update(Observable o, Object data) { + if(data instanceof String){ + currentCode = data.toString(); + } + if(data instanceof Promise){ + validateCode((Promise) data , currentCode); + } + } } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SMSActivationObservable.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SMSActivationObservable.java new file mode 100644 index 0000000000..e853067e39 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SMSActivationObservable.java @@ -0,0 +1,23 @@ +package im.actor.sdk.controllers.auth; + +import java.util.Observable; + +/** + * Created by 98379720172 on 25/10/16. + */ + +public class SMSActivationObservable extends Observable { + + private static SMSActivationObservable instance = new SMSActivationObservable(); + + public static SMSActivationObservable getInstance(){ + return instance; + } + + public void updateValue(Object data){ + synchronized (this){ + setChanged(); + notifyObservers(data); + } + } +} From 746a0b2f85a406659d3a5793ed094e4473eed035 Mon Sep 17 00:00:00 2001 From: diego Date: Tue, 25 Oct 2016 23:00:35 -0200 Subject: [PATCH 138/253] alteracoes --- .../java/im/actor/sdk/controllers/auth/AuthActivity.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java index f72b2d1183..1af9db63d1 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java @@ -486,10 +486,7 @@ public String getTransactionHash() { @Override public void update(Observable o, Object data) { if(data instanceof String){ - currentCode = data.toString(); - } - if(data instanceof Promise){ - validateCode((Promise) data , currentCode); + validateCode(messenger().doValidateCode(data.toString(), getTransactionHash()), data.toString()); } } } From 0c8682fd9ee60a8cbf77d5321bc14b37ab18f7a5 Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Fri, 28 Oct 2016 16:10:28 +0300 Subject: [PATCH 139/253] chore(iOS): change stickerView fields/methods access modificators to open --- .../Conversation/ConversationViewController.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift index 7a705e84d0..cc9e6c66d8 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift @@ -50,7 +50,7 @@ open class ConversationViewController: // fileprivate var stickersView: AAStickersKeyboard! - fileprivate var stickersButton : UIButton! + open var stickersButton : UIButton! fileprivate var stickersOpen = false @@ -1054,13 +1054,13 @@ open class ConversationViewController: // MARK: - Stickers actions //////////////////////////////////////////////////////////// - func updateStickersStateOnCloseKeyboard() { + open func updateStickersStateOnCloseKeyboard() { self.stickersOpen = false self.stickersButton.setImage(UIImage.bundled("sticker_button"), for: UIControlState()) self.textInputbar.textView.inputView = nil } - func changeKeyboard() { + open func changeKeyboard() { if self.stickersOpen == false { // self.stickersView.loadStickers() From 981d855e947e0d57f90a7f4d4138f7b9963cc410 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sun, 30 Oct 2016 09:48:04 -0200 Subject: [PATCH 140/253] alteracoes --- actor-server/version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/version.sbt b/actor-server/version.sbt index e11861a4ef..f124c4c934 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.7-SNAPSHOT" +version in ThisBuild := "3.0.8-SNAPSHOT" From e562f53816a437ee79b571e7afe1992adce66731 Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 30 Oct 2016 11:14:29 -0200 Subject: [PATCH 141/253] alteracos --- .../sdk-core-android/android-sdk/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml index c9871d82c2..8bd73c7e08 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ android:pathPrefix="/join/" android:scheme="https" /> From 6852af6688dddd6ef30fefdf0172102177d5239e Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 1 Nov 2016 13:49:26 -0200 Subject: [PATCH 142/253] alteracoes --- .../im/actor/sdk/controllers/auth/SignInFragment.java | 8 ++++++-- .../android-sdk/src/main/res/values-pt-rBR/ui_text.xml | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java index 39a4627f20..6200e15296 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/SignInFragment.java @@ -141,8 +141,12 @@ private void requestCode() { startEmailAuth(rawId); } else { try { - // startPhoneAuth(Long.parseLong("55"+rawId.replace("+", ""))); - startPhoneAuth(Long.parseLong("55"+rawId.replaceAll("[^0-9]*", ""))); + String numero = "55"+rawId.replaceAll("[^0-9]*", ""); + if(numero.length() < 12){ + throw new Exception("Numero invalido"); + }else{ + startPhoneAuth(Long.parseLong(numero)); + } } catch (Exception e) { new AlertDialog.Builder(getActivity()) .setMessage(message) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml index bf93764a70..df21f7db20 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml @@ -137,7 +137,7 @@ COMEÇAR A CONVERSAR - Por favor, informe um telefone ou email válido + Por favor, informe um telefone válido Por favor, insira seu número de telefone por favor, insira seu e-mail O código expirou. Por favor reinicie o processo de validação. From 0ebca59c622984f4a2deea45b89b7c117cb8f44a Mon Sep 17 00:00:00 2001 From: diego Date: Tue, 1 Nov 2016 19:39:58 -0200 Subject: [PATCH 143/253] alteracoes --- .../src/main/java/im/actor/sdk/ActorSDKDelegate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKDelegate.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKDelegate.java index 5ad45ecbc1..e69a05707f 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKDelegate.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKDelegate.java @@ -222,6 +222,6 @@ public interface ActorSDKDelegate { * @param layouters default layouters */ void configureChatViewHolders(ArrayList layouters); - + DialogsDefaultFragment fragmentForDialogs(); } From 0f762f5dc5d1e7becd639fb130f2cbdfddffca48 Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 6 Nov 2016 19:34:51 -0200 Subject: [PATCH 144/253] alteracoes --- .../android-google-maps/build.gradle | 4 ++-- .../android-google-push/build.gradle | 4 ++-- .../sdk-core-android/android-sdk/build.gradle | 16 ++++++++-------- .../sdk-core/core/core-android/build.gradle | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-google-maps/build.gradle b/actor-sdk/sdk-core-android/android-google-maps/build.gradle index d4f955c0fa..ed6fb880ee 100644 --- a/actor-sdk/sdk-core-android/android-google-maps/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-maps/build.gradle @@ -23,7 +23,7 @@ def baseVersion = "3.0" android { compileSdkVersion 24 - buildToolsVersion "24.0.0" + buildToolsVersion "24.0.2" defaultConfig { minSdkVersion 15 @@ -48,7 +48,7 @@ android { } dependencies { - compile 'com.android.support:appcompat-v7:24.0.0' + compile 'com.android.support:appcompat-v7:24.2.1' //compile 'im.actor:android-sdk:0.1.30' compile project(':actor-sdk:sdk-core-android:android-sdk') diff --git a/actor-sdk/sdk-core-android/android-google-push/build.gradle b/actor-sdk/sdk-core-android/android-google-push/build.gradle index d816908fbc..1888b164aa 100644 --- a/actor-sdk/sdk-core-android/android-google-push/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-push/build.gradle @@ -21,7 +21,7 @@ def baseVersion = "3.0" android { compileSdkVersion 24 - buildToolsVersion "24.0.0" + buildToolsVersion "24.0.2" defaultConfig { minSdkVersion 15 @@ -46,7 +46,7 @@ android { } dependencies { - compile 'com.android.support:appcompat-v7:24.0.0' + compile 'com.android.support:appcompat-v7:24.2.1' //compile 'im.actor:android-sdk:0.1.30' compile project(':actor-sdk:sdk-core-android:android-sdk') diff --git a/actor-sdk/sdk-core-android/android-sdk/build.gradle b/actor-sdk/sdk-core-android/android-sdk/build.gradle index d31784d911..9c153fc46a 100644 --- a/actor-sdk/sdk-core-android/android-sdk/build.gradle +++ b/actor-sdk/sdk-core-android/android-sdk/build.gradle @@ -21,7 +21,7 @@ def baseVersion = "3.0" android { compileSdkVersion 24 - buildToolsVersion '24.0.0' + buildToolsVersion '24.0.2' defaultConfig { minSdkVersion 15 @@ -95,13 +95,13 @@ dependencies { compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.2' // Android Support - compile 'com.android.support:support-v4:24.0.0' - compile 'com.android.support:support-v13:24.0.0' - compile 'com.android.support:appcompat-v7:24.0.0' - compile 'com.android.support:palette-v7:24.0.0' - compile 'com.android.support:recyclerview-v7:24.0.0' - compile 'com.android.support:design:24.0.0' - compile 'com.android.support:customtabs:24.0.0' + compile 'com.android.support:support-v4:24.2.1' + compile 'com.android.support:support-v13:24.2.1' + compile 'com.android.support:appcompat-v7:24.2.1' + compile 'com.android.support:palette-v7:24.2.1' + compile 'com.android.support:recyclerview-v7:24.2.1' + compile 'com.android.support:design:24.2.1' + compile 'com.android.support:customtabs:24.2.1' } // diff --git a/actor-sdk/sdk-core/core/core-android/build.gradle b/actor-sdk/sdk-core/core/core-android/build.gradle index 55bd15783c..6fb950eb39 100644 --- a/actor-sdk/sdk-core/core/core-android/build.gradle +++ b/actor-sdk/sdk-core/core/core-android/build.gradle @@ -14,7 +14,7 @@ apply plugin: 'me.tatarka.retrolambda' android { compileSdkVersion 24 - buildToolsVersion '24.0.0' + buildToolsVersion '24.0.2' defaultConfig { minSdkVersion 15 @@ -50,7 +50,7 @@ android { dependencies { compile project(':actor-sdk:sdk-core:runtime:runtime-android') - compile 'com.android.support:recyclerview-v7:24.0.0' + compile 'com.android.support:recyclerview-v7:24.2.1' compile 'com.squareup.okhttp:okhttp:2+' compile 'io.pristine:libjingle:11139@aar' } \ No newline at end of file From 747725cced3905f7e919bee83906716c2dc278eb Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 8 Nov 2016 20:28:39 -0200 Subject: [PATCH 145/253] alteracoes --- .DS_Store | Bin 10244 -> 10244 bytes actor-sdk/.DS_Store | Bin 10244 -> 10244 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 6148 -> 10244 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++++++++++ .../xcschemes/xcschememanagement.plist | 14 ++++++++++++++ .../Resources/pt.lproj/Localizable.strings | 8 ++++---- .../ActorSDK/Sources/ActorSDK.swift | 2 +- actor-server/sbt-launch.jar | Bin 1208385 -> 1210231 bytes 8 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 actor-sdk/sdk-core-ios/ActorApp.xcodeproj/xcuserdata/diego.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/xcuserdata/diego.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/.DS_Store b/.DS_Store index de58dcb6643ff0c995ccdb35e5dd24c630696b82..47f944fc84647ba07ce890ee2f689b196d203448 100644 GIT binary patch literal 10244 zcmeHMeQX@X6@TyIBs;7fuR{{s9Lt^KI7yvL{ectXB)I2~gg8!!iyiEQ5NGdpNmi_H zo!h%J!5ECxD&@0PKllhOAId+prL>irmXEelX`2?RmI}F)KoM&HK%&qhTD3)0L47l` zXPomL3Tj1=*pYVL&U^EAcHaKp{buF>0K2nh3qTYA6uP+7%Bd<+xSe0~O32r!B$509 z(y$&pFyY$7#Jt{tB8Wf`fgl1w1cC?z5%?%XfH<2Mh4Xh%f(Qf=2qG{y0{r(ON*9-L zUrtLYembZUTL6+}q!xwlX&)ebqP~p#a#~8^O3#$L2lQRh-(sM2Cwr84CmHwUw3N~v zP`U&9Bcs1VK`}b{MMZbOxRgO1L?DR3{0MOFXJ9}QGT_eLzkA~e$4!v+>BP8Wdzt3u z-(zS&*}_GO6-7~%3gzm-!|udj#>iy7ZXP-ZfI|x znqo?IL(8Ro2giJvfQmmBpff-BO?*IJ0FP` z@{wRn4fpNn-#MyjS81wKR*t4WoOGS+Sc)uFNyABI zsk7DPID_`}mN$~IuFLSdeV&`n^oWilHu-YhsJ4{*?;g+CZpypTN_!+3`)2uaedX$P z%^Nm-s&}ShNu^e`l(BvE2~rvR8rw?mnXt{w;k|~Jv{I&>Iy9WKJv-r8Ln&j-s=||u z%~Y(YuBp8s94^&$B%830WbMpRtzJ=Pv?Y}lEE29`+DT=wD4`)l$vYh8vk?C_^62L_T6YYhs$mhOVXWE?rw$o1&R)k7Fb(N2=Ochobef;hdbV zRBmCNN)^V~NYWh}qj`E#-4*Upv|lO*_}DuQFSC2xO40Cqc3UIi@LsO(GEK`Q=+?*A zN?eFA)W@4;OXCDo3o+<~ZLp8hAq5j~JKO2k=q+0saJ^!k^;L@Ynbpz9io;l*jch+0NJaGTjviuAjo8 z1I2)=Z@X-J_c;OX>2itI^Or5ZsDADG*7hx3vmdnJ8_tE3K#+upfKDD7;zOQ^M+s}D z?;(U)*OfxIwwPl{nc=-7QC-(Kh-7nB12sd0bJ_evqt3JigkmN-f3k_`+Cl=Xv|ilC zm{vxJmexx;$hwHItIX6^*Q{WjEY5hkX&{`t8|Yc6uu@1YiNlBB8}K;%9G)Tk{SID+ zKf#;uHes&}m*5IQUKlS#9arO8Y{YdK!wuL@7~DiC?8R-k9s3B0gSZEWaRm2b0!_l< zAv}yn2!~nB;RH_O%>s|d@C$^;FX5N*D}=}s1^DaBBTq_vq&WU^gXxsxrVf#nBe%SO zWGo_^98jH@n5CL$@;E(LR8u=S+1l267F@%*gi1-SxsQw`XFP{ePUmO*;w+_{r>Yft z|IS^P?;iM{vy+ohGVMCffa}?uJ@(EL%{0sfSziI(@KU*^#bb2$=%5;2h|G{QB{PDbZCZd*Z~J%9FD?ma2Gs4 zBy*KtBRa*o>`sF~&vO_fygzL<5tQ z^tK=#p74@h-~M}s@{)m0-P4hEh4ZL)zOB=rnZjGp8qq2 z$@EYoXGdYYciqZJ#HTRcT)l>xlEQd%T`Z#d6vms)Eo#K4Fy7p-QB{2kUc`IEEXslMviP z1h$nHPy=`c5!jGeL>WY2Npvtp3#lW7=t-Qyn*@Q~inkMRuv-pBoJP}l9aa_2#diDKqTtIOPApu#i!2vVBso>eL2o4d~8T7ZP z1J+yvHwGn$z`2UR0y%J$p8;$w{r~^Ddc9!WAOb-IK7&9z=5h literal 10244 zcmeI1Yit}>701utv6Gq2BpEvouQ%RiX>6rV9mh#r+i6~F$Id&7RXeerhB~`DLo#%{ zV|LbdN-!9ZT4+lvpgdFrf`qov(yAZQ=ZC7TsuWQPT51qMs2`|6z=sx5Ar(FV=iWQJ z-AqhHr6O81Bh5W?A7}Q?ncw}-y?2QSy_41^q7)Hnd1Yldu#q!{5UI$2@RAAGAomE!4@;%k+0f8%mB?go`*QZ2tw&}pmDy!TH z%AFAWGJ+Kfy)7!70Ihyzxxwe*UNJ4-?J00;}_f8 zFQIBdbnjYh0Y0Ru$`q9DD-t=HGQ=IgBGld&v&av!la6OPIo-SPvd7fLo&SZ}{ z_Vk#!Vz-wsW}LiTsBk?o?Bp$Py4Rb`TmFebb-!W9DxMxQR}K{HDRv#mspXT2p5?wRdr*v%PC(#{8?Mt!}xl=kVyn%rV}+&{cV*(EaM2&@GPl)%M56%sTNH zM<$Anm-mm^1)uGhxy+CvAVEXrC#H ztK+^`DDIXGM;!JQWn-o}>DxEh?BGnu8bCazk0&4$fg+vk=nU1rwS#bU=f zzWJi_F~=?(ofbhJ&G!&4%{u052`jN7$%OxLB?s`_~BgvGZ!>{-IkG9S}a z&FcDi{6WAUSICTqKU5E_9;@`*9G5 za2UrhhAeWhFpf{*)A$T#@kM+Y-@x~94(IVO9>EiMR&}bX#Oq#_FQs^nujU6b7|T_| z^8uOcU%uym1mq<{VYqz7%7DwB^2-gq&PuK%Oo|psQHc@>>SbuoF{}-V)v@GJhRr?` ze*GmZ%tZ<%(RxiPnKU&?kH|JPbGC{R*W|rg)+b};0tvFHWk!=`jYL*tna-G5Euj|K z?yX$AP_iqsJ9cs{sevT&dUGF)`-1;(8^cz^pw**+F-zhq ztV0W~MJqNiXx+FT+prz|*vq&bVBm%rw-JouI0I+n6i&lI0Yyw<8fWlXd>*&rHhh8c z`wG5_d+=@C9|CV*2{~o)!2IA%4HojQmp{d|0$C&UnX&nEGsT0dP@$MVDgpZI3dJ;* zB>MO4U1jWlA5>FlY_8zB?ttezLVQQdI(kLbNQJV_BdBGu70SA_zA@Fjeq%@Xjya*L z#tLIq39c}76^g41>?F0yi&51XwaXC}_e(S+)@WMg7*GyZCz^DIQ4R=Ivd(DH89+HM zWJ#jcXw#TbHC|NFCS!}nSeC|(DqLZ7X?l71sj}-6+r>}_jm5dTox9RK4T(hf(Mpe8 zA*veledbXK$~*chvz+Kj)~ufK1usNDXhbi^pni^$KkTPPL}0W(ET-h9rv-g zUcfWBh?nsSevVi18~hG$;7!%bvfLgh^;%iH&Gy}xE{X0v^E2JJXYan1#(@tm)0gB7 zfu(s>y+nKK&fYQ|As{Njd=KI*q`5I^tSMm=#z~2`CI*SQXim1iy0J+BX=*CFuCYbq z0b^FltkK%oCWeE#K-EgjE#0h9wVg({7#e1^s@-Pn5QD&6sA`i&kFJ}fGV2-_>+c7- zKVfcv%hbNbD*X>E#A3vGBG7`3*os|9V>h$92S+e~8!(8YxQQnM8J-G=i9j9`_yl~O z5X{I4!RK%X?!;ZVo0a)qe2aDYJNPbshzIcyPY@pG3Br?j3eV#u%;6Uyb`OTweeK=Y z4e53bWoeQea>*)9eJ{UTl#3z|Mc~61fd#6|DY5_G|L_0*|L{Fn)Z-`uQ3U?u2%x%e zu&(#pg*r#Ua|wDl1($5luw7+>Ymr*p8RGDO?t8rpWqq&~8>)>CS%A fovqr<|F8cU5Z>X6*8kD^pZ82dTLb^s>;HcN?K$*u diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index dde706da0fb81dab8fc678c122c869789060f1bc..9bce08471e278344cfcf33a457d78180de6d7207 100644 GIT binary patch literal 10244 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 delta 212 zcmZn(XfcprU|?W$DortDU=RQ@Ie-{MGjUEV6q~50C<+o_1dA0hI5HFfp&moU#=_-{ zj2x2_1vDo63Gy;CR8|7n#;n{9p$rT_me%A0f*dTDkF|JAJ}+Rwbbw)UoFGIcv)2kB z+lUP$2UHp-h@|w4pg9wB!^T1zmc{HG9D>Y1i-ACZ8%Vf<9JI0UJM(0I6-SVZK~7=; Q(M%90gT*$-^UPre0An#LWdHyG diff --git a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/xcuserdata/diego.xcuserdatad/xcschemes/xcschememanagement.plist b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/xcuserdata/diego.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000000..fefed83334 --- /dev/null +++ b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/xcuserdata/diego.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SuppressBuildableAutocreation + + EA6B7348F8364542DDD264F741AAAA19 + + primary + + + + + diff --git a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/xcuserdata/diego.xcuserdatad/xcschemes/xcschememanagement.plist b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/xcuserdata/diego.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000000..d3a5cfd889 --- /dev/null +++ b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/xcuserdata/diego.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SuppressBuildableAutocreation + + 066A50D11BC4AE63000E606E + + primary + + + + + diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/pt.lproj/Localizable.strings b/actor-sdk/sdk-core-ios/ActorSDK/Resources/pt.lproj/Localizable.strings index e867ef01ff..ffac995e18 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Resources/pt.lproj/Localizable.strings +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/pt.lproj/Localizable.strings @@ -505,13 +505,13 @@ * Welcome */ -"WelcomeTitle" = "Welcome to {app_name}!"; +"WelcomeTitle" = "Bem vindo ao {app_name}!"; -"WelcomeTagline" = "Free, fast and secure messaging."; +"WelcomeTagline" = "Mensageiro rápido e gratuido"; -"WelcomeSignUp" = "Sign Up"; +"WelcomeSignUp" = "Entrar"; -"WelcomeLogIn" = "Log In"; +"WelcomeLogIn" = "Entrar"; /* diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift index 29f151c290..dc761a154d 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift @@ -233,7 +233,7 @@ import ReachabilitySwift // Api Connections let deviceKey = UUID().uuidString let deviceName = UIDevice.current.name - let appTitle = "Actor iOS" + let appTitle = "XlotoMensageiro" for url in endpoints { builder.addEndpoint(url) } diff --git a/actor-server/sbt-launch.jar b/actor-server/sbt-launch.jar index 0d9dd94c57e48c8b08c90e44ad9379fc0ebcde2c..34b74b7ef7cef9f2c43dc75bf941d1621d4989bb 100644 GIT binary patch delta 104709 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 Mu6ei9*n}$ZKQ)s4lmGw# delta 104884 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 XMd%okv0IO{{&!jVa*fYoVO8$`a!d`- From 9025720d744c82b4863fabea88d02ec5cd58f245 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 10 Nov 2016 15:40:47 -0200 Subject: [PATCH 146/253] alteracoes --- actor-sdk/.DS_Store | Bin 10244 -> 10244 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 10244 -> 10244 bytes .../ActorApp.xcodeproj/project.pbxproj | 10 +- .../ActorSDK.xcodeproj/project.pbxproj | 13025 +++------------- actor-sdk/sdk-core-ios/ActorSDK/.DS_Store | Bin 0 -> 6148 bytes .../Dialogs List/Cells/AADialogCell.swift | 2 +- .../ConversationViewController.swift | 2 +- .../ActorSDK/Sources/Utils/AATools.swift | 8 +- 8 files changed, 2553 insertions(+), 10494 deletions(-) create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/.DS_Store diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index 9bce08471e278344cfcf33a457d78180de6d7207..2e56c7f803c069787bf0c706117b7dcaf644010c 100644 GIT binary patch delta 621 zcmajdPe_wt9KiA4*Z%FTw|v~(n%iQMq*0-hrc5J~5L>KhrHGXv%UuhcD0J_u)4jAC6DuJ&tgF zXj^%0UA?v7xwuA;b(%fNzBco`Vf}PfTVuY6Ra4>)I5Va(aNtbZO!lQZjI$~Gu4oQP z;bi^ZS_UbpphNyA5uFWj_Dbs$ftRIUI#YO~`J`RN`+7*XcpELLJu@YeS>1tK}-CE&goUW!IG|W>swEQrCfn6r3j^8a3HB2>0b?Sw>beUnOi7KrZZmw8q*CMsvu0emmXRI-5br(5Z zi54nIiiBdb3&%fnGk@cKCZqDsru~6XWV4ppq|=$jJeIJE)znbSTAJ8M3!B+ugSOMb z4tD2JQ}l6wLmcJ^CppDw8@Ate9k5+5GRRe~ab0nPn~ad-J`Z@vqv1>CtyBK{<4kT% K>`WzF62Ab`IF-u) diff --git a/actor-sdk/sdk-core-ios/.DS_Store b/actor-sdk/sdk-core-ios/.DS_Store index 66a1309b31a2f9831eb19e6a24c6dac47e703dd6..3c90d8b9e609b602d1a76ae5540772a0ea2cc4af 100644 GIT binary patch delta 845 zcmds!Pe{{o6u{rdm2B*%e%+>Su9zhmMw(8^1S=)YQp4FQqQXDvh>^Obk!5K`g9sZ4 zzY5c!Lr9cKg4!PnI)oq*1!+WwI&`sH5J7*u^keJLCGgz4JRTq3$8drO7#(YG_6V5 zP6Puz_2J{eP-pkPKv%bs^+Lxf>;7PCsM8PS1P4Wnx#ul zOH_trOs3?4Je241Qr^i2S&%RCO}@(y`AGs+l1L^6CobHqAQvx16jRPlYN%ruyE(`q z8fl`94mt^Qj2_N$o(n{{%+=Lg<2u9K;vVDNXM$(U@`gF)dCNx@_^e+^Z*W)ds7}{v z{&|<@ue&VolT%cx&F)A`&&XPno98VltI%&|3?8uNcr-O_w#++SneKHt9*;^en`1@( z27{PX%O6%$ta;RO)nCl(3ZwDyd>S^)%pT4|@%F&9rcsqcMLWPSVR6`sn8(ml!Y{Mh%5S r3}-RI4Mw@m9quy56w^H7F;95P46k@SS>~Ft>gKesOWgE7_<8$pc?;BF delta 865 zcmd_o%S)7D6vy%N)v4yCx8`viN5`RNXh@}tc@4EPiBQ9$5k>4mWz#6r#gWFef)vRv zbOG_T2rMkhMJ-}zv{nj6wrEjAL1@vc7A>-!kU{k_Q_v#%2YNQ=IsAAYI3G^0ztHWT)LgQq^|P@jWjM(aHBQ-AtHUk%b%F4aHi@6R`9_yLH`ZqNVJ$8wTIJ1OTWAcX zUe+2zfpBYG=wz@z{lwC}%H9zQc5ZKL4~1JJ4Z))kv-&FX5`V-d90hbM#41Z9OG>0d z>ZMu2(j%8-NJeB##^ss3lK1jKW@J{r$#?mIpkc>B8csZTS%!~1N-1Lm zp8!FcIYc|h=;SzEoZ~zfxQM}ZZg7)ZxbG2TgoixhDKD5}nzy{;BQtz42As9F>Mhky zJ?qc03jRHoHnrHMQtYXYG-tYZ`HI}ak`0@TYw3O6S=k<4p+>FR>kL<>du6uAqmr!F zc(W$Y%#u~pudJw8_o#X5fR;#0%XD2?R76X>EZ=CR^Hq(Rx?PzW`ewaSOJP(~V)Z3x zMSK-GiL3UTxBIWYFJ)Rj$t+1MV3FyXX`1GcOA+N%QcVq8*+v76>|__aP0 /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run \'pod install\' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; 851EE1A34619AE6677649A27 /* Embed Pods Frameworks */ = { diff --git a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj index 0cf6732f3d..f4d5663f5c 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj @@ -1,10489 +1,2548 @@ - - - - - archiveVersion - 1 - classes - - objectVersion - 46 - objects - - 060134FD1C95ED4C00A18C4E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYAsyncLayer.h - sourceTree - <group> - - 060134FE1C95ED4C00A18C4E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYAsyncLayer.m - sourceTree - <group> - - 060134FF1C95ED4C00A18C4E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYSentinel.h - sourceTree - <group> - - 060135001C95ED4C00A18C4E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYSentinel.m - sourceTree - <group> - - 060135011C95ED4C00A18C4E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTransaction.h - sourceTree - <group> - - 060135021C95ED4C00A18C4E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTransaction.m - sourceTree - <group> - - 060135031C95ED4C00A18C4E - - fileRef - 060134FD1C95ED4C00A18C4E - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 060135041C95ED4C00A18C4E - - fileRef - 060134FE1C95ED4C00A18C4E - isa - PBXBuildFile - - 060135051C95ED4C00A18C4E - - fileRef - 060134FF1C95ED4C00A18C4E - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 060135061C95ED4C00A18C4E - - fileRef - 060135001C95ED4C00A18C4E - isa - PBXBuildFile - - 060135071C95ED4C00A18C4E - - fileRef - 060135011C95ED4C00A18C4E - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 060135081C95ED4C00A18C4E - - fileRef - 060135021C95ED4C00A18C4E - isa - PBXBuildFile - - 0601BBB11CA4C7DE00AEFA81 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ElegantPresentations.swift - sourceTree - <group> - - 0601BBB21CA4C7DE00AEFA81 - - fileRef - 0601BBB11CA4C7DE00AEFA81 - isa - PBXBuildFile - - 0601BBB31CA4C80D00AEFA81 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ElegantPresentationController.swift - sourceTree - <group> - - 0601BBB41CA4C80D00AEFA81 - - fileRef - 0601BBB31CA4C80D00AEFA81 - isa - PBXBuildFile - - 06129AA51C8359FB0099286B - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - CocoaLifecycleRuntime.swift - sourceTree - <group> - - 06129AA61C8359FB0099286B - - fileRef - 06129AA51C8359FB0099286B - isa - PBXBuildFile - - 06129AA81C8394700099286B - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAudioManager.swift - sourceTree - <group> - - 06129AA91C8394700099286B - - fileRef - 06129AA81C8394700099286B - isa - PBXBuildFile - - 06129AAA1C83B80A0099286B - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAudioRouter.swift - sourceTree - <group> - - 06129AAB1C83B80B0099286B - - fileRef - 06129AAA1C83B80A0099286B - isa - PBXBuildFile - - 0618509D1C9582DD00C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABackgroundCellRenderer.swift - sourceTree - <group> - - 0618509E1C9582DD00C522D5 - - fileRef - 0618509D1C9582DD00C522D5 - isa - PBXBuildFile - - 0618509F1C95CA2600C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - CocoaDispatcher.swift - sourceTree - <group> - - 061850A01C95CA2600C522D5 - - fileRef - 0618509F1C95CA2600C522D5 - isa - PBXBuildFile - - 061850A31C95CBF000C522D5 - - children - - 061850A41C95CBF000C522D5 - 061850B71C95CBF000C522D5 - 061850C21C95CBF000C522D5 - 061850D31C95CBF000C522D5 - 061850D41C95CBF000C522D5 - 061850D51C95CBF000C522D5 - 061850D61C95CBF000C522D5 - 061850D71C95CBF000C522D5 - 061850D81C95CBF000C522D5 - 061850D91C95CBF000C522D5 - 060134FD1C95ED4C00A18C4E - 060134FE1C95ED4C00A18C4E - 060134FF1C95ED4C00A18C4E - 060135001C95ED4C00A18C4E - 060135011C95ED4C00A18C4E - 060135021C95ED4C00A18C4E - - isa - PBXGroup - name - YYKit - path - Libs/YYKit - sourceTree - <group> - - 061850A41C95CBF000C522D5 - - children - - 061850A51C95CBF000C522D5 - 061850A61C95CBF000C522D5 - 061850A71C95CBF000C522D5 - 061850A81C95CBF000C522D5 - 061850A91C95CBF000C522D5 - 061850AA1C95CBF000C522D5 - 061850AB1C95CBF000C522D5 - 061850AC1C95CBF000C522D5 - 061850AD1C95CBF000C522D5 - 061850AE1C95CBF000C522D5 - 061850AF1C95CBF000C522D5 - 061850B01C95CBF000C522D5 - 061850B11C95CBF000C522D5 - 061850B21C95CBF000C522D5 - 061850B31C95CBF000C522D5 - 061850B41C95CBF000C522D5 - 061850B51C95CBF000C522D5 - 061850B61C95CBF000C522D5 - - isa - PBXGroup - path - Component - sourceTree - <group> - - 061850A51C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextContainerView.h - sourceTree - <group> - - 061850A61C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextContainerView.m - sourceTree - <group> - - 061850A71C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextDebugOption.h - sourceTree - <group> - - 061850A81C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextDebugOption.m - sourceTree - <group> - - 061850A91C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextEffectWindow.h - sourceTree - <group> - - 061850AA1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextEffectWindow.m - sourceTree - <group> - - 061850AB1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextInput.h - sourceTree - <group> - - 061850AC1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextInput.m - sourceTree - <group> - - 061850AD1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextKeyboardManager.h - sourceTree - <group> - - 061850AE1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextKeyboardManager.m - sourceTree - <group> - - 061850AF1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextLayout.h - sourceTree - <group> - - 061850B01C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextLayout.m - sourceTree - <group> - - 061850B11C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextLine.h - sourceTree - <group> - - 061850B21C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextLine.m - sourceTree - <group> - - 061850B31C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextMagnifier.h - sourceTree - <group> - - 061850B41C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextMagnifier.m - sourceTree - <group> - - 061850B51C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextSelectionView.h - sourceTree - <group> - - 061850B61C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextSelectionView.m - sourceTree - <group> - - 061850B71C95CBF000C522D5 - - children - - 061850B81C95CBF000C522D5 - 061850B91C95CBF000C522D5 - 061850BA1C95CBF000C522D5 - 061850BB1C95CBF000C522D5 - 061850BC1C95CBF000C522D5 - 061850BD1C95CBF000C522D5 - 061850BE1C95CBF000C522D5 - 061850BF1C95CBF000C522D5 - 061850C01C95CBF000C522D5 - 061850C11C95CBF000C522D5 - - isa - PBXGroup - path - String - sourceTree - <group> - - 061850B81C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextArchiver.h - sourceTree - <group> - - 061850B91C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextArchiver.m - sourceTree - <group> - - 061850BA1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextAttribute.h - sourceTree - <group> - - 061850BB1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextAttribute.m - sourceTree - <group> - - 061850BC1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextParser.h - sourceTree - <group> - - 061850BD1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextParser.m - sourceTree - <group> - - 061850BE1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextRubyAnnotation.h - sourceTree - <group> - - 061850BF1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextRubyAnnotation.m - sourceTree - <group> - - 061850C01C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextRunDelegate.h - sourceTree - <group> - - 061850C11C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextRunDelegate.m - sourceTree - <group> - - 061850C21C95CBF000C522D5 - - children - - 061850C31C95CBF000C522D5 - 061850C41C95CBF000C522D5 - 061850C51C95CBF000C522D5 - 061850C61C95CBF000C522D5 - 061850C71C95CBF000C522D5 - 061850C81C95CBF000C522D5 - 061850C91C95CBF000C522D5 - 061850CA1C95CBF000C522D5 - 061850CB1C95CBF000C522D5 - 061850CC1C95CBF000C522D5 - 061850CD1C95CBF000C522D5 - 061850CE1C95CBF000C522D5 - 061850CF1C95CBF000C522D5 - 061850D01C95CBF000C522D5 - 061850D11C95CBF000C522D5 - 061850D21C95CBF000C522D5 - - isa - PBXGroup - path - Utility - sourceTree - <group> - - 061850C31C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NSAttributedString+YYText.h - sourceTree - <group> - - 061850C41C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NSAttributedString+YYText.m - sourceTree - <group> - - 061850C51C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NSParagraphStyle+YYText.h - sourceTree - <group> - - 061850C61C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NSParagraphStyle+YYText.m - sourceTree - <group> - - 061850C71C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - UIPasteboard+YYText.h - sourceTree - <group> - - 061850C81C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - UIPasteboard+YYText.m - sourceTree - <group> - - 061850C91C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - UIView+YYText.h - sourceTree - <group> - - 061850CA1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - UIView+YYText.m - sourceTree - <group> - - 061850CB1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextAsyncLayer.h - sourceTree - <group> - - 061850CC1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextAsyncLayer.m - sourceTree - <group> - - 061850CD1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextTransaction.h - sourceTree - <group> - - 061850CE1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextTransaction.m - sourceTree - <group> - - 061850CF1C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextUtilities.h - sourceTree - <group> - - 061850D01C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextUtilities.m - sourceTree - <group> - - 061850D11C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextWeakProxy.h - sourceTree - <group> - - 061850D21C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextWeakProxy.m - sourceTree - <group> - - 061850D31C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYDispatchQueuePool.h - sourceTree - <group> - - 061850D41C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYDispatchQueuePool.m - sourceTree - <group> - - 061850D51C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYLabel.h - sourceTree - <group> - - 061850D61C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYLabel.m - sourceTree - <group> - - 061850D71C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYText.h - sourceTree - <group> - - 061850D81C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - YYTextView.h - sourceTree - <group> - - 061850D91C95CBF000C522D5 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - YYTextView.m - sourceTree - <group> - - 061850DA1C95CBF000C522D5 - - fileRef - 061850A51C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850DB1C95CBF000C522D5 - - fileRef - 061850A61C95CBF000C522D5 - isa - PBXBuildFile - - 061850DC1C95CBF000C522D5 - - fileRef - 061850A71C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850DD1C95CBF000C522D5 - - fileRef - 061850A81C95CBF000C522D5 - isa - PBXBuildFile - - 061850DE1C95CBF000C522D5 - - fileRef - 061850A91C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850DF1C95CBF000C522D5 - - fileRef - 061850AA1C95CBF000C522D5 - isa - PBXBuildFile - - 061850E01C95CBF000C522D5 - - fileRef - 061850AB1C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850E11C95CBF000C522D5 - - fileRef - 061850AC1C95CBF000C522D5 - isa - PBXBuildFile - - 061850E21C95CBF000C522D5 - - fileRef - 061850AD1C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850E31C95CBF000C522D5 - - fileRef - 061850AE1C95CBF000C522D5 - isa - PBXBuildFile - - 061850E41C95CBF000C522D5 - - fileRef - 061850AF1C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850E51C95CBF000C522D5 - - fileRef - 061850B01C95CBF000C522D5 - isa - PBXBuildFile - - 061850E61C95CBF000C522D5 - - fileRef - 061850B11C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850E71C95CBF000C522D5 - - fileRef - 061850B21C95CBF000C522D5 - isa - PBXBuildFile - - 061850E81C95CBF000C522D5 - - fileRef - 061850B31C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850E91C95CBF000C522D5 - - fileRef - 061850B41C95CBF000C522D5 - isa - PBXBuildFile - - 061850EA1C95CBF000C522D5 - - fileRef - 061850B51C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850EB1C95CBF000C522D5 - - fileRef - 061850B61C95CBF000C522D5 - isa - PBXBuildFile - - 061850EC1C95CBF000C522D5 - - fileRef - 061850B81C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850ED1C95CBF000C522D5 - - fileRef - 061850B91C95CBF000C522D5 - isa - PBXBuildFile - - 061850EE1C95CBF000C522D5 - - fileRef - 061850BA1C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850EF1C95CBF000C522D5 - - fileRef - 061850BB1C95CBF000C522D5 - isa - PBXBuildFile - - 061850F01C95CBF000C522D5 - - fileRef - 061850BC1C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850F11C95CBF000C522D5 - - fileRef - 061850BD1C95CBF000C522D5 - isa - PBXBuildFile - - 061850F21C95CBF000C522D5 - - fileRef - 061850BE1C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850F31C95CBF000C522D5 - - fileRef - 061850BF1C95CBF000C522D5 - isa - PBXBuildFile - - 061850F41C95CBF000C522D5 - - fileRef - 061850C01C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850F51C95CBF000C522D5 - - fileRef - 061850C11C95CBF000C522D5 - isa - PBXBuildFile - - 061850F61C95CBF000C522D5 - - fileRef - 061850C31C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850F71C95CBF000C522D5 - - fileRef - 061850C41C95CBF000C522D5 - isa - PBXBuildFile - - 061850F81C95CBF000C522D5 - - fileRef - 061850C51C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850F91C95CBF000C522D5 - - fileRef - 061850C61C95CBF000C522D5 - isa - PBXBuildFile - - 061850FA1C95CBF000C522D5 - - fileRef - 061850C71C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850FB1C95CBF000C522D5 - - fileRef - 061850C81C95CBF000C522D5 - isa - PBXBuildFile - - 061850FC1C95CBF000C522D5 - - fileRef - 061850C91C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850FD1C95CBF000C522D5 - - fileRef - 061850CA1C95CBF000C522D5 - isa - PBXBuildFile - - 061850FE1C95CBF000C522D5 - - fileRef - 061850CB1C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061850FF1C95CBF000C522D5 - - fileRef - 061850CC1C95CBF000C522D5 - isa - PBXBuildFile - - 061851001C95CBF000C522D5 - - fileRef - 061850CD1C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061851011C95CBF000C522D5 - - fileRef - 061850CE1C95CBF000C522D5 - isa - PBXBuildFile - - 061851021C95CBF000C522D5 - - fileRef - 061850CF1C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061851031C95CBF000C522D5 - - fileRef - 061850D01C95CBF000C522D5 - isa - PBXBuildFile - - 061851041C95CBF000C522D5 - - fileRef - 061850D11C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061851051C95CBF000C522D5 - - fileRef - 061850D21C95CBF000C522D5 - isa - PBXBuildFile - - 061851061C95CBF000C522D5 - - fileRef - 061850D31C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061851071C95CBF000C522D5 - - fileRef - 061850D41C95CBF000C522D5 - isa - PBXBuildFile - - 061851081C95CBF000C522D5 - - fileRef - 061850D51C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 061851091C95CBF000C522D5 - - fileRef - 061850D61C95CBF000C522D5 - isa - PBXBuildFile - - 0618510A1C95CBF000C522D5 - - fileRef - 061850D71C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 0618510B1C95CBF000C522D5 - - fileRef - 061850D81C95CBF000C522D5 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 0618510C1C95CBF000C522D5 - - fileRef - 061850D91C95CBF000C522D5 - isa - PBXBuildFile - - 06230F3F1BC95BD200A4807B - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - RMPhoneFormat.m - sourceTree - <group> - - 06230F401BC95BD200A4807B - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - RMPhoneFormat.h - sourceTree - <group> - - 06230F411BC95BD200A4807B - - fileRef - 06230F3F1BC95BD200A4807B - isa - PBXBuildFile - - 06230F421BC95BD200A4807B - - fileRef - 06230F401BC95BD200A4807B - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 06230F431BC95C0E00A4807B - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - text - path - ABPhoneFieldCodes.txt - sourceTree - <group> - - 06230F441BC95C0E00A4807B - - isa - PBXFileReference - lastKnownFileType - file - path - PhoneFormats.dat - sourceTree - <group> - - 06230F451BC95C0E00A4807B - - fileRef - 06230F431BC95C0E00A4807B - isa - PBXBuildFile - - 06230F461BC95C0E00A4807B - - fileRef - 06230F441BC95C0E00A4807B - isa - PBXBuildFile - - 063074161BD68E370053DEAF - - isa - PBXFileReference - lastKnownFileType - image.jpeg - path - bg_3_preview.jpg - sourceTree - <group> - - 063074171BD68E370053DEAF - - isa - PBXFileReference - lastKnownFileType - image.jpeg - path - bg_2_preview.jpg - sourceTree - <group> - - 063074181BD68E370053DEAF - - isa - PBXFileReference - lastKnownFileType - image.jpeg - path - bg_1_preview.jpg - sourceTree - <group> - - 063074191BD68E370053DEAF - - fileRef - 063074161BD68E370053DEAF - isa - PBXBuildFile - - 0630741A1BD68E370053DEAF - - fileRef - 063074171BD68E370053DEAF - isa - PBXBuildFile - - 0630741B1BD68E370053DEAF - - fileRef - 063074181BD68E370053DEAF - isa - PBXBuildFile - - 064E41B41CA1D2FF00A4A9D1 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABigAlertController.swift - sourceTree - <group> - - 064E41B51CA1D2FF00A4A9D1 - - fileRef - 064E41B41CA1D2FF00A4A9D1 - isa - PBXBuildFile - - 065974A41BC621F100B8C7DF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAuthNavigationController.swift - sourceTree - <group> - - 065974A51BC621F100B8C7DF - - fileRef - 065974A41BC621F100B8C7DF - isa - PBXBuildFile - - 065974A61BC62B3600B8C7DF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ViewExtensions.swift - sourceTree - <group> - - 065974A71BC62B3600B8C7DF - - fileRef - 065974A61BC62B3600B8C7DF - isa - PBXBuildFile - - 065975011BC7534100B8C7DF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - FMDBBridge.swift - sourceTree - <group> - - 065975021BC7534100B8C7DF - - fileRef - 065975011BC7534100B8C7DF - isa - PBXBuildFile - - 065975041BC757A300B8C7DF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ActorRuntime.swift - sourceTree - <group> - - 065975051BC757A300B8C7DF - - fileRef - 065975041BC757A300B8C7DF - isa - PBXBuildFile - - 065975061BC7BB4000B8C7DF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AANavigationBadge.swift - sourceTree - <group> - - 065975071BC7BB4000B8C7DF - - fileRef - 065975061BC7BB4000B8C7DF - isa - PBXBuildFile - - 065975081BC7C4F300B8C7DF - - children - - 0659751D1BC7C84200B8C7DF - 065975501BC7DD3C00B8C7DF - 06230F431BC95C0E00A4807B - 0659753A1BC7D22200B8C7DF - 06E3C58C1C74931F004776CD - 065975461BC7D34200B8C7DF - 06230F441BC95C0E00A4807B - 153F6B3C1C2A9B1900C0B960 - 065975491BC7DBA000B8C7DF - 0659754A1BC7DBA000B8C7DF - 06E3C58A1C746AAC004776CD - - isa - PBXGroup - path - Resources - sourceTree - <group> - - 0659751D1BC7C84200B8C7DF - - children - - 0659751E1BC7C84E00B8C7DF - 063074181BD68E370053DEAF - 065975201BC7C84E00B8C7DF - 063074171BD68E370053DEAF - 0659751F1BC7C84E00B8C7DF - 063074161BD68E370053DEAF - - isa - PBXGroup - path - Backgrounds - sourceTree - <group> - - 0659751E1BC7C84E00B8C7DF - - isa - PBXFileReference - lastKnownFileType - image.jpeg - path - bg_1.jpg - sourceTree - <group> - - 0659751F1BC7C84E00B8C7DF - - isa - PBXFileReference - lastKnownFileType - image.jpeg - path - bg_3.jpg - sourceTree - <group> - - 065975201BC7C84E00B8C7DF - - isa - PBXFileReference - lastKnownFileType - image.jpeg - path - bg_2.jpg - sourceTree - <group> - - 065975211BC7C84E00B8C7DF - - fileRef - 0659751E1BC7C84E00B8C7DF - isa - PBXBuildFile - - 065975221BC7C84E00B8C7DF - - fileRef - 0659751F1BC7C84E00B8C7DF - isa - PBXBuildFile - - 065975231BC7C84E00B8C7DF - - fileRef - 065975201BC7C84E00B8C7DF - isa - PBXBuildFile - - 065975381BC7CA7B00B8C7DF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Bundle.swift - sourceTree - <group> - - 065975391BC7CA7B00B8C7DF - - fileRef - 065975381BC7CA7B00B8C7DF - isa - PBXBuildFile - - 0659753A1BC7D22200B8C7DF - - isa - PBXFileReference - lastKnownFileType - folder.assetcatalog - path - Images.xcassets - sourceTree - <group> - - 0659753B1BC7D22200B8C7DF - - fileRef - 0659753A1BC7D22200B8C7DF - isa - PBXBuildFile - - 065975441BC7D34200B8C7DF - - fileRef - 065975461BC7D34200B8C7DF - isa - PBXBuildFile - - 065975451BC7D34200B8C7DF - - isa - PBXFileReference - lastKnownFileType - text.plist.strings - name - pt - path - pt.lproj/Localizable.strings - sourceTree - <group> - - 065975461BC7D34200B8C7DF - - children - - 0659754D1BC7DCED00B8C7DF - 15F89F0F1C21317400776ACD - 065975451BC7D34200B8C7DF - 065975471BC7D34400B8C7DF - 065975481BC7D34600B8C7DF - - isa - PBXVariantGroup - name - Localizable.strings - path - . - sourceTree - <group> - - 065975471BC7D34400B8C7DF - - isa - PBXFileReference - lastKnownFileType - text.plist.strings - name - ru - path - ru.lproj/Localizable.strings - sourceTree - <group> - - 065975481BC7D34600B8C7DF - - isa - PBXFileReference - lastKnownFileType - text.plist.strings - name - zh-Hans - path - zh-Hans.lproj/Localizable.strings - sourceTree - <group> - - 065975491BC7DBA000B8C7DF - - isa - PBXFileReference - lastKnownFileType - file - path - iapetus.caf - sourceTree - <group> - - 0659754A1BC7DBA000B8C7DF - - isa - PBXFileReference - lastKnownFileType - file - path - notification.caf - sourceTree - <group> - - 0659754B1BC7DBA000B8C7DF - - fileRef - 065975491BC7DBA000B8C7DF - isa - PBXBuildFile - - 0659754C1BC7DBA000B8C7DF - - fileRef - 0659754A1BC7DBA000B8C7DF - isa - PBXBuildFile - - 0659754D1BC7DCED00B8C7DF - - isa - PBXFileReference - lastKnownFileType - text.plist.strings - name - Base - path - Base.lproj/Localizable.strings - sourceTree - <group> - - 0659754E1BC7DD3C00B8C7DF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - text.css - path - highlight-default.min.css - sourceTree - <group> - - 0659754F1BC7DD3C00B8C7DF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.javascript - path - highlight.min.js - sourceTree - <group> - - 065975501BC7DD3C00B8C7DF - - children - - 0659754E1BC7DD3C00B8C7DF - 0659754F1BC7DD3C00B8C7DF - - isa - PBXGroup - path - Highlighter - sourceTree - <group> - - 065975511BC7DD3C00B8C7DF - - fileRef - 0659754E1BC7DD3C00B8C7DF - isa - PBXBuildFile - - 065975521BC7DD3C00B8C7DF - - fileRef - 0659754F1BC7DD3C00B8C7DF - isa - PBXBuildFile - - 065975531BC7DF5100B8C7DF - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - CocoaAssetsRuntime.swift - sourceTree - <group> - - 065975541BC7DF5100B8C7DF - - fileRef - 065975531BC7DF5100B8C7DF - isa - PBXBuildFile - - 065A06B51C6CEFE00012EA09 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - CocoaWebRTCRuntime.swift - sourceTree - <group> - - 065A06B61C6CEFE00012EA09 - - fileRef - 065A06B51C6CEFE00012EA09 - isa - PBXBuildFile - - 066A50C81BC4AE63000E606E - - children - - 066A50D41BC4AE63000E606E - 2F428D134E194A828C3DF863 - 066A50D31BC4AE63000E606E - F0BB28A250FF185B1F4D414D - - isa - PBXGroup - sourceTree - <group> - - 066A50C91BC4AE63000E606E - - attributes - - LastSwiftUpdateCheck - 0700 - LastUpgradeCheck - 0700 - ORGANIZATIONNAME - Steve Kite - TargetAttributes - - 066A50D11BC4AE63000E606E - - CreatedOnToolsVersion - 7.0 - DevelopmentTeam - HVJR44Y5B6 - LastSwiftMigration - 0800 - - - - buildConfigurationList - 066A50CC1BC4AE63000E606E - compatibilityVersion - Xcode 3.2 - developmentRegion - English - hasScannedForEncodings - 0 - isa - PBXProject - knownRegions - - en - ru - zh-Hans - Base - es - - mainGroup - 066A50C81BC4AE63000E606E - productRefGroup - 066A50D31BC4AE63000E606E - projectDirPath - - projectReferences - - projectRoot - - targets - - 066A50D11BC4AE63000E606E - - - 066A50CC1BC4AE63000E606E - - buildConfigurations - - 066A50D81BC4AE63000E606E - 066A50D91BC4AE63000E606E - - defaultConfigurationIsVisible - 0 - defaultConfigurationName - Release - isa - XCConfigurationList - - 066A50CD1BC4AE63000E606E - - buildActionMask - 2147483647 - files - - 15D35F781C20273D00E3717A - 15D35F181C20185500E3717A - 066A52F81BC52B13000E606E - BEFE68D51C4657360001F2D6 - 066A51591BC4C14A000E606E - 061850F11C95CBF000C522D5 - BED5A1FB1C48396A0045FDB0 - 15D35F161C20185500E3717A - 061850E11C95CBF000C522D5 - 9AA6A41F1D08568A00957A7F - 066A525E1BC503BB000E606E - 061850F31C95CBF000C522D5 - BED5A1F91C48396A0045FDB0 - 066A53101BC53317000E606E - 152AA8B91C2989270030DEEE - 066A52F21BC52B02000E606E - 15D35F561C20187E00E3717A - 060135061C95ED4C00A18C4E - 061850DB1C95CBF000C522D5 - 15D35F301C20187200E3717A - 066A532E1BC53406000E606E - 06ABFE3D1D41283A0031A0D6 - 066A514A1BC4BCE0000E606E - 066A52401BC4EECD000E606E - BED5A1F51C48396A0045FDB0 - 066A52FF1BC52FA9000E606E - 066A53301BC53406000E606E - 066A52FD1BC52FA8000E606E - 066A52351BC4EEBA000E606E - 061850A01C95CA2600C522D5 - 066A51461BC4BBC3000E606E - 066A52271BC4EEAC000E606E - 066A51411BC4BB5C000E606E - 066A52E51BC52A20000E606E - 0618509E1C9582DD00C522D5 - 15D35F691C20187E00E3717A - 066A52251BC4EEAC000E606E - 15D35F601C20187E00E3717A - 061850EB1C95CBF000C522D5 - 15D35F1C1C20185500E3717A - 066A532B1BC53406000E606E - 061850E91C95CBF000C522D5 - 06E323151C6A7AC000D66F53 - 066A52C71BC521EA000E606E - 061850FD1C95CBF000C522D5 - 153F6B5D1C2B3AC500C0B960 - 15D35F1E1C20185500E3717A - 065974A51BC621F100B8C7DF - 068AFC391C94A0050055F503 - BED5A1FF1C48396A0045FDB0 - 066A518E1BC4C383000E606E - 06E7B2541C139B6F0090660C - 066A52CC1BC521FA000E606E - 061850E31C95CBF000C522D5 - 066A52571BC4EF61000E606E - 066A532F1BC53406000E606E - 06ABFE3A1D410D2D0031A0D6 - 15D35F631C20187E00E3717A - 066A527F1BC51ED0000E606E - 066A52481BC4EED5000E606E - 066A51921BC4C383000E606E - 066A52DC1BC52385000E606E - 065975071BC7BB4000B8C7DF - 066A518D1BC4C383000E606E - 066A52F01BC52B02000E606E - 060135081C95ED4C00A18C4E - 066A52741BC5101A000E606E - 153F6B611C2BF8EC00C0B960 - 152AA8A91C2989270030DEEE - BED5A1F31C48396A0045FDB0 - 066A53071BC53183000E606E - 061850EF1C95CBF000C522D5 - 06230F411BC95BD200A4807B - BE4DBE6C1C5723BE00A31894 - 066A52361BC4EEBA000E606E - 066A52431BC4EECD000E606E - 061851011C95CBF000C522D5 - 066A52341BC4EEBA000E606E - 15D35F311C20187200E3717A - 061850F91C95CBF000C522D5 - 06E1648F1C96D99F005AFB94 - 066A52DF1BC5241F000E606E - 066A51221BC4B55C000E606E - 066A532D1BC53406000E606E - 065974A71BC62B3600B8C7DF - 066A52F11BC52B02000E606E - 061850FF1C95CBF000C522D5 - 065A06B61C6CEFE00012EA09 - 15D35F5A1C20187E00E3717A - 066A52381BC4EEBA000E606E - 06C1D0771C8BC9FC00B73632 - 066A524B1BC4EF49000E606E - 066A51521BC4BE34000E606E - 066A52D71BC52378000E606E - 061850FB1C95CBF000C522D5 - 066A51241BC4B56D000E606E - 066A53171BC533DD000E606E - 153F6B8B1C2D7BA400C0B960 - 06ABFE341D3FAF800031A0D6 - 061850E71C95CBF000C522D5 - 066A52081BC4E962000E606E - 066A53231BC533F5000E606E - 06E7B2471C0F8D7A0090660C - 061851031C95CBF000C522D5 - 066A51501BC4BE06000E606E - 06CE89901BD84DF5005A5530 - 061850DD1C95CBF000C522D5 - 15D35F6F1C20196E00E3717A - 069CF4D31BCB909A00C66E12 - 066A52F71BC52B13000E606E - 0601BBB41CA4C80D00AEFA81 - 066A51541BC4BE95000E606E - 152AA8A71C2989270030DEEE - 066A52801BC51ED0000E606E - 061850E51C95CBF000C522D5 - 066A522A1BC4EEAC000E606E - 069CF4D11BCB909A00C66E12 - 061851051C95CBF000C522D5 - 066A52451BC4EECD000E606E - BE237C9D1C422FFA00060648 - 066A52D21BC52204000E606E - 066A52371BC4EEBA000E606E - 066A51481BC4BBF4000E606E - 066A53151BC533D5000E606E - 066A52151BC4EE04000E606E - 066A52591BC4EF61000E606E - 153F6B8A1C2D7BA300C0B960 - 15D35F5E1C20187E00E3717A - 9AAE96481CF81F140092E366 - 066A52DB1BC52385000E606E - 15D35F331C20187200E3717A - 065975391BC7CA7B00B8C7DF - 15D35F6B1C20187E00E3717A - 066A53111BC53317000E606E - 066A519B1BC4C390000E606E - 15D35F521C20187E00E3717A - 15D35F651C20187E00E3717A - 061851071C95CBF000C522D5 - 066A52F31BC52B02000E606E - 066A53041BC53177000E606E - 066A51801BC4C373000E606E - 061850F51C95CBF000C522D5 - 06129AA91C8394700099286B - 06C1D07B1C8BFE5C00B73632 - 0618510C1C95CBF000C522D5 - 066A518F1BC4C383000E606E - 060135041C95ED4C00A18C4E - 066A530B1BC531A2000E606E - 06E3C5B81C80EE21004776CD - 153F6B5B1C2B109400C0B960 - 061851091C95CBF000C522D5 - 15D35F251C20186200E3717A - 066A531A1BC533E7000E606E - 065975051BC757A300B8C7DF - 066A517B1BC4C373000E606E - 06C1D07E1C8D0DEA00B73632 - BE2621591C4656EE00A817AB - 066A52561BC4EF61000E606E - 152AA8AB1C2989270030DEEE - 066A52D61BC52378000E606E - 065975021BC7534100B8C7DF - 15D35F351C20187200E3717A - BED5A1F71C48396A0045FDB0 - 066A519E1BC4C390000E606E - 066A52E61BC52A20000E606E - 066A52C81BC521EA000E606E - 066A532C1BC53406000E606E - BE2621571C4656D700A817AB - 066A52261BC4EEAC000E606E - 066A53221BC533F5000E606E - 15D35F541C20187E00E3717A - 06E322C91C69344A00D66F53 - 066A53371BC537CA000E606E - 066A519D1BC4C390000E606E - 069CF4CD1BCB909A00C66E12 - 15D35F1B1C20185500E3717A - 152AA8BD1C298BF00030DEEE - 066A515B1BC4C178000E606E - 066A52811BC51ED0000E606E - BEE6EB041C4D9A4900A2280E - 152AA8B21C2989270030DEEE - 066A52281BC4EEAC000E606E - 065975541BC7DF5100B8C7DF - 06E7B2521C1345E70090660C - 06129AAB1C83B80B0099286B - 066A53121BC53317000E606E - 066A52391BC4EEBA000E606E - 066A526D1BC50E8B000E606E - 152AA8AF1C2989270030DEEE - 066A51911BC4C383000E606E - BE281CC51C502B230042F6D4 - 066A53211BC533F5000E606E - 066A51821BC4C373000E606E - 061850F71C95CBF000C522D5 - 066A525A1BC4EF61000E606E - 066A51841BC4C373000E606E - 066A514E1BC4BDE4000E606E - 06B489ED1C9F6EBD0054245B - 15D35F671C20187E00E3717A - 06D5C05C1C8EA842002D5045 - 15D35F5C1C20187E00E3717A - 152AA8BF1C298C4B0030DEEE - 066A51561BC4BEF5000E606E - 069CF4CF1BCB909A00C66E12 - 15D35F751C201B6B00E3717A - 066A51441BC4BBAF000E606E - BEE6EB011C4D7B7500A2280E - BED5A2011C48396A0045FDB0 - 066A53331BC534F5000E606E - 066A52FE1BC52FA9000E606E - 066A52E71BC52A20000E606E - 152AA8AD1C2989270030DEEE - 152AA8B71C2989270030DEEE - 066A52241BC4EEAC000E606E - 061850ED1C95CBF000C522D5 - 066A50E21BC4AF9F000E606E - 15D35F761C201B6B00E3717A - 06E7B24C1C0FAB500090660C - BED5A1F11C48396A0045FDB0 - BED5A20F1C4839880045FDB0 - 06129AA61C8359FB0099286B - 066A516D1BC4C366000E606E - 066A517E1BC4C373000E606E - 066A519A1BC4C390000E606E - 066A52221BC4EEAC000E606E - 152AA8B51C2989270030DEEE - 066A52EA1BC52A2B000E606E - 066A52291BC4EEAC000E606E - BED5A1FD1C48396A0045FDB0 - 066A514C1BC4BD05000E606E - 066A526A1BC50E7B000E606E - 066A52541BC4EF61000E606E - 066A525C1BC502EB000E606E - 066A52551BC4EF61000E606E - 066A52421BC4EECD000E606E - 06D5C05A1C8E9B3B002D5045 - 064E41B51CA1D2FF00A4A9D1 - 066A52CD1BC521FA000E606E - 15D35F261C20186200E3717A - 06D5C0571C8D6E20002D5045 - 06E323111C694C1D00D66F53 - 066A52231BC4EEAC000E606E - 066A52D11BC52204000E606E - 066A51901BC4C383000E606E - 06ABFE381D3FCCE30031A0D6 - 06E7B24A1C0F92140090660C - 067B67541D45341D00B9A238 - 066A52581BC4EF61000E606E - 066A51691BC4C366000E606E - 066A53201BC533F5000E606E - 066CBCDC1C8D419F004507E2 - 061850DF1C95CBF000C522D5 - 066A52661BC50E7B000E606E - 0601BBB21CA4C7DE00AEFA81 - 066A53391BC5456B000E606E - - isa - PBXSourcesBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 066A50CE1BC4AE63000E606E - - buildActionMask - 2147483647 - files - - 06CE898C1BD841C9005A5530 - BEAC2B311C42D683007F7A2F - 066A52001BC4E0B0000E606E - BDF21708B376E212CEAEC43D - - isa - PBXFrameworksBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 066A50CF1BC4AE63000E606E - - buildActionMask - 2147483647 - files - - 060135031C95ED4C00A18C4E - 069CF4D21BCB909A00C66E12 - 066A51831BC4C373000E606E - 15F89F091C211FED00776ACD - 060135071C95ED4C00A18C4E - 066A517D1BC4C373000E606E - 069CF4D01BCB909A00C66E12 - 060135051C95ED4C00A18C4E - 066A517F1BC4C373000E606E - 066A51811BC4C373000E606E - 066A517A1BC4C373000E606E - 069CF4CC1BCB909A00C66E12 - 061850F21C95CBF000C522D5 - 066A50D61BC4AE63000E606E - 061850E01C95CBF000C522D5 - 15D35F621C20187E00E3717A - 066A517C1BC4C373000E606E - 15D35F5B1C20187E00E3717A - 152AA8B11C2989270030DEEE - 152AA8A81C2989270030DEEE - 061850E81C95CBF000C522D5 - 061850DE1C95CBF000C522D5 - 066A52731BC5101A000E606E - 061850FA1C95CBF000C522D5 - 061850E61C95CBF000C522D5 - 061850F61C95CBF000C522D5 - 152AA8AA1C2989270030DEEE - 152AA8B01C2989270030DEEE - 152AA8AC1C2989270030DEEE - 06ABFE331D3FAF800031A0D6 - 152AA8AE1C2989270030DEEE - 152AA8B31C2989270030DEEE - 152AA8B61C2989270030DEEE - 061850DA1C95CBF000C522D5 - BED5A2111C48413C0045FDB0 - BED5A2121C48413C0045FDB0 - 061850EE1C95CBF000C522D5 - 061851081C95CBF000C522D5 - BED5A2131C48413C0045FDB0 - 061851041C95CBF000C522D5 - 15D35F681C20187E00E3717A - 152AA8B81C2989270030DEEE - 061850F41C95CBF000C522D5 - BED5A1FE1C48396A0045FDB0 - 061850EC1C95CBF000C522D5 - 061850E41C95CBF000C522D5 - 061850F01C95CBF000C522D5 - BED5A1F81C48396A0045FDB0 - 061851001C95CBF000C522D5 - 15D35F641C20187E00E3717A - 061851021C95CBF000C522D5 - 0618510A1C95CBF000C522D5 - BED5A2071C4839790045FDB0 - 15D35F571C20187E00E3717A - 15F89F071C211FED00776ACD - 061850E21C95CBF000C522D5 - 15D35F341C20187200E3717A - 15D35F661C20187E00E3717A - 061850EA1C95CBF000C522D5 - 061850FC1C95CBF000C522D5 - 15D35F281C20186200E3717A - 15D35F191C20185500E3717A - 061850DC1C95CBF000C522D5 - 15F89F081C211FED00776ACD - 15D35F1F1C20185500E3717A - 15D35F171C20185500E3717A - 15D35F5F1C20187E00E3717A - 15D35F551C20187E00E3717A - 0618510B1C95CBF000C522D5 - 061850F81C95CBF000C522D5 - 061850FE1C95CBF000C522D5 - 15D35F5D1C20187E00E3717A - 15D35F271C20186200E3717A - 15D35F321C20187200E3717A - 15D35F1A1C20185500E3717A - 15D35F591C20187E00E3717A - 15D35F531C20187E00E3717A - 15D35F611C20187E00E3717A - 061851061C95CBF000C522D5 - 15D35F6A1C20187E00E3717A - 15F89F0A1C211FED00776ACD - 15D35F511C20187E00E3717A - 15D35F1D1C20185500E3717A - 06E3230E1C69445C00D66F53 - 06230F421BC95BD200A4807B - 069CF4CE1BCB909A00C66E12 - - isa - PBXHeadersBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 066A50D01BC4AE63000E606E - - buildActionMask - 2147483647 - files - - 06230F451BC95C0E00A4807B - 0630741B1BD68E370053DEAF - BED5A1D91C4839590045FDB0 - BED5A1D81C4839590045FDB0 - BED5A1D71C4839590045FDB0 - 06230F461BC95C0E00A4807B - 065975511BC7DD3C00B8C7DF - 0659754B1BC7DBA000B8C7DF - BED5A1DC1C4839590045FDB0 - 0630741A1BD68E370053DEAF - 065975221BC7C84E00B8C7DF - 065975211BC7C84E00B8C7DF - 0659753B1BC7D22200B8C7DF - 065975231BC7C84E00B8C7DF - 065975521BC7DD3C00B8C7DF - 065975441BC7D34200B8C7DF - 06E3C58B1C746CCC004776CD - BED5A1DB1C4839590045FDB0 - 06E3C58D1C749320004776CD - 0659754C1BC7DBA000B8C7DF - BEF11DB61C466D800076400A - 063074191BD68E370053DEAF - BED5A1DA1C4839590045FDB0 - - isa - PBXResourcesBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 066A50D11BC4AE63000E606E - - buildConfigurationList - 066A50DA1BC4AE63000E606E - buildPhases - - 5B00FFD27DD7E01F43B31D13 - 066A52091BC4EA95000E606E - 066A50CD1BC4AE63000E606E - 066A50CF1BC4AE63000E606E - 066A50CE1BC4AE63000E606E - 066A50D01BC4AE63000E606E - A2ED258362D73946D3AE7FB4 - - buildRules - - dependencies - - isa - PBXNativeTarget - name - ActorSDK - productName - ActorSDK - productReference - 066A50D21BC4AE63000E606E - productType - com.apple.product-type.framework - - 066A50D21BC4AE63000E606E - - explicitFileType - wrapper.framework - includeInIndex - 0 - isa - PBXFileReference - path - ActorSDK.framework - sourceTree - BUILT_PRODUCTS_DIR - - 066A50D31BC4AE63000E606E - - children - - 066A50D21BC4AE63000E606E - - isa - PBXGroup - name - Products - sourceTree - <group> - - 066A50D41BC4AE63000E606E - - children - - 069CF4151BCA5DB500C66E12 - 065975081BC7C4F300B8C7DF - - isa - PBXGroup - path - ActorSDK - sourceTree - <group> - - 066A50D51BC4AE63000E606E - - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - ActorSDK.h - sourceTree - <group> - - 066A50D61BC4AE63000E606E - - fileRef - 066A50D51BC4AE63000E606E - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 066A50D71BC4AE63000E606E - - isa - PBXFileReference - lastKnownFileType - text.plist.xml - path - Info.plist - sourceTree - <group> - - 066A50D81BC4AE63000E606E - - buildSettings - - ALWAYS_SEARCH_USER_PATHS - NO - CLANG_CXX_LANGUAGE_STANDARD - gnu++0x - CLANG_CXX_LIBRARY - libc++ - CLANG_ENABLE_MODULES - YES - CLANG_ENABLE_OBJC_ARC - YES - CLANG_WARN_BOOL_CONVERSION - YES - CLANG_WARN_CONSTANT_CONVERSION - YES - CLANG_WARN_DIRECT_OBJC_ISA_USAGE - YES_ERROR - CLANG_WARN_EMPTY_BODY - YES - CLANG_WARN_ENUM_CONVERSION - YES - CLANG_WARN_INT_CONVERSION - YES - CLANG_WARN_OBJC_ROOT_CLASS - YES_ERROR - CLANG_WARN_UNREACHABLE_CODE - YES - CLANG_WARN__DUPLICATE_METHOD_MATCH - YES - CODE_SIGN_IDENTITY[sdk=iphoneos*] - iPhone Developer - COPY_PHASE_STRIP - NO - CURRENT_PROJECT_VERSION - 1 - DEBUG_INFORMATION_FORMAT - dwarf - ENABLE_STRICT_OBJC_MSGSEND - YES - ENABLE_TESTABILITY - YES - GCC_C_LANGUAGE_STANDARD - gnu99 - GCC_NO_COMMON_BLOCKS - YES - GCC_OPTIMIZATION_LEVEL - 0 - GCC_PREPROCESSOR_DEFINITIONS - - DEBUG=1 - $(inherited) - - GCC_WARN_64_TO_32_BIT_CONVERSION - YES - GCC_WARN_ABOUT_RETURN_TYPE - YES_ERROR - GCC_WARN_UNDECLARED_SELECTOR - YES - GCC_WARN_UNINITIALIZED_AUTOS - YES_AGGRESSIVE - GCC_WARN_UNUSED_FUNCTION - YES - GCC_WARN_UNUSED_VARIABLE - YES - IPHONEOS_DEPLOYMENT_TARGET - 8.0 - MTL_ENABLE_DEBUG_INFO - YES - ONLY_ACTIVE_ARCH - YES - SDKROOT - iphoneos - SWIFT_OPTIMIZATION_LEVEL - -Onone - TARGETED_DEVICE_FAMILY - 1,2 - VERSIONING_SYSTEM - apple-generic - VERSION_INFO_PREFIX - - - isa - XCBuildConfiguration - name - Debug - - 066A50D91BC4AE63000E606E - - buildSettings - - ALWAYS_SEARCH_USER_PATHS - NO - CLANG_CXX_LANGUAGE_STANDARD - gnu++0x - CLANG_CXX_LIBRARY - libc++ - CLANG_ENABLE_MODULES - YES - CLANG_ENABLE_OBJC_ARC - YES - CLANG_WARN_BOOL_CONVERSION - YES - CLANG_WARN_CONSTANT_CONVERSION - YES - CLANG_WARN_DIRECT_OBJC_ISA_USAGE - YES_ERROR - CLANG_WARN_EMPTY_BODY - YES - CLANG_WARN_ENUM_CONVERSION - YES - CLANG_WARN_INT_CONVERSION - YES - CLANG_WARN_OBJC_ROOT_CLASS - YES_ERROR - CLANG_WARN_UNREACHABLE_CODE - YES - CLANG_WARN__DUPLICATE_METHOD_MATCH - YES - CODE_SIGN_IDENTITY[sdk=iphoneos*] - iPhone Developer - COPY_PHASE_STRIP - NO - CURRENT_PROJECT_VERSION - 1 - DEBUG_INFORMATION_FORMAT - dwarf-with-dsym - ENABLE_NS_ASSERTIONS - NO - ENABLE_STRICT_OBJC_MSGSEND - YES - GCC_C_LANGUAGE_STANDARD - gnu99 - GCC_NO_COMMON_BLOCKS - YES - GCC_WARN_64_TO_32_BIT_CONVERSION - YES - GCC_WARN_ABOUT_RETURN_TYPE - YES_ERROR - GCC_WARN_UNDECLARED_SELECTOR - YES - GCC_WARN_UNINITIALIZED_AUTOS - YES_AGGRESSIVE - GCC_WARN_UNUSED_FUNCTION - YES - GCC_WARN_UNUSED_VARIABLE - YES - IPHONEOS_DEPLOYMENT_TARGET - 8.0 - MTL_ENABLE_DEBUG_INFO - NO - SDKROOT - iphoneos - TARGETED_DEVICE_FAMILY - 1,2 - VALIDATE_PRODUCT - YES - VERSIONING_SYSTEM - apple-generic - VERSION_INFO_PREFIX - - - isa - XCBuildConfiguration - name - Release - - 066A50DA1BC4AE63000E606E - - buildConfigurations - - 066A50DB1BC4AE63000E606E - 066A50DC1BC4AE63000E606E - - defaultConfigurationIsVisible - 0 - defaultConfigurationName - Release - isa - XCConfigurationList - - 066A50DB1BC4AE63000E606E - - baseConfigurationReference - E30822B631D108159E8B306B - buildSettings - - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES - YES - CLANG_ENABLE_MODULES - YES - CODE_SIGN_IDENTITY - iPhone Developer - CODE_SIGN_IDENTITY[sdk=iphoneos*] - iPhone Developer - DEBUG_INFORMATION_FORMAT - dwarf-with-dsym - DEFINES_MODULE - YES - DYLIB_COMPATIBILITY_VERSION - 1 - DYLIB_CURRENT_VERSION - 1 - DYLIB_INSTALL_NAME_BASE - @rpath - EMBEDDED_CONTENT_CONTAINS_SWIFT - YES - ENABLE_BITCODE - NO - FRAMEWORK_SEARCH_PATHS - - $(inherited) - $(PROJECT_DIR)/build/Debug-iphoneos - $(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks - - GCC_DYNAMIC_NO_PIC - NO - GCC_LINK_WITH_DYNAMIC_LIBRARIES - YES - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS - NO - INFOPLIST_FILE - $(SRCROOT)/ActorSDK/Sources/Info.plist - INSTALL_PATH - $(LOCAL_LIBRARY_DIR)/Frameworks - IPHONEOS_DEPLOYMENT_TARGET - 8.0 - LD_NO_PIE - NO - LD_RUNPATH_SEARCH_PATHS - $(inherited) @executable_path/Frameworks @loader_path/Frameworks - LIBRARY_SEARCH_PATHS - - $(CONFIGURATION_TEMP_DIR)/j2objc/Objects/ - $(PROJECT_DIR)/ActorSDK/Sources/Utils - $(PROJECT_DIR)/ActorSDK/Sources/Utils/AudioRecorder/libopus/lib - $(inherited) - $(PROJECT_DIR)/ActorSDK/Libs - - MACH_O_TYPE - mh_dylib - ONLY_ACTIVE_ARCH - YES - OTHER_LDFLAGS - - -lactor - $(inherited) - -framework - j2objc - - PRODUCT_BUNDLE_IDENTIFIER - im.actor.ActorSDK - PRODUCT_NAME - ActorSDK - PROVISIONING_PROFILE - - SKIP_INSTALL - YES - STRIP_INSTALLED_PRODUCT - YES - SWIFT_INCLUDE_PATHS - $(PROJECT_DIR)/ActorSDK/Sources/Libs/CommonCrypto $(PROJECT_DIR)/IDZSwiftCommonCrypto/Frameworks/$(PLATFORM_NAME) - SWIFT_OBJC_BRIDGING_HEADER - - SWIFT_OPTIMIZATION_LEVEL - -Onone - SWIFT_VERSION - 3.0 - VALID_ARCHS - arm64 armv7 - WARNING_CFLAGS - -Wno-nullability-completeness - - isa - XCBuildConfiguration - name - Debug - - 066A50DC1BC4AE63000E606E - - baseConfigurationReference - F076508E3899D309954904A3 - buildSettings - - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES - YES - CLANG_ENABLE_MODULES - YES - CODE_SIGN_IDENTITY - iPhone Developer - CODE_SIGN_IDENTITY[sdk=iphoneos*] - iPhone Developer - DEFINES_MODULE - YES - DYLIB_COMPATIBILITY_VERSION - 1 - DYLIB_CURRENT_VERSION - 1 - DYLIB_INSTALL_NAME_BASE - @rpath - EMBEDDED_CONTENT_CONTAINS_SWIFT - YES - ENABLE_BITCODE - NO - FRAMEWORK_SEARCH_PATHS - - $(inherited) - $(PROJECT_DIR)/build/Debug-iphoneos - $(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks - - GCC_DYNAMIC_NO_PIC - NO - GCC_LINK_WITH_DYNAMIC_LIBRARIES - YES - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS - NO - INFOPLIST_FILE - $(SRCROOT)/ActorSDK/Sources/Info.plist - INSTALL_PATH - $(LOCAL_LIBRARY_DIR)/Frameworks - IPHONEOS_DEPLOYMENT_TARGET - 8.0 - LD_NO_PIE - NO - LD_RUNPATH_SEARCH_PATHS - $(inherited) @executable_path/Frameworks @loader_path/Frameworks - LIBRARY_SEARCH_PATHS - - $(CONFIGURATION_TEMP_DIR)/j2objc/Objects/ - $(PROJECT_DIR)/ActorSDK/Sources/Utils - $(PROJECT_DIR)/ActorSDK/Sources/Utils/AudioRecorder/libopus/lib - $(inherited) - $(PROJECT_DIR)/ActorSDK/Libs - - MACH_O_TYPE - mh_dylib - ONLY_ACTIVE_ARCH - YES - OTHER_LDFLAGS - - -lactor - $(inherited) - -framework - j2objc - - PRODUCT_BUNDLE_IDENTIFIER - im.actor.ActorSDK - PRODUCT_NAME - ActorSDK - PROVISIONING_PROFILE - - SKIP_INSTALL - YES - STRIP_INSTALLED_PRODUCT - YES - SWIFT_INCLUDE_PATHS - $(PROJECT_DIR)/ActorSDK/Sources/Libs/CommonCrypto $(PROJECT_DIR)/IDZSwiftCommonCrypto/Frameworks/$(PLATFORM_NAME) - SWIFT_OBJC_BRIDGING_HEADER - - SWIFT_OPTIMIZATION_LEVEL - -Owholemodule - SWIFT_VERSION - 3.0 - VALID_ARCHS - arm64 armv7 - WARNING_CFLAGS - -Wno-nullability-completeness - - isa - XCBuildConfiguration - name - Release - - 066A50E11BC4AF9F000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ActorSDK.swift - sourceTree - <group> - - 066A50E21BC4AF9F000E606E - - fileRef - 066A50E11BC4AF9F000E606E - isa - PBXBuildFile - - 066A511D1BC4B4BD000E606E - - children - - 066A51851BC4C377000E606E - 066A51681BC4C366000E606E - 065975041BC757A300B8C7DF - 066A52051BC4E962000E606E - 066A52041BC4E962000E606E - - isa - PBXGroup - path - ActorCore - sourceTree - <group> - - 066A51201BC4B53C000E606E - - children - - 066A51211BC4B55C000E606E - 066A51551BC4BEF5000E606E - 066A514F1BC4BE06000E606E - 066A51401BC4BB5C000E606E - 066A514B1BC4BD05000E606E - 066A51231BC4B56D000E606E - 066A51491BC4BCE0000E606E - 066A51451BC4BBC3000E606E - 066A51531BC4BE95000E606E - 066A51511BC4BE34000E606E - 066A514D1BC4BDE4000E606E - 066A51431BC4BBAF000E606E - 066A51471BC4BBF4000E606E - 06D5C0591C8E9B3B002D5045 - - isa - PBXGroup - path - SwiftExtensions - sourceTree - <group> - - 066A51211BC4B55C000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AADevice.swift - sourceTree - <group> - - 066A51221BC4B55C000E606E - - fileRef - 066A51211BC4B55C000E606E - isa - PBXBuildFile - - 066A51231BC4B56D000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Colors.swift - sourceTree - <group> - - 066A51241BC4B56D000E606E - - fileRef - 066A51231BC4B56D000E606E - isa - PBXBuildFile - - 066A51401BC4BB5C000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AssosiatedObject.swift - sourceTree - <group> - - 066A51411BC4BB5C000E606E - - fileRef - 066A51401BC4BB5C000E606E - isa - PBXBuildFile - - 066A51431BC4BBAF000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Strings.swift - sourceTree - <group> - - 066A51441BC4BBAF000E606E - - fileRef - 066A51431BC4BBAF000E606E - isa - PBXBuildFile - - 066A51451BC4BBC3000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Fonts.swift - sourceTree - <group> - - 066A51461BC4BBC3000E606E - - fileRef - 066A51451BC4BBC3000E606E - isa - PBXBuildFile - - 066A51471BC4BBF4000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Views.swift - sourceTree - <group> - - 066A51481BC4BBF4000E606E - - fileRef - 066A51471BC4BBF4000E606E - isa - PBXBuildFile - - 066A51491BC4BCE0000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Dispatch.swift - sourceTree - <group> - - 066A514A1BC4BCE0000E606E - - fileRef - 066A51491BC4BCE0000E606E - isa - PBXBuildFile - - 066A514B1BC4BD05000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Collections.swift - sourceTree - <group> - - 066A514C1BC4BD05000E606E - - fileRef - 066A514B1BC4BD05000E606E - isa - PBXBuildFile - - 066A514D1BC4BDE4000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Numbers.swift - sourceTree - <group> - - 066A514E1BC4BDE4000E606E - - fileRef - 066A514D1BC4BDE4000E606E - isa - PBXBuildFile - - 066A514F1BC4BE06000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AARegex.swift - sourceTree - <group> - - 066A51501BC4BE06000E606E - - fileRef - 066A514F1BC4BE06000E606E - isa - PBXBuildFile - - 066A51511BC4BE34000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Logs.swift - sourceTree - <group> - - 066A51521BC4BE34000E606E - - fileRef - 066A51511BC4BE34000E606E - isa - PBXBuildFile - - 066A51531BC4BE95000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Images.swift - sourceTree - <group> - - 066A51541BC4BE95000E606E - - fileRef - 066A51531BC4BE95000E606E - isa - PBXBuildFile - - 066A51551BC4BEF5000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AALocalized.swift - sourceTree - <group> - - 066A51561BC4BEF5000E606E - - fileRef - 066A51551BC4BEF5000E606E - isa - PBXBuildFile - - 066A51571BC4C112000E606E - - children - - 15D35F721C201B5300E3717A - 152AA8901C29887A0030DEEE - 06129AA81C8394700099286B - 06129AAA1C83B80A0099286B - 066A53311BC534F5000E606E - 066A515A1BC4C178000E606E - 066A51581BC4C14A000E606E - 066A51641BC4C366000E606E - 065975381BC7CA7B00B8C7DF - 06C1D07D1C8D0DE900B73632 - - isa - PBXGroup - path - Utils - sourceTree - <group> - - 066A51581BC4C14A000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AASwiftlyLRU.swift - sourceTree - <group> - - 066A51591BC4C14A000E606E - - fileRef - 066A51581BC4C14A000E606E - isa - PBXBuildFile - - 066A515A1BC4C178000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAHashMap.swift - sourceTree - <group> - - 066A515B1BC4C178000E606E - - fileRef - 066A515A1BC4C178000E606E - isa - PBXBuildFile - - 066A51641BC4C366000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AATools.swift - sourceTree - <group> - - 066A51681BC4C366000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ActorCoreExt.swift - sourceTree - <group> - - 066A51691BC4C366000E606E - - fileRef - 066A51641BC4C366000E606E - isa - PBXBuildFile - - 066A516D1BC4C366000E606E - - fileRef - 066A51681BC4C366000E606E - isa - PBXBuildFile - - 066A516E1BC4C369000E606E - - children - - 066A51711BC4C373000E606E - 066A516F1BC4C373000E606E - 066A51701BC4C373000E606E - 066A51721BC4C373000E606E - 066A51731BC4C373000E606E - 066A51741BC4C373000E606E - 066A51751BC4C373000E606E - 066A51761BC4C373000E606E - 066A51771BC4C373000E606E - 066A51781BC4C373000E606E - 066A51791BC4C373000E606E - - isa - PBXGroup - path - FMDB - sourceTree - <group> - - 066A516F1BC4C373000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - FMDatabase.h - sourceTree - <group> - - 066A51701BC4C373000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - FMDatabase.m - sourceTree - <group> - - 066A51711BC4C373000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - FMDatabase+Private.h - sourceTree - <group> - - 066A51721BC4C373000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - FMDatabaseAdditions.h - sourceTree - <group> - - 066A51731BC4C373000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - FMDatabaseAdditions.m - sourceTree - <group> - - 066A51741BC4C373000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - FMDatabasePool.h - sourceTree - <group> - - 066A51751BC4C373000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - FMDatabasePool.m - sourceTree - <group> - - 066A51761BC4C373000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - FMDatabaseQueue.h - sourceTree - <group> - - 066A51771BC4C373000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - FMDatabaseQueue.m - sourceTree - <group> - - 066A51781BC4C373000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - FMResultSet.h - sourceTree - <group> - - 066A51791BC4C373000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - FMResultSet.m - sourceTree - <group> - - 066A517A1BC4C373000E606E - - fileRef - 066A516F1BC4C373000E606E - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 066A517B1BC4C373000E606E - - fileRef - 066A51701BC4C373000E606E - isa - PBXBuildFile - - 066A517C1BC4C373000E606E - - fileRef - 066A51711BC4C373000E606E - isa - PBXBuildFile - - 066A517D1BC4C373000E606E - - fileRef - 066A51721BC4C373000E606E - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 066A517E1BC4C373000E606E - - fileRef - 066A51731BC4C373000E606E - isa - PBXBuildFile - - 066A517F1BC4C373000E606E - - fileRef - 066A51741BC4C373000E606E - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 066A51801BC4C373000E606E - - fileRef - 066A51751BC4C373000E606E - isa - PBXBuildFile - - 066A51811BC4C373000E606E - - fileRef - 066A51761BC4C373000E606E - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 066A51821BC4C373000E606E - - fileRef - 066A51771BC4C373000E606E - isa - PBXBuildFile - - 066A51831BC4C373000E606E - - fileRef - 066A51781BC4C373000E606E - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 066A51841BC4C373000E606E - - fileRef - 066A51791BC4C373000E606E - isa - PBXBuildFile - - 066A51851BC4C377000E606E - - children - - 066A51941BC4C385000E606E - 065975531BC7DF5100B8C7DF - 066A518B1BC4C383000E606E - 066A518A1BC4C383000E606E - 066A51891BC4C383000E606E - 066A51861BC4C383000E606E - 065A06B51C6CEFE00012EA09 - 06129AA51C8359FB0099286B - 0618509F1C95CA2600C522D5 - 06E1648E1C96D99F005AFB94 - 066A51871BC4C383000E606E - 066A51881BC4C383000E606E - 06E322C81C69344A00D66F53 - - isa - PBXGroup - path - Providers - sourceTree - <group> - - 066A51861BC4C383000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - CocoaStorageRuntime.swift - sourceTree - <group> - - 066A51871BC4C383000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - iOSNotificationProvider.swift - sourceTree - <group> - - 066A51881BC4C383000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - iOSPhoneBookProvider.swift - sourceTree - <group> - - 066A51891BC4C383000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - CocoaNetworkRuntime.swift - sourceTree - <group> - - 066A518A1BC4C383000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - CocoaHttpRuntime.swift - sourceTree - <group> - - 066A518B1BC4C383000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - CocoaFileSystemRuntime.swift - sourceTree - <group> - - 066A518D1BC4C383000E606E - - fileRef - 066A51861BC4C383000E606E - isa - PBXBuildFile - - 066A518E1BC4C383000E606E - - fileRef - 066A51871BC4C383000E606E - isa - PBXBuildFile - - 066A518F1BC4C383000E606E - - fileRef - 066A51881BC4C383000E606E - isa - PBXBuildFile - - 066A51901BC4C383000E606E - - fileRef - 066A51891BC4C383000E606E - isa - PBXBuildFile - - 066A51911BC4C383000E606E - - fileRef - 066A518A1BC4C383000E606E - isa - PBXBuildFile - - 066A51921BC4C383000E606E - - fileRef - 066A518B1BC4C383000E606E - isa - PBXBuildFile - - 066A51941BC4C385000E606E - - children - - 066A516E1BC4C369000E606E - 065975011BC7534100B8C7DF - 066A51991BC4C390000E606E - 066A51961BC4C390000E606E - 066A51951BC4C390000E606E - 066A51981BC4C390000E606E - - isa - PBXGroup - path - Storage - sourceTree - <group> - - 066A51951BC4C390000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - FMDBList.swift - sourceTree - <group> - - 066A51961BC4C390000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - FMDBKeyValue.swift - sourceTree - <group> - - 066A51981BC4C390000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - UDPreferencesStorage.swift - sourceTree - <group> - - 066A51991BC4C390000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - FMDBExtensions.swift - sourceTree - <group> - - 066A519A1BC4C390000E606E - - fileRef - 066A51951BC4C390000E606E - isa - PBXBuildFile - - 066A519B1BC4C390000E606E - - fileRef - 066A51961BC4C390000E606E - isa - PBXBuildFile - - 066A519D1BC4C390000E606E - - fileRef - 066A51981BC4C390000E606E - isa - PBXBuildFile - - 066A519E1BC4C390000E606E - - fileRef - 066A51991BC4C390000E606E - isa - PBXBuildFile - - 066A51FF1BC4E0B0000E606E - - isa - PBXFileReference - lastKnownFileType - sourcecode.text-based-dylib-definition - name - libsqlite3.tbd - path - usr/lib/libsqlite3.tbd - sourceTree - SDKROOT - - 066A52001BC4E0B0000E606E - - fileRef - 066A51FF1BC4E0B0000E606E - isa - PBXBuildFile - - 066A52041BC4E962000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - text.script.python - path - convert.py - sourceTree - <group> - - 066A52051BC4E962000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.make - path - Makefile - sourceTree - <group> - - 066A52081BC4E962000E606E - - fileRef - 066A52051BC4E962000E606E - isa - PBXBuildFile - - 066A52091BC4EA95000E606E - - buildActionMask - 2147483647 - files - - inputPaths - - isa - PBXShellScriptBuildPhase - name - Build and Install Actor Core - outputPaths - - runOnlyForDeploymentPostprocessing - 0 - shellPath - /bin/sh - shellScript - set -e +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { -cd ActorSDK/Sources/ActorCore -make translate -make build -j3 +/* Begin PBXBuildFile section */ + 060135031C95ED4C00A18C4E /* YYAsyncLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 060134FD1C95ED4C00A18C4E /* YYAsyncLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 060135041C95ED4C00A18C4E /* YYAsyncLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 060134FE1C95ED4C00A18C4E /* YYAsyncLayer.m */; }; + 060135051C95ED4C00A18C4E /* YYSentinel.h in Headers */ = {isa = PBXBuildFile; fileRef = 060134FF1C95ED4C00A18C4E /* YYSentinel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 060135061C95ED4C00A18C4E /* YYSentinel.m in Sources */ = {isa = PBXBuildFile; fileRef = 060135001C95ED4C00A18C4E /* YYSentinel.m */; }; + 060135071C95ED4C00A18C4E /* YYTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 060135011C95ED4C00A18C4E /* YYTransaction.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 060135081C95ED4C00A18C4E /* YYTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 060135021C95ED4C00A18C4E /* YYTransaction.m */; }; + 0601BBB21CA4C7DE00AEFA81 /* ElegantPresentations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0601BBB11CA4C7DE00AEFA81 /* ElegantPresentations.swift */; }; + 0601BBB41CA4C80D00AEFA81 /* ElegantPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0601BBB31CA4C80D00AEFA81 /* ElegantPresentationController.swift */; }; + 06129AA61C8359FB0099286B /* CocoaLifecycleRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06129AA51C8359FB0099286B /* CocoaLifecycleRuntime.swift */; }; + 06129AA91C8394700099286B /* AAAudioManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06129AA81C8394700099286B /* AAAudioManager.swift */; }; + 06129AAB1C83B80B0099286B /* AAAudioRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06129AAA1C83B80A0099286B /* AAAudioRouter.swift */; }; + 0618509E1C9582DD00C522D5 /* AABackgroundCellRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0618509D1C9582DD00C522D5 /* AABackgroundCellRenderer.swift */; }; + 061850A01C95CA2600C522D5 /* CocoaDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0618509F1C95CA2600C522D5 /* CocoaDispatcher.swift */; }; + 061850DA1C95CBF000C522D5 /* YYTextContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850A51C95CBF000C522D5 /* YYTextContainerView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850DB1C95CBF000C522D5 /* YYTextContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850A61C95CBF000C522D5 /* YYTextContainerView.m */; }; + 061850DC1C95CBF000C522D5 /* YYTextDebugOption.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850A71C95CBF000C522D5 /* YYTextDebugOption.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850DD1C95CBF000C522D5 /* YYTextDebugOption.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850A81C95CBF000C522D5 /* YYTextDebugOption.m */; }; + 061850DE1C95CBF000C522D5 /* YYTextEffectWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850A91C95CBF000C522D5 /* YYTextEffectWindow.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850DF1C95CBF000C522D5 /* YYTextEffectWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850AA1C95CBF000C522D5 /* YYTextEffectWindow.m */; }; + 061850E01C95CBF000C522D5 /* YYTextInput.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850AB1C95CBF000C522D5 /* YYTextInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850E11C95CBF000C522D5 /* YYTextInput.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850AC1C95CBF000C522D5 /* YYTextInput.m */; }; + 061850E21C95CBF000C522D5 /* YYTextKeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850AD1C95CBF000C522D5 /* YYTextKeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850E31C95CBF000C522D5 /* YYTextKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850AE1C95CBF000C522D5 /* YYTextKeyboardManager.m */; }; + 061850E41C95CBF000C522D5 /* YYTextLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850AF1C95CBF000C522D5 /* YYTextLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850E51C95CBF000C522D5 /* YYTextLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850B01C95CBF000C522D5 /* YYTextLayout.m */; }; + 061850E61C95CBF000C522D5 /* YYTextLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850B11C95CBF000C522D5 /* YYTextLine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850E71C95CBF000C522D5 /* YYTextLine.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850B21C95CBF000C522D5 /* YYTextLine.m */; }; + 061850E81C95CBF000C522D5 /* YYTextMagnifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850B31C95CBF000C522D5 /* YYTextMagnifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850E91C95CBF000C522D5 /* YYTextMagnifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850B41C95CBF000C522D5 /* YYTextMagnifier.m */; }; + 061850EA1C95CBF000C522D5 /* YYTextSelectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850B51C95CBF000C522D5 /* YYTextSelectionView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850EB1C95CBF000C522D5 /* YYTextSelectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850B61C95CBF000C522D5 /* YYTextSelectionView.m */; }; + 061850EC1C95CBF000C522D5 /* YYTextArchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850B81C95CBF000C522D5 /* YYTextArchiver.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850ED1C95CBF000C522D5 /* YYTextArchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850B91C95CBF000C522D5 /* YYTextArchiver.m */; }; + 061850EE1C95CBF000C522D5 /* YYTextAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850BA1C95CBF000C522D5 /* YYTextAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850EF1C95CBF000C522D5 /* YYTextAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850BB1C95CBF000C522D5 /* YYTextAttribute.m */; }; + 061850F01C95CBF000C522D5 /* YYTextParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850BC1C95CBF000C522D5 /* YYTextParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850F11C95CBF000C522D5 /* YYTextParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850BD1C95CBF000C522D5 /* YYTextParser.m */; }; + 061850F21C95CBF000C522D5 /* YYTextRubyAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850BE1C95CBF000C522D5 /* YYTextRubyAnnotation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850F31C95CBF000C522D5 /* YYTextRubyAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850BF1C95CBF000C522D5 /* YYTextRubyAnnotation.m */; }; + 061850F41C95CBF000C522D5 /* YYTextRunDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850C01C95CBF000C522D5 /* YYTextRunDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850F51C95CBF000C522D5 /* YYTextRunDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850C11C95CBF000C522D5 /* YYTextRunDelegate.m */; }; + 061850F61C95CBF000C522D5 /* NSAttributedString+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850C31C95CBF000C522D5 /* NSAttributedString+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850F71C95CBF000C522D5 /* NSAttributedString+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850C41C95CBF000C522D5 /* NSAttributedString+YYText.m */; }; + 061850F81C95CBF000C522D5 /* NSParagraphStyle+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850C51C95CBF000C522D5 /* NSParagraphStyle+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850F91C95CBF000C522D5 /* NSParagraphStyle+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850C61C95CBF000C522D5 /* NSParagraphStyle+YYText.m */; }; + 061850FA1C95CBF000C522D5 /* UIPasteboard+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850C71C95CBF000C522D5 /* UIPasteboard+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850FB1C95CBF000C522D5 /* UIPasteboard+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850C81C95CBF000C522D5 /* UIPasteboard+YYText.m */; }; + 061850FC1C95CBF000C522D5 /* UIView+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850C91C95CBF000C522D5 /* UIView+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850FD1C95CBF000C522D5 /* UIView+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850CA1C95CBF000C522D5 /* UIView+YYText.m */; }; + 061850FE1C95CBF000C522D5 /* YYTextAsyncLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850CB1C95CBF000C522D5 /* YYTextAsyncLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061850FF1C95CBF000C522D5 /* YYTextAsyncLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850CC1C95CBF000C522D5 /* YYTextAsyncLayer.m */; }; + 061851001C95CBF000C522D5 /* YYTextTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850CD1C95CBF000C522D5 /* YYTextTransaction.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061851011C95CBF000C522D5 /* YYTextTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850CE1C95CBF000C522D5 /* YYTextTransaction.m */; }; + 061851021C95CBF000C522D5 /* YYTextUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850CF1C95CBF000C522D5 /* YYTextUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061851031C95CBF000C522D5 /* YYTextUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850D01C95CBF000C522D5 /* YYTextUtilities.m */; }; + 061851041C95CBF000C522D5 /* YYTextWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850D11C95CBF000C522D5 /* YYTextWeakProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061851051C95CBF000C522D5 /* YYTextWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850D21C95CBF000C522D5 /* YYTextWeakProxy.m */; }; + 061851061C95CBF000C522D5 /* YYDispatchQueuePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850D31C95CBF000C522D5 /* YYDispatchQueuePool.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061851071C95CBF000C522D5 /* YYDispatchQueuePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850D41C95CBF000C522D5 /* YYDispatchQueuePool.m */; }; + 061851081C95CBF000C522D5 /* YYLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850D51C95CBF000C522D5 /* YYLabel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 061851091C95CBF000C522D5 /* YYLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850D61C95CBF000C522D5 /* YYLabel.m */; }; + 0618510A1C95CBF000C522D5 /* YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850D71C95CBF000C522D5 /* YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0618510B1C95CBF000C522D5 /* YYTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 061850D81C95CBF000C522D5 /* YYTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0618510C1C95CBF000C522D5 /* YYTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 061850D91C95CBF000C522D5 /* YYTextView.m */; }; + 06230F411BC95BD200A4807B /* RMPhoneFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 06230F3F1BC95BD200A4807B /* RMPhoneFormat.m */; }; + 06230F421BC95BD200A4807B /* RMPhoneFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 06230F401BC95BD200A4807B /* RMPhoneFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06230F451BC95C0E00A4807B /* ABPhoneFieldCodes.txt in Resources */ = {isa = PBXBuildFile; fileRef = 06230F431BC95C0E00A4807B /* ABPhoneFieldCodes.txt */; }; + 06230F461BC95C0E00A4807B /* PhoneFormats.dat in Resources */ = {isa = PBXBuildFile; fileRef = 06230F441BC95C0E00A4807B /* PhoneFormats.dat */; }; + 063074191BD68E370053DEAF /* bg_3_preview.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 063074161BD68E370053DEAF /* bg_3_preview.jpg */; }; + 0630741A1BD68E370053DEAF /* bg_2_preview.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 063074171BD68E370053DEAF /* bg_2_preview.jpg */; }; + 0630741B1BD68E370053DEAF /* bg_1_preview.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 063074181BD68E370053DEAF /* bg_1_preview.jpg */; }; + 064E41B51CA1D2FF00A4A9D1 /* AABigAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064E41B41CA1D2FF00A4A9D1 /* AABigAlertController.swift */; }; + 065974A51BC621F100B8C7DF /* AAAuthNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065974A41BC621F100B8C7DF /* AAAuthNavigationController.swift */; }; + 065974A71BC62B3600B8C7DF /* ViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065974A61BC62B3600B8C7DF /* ViewExtensions.swift */; }; + 065975021BC7534100B8C7DF /* FMDBBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065975011BC7534100B8C7DF /* FMDBBridge.swift */; }; + 065975051BC757A300B8C7DF /* ActorRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065975041BC757A300B8C7DF /* ActorRuntime.swift */; }; + 065975071BC7BB4000B8C7DF /* AANavigationBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065975061BC7BB4000B8C7DF /* AANavigationBadge.swift */; }; + 065975211BC7C84E00B8C7DF /* bg_1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 0659751E1BC7C84E00B8C7DF /* bg_1.jpg */; }; + 065975221BC7C84E00B8C7DF /* bg_3.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 0659751F1BC7C84E00B8C7DF /* bg_3.jpg */; }; + 065975231BC7C84E00B8C7DF /* bg_2.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 065975201BC7C84E00B8C7DF /* bg_2.jpg */; }; + 065975391BC7CA7B00B8C7DF /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065975381BC7CA7B00B8C7DF /* Bundle.swift */; }; + 0659753B1BC7D22200B8C7DF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0659753A1BC7D22200B8C7DF /* Images.xcassets */; }; + 065975441BC7D34200B8C7DF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 065975461BC7D34200B8C7DF /* Localizable.strings */; }; + 0659754B1BC7DBA000B8C7DF /* iapetus.caf in Resources */ = {isa = PBXBuildFile; fileRef = 065975491BC7DBA000B8C7DF /* iapetus.caf */; }; + 0659754C1BC7DBA000B8C7DF /* notification.caf in Resources */ = {isa = PBXBuildFile; fileRef = 0659754A1BC7DBA000B8C7DF /* notification.caf */; }; + 065975511BC7DD3C00B8C7DF /* highlight-default.min.css in Resources */ = {isa = PBXBuildFile; fileRef = 0659754E1BC7DD3C00B8C7DF /* highlight-default.min.css */; }; + 065975521BC7DD3C00B8C7DF /* highlight.min.js in Resources */ = {isa = PBXBuildFile; fileRef = 0659754F1BC7DD3C00B8C7DF /* highlight.min.js */; }; + 065975541BC7DF5100B8C7DF /* CocoaAssetsRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065975531BC7DF5100B8C7DF /* CocoaAssetsRuntime.swift */; }; + 065A06B61C6CEFE00012EA09 /* CocoaWebRTCRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065A06B51C6CEFE00012EA09 /* CocoaWebRTCRuntime.swift */; }; + 066A50D61BC4AE63000E606E /* ActorSDK.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A50D51BC4AE63000E606E /* ActorSDK.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 066A50E21BC4AF9F000E606E /* ActorSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A50E11BC4AF9F000E606E /* ActorSDK.swift */; }; + 066A51221BC4B55C000E606E /* AADevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51211BC4B55C000E606E /* AADevice.swift */; }; + 066A51241BC4B56D000E606E /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51231BC4B56D000E606E /* Colors.swift */; }; + 066A51411BC4BB5C000E606E /* AssosiatedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51401BC4BB5C000E606E /* AssosiatedObject.swift */; }; + 066A51441BC4BBAF000E606E /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51431BC4BBAF000E606E /* Strings.swift */; }; + 066A51461BC4BBC3000E606E /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51451BC4BBC3000E606E /* Fonts.swift */; }; + 066A51481BC4BBF4000E606E /* Views.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51471BC4BBF4000E606E /* Views.swift */; }; + 066A514A1BC4BCE0000E606E /* Dispatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51491BC4BCE0000E606E /* Dispatch.swift */; }; + 066A514C1BC4BD05000E606E /* Collections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A514B1BC4BD05000E606E /* Collections.swift */; }; + 066A514E1BC4BDE4000E606E /* Numbers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A514D1BC4BDE4000E606E /* Numbers.swift */; }; + 066A51501BC4BE06000E606E /* AARegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A514F1BC4BE06000E606E /* AARegex.swift */; }; + 066A51521BC4BE34000E606E /* Logs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51511BC4BE34000E606E /* Logs.swift */; }; + 066A51541BC4BE95000E606E /* Images.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51531BC4BE95000E606E /* Images.swift */; }; + 066A51561BC4BEF5000E606E /* AALocalized.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51551BC4BEF5000E606E /* AALocalized.swift */; }; + 066A51591BC4C14A000E606E /* AASwiftlyLRU.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51581BC4C14A000E606E /* AASwiftlyLRU.swift */; }; + 066A515B1BC4C178000E606E /* AAHashMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A515A1BC4C178000E606E /* AAHashMap.swift */; }; + 066A51691BC4C366000E606E /* AATools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51641BC4C366000E606E /* AATools.swift */; }; + 066A516D1BC4C366000E606E /* ActorCoreExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51681BC4C366000E606E /* ActorCoreExt.swift */; }; + 066A517A1BC4C373000E606E /* FMDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A516F1BC4C373000E606E /* FMDatabase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 066A517B1BC4C373000E606E /* FMDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 066A51701BC4C373000E606E /* FMDatabase.m */; }; + 066A517C1BC4C373000E606E /* FMDatabase+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A51711BC4C373000E606E /* FMDatabase+Private.h */; }; + 066A517D1BC4C373000E606E /* FMDatabaseAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A51721BC4C373000E606E /* FMDatabaseAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 066A517E1BC4C373000E606E /* FMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 066A51731BC4C373000E606E /* FMDatabaseAdditions.m */; }; + 066A517F1BC4C373000E606E /* FMDatabasePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A51741BC4C373000E606E /* FMDatabasePool.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 066A51801BC4C373000E606E /* FMDatabasePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 066A51751BC4C373000E606E /* FMDatabasePool.m */; }; + 066A51811BC4C373000E606E /* FMDatabaseQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A51761BC4C373000E606E /* FMDatabaseQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 066A51821BC4C373000E606E /* FMDatabaseQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 066A51771BC4C373000E606E /* FMDatabaseQueue.m */; }; + 066A51831BC4C373000E606E /* FMResultSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A51781BC4C373000E606E /* FMResultSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 066A51841BC4C373000E606E /* FMResultSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 066A51791BC4C373000E606E /* FMResultSet.m */; }; + 066A518D1BC4C383000E606E /* CocoaStorageRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51861BC4C383000E606E /* CocoaStorageRuntime.swift */; }; + 066A518E1BC4C383000E606E /* iOSNotificationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51871BC4C383000E606E /* iOSNotificationProvider.swift */; }; + 066A518F1BC4C383000E606E /* iOSPhoneBookProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51881BC4C383000E606E /* iOSPhoneBookProvider.swift */; }; + 066A51901BC4C383000E606E /* CocoaNetworkRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51891BC4C383000E606E /* CocoaNetworkRuntime.swift */; }; + 066A51911BC4C383000E606E /* CocoaHttpRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A518A1BC4C383000E606E /* CocoaHttpRuntime.swift */; }; + 066A51921BC4C383000E606E /* CocoaFileSystemRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A518B1BC4C383000E606E /* CocoaFileSystemRuntime.swift */; }; + 066A519A1BC4C390000E606E /* FMDBList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51951BC4C390000E606E /* FMDBList.swift */; }; + 066A519B1BC4C390000E606E /* FMDBKeyValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51961BC4C390000E606E /* FMDBKeyValue.swift */; }; + 066A519D1BC4C390000E606E /* UDPreferencesStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51981BC4C390000E606E /* UDPreferencesStorage.swift */; }; + 066A519E1BC4C390000E606E /* FMDBExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A51991BC4C390000E606E /* FMDBExtensions.swift */; }; + 066A52001BC4E0B0000E606E /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 066A51FF1BC4E0B0000E606E /* libsqlite3.tbd */; }; + 066A52081BC4E962000E606E /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 066A52051BC4E962000E606E /* Makefile */; }; + 066A52151BC4EE04000E606E /* AAAvatarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52141BC4EE04000E606E /* AAAvatarView.swift */; }; + 066A52221BC4EEAC000E606E /* AAManagedTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52191BC4EEAC000E606E /* AAManagedTable.swift */; settings = {COMPILER_FLAGS = "-w"; }; }; + 066A52231BC4EEAC000E606E /* AAManagedSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A521A1BC4EEAC000E606E /* AAManagedSection.swift */; }; + 066A52241BC4EEAC000E606E /* AAManagedRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A521B1BC4EEAC000E606E /* AAManagedRange.swift */; }; + 066A52251BC4EEAC000E606E /* ManagedBindedCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A521C1BC4EEAC000E606E /* ManagedBindedCells.swift */; }; + 066A52261BC4EEAC000E606E /* ManagedCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A521D1BC4EEAC000E606E /* ManagedCells.swift */; }; + 066A52271BC4EEAC000E606E /* AAContentTableController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A521E1BC4EEAC000E606E /* AAContentTableController.swift */; }; + 066A52281BC4EEAC000E606E /* AAManagedTableController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A521F1BC4EEAC000E606E /* AAManagedTableController.swift */; }; + 066A52291BC4EEAC000E606E /* ManagedTableExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52201BC4EEAC000E606E /* ManagedTableExtensions.swift */; }; + 066A522A1BC4EEAC000E606E /* ManagedAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52211BC4EEAC000E606E /* ManagedAlerts.swift */; }; + 066A52341BC4EEBA000E606E /* AACommonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A522C1BC4EEBA000E606E /* AACommonCell.swift */; }; + 066A52351BC4EEBA000E606E /* AATextCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A522D1BC4EEBA000E606E /* AATextCell.swift */; }; + 066A52361BC4EEBA000E606E /* AATitledCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A522E1BC4EEBA000E606E /* AATitledCell.swift */; }; + 066A52371BC4EEBA000E606E /* AATableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A522F1BC4EEBA000E606E /* AATableViewCell.swift */; }; + 066A52381BC4EEBA000E606E /* AAHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52301BC4EEBA000E606E /* AAHeaderCell.swift */; }; + 066A52391BC4EEBA000E606E /* AAEditCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52311BC4EEBA000E606E /* AAEditCell.swift */; }; + 066A52401BC4EECD000E606E /* AABigPlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A523A1BC4EECD000E606E /* AABigPlaceholderView.swift */; }; + 066A52421BC4EECD000E606E /* AATableViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A523C1BC4EECD000E606E /* AATableViewHeader.swift */; }; + 066A52431BC4EECD000E606E /* AATableViewSeparator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A523D1BC4EECD000E606E /* AATableViewSeparator.swift */; }; + 066A52451BC4EECD000E606E /* AAAvatarCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A523F1BC4EECD000E606E /* AAAvatarCell.swift */; }; + 066A52481BC4EED5000E606E /* AAProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52461BC4EED5000E606E /* AAProgressView.swift */; }; + 066A524B1BC4EF49000E606E /* AAViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52491BC4EF49000E606E /* AAViewController.swift */; }; + 066A52541BC4EF61000E606E /* AAImagePickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A524D1BC4EF61000E606E /* AAImagePickerController.swift */; }; + 066A52551BC4EF61000E606E /* AANavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A524E1BC4EF61000E606E /* AANavigationController.swift */; }; + 066A52561BC4EF61000E606E /* AATableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A524F1BC4EF61000E606E /* AATableViewController.swift */; }; + 066A52571BC4EF61000E606E /* AACollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52501BC4EF61000E606E /* AACollectionViewController.swift */; }; + 066A52581BC4EF61000E606E /* Alerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52511BC4EF61000E606E /* Alerts.swift */; }; + 066A52591BC4EF61000E606E /* Executions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52521BC4EF61000E606E /* Executions.swift */; }; + 066A525A1BC4EF61000E606E /* Navigations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52531BC4EF61000E606E /* Navigations.swift */; }; + 066A525C1BC502EB000E606E /* ActorSDKDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A525B1BC502EB000E606E /* ActorSDKDelegate.swift */; }; + 066A525E1BC503BB000E606E /* ActorApplicationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A525D1BC503BB000E606E /* ActorApplicationDelegate.swift */; }; + 066A52661BC50E7B000E606E /* AACountryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52611BC50E7B000E606E /* AACountryViewController.swift */; }; + 066A526A1BC50E7B000E606E /* AAAuthViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52651BC50E7B000E606E /* AAAuthViewController.swift */; }; + 066A526D1BC50E8B000E606E /* AAAuthCountryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A526C1BC50E8B000E606E /* AAAuthCountryCell.swift */; }; + 066A52731BC5101A000E606E /* ABPhoneField.h in Headers */ = {isa = PBXBuildFile; fileRef = 066A526F1BC5101A000E606E /* ABPhoneField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 066A52741BC5101A000E606E /* ABPhoneField.m in Sources */ = {isa = PBXBuildFile; fileRef = 066A52701BC5101A000E606E /* ABPhoneField.m */; }; + 066A527F1BC51ED0000E606E /* AARootSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A527C1BC51ED0000E606E /* AARootSplitViewController.swift */; }; + 066A52801BC51ED0000E606E /* AARootTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A527D1BC51ED0000E606E /* AARootTabViewController.swift */; }; + 066A52811BC51ED0000E606E /* AANoSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A527E1BC51ED0000E606E /* AANoSelectionViewController.swift */; }; + 066A52C71BC521EA000E606E /* AAEditTextController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52C51BC521EA000E606E /* AAEditTextController.swift */; }; + 066A52C81BC521EA000E606E /* AAEditFieldController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52C61BC521EA000E606E /* AAEditFieldController.swift */; }; + 066A52CC1BC521FA000E606E /* AADialogsListContentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52CA1BC521FA000E606E /* AADialogsListContentController.swift */; }; + 066A52CD1BC521FA000E606E /* AADialogsListContentControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52CB1BC521FA000E606E /* AADialogsListContentControllerDelegate.swift */; }; + 066A52D11BC52204000E606E /* AADialogCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52CF1BC52204000E606E /* AADialogCell.swift */; }; + 066A52D21BC52204000E606E /* AADialogSearchCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52D01BC52204000E606E /* AADialogSearchCell.swift */; }; + 066A52D61BC52378000E606E /* AAContactsListContentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52D41BC52378000E606E /* AAContactsListContentController.swift */; }; + 066A52D71BC52378000E606E /* AAContactsListContentControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52D51BC52378000E606E /* AAContactsListContentControllerDelegate.swift */; }; + 066A52DB1BC52385000E606E /* AAContactActionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52D91BC52385000E606E /* AAContactActionCell.swift */; }; + 066A52DC1BC52385000E606E /* AAContactCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52DA1BC52385000E606E /* AAContactCell.swift */; }; + 066A52DF1BC5241F000E606E /* AAWebActionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52DE1BC5241F000E606E /* AAWebActionController.swift */; }; + 066A52E51BC52A20000E606E /* AAGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52E21BC52A20000E606E /* AAGroupViewController.swift */; }; + 066A52E61BC52A20000E606E /* AAAddParticipantViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52E31BC52A20000E606E /* AAAddParticipantViewController.swift */; }; + 066A52E71BC52A20000E606E /* AAInviteLinkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52E41BC52A20000E606E /* AAInviteLinkViewController.swift */; }; + 066A52EA1BC52A2B000E606E /* AAGroupMemberCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52E91BC52A2B000E606E /* AAGroupMemberCell.swift */; }; + 066A52F01BC52B02000E606E /* AASettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52EC1BC52B02000E606E /* AASettingsViewController.swift */; }; + 066A52F11BC52B02000E606E /* AASettingsNotificationsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52ED1BC52B02000E606E /* AASettingsNotificationsViewController.swift */; }; + 066A52F21BC52B02000E606E /* AASettingsPrivacyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52EE1BC52B02000E606E /* AASettingsPrivacyViewController.swift */; }; + 066A52F31BC52B02000E606E /* AASettingsWallpapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52EF1BC52B02000E606E /* AASettingsWallpapper.swift */; }; + 066A52F71BC52B13000E606E /* AAWallpapperPreviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52F51BC52B13000E606E /* AAWallpapperPreviewCell.swift */; }; + 066A52F81BC52B13000E606E /* AAWallpapperSettingsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52F61BC52B13000E606E /* AAWallpapperSettingsCell.swift */; }; + 066A52FD1BC52FA8000E606E /* AAComposeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52FA1BC52FA8000E606E /* AAComposeController.swift */; }; + 066A52FE1BC52FA9000E606E /* AAGroupCreateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52FB1BC52FA8000E606E /* AAGroupCreateViewController.swift */; }; + 066A52FF1BC52FA9000E606E /* AAGroupMembersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A52FC1BC52FA8000E606E /* AAGroupMembersController.swift */; }; + 066A53041BC53177000E606E /* AAContactsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53031BC53177000E606E /* AAContactsViewController.swift */; }; + 066A53071BC53183000E606E /* AARecentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53061BC53183000E606E /* AARecentViewController.swift */; }; + 066A530B1BC531A2000E606E /* AAUserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A530A1BC531A2000E606E /* AAUserViewController.swift */; }; + 066A53101BC53317000E606E /* AAWallpapperPreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A530D1BC53317000E606E /* AAWallpapperPreviewController.swift */; }; + 066A53111BC53317000E606E /* AACorePreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A530E1BC53317000E606E /* AACorePreviewController.swift */; }; + 066A53121BC53317000E606E /* AAPhotoPreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A530F1BC53317000E606E /* AAPhotoPreviewController.swift */; }; + 066A53151BC533D5000E606E /* AAConversationContentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53141BC533D5000E606E /* AAConversationContentController.swift */; }; + 066A53171BC533DD000E606E /* AABubbles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53161BC533DD000E606E /* AABubbles.swift */; }; + 066A531A1BC533E7000E606E /* AAAutoCompleteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53191BC533E7000E606E /* AAAutoCompleteCell.swift */; }; + 066A53201BC533F5000E606E /* AABubbleBackgroundProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A531C1BC533F5000E606E /* AABubbleBackgroundProcessor.swift */; }; + 066A53211BC533F5000E606E /* BubbleLayouts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A531D1BC533F5000E606E /* BubbleLayouts.swift */; }; + 066A53221BC533F5000E606E /* AAMessagesFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A531E1BC533F5000E606E /* AAMessagesFlowLayout.swift */; }; + 066A53231BC533F5000E606E /* Caches.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A531F1BC533F5000E606E /* Caches.swift */; }; + 066A532B1BC53406000E606E /* AABubbleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53251BC53406000E606E /* AABubbleCell.swift */; }; + 066A532C1BC53406000E606E /* AABubbleTextCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53261BC53406000E606E /* AABubbleTextCell.swift */; }; + 066A532D1BC53406000E606E /* AABubbleServiceCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53271BC53406000E606E /* AABubbleServiceCell.swift */; }; + 066A532E1BC53406000E606E /* AABubbleBaseFileCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53281BC53406000E606E /* AABubbleBaseFileCell.swift */; }; + 066A532F1BC53406000E606E /* AABubbleMediaCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53291BC53406000E606E /* AABubbleMediaCell.swift */; }; + 066A53301BC53406000E606E /* AABubbleDocumentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A532A1BC53406000E606E /* AABubbleDocumentCell.swift */; }; + 066A53331BC534F5000E606E /* AAFileTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53311BC534F5000E606E /* AAFileTypes.swift */; }; + 066A53371BC537CA000E606E /* ConversationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53361BC537CA000E606E /* ConversationViewController.swift */; }; + 066A53391BC5456B000E606E /* ActorStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066A53381BC5456B000E606E /* ActorStyle.swift */; }; + 066CBCDC1C8D419F004507E2 /* AAAuthEmailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066CBCDB1C8D419F004507E2 /* AAAuthEmailViewController.swift */; }; + 067B67541D45341D00B9A238 /* AAGroupViewMembersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067B67531D45341D00B9A238 /* AAGroupViewMembersController.swift */; }; + 068AFC391C94A0050055F503 /* AADialogListProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 068AFC381C94A0050055F503 /* AADialogListProcessor.swift */; }; + 069CF4CC1BCB909A00C66E12 /* CLBackspaceDetectingTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 069CF4C41BCB909A00C66E12 /* CLBackspaceDetectingTextField.h */; }; + 069CF4CD1BCB909A00C66E12 /* CLBackspaceDetectingTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 069CF4C51BCB909A00C66E12 /* CLBackspaceDetectingTextField.m */; }; + 069CF4CE1BCB909A00C66E12 /* CLToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 069CF4C61BCB909A00C66E12 /* CLToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 069CF4CF1BCB909A00C66E12 /* CLToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 069CF4C71BCB909A00C66E12 /* CLToken.m */; }; + 069CF4D01BCB909A00C66E12 /* CLTokenInputView.h in Headers */ = {isa = PBXBuildFile; fileRef = 069CF4C81BCB909A00C66E12 /* CLTokenInputView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 069CF4D11BCB909A00C66E12 /* CLTokenInputView.m in Sources */ = {isa = PBXBuildFile; fileRef = 069CF4C91BCB909A00C66E12 /* CLTokenInputView.m */; }; + 069CF4D21BCB909A00C66E12 /* CLTokenView.h in Headers */ = {isa = PBXBuildFile; fileRef = 069CF4CA1BCB909A00C66E12 /* CLTokenView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 069CF4D31BCB909A00C66E12 /* CLTokenView.m in Sources */ = {isa = PBXBuildFile; fileRef = 069CF4CB1BCB909A00C66E12 /* CLTokenView.m */; }; + 06ABFE331D3FAF800031A0D6 /* GCDAsyncSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 06ABFE2F1D3FAF800031A0D6 /* GCDAsyncSocket.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06ABFE341D3FAF800031A0D6 /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 06ABFE301D3FAF800031A0D6 /* GCDAsyncSocket.m */; }; + 06ABFE381D3FCCE30031A0D6 /* AAGroupEditInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ABFE371D3FCCE30031A0D6 /* AAGroupEditInfoViewController.swift */; }; + 06ABFE3A1D410D2D0031A0D6 /* AAGroupTypeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ABFE391D410D2D0031A0D6 /* AAGroupTypeController.swift */; }; + 06ABFE3D1D41283A0031A0D6 /* AAGroupAdministrationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ABFE3C1D41283A0031A0D6 /* AAGroupAdministrationViewController.swift */; }; + 06B489ED1C9F6EBD0054245B /* AAStickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B489EC1C9F6EBC0054245B /* AAStickerView.swift */; }; + 06C1D0771C8BC9FC00B73632 /* AAAuthNameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C1D0761C8BC9FC00B73632 /* AAAuthNameViewController.swift */; }; + 06C1D07B1C8BFE5C00B73632 /* AAAuthPhoneViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C1D07A1C8BFE5C00B73632 /* AAAuthPhoneViewController.swift */; }; + 06C1D07E1C8D0DEA00B73632 /* Telephony.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C1D07D1C8D0DE900B73632 /* Telephony.swift */; }; + 06CE898C1BD841C9005A5530 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06CE898B1BD841C9005A5530 /* SystemConfiguration.framework */; }; + 06CE89901BD84DF5005A5530 /* ActorSDKAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06CE898F1BD84DF5005A5530 /* ActorSDKAnalytics.swift */; }; + 06D5C0571C8D6E20002D5045 /* AAAuthLogInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06D5C0561C8D6E20002D5045 /* AAAuthLogInViewController.swift */; }; + 06D5C05A1C8E9B3B002D5045 /* Promises.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06D5C0591C8E9B3B002D5045 /* Promises.swift */; }; + 06D5C05C1C8EA842002D5045 /* AAAuthOTPViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06D5C05B1C8EA842002D5045 /* AAAuthOTPViewController.swift */; }; + 06E1648F1C96D99F005AFB94 /* CocoaCrypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E1648E1C96D99F005AFB94 /* CocoaCrypto.swift */; }; + 06E322C91C69344A00D66F53 /* iOSCallsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E322C81C69344A00D66F53 /* iOSCallsProvider.swift */; }; + 06E3230E1C69445C00D66F53 /* WebRTC.h in Headers */ = {isa = PBXBuildFile; fileRef = 06E3230D1C6942C400D66F53 /* WebRTC.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06E323111C694C1D00D66F53 /* WebRTCExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E323101C694C1D00D66F53 /* WebRTCExt.swift */; }; + 06E323151C6A7AC000D66F53 /* AACallViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E323141C6A7AC000D66F53 /* AACallViewController.swift */; }; + 06E3C58B1C746CCC004776CD /* tone.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 06E3C58A1C746AAC004776CD /* tone.m4a */; }; + 06E3C58D1C749320004776CD /* ringtone.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 06E3C58C1C74931F004776CD /* ringtone.m4a */; }; + 06E3C5B81C80EE21004776CD /* AACircleButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E3C5B71C80EE20004776CD /* AACircleButton.swift */; }; + 06E7B2471C0F8D7A0090660C /* AALocationPickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E7B2461C0F8D7A0090660C /* AALocationPickerController.swift */; }; + 06E7B24A1C0F92140090660C /* AABubbleLocationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E7B2491C0F92140090660C /* AABubbleLocationCell.swift */; }; + 06E7B24C1C0FAB500090660C /* AAMapFastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E7B24B1C0FAB500090660C /* AAMapFastView.swift */; }; + 06E7B2521C1345E70090660C /* AAMapPinPointView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E7B2511C1345E70090660C /* AAMapPinPointView.swift */; }; + 06E7B2541C139B6F0090660C /* AABubbleContactCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E7B2531C139B6F0090660C /* AABubbleContactCell.swift */; }; + 152AA8A71C2989270030DEEE /* SLKInputAccessoryView.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8931C2989270030DEEE /* SLKInputAccessoryView.m */; }; + 152AA8A81C2989270030DEEE /* SLKTextInputbar.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA8941C2989270030DEEE /* SLKTextInputbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 152AA8A91C2989270030DEEE /* SLKTextInputbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8951C2989270030DEEE /* SLKTextInputbar.m */; }; + 152AA8AA1C2989270030DEEE /* SLKTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA8961C2989270030DEEE /* SLKTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 152AA8AB1C2989270030DEEE /* SLKTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8971C2989270030DEEE /* SLKTextView.m */; }; + 152AA8AC1C2989270030DEEE /* SLKTextView+SLKAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA8981C2989270030DEEE /* SLKTextView+SLKAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 152AA8AD1C2989270030DEEE /* SLKTextView+SLKAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8991C2989270030DEEE /* SLKTextView+SLKAdditions.m */; }; + 152AA8AE1C2989270030DEEE /* SLKTextViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA89A1C2989270030DEEE /* SLKTextViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 152AA8AF1C2989270030DEEE /* SLKTextViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA89B1C2989270030DEEE /* SLKTextViewController.m */; }; + 152AA8B01C2989270030DEEE /* SLKTypingIndicatorProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA89C1C2989270030DEEE /* SLKTypingIndicatorProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 152AA8B11C2989270030DEEE /* SLKTypingIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA89D1C2989270030DEEE /* SLKTypingIndicatorView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 152AA8B21C2989270030DEEE /* SLKTypingIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA89E1C2989270030DEEE /* SLKTypingIndicatorView.m */; }; + 152AA8B31C2989270030DEEE /* SLKUIConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA89F1C2989270030DEEE /* SLKUIConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 152AA8B51C2989270030DEEE /* UIResponder+SLKAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8A11C2989270030DEEE /* UIResponder+SLKAdditions.m */; }; + 152AA8B61C2989270030DEEE /* UIScrollView+SLKAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA8A21C2989270030DEEE /* UIScrollView+SLKAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 152AA8B71C2989270030DEEE /* UIScrollView+SLKAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8A31C2989270030DEEE /* UIScrollView+SLKAdditions.m */; }; + 152AA8B81C2989270030DEEE /* UIView+SLKAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 152AA8A41C2989270030DEEE /* UIView+SLKAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 152AA8B91C2989270030DEEE /* UIView+SLKAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8A51C2989270030DEEE /* UIView+SLKAdditions.m */; }; + 152AA8BD1C298BF00030DEEE /* AASettingsSessionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8BC1C298BF00030DEEE /* AASettingsSessionsController.swift */; }; + 152AA8BF1C298C4B0030DEEE /* AASettingsLastSeenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 152AA8BE1C298C4B0030DEEE /* AASettingsLastSeenController.swift */; }; + 153F6B5B1C2B109400C0B960 /* AABubbleVoiceCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153F6B5A1C2B109400C0B960 /* AABubbleVoiceCell.swift */; }; + 153F6B5D1C2B3AC500C0B960 /* AABubbleStickerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153F6B5C1C2B3AC500C0B960 /* AABubbleStickerCell.swift */; }; + 153F6B611C2BF8EC00C0B960 /* AAAuthWelcomeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153F6B601C2BF8EC00C0B960 /* AAAuthWelcomeController.swift */; }; + 153F6B8A1C2D7BA300C0B960 /* AATapLabelDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153F6B881C2D7BA300C0B960 /* AATapLabelDelegate.swift */; }; + 153F6B8B1C2D7BA400C0B960 /* AATapLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153F6B891C2D7BA300C0B960 /* AATapLabel.swift */; }; + 15D35F161C20185500E3717A /* diag_range.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F0C1C20185500E3717A /* diag_range.c */; }; + 15D35F171C20185500E3717A /* diag_range.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F0D1C20185500E3717A /* diag_range.h */; }; + 15D35F181C20185500E3717A /* opus_header.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F0E1C20185500E3717A /* opus_header.c */; }; + 15D35F191C20185500E3717A /* opus_header.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F0F1C20185500E3717A /* opus_header.h */; }; + 15D35F1A1C20185500E3717A /* opusenc.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F101C20185500E3717A /* opusenc.h */; }; + 15D35F1B1C20185500E3717A /* opusenc.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F111C20185500E3717A /* opusenc.m */; settings = {COMPILER_FLAGS = "-w"; }; }; + 15D35F1C1C20185500E3717A /* picture.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F121C20185500E3717A /* picture.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 15D35F1D1C20185500E3717A /* picture.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F131C20185500E3717A /* picture.h */; }; + 15D35F1E1C20185500E3717A /* wav_io.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F141C20185500E3717A /* wav_io.c */; }; + 15D35F1F1C20185500E3717A /* wav_io.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F151C20185500E3717A /* wav_io.h */; }; + 15D35F251C20186200E3717A /* bitwise.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F211C20186200E3717A /* bitwise.c */; }; + 15D35F261C20186200E3717A /* framing.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F221C20186200E3717A /* framing.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 15D35F271C20186200E3717A /* ogg.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F231C20186200E3717A /* ogg.h */; }; + 15D35F281C20186200E3717A /* os_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F241C20186200E3717A /* os_types.h */; }; + 15D35F301C20187200E3717A /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F2A1C20187200E3717A /* info.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 15D35F311C20187200E3717A /* internal.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F2B1C20187200E3717A /* internal.c */; }; + 15D35F321C20187200E3717A /* internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F2C1C20187200E3717A /* internal.h */; }; + 15D35F331C20187200E3717A /* opusfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F2D1C20187200E3717A /* opusfile.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 15D35F341C20187200E3717A /* opusfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F2E1C20187200E3717A /* opusfile.h */; }; + 15D35F351C20187200E3717A /* stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F2F1C20187200E3717A /* stream.c */; }; + 15D35F511C20187E00E3717A /* ASQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F361C20187E00E3717A /* ASQueue.h */; }; + 15D35F521C20187E00E3717A /* ASQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F371C20187E00E3717A /* ASQueue.m */; }; + 15D35F531C20187E00E3717A /* AAOpusAudioRecorder.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F381C20187E00E3717A /* AAOpusAudioRecorder.h */; }; + 15D35F541C20187E00E3717A /* AAOpusAudioRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F391C20187E00E3717A /* AAOpusAudioRecorder.m */; settings = {COMPILER_FLAGS = "-w"; }; }; + 15D35F551C20187E00E3717A /* AAAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F3A1C20187E00E3717A /* AAAlertView.h */; }; + 15D35F561C20187E00E3717A /* AAAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F3B1C20187E00E3717A /* AAAlertView.m */; }; + 15D35F571C20187E00E3717A /* AAAudioRecorder.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F3C1C20187E00E3717A /* AAAudioRecorder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 15D35F591C20187E00E3717A /* AATimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F3E1C20187E00E3717A /* AATimer.h */; }; + 15D35F5A1C20187E00E3717A /* AATimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F3F1C20187E00E3717A /* AATimer.m */; }; + 15D35F5B1C20187E00E3717A /* AAAudioPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F401C20187E00E3717A /* AAAudioPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 15D35F5C1C20187E00E3717A /* AAAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F411C20187E00E3717A /* AAAudioPlayer.m */; }; + 15D35F5D1C20187E00E3717A /* AANativeAudioPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F421C20187E00E3717A /* AANativeAudioPlayer.h */; }; + 15D35F5E1C20187E00E3717A /* AANativeAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F431C20187E00E3717A /* AANativeAudioPlayer.m */; }; + 15D35F5F1C20187E00E3717A /* AAOpusAudioPlayerAU.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F441C20187E00E3717A /* AAOpusAudioPlayerAU.h */; }; + 15D35F601C20187E00E3717A /* AAOpusAudioPlayerAU.mm in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F451C20187E00E3717A /* AAOpusAudioPlayerAU.mm */; settings = {COMPILER_FLAGS = "-w"; }; }; + 15D35F611C20187E00E3717A /* AAAudioBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F461C20187E00E3717A /* AAAudioBuffer.h */; }; + 15D35F621C20187E00E3717A /* AAModernConversationAudioPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F471C20187E00E3717A /* AAModernConversationAudioPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 15D35F631C20187E00E3717A /* AAModernConversationAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F481C20187E00E3717A /* AAModernConversationAudioPlayer.m */; }; + 15D35F641C20187E00E3717A /* AAModernConversationAudioPlayerContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F491C20187E00E3717A /* AAModernConversationAudioPlayerContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 15D35F651C20187E00E3717A /* AAModernConversationAudioPlayerContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F4A1C20187E00E3717A /* AAModernConversationAudioPlayerContext.m */; }; + 15D35F661C20187E00E3717A /* NSObject+TGLock.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F4B1C20187E00E3717A /* NSObject+TGLock.h */; }; + 15D35F671C20187E00E3717A /* NSObject+TGLock.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F4C1C20187E00E3717A /* NSObject+TGLock.m */; }; + 15D35F681C20187E00E3717A /* AAModernViewInlineMediaContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F4D1C20187E00E3717A /* AAModernViewInlineMediaContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 15D35F691C20187E00E3717A /* AAModernViewInlineMediaContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F4E1C20187E00E3717A /* AAModernViewInlineMediaContext.m */; }; + 15D35F6A1C20187E00E3717A /* AATimerTarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 15D35F4F1C20187E00E3717A /* AATimerTarget.h */; }; + 15D35F6B1C20187E00E3717A /* AATimerTarget.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F501C20187E00E3717A /* AATimerTarget.m */; }; + 15D35F6F1C20196E00E3717A /* AARecordAudioController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F6E1C20196E00E3717A /* AARecordAudioController.swift */; }; + 15D35F751C201B6B00E3717A /* AACustomPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F731C201B6B00E3717A /* AACustomPresentationController.swift */; }; + 15D35F761C201B6B00E3717A /* AACustomPresentationAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F741C201B6B00E3717A /* AACustomPresentationAnimationController.swift */; }; + 15D35F781C20273D00E3717A /* AAAudioRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = 15D35F3D1C20187E00E3717A /* AAAudioRecorder.m */; settings = {COMPILER_FLAGS = "-w"; }; }; + 15F89F071C211FED00776ACD /* opus_defines.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F031C211FED00776ACD /* opus_defines.h */; }; + 15F89F081C211FED00776ACD /* opus_multistream.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F041C211FED00776ACD /* opus_multistream.h */; }; + 15F89F091C211FED00776ACD /* opus_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F051C211FED00776ACD /* opus_types.h */; }; + 15F89F0A1C211FED00776ACD /* opus.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F061C211FED00776ACD /* opus.h */; }; + 9AA6A41F1D08568A00957A7F /* AASettingsMediaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AA6A41E1D08568A00957A7F /* AASettingsMediaViewController.swift */; }; + 9AAE96481CF81F140092E366 /* AARingtonesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AAE96471CF81F140092E366 /* AARingtonesViewController.swift */; }; + BDF21708B376E212CEAEC43D /* Pods_ActorSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 354C3EFA48FBFAEAD0DEEE17 /* Pods_ActorSDK.framework */; }; + BE237C9D1C422FFA00060648 /* AAStickersKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE237C9C1C422FFA00060648 /* AAStickersKeyboard.swift */; }; + BE2621571C4656D700A817AB /* AAConvActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2621561C4656D700A817AB /* AAConvActionSheet.swift */; }; + BE2621591C4656EE00A817AB /* AAThumbnailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2621581C4656EE00A817AB /* AAThumbnailView.swift */; }; + BE281CC51C502B230042F6D4 /* AAVoiceRecorderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE281CC41C502B230042F6D4 /* AAVoiceRecorderView.swift */; }; + BE4DBE6C1C5723BE00A31894 /* AttributedLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE4DBE6B1C5723BE00A31894 /* AttributedLabel.swift */; }; + BEAC2B311C42D683007F7A2F /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 15F89F001C211FDE00776ACD /* libopus.a */; }; + BED5A1D71C4839590045FDB0 /* NYTPhotoViewerCloseButtonX.png in Resources */ = {isa = PBXBuildFile; fileRef = BED5A1D11C4839590045FDB0 /* NYTPhotoViewerCloseButtonX.png */; }; + BED5A1D81C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BED5A1D21C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@2x.png */; }; + BED5A1D91C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = BED5A1D31C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@3x.png */; }; + BED5A1DA1C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape.png in Resources */ = {isa = PBXBuildFile; fileRef = BED5A1D41C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape.png */; }; + BED5A1DB1C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BED5A1D51C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@2x.png */; }; + BED5A1DC1C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = BED5A1D61C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@3x.png */; }; + BED5A1F11C48396A0045FDB0 /* NYTPhotoCaptionView.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1DF1C48396A0045FDB0 /* NYTPhotoCaptionView.m */; }; + BED5A1F31C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1E11C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.m */; }; + BED5A1F51C48396A0045FDB0 /* NYTPhotosDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1E31C48396A0045FDB0 /* NYTPhotosDataSource.m */; }; + BED5A1F71C48396A0045FDB0 /* NYTPhotosOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1E51C48396A0045FDB0 /* NYTPhotosOverlayView.m */; }; + BED5A1F81C48396A0045FDB0 /* NYTPhotosViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = BED5A1E61C48396A0045FDB0 /* NYTPhotosViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BED5A1F91C48396A0045FDB0 /* NYTPhotosViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1E71C48396A0045FDB0 /* NYTPhotosViewController.m */; }; + BED5A1FB1C48396A0045FDB0 /* NYTPhotoTransitionAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1E91C48396A0045FDB0 /* NYTPhotoTransitionAnimator.m */; }; + BED5A1FD1C48396A0045FDB0 /* NYTPhotoTransitionController.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1EB1C48396A0045FDB0 /* NYTPhotoTransitionController.m */; }; + BED5A1FE1C48396A0045FDB0 /* NYTPhotoViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = BED5A1EC1C48396A0045FDB0 /* NYTPhotoViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BED5A1FF1C48396A0045FDB0 /* NYTPhotoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1ED1C48396A0045FDB0 /* NYTPhotoViewController.m */; }; + BED5A2011C48396A0045FDB0 /* NYTScalingImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A1EF1C48396A0045FDB0 /* NYTScalingImageView.m */; }; + BED5A2071C4839790045FDB0 /* NYTPhoto.h in Headers */ = {isa = PBXBuildFile; fileRef = BED5A2031C4839790045FDB0 /* NYTPhoto.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BED5A20F1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.m in Sources */ = {isa = PBXBuildFile; fileRef = BED5A20D1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.m */; }; + BED5A2111C48413C0045FDB0 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */ = {isa = PBXBuildFile; fileRef = BED5A2041C4839790045FDB0 /* NYTPhotoCaptionViewLayoutWidthHinting.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BED5A2121C48413C0045FDB0 /* NYTPhotoContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = BED5A2051C4839790045FDB0 /* NYTPhotoContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BED5A2131C48413C0045FDB0 /* NYTPhotosViewControllerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = BED5A2061C4839790045FDB0 /* NYTPhotosViewControllerDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BEE6EB011C4D7B7500A2280E /* AASettingsWallpapersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEE6EB001C4D7B7500A2280E /* AASettingsWallpapersController.swift */; }; + BEE6EB041C4D9A4900A2280E /* AAWallpapersCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEE6EB031C4D9A4900A2280E /* AAWallpapersCell.swift */; }; + BEF11DB61C466D800076400A /* begin_record.caf in Resources */ = {isa = PBXBuildFile; fileRef = 153F6B3C1C2A9B1900C0B960 /* begin_record.caf */; }; + BEFE68D51C4657360001F2D6 /* AAThumbnailCollectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEFE68D41C4657360001F2D6 /* AAThumbnailCollectionCell.swift */; }; +/* End PBXBuildFile section */ -cd "${CONFIGURATION_TEMP_DIR}/j2objc/" -python "${PROJECT_DIR}/ActorSDK/Sources/ActorCore/convert.py" "${PROJECT_DIR}/ActorSDK/Sources/ActorCore/ActorCore.h" +/* Begin PBXFileReference section */ + 060134FD1C95ED4C00A18C4E /* YYAsyncLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYAsyncLayer.h; sourceTree = ""; }; + 060134FE1C95ED4C00A18C4E /* YYAsyncLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYAsyncLayer.m; sourceTree = ""; }; + 060134FF1C95ED4C00A18C4E /* YYSentinel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYSentinel.h; sourceTree = ""; }; + 060135001C95ED4C00A18C4E /* YYSentinel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYSentinel.m; sourceTree = ""; }; + 060135011C95ED4C00A18C4E /* YYTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTransaction.h; sourceTree = ""; }; + 060135021C95ED4C00A18C4E /* YYTransaction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTransaction.m; sourceTree = ""; }; + 0601BBB11CA4C7DE00AEFA81 /* ElegantPresentations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ElegantPresentations.swift; sourceTree = ""; }; + 0601BBB31CA4C80D00AEFA81 /* ElegantPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ElegantPresentationController.swift; sourceTree = ""; }; + 06129AA51C8359FB0099286B /* CocoaLifecycleRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaLifecycleRuntime.swift; sourceTree = ""; }; + 06129AA81C8394700099286B /* AAAudioManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAudioManager.swift; sourceTree = ""; }; + 06129AAA1C83B80A0099286B /* AAAudioRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAudioRouter.swift; sourceTree = ""; }; + 0618509D1C9582DD00C522D5 /* AABackgroundCellRenderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABackgroundCellRenderer.swift; sourceTree = ""; }; + 0618509F1C95CA2600C522D5 /* CocoaDispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaDispatcher.swift; sourceTree = ""; }; + 061850A51C95CBF000C522D5 /* YYTextContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextContainerView.h; sourceTree = ""; }; + 061850A61C95CBF000C522D5 /* YYTextContainerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextContainerView.m; sourceTree = ""; }; + 061850A71C95CBF000C522D5 /* YYTextDebugOption.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextDebugOption.h; sourceTree = ""; }; + 061850A81C95CBF000C522D5 /* YYTextDebugOption.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextDebugOption.m; sourceTree = ""; }; + 061850A91C95CBF000C522D5 /* YYTextEffectWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextEffectWindow.h; sourceTree = ""; }; + 061850AA1C95CBF000C522D5 /* YYTextEffectWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextEffectWindow.m; sourceTree = ""; }; + 061850AB1C95CBF000C522D5 /* YYTextInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextInput.h; sourceTree = ""; }; + 061850AC1C95CBF000C522D5 /* YYTextInput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextInput.m; sourceTree = ""; }; + 061850AD1C95CBF000C522D5 /* YYTextKeyboardManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextKeyboardManager.h; sourceTree = ""; }; + 061850AE1C95CBF000C522D5 /* YYTextKeyboardManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextKeyboardManager.m; sourceTree = ""; }; + 061850AF1C95CBF000C522D5 /* YYTextLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextLayout.h; sourceTree = ""; }; + 061850B01C95CBF000C522D5 /* YYTextLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextLayout.m; sourceTree = ""; }; + 061850B11C95CBF000C522D5 /* YYTextLine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextLine.h; sourceTree = ""; }; + 061850B21C95CBF000C522D5 /* YYTextLine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextLine.m; sourceTree = ""; }; + 061850B31C95CBF000C522D5 /* YYTextMagnifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextMagnifier.h; sourceTree = ""; }; + 061850B41C95CBF000C522D5 /* YYTextMagnifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextMagnifier.m; sourceTree = ""; }; + 061850B51C95CBF000C522D5 /* YYTextSelectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextSelectionView.h; sourceTree = ""; }; + 061850B61C95CBF000C522D5 /* YYTextSelectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextSelectionView.m; sourceTree = ""; }; + 061850B81C95CBF000C522D5 /* YYTextArchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextArchiver.h; sourceTree = ""; }; + 061850B91C95CBF000C522D5 /* YYTextArchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextArchiver.m; sourceTree = ""; }; + 061850BA1C95CBF000C522D5 /* YYTextAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextAttribute.h; sourceTree = ""; }; + 061850BB1C95CBF000C522D5 /* YYTextAttribute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextAttribute.m; sourceTree = ""; }; + 061850BC1C95CBF000C522D5 /* YYTextParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextParser.h; sourceTree = ""; }; + 061850BD1C95CBF000C522D5 /* YYTextParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextParser.m; sourceTree = ""; }; + 061850BE1C95CBF000C522D5 /* YYTextRubyAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextRubyAnnotation.h; sourceTree = ""; }; + 061850BF1C95CBF000C522D5 /* YYTextRubyAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextRubyAnnotation.m; sourceTree = ""; }; + 061850C01C95CBF000C522D5 /* YYTextRunDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextRunDelegate.h; sourceTree = ""; }; + 061850C11C95CBF000C522D5 /* YYTextRunDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextRunDelegate.m; sourceTree = ""; }; + 061850C31C95CBF000C522D5 /* NSAttributedString+YYText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSAttributedString+YYText.h"; sourceTree = ""; }; + 061850C41C95CBF000C522D5 /* NSAttributedString+YYText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSAttributedString+YYText.m"; sourceTree = ""; }; + 061850C51C95CBF000C522D5 /* NSParagraphStyle+YYText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSParagraphStyle+YYText.h"; sourceTree = ""; }; + 061850C61C95CBF000C522D5 /* NSParagraphStyle+YYText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSParagraphStyle+YYText.m"; sourceTree = ""; }; + 061850C71C95CBF000C522D5 /* UIPasteboard+YYText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIPasteboard+YYText.h"; sourceTree = ""; }; + 061850C81C95CBF000C522D5 /* UIPasteboard+YYText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIPasteboard+YYText.m"; sourceTree = ""; }; + 061850C91C95CBF000C522D5 /* UIView+YYText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+YYText.h"; sourceTree = ""; }; + 061850CA1C95CBF000C522D5 /* UIView+YYText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+YYText.m"; sourceTree = ""; }; + 061850CB1C95CBF000C522D5 /* YYTextAsyncLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextAsyncLayer.h; sourceTree = ""; }; + 061850CC1C95CBF000C522D5 /* YYTextAsyncLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextAsyncLayer.m; sourceTree = ""; }; + 061850CD1C95CBF000C522D5 /* YYTextTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextTransaction.h; sourceTree = ""; }; + 061850CE1C95CBF000C522D5 /* YYTextTransaction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextTransaction.m; sourceTree = ""; }; + 061850CF1C95CBF000C522D5 /* YYTextUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextUtilities.h; sourceTree = ""; }; + 061850D01C95CBF000C522D5 /* YYTextUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextUtilities.m; sourceTree = ""; }; + 061850D11C95CBF000C522D5 /* YYTextWeakProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextWeakProxy.h; sourceTree = ""; }; + 061850D21C95CBF000C522D5 /* YYTextWeakProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextWeakProxy.m; sourceTree = ""; }; + 061850D31C95CBF000C522D5 /* YYDispatchQueuePool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYDispatchQueuePool.h; sourceTree = ""; }; + 061850D41C95CBF000C522D5 /* YYDispatchQueuePool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYDispatchQueuePool.m; sourceTree = ""; }; + 061850D51C95CBF000C522D5 /* YYLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYLabel.h; sourceTree = ""; }; + 061850D61C95CBF000C522D5 /* YYLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYLabel.m; sourceTree = ""; }; + 061850D71C95CBF000C522D5 /* YYText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYText.h; sourceTree = ""; }; + 061850D81C95CBF000C522D5 /* YYTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYTextView.h; sourceTree = ""; }; + 061850D91C95CBF000C522D5 /* YYTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYTextView.m; sourceTree = ""; }; + 06230F3F1BC95BD200A4807B /* RMPhoneFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMPhoneFormat.m; sourceTree = ""; }; + 06230F401BC95BD200A4807B /* RMPhoneFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMPhoneFormat.h; sourceTree = ""; }; + 06230F431BC95C0E00A4807B /* ABPhoneFieldCodes.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ABPhoneFieldCodes.txt; sourceTree = ""; }; + 06230F441BC95C0E00A4807B /* PhoneFormats.dat */ = {isa = PBXFileReference; lastKnownFileType = file; path = PhoneFormats.dat; sourceTree = ""; }; + 063074161BD68E370053DEAF /* bg_3_preview.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg_3_preview.jpg; sourceTree = ""; }; + 063074171BD68E370053DEAF /* bg_2_preview.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg_2_preview.jpg; sourceTree = ""; }; + 063074181BD68E370053DEAF /* bg_1_preview.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg_1_preview.jpg; sourceTree = ""; }; + 064E41B41CA1D2FF00A4A9D1 /* AABigAlertController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABigAlertController.swift; sourceTree = ""; }; + 065974A41BC621F100B8C7DF /* AAAuthNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthNavigationController.swift; sourceTree = ""; }; + 065974A61BC62B3600B8C7DF /* ViewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewExtensions.swift; sourceTree = ""; }; + 065975011BC7534100B8C7DF /* FMDBBridge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FMDBBridge.swift; sourceTree = ""; }; + 065975041BC757A300B8C7DF /* ActorRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorRuntime.swift; sourceTree = ""; }; + 065975061BC7BB4000B8C7DF /* AANavigationBadge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AANavigationBadge.swift; sourceTree = ""; }; + 0659751E1BC7C84E00B8C7DF /* bg_1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg_1.jpg; sourceTree = ""; }; + 0659751F1BC7C84E00B8C7DF /* bg_3.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg_3.jpg; sourceTree = ""; }; + 065975201BC7C84E00B8C7DF /* bg_2.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg_2.jpg; sourceTree = ""; }; + 065975381BC7CA7B00B8C7DF /* Bundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = ""; }; + 0659753A1BC7D22200B8C7DF /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 065975451BC7D34200B8C7DF /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = ""; }; + 065975471BC7D34400B8C7DF /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + 065975481BC7D34600B8C7DF /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + 065975491BC7DBA000B8C7DF /* iapetus.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = iapetus.caf; sourceTree = ""; }; + 0659754A1BC7DBA000B8C7DF /* notification.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = notification.caf; sourceTree = ""; }; + 0659754D1BC7DCED00B8C7DF /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + 0659754E1BC7DD3C00B8C7DF /* highlight-default.min.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "highlight-default.min.css"; sourceTree = ""; }; + 0659754F1BC7DD3C00B8C7DF /* highlight.min.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = highlight.min.js; sourceTree = ""; }; + 065975531BC7DF5100B8C7DF /* CocoaAssetsRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaAssetsRuntime.swift; sourceTree = ""; }; + 065A06B51C6CEFE00012EA09 /* CocoaWebRTCRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaWebRTCRuntime.swift; sourceTree = ""; }; + 066A50D21BC4AE63000E606E /* ActorSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ActorSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 066A50D51BC4AE63000E606E /* ActorSDK.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ActorSDK.h; sourceTree = ""; }; + 066A50D71BC4AE63000E606E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 066A50E11BC4AF9F000E606E /* ActorSDK.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorSDK.swift; sourceTree = ""; }; + 066A51211BC4B55C000E606E /* AADevice.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AADevice.swift; sourceTree = ""; }; + 066A51231BC4B56D000E606E /* Colors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; + 066A51401BC4BB5C000E606E /* AssosiatedObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssosiatedObject.swift; sourceTree = ""; }; + 066A51431BC4BBAF000E606E /* Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Strings.swift; sourceTree = ""; }; + 066A51451BC4BBC3000E606E /* Fonts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fonts.swift; sourceTree = ""; }; + 066A51471BC4BBF4000E606E /* Views.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Views.swift; sourceTree = ""; }; + 066A51491BC4BCE0000E606E /* Dispatch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Dispatch.swift; sourceTree = ""; }; + 066A514B1BC4BD05000E606E /* Collections.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Collections.swift; sourceTree = ""; }; + 066A514D1BC4BDE4000E606E /* Numbers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Numbers.swift; sourceTree = ""; }; + 066A514F1BC4BE06000E606E /* AARegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARegex.swift; sourceTree = ""; }; + 066A51511BC4BE34000E606E /* Logs.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logs.swift; sourceTree = ""; }; + 066A51531BC4BE95000E606E /* Images.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Images.swift; sourceTree = ""; }; + 066A51551BC4BEF5000E606E /* AALocalized.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AALocalized.swift; sourceTree = ""; }; + 066A51581BC4C14A000E606E /* AASwiftlyLRU.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASwiftlyLRU.swift; sourceTree = ""; }; + 066A515A1BC4C178000E606E /* AAHashMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAHashMap.swift; sourceTree = ""; }; + 066A51641BC4C366000E606E /* AATools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATools.swift; sourceTree = ""; }; + 066A51681BC4C366000E606E /* ActorCoreExt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorCoreExt.swift; sourceTree = ""; }; + 066A516F1BC4C373000E606E /* FMDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabase.h; sourceTree = ""; }; + 066A51701BC4C373000E606E /* FMDatabase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabase.m; sourceTree = ""; }; + 066A51711BC4C373000E606E /* FMDatabase+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "FMDatabase+Private.h"; sourceTree = ""; }; + 066A51721BC4C373000E606E /* FMDatabaseAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabaseAdditions.h; sourceTree = ""; }; + 066A51731BC4C373000E606E /* FMDatabaseAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabaseAdditions.m; sourceTree = ""; }; + 066A51741BC4C373000E606E /* FMDatabasePool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabasePool.h; sourceTree = ""; }; + 066A51751BC4C373000E606E /* FMDatabasePool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabasePool.m; sourceTree = ""; }; + 066A51761BC4C373000E606E /* FMDatabaseQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabaseQueue.h; sourceTree = ""; }; + 066A51771BC4C373000E606E /* FMDatabaseQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabaseQueue.m; sourceTree = ""; }; + 066A51781BC4C373000E606E /* FMResultSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMResultSet.h; sourceTree = ""; }; + 066A51791BC4C373000E606E /* FMResultSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMResultSet.m; sourceTree = ""; }; + 066A51861BC4C383000E606E /* CocoaStorageRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaStorageRuntime.swift; sourceTree = ""; }; + 066A51871BC4C383000E606E /* iOSNotificationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iOSNotificationProvider.swift; sourceTree = ""; }; + 066A51881BC4C383000E606E /* iOSPhoneBookProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iOSPhoneBookProvider.swift; sourceTree = ""; }; + 066A51891BC4C383000E606E /* CocoaNetworkRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaNetworkRuntime.swift; sourceTree = ""; }; + 066A518A1BC4C383000E606E /* CocoaHttpRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaHttpRuntime.swift; sourceTree = ""; }; + 066A518B1BC4C383000E606E /* CocoaFileSystemRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaFileSystemRuntime.swift; sourceTree = ""; }; + 066A51951BC4C390000E606E /* FMDBList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FMDBList.swift; sourceTree = ""; }; + 066A51961BC4C390000E606E /* FMDBKeyValue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FMDBKeyValue.swift; sourceTree = ""; }; + 066A51981BC4C390000E606E /* UDPreferencesStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UDPreferencesStorage.swift; sourceTree = ""; }; + 066A51991BC4C390000E606E /* FMDBExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FMDBExtensions.swift; sourceTree = ""; }; + 066A51FF1BC4E0B0000E606E /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; + 066A52041BC4E962000E606E /* convert.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = convert.py; sourceTree = ""; }; + 066A52051BC4E962000E606E /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; + 066A52141BC4EE04000E606E /* AAAvatarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAvatarView.swift; sourceTree = ""; }; + 066A52191BC4EEAC000E606E /* AAManagedTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAManagedTable.swift; sourceTree = ""; }; + 066A521A1BC4EEAC000E606E /* AAManagedSection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAManagedSection.swift; sourceTree = ""; }; + 066A521B1BC4EEAC000E606E /* AAManagedRange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAManagedRange.swift; sourceTree = ""; }; + 066A521C1BC4EEAC000E606E /* ManagedBindedCells.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedBindedCells.swift; sourceTree = ""; }; + 066A521D1BC4EEAC000E606E /* ManagedCells.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedCells.swift; sourceTree = ""; }; + 066A521E1BC4EEAC000E606E /* AAContentTableController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAContentTableController.swift; sourceTree = ""; }; + 066A521F1BC4EEAC000E606E /* AAManagedTableController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAManagedTableController.swift; sourceTree = ""; }; + 066A52201BC4EEAC000E606E /* ManagedTableExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedTableExtensions.swift; sourceTree = ""; }; + 066A52211BC4EEAC000E606E /* ManagedAlerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagedAlerts.swift; sourceTree = ""; }; + 066A522C1BC4EEBA000E606E /* AACommonCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACommonCell.swift; sourceTree = ""; }; + 066A522D1BC4EEBA000E606E /* AATextCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATextCell.swift; sourceTree = ""; }; + 066A522E1BC4EEBA000E606E /* AATitledCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATitledCell.swift; sourceTree = ""; }; + 066A522F1BC4EEBA000E606E /* AATableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATableViewCell.swift; sourceTree = ""; }; + 066A52301BC4EEBA000E606E /* AAHeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAHeaderCell.swift; sourceTree = ""; }; + 066A52311BC4EEBA000E606E /* AAEditCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAEditCell.swift; sourceTree = ""; }; + 066A523A1BC4EECD000E606E /* AABigPlaceholderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABigPlaceholderView.swift; sourceTree = ""; }; + 066A523C1BC4EECD000E606E /* AATableViewHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATableViewHeader.swift; sourceTree = ""; }; + 066A523D1BC4EECD000E606E /* AATableViewSeparator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATableViewSeparator.swift; sourceTree = ""; }; + 066A523F1BC4EECD000E606E /* AAAvatarCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAvatarCell.swift; sourceTree = ""; }; + 066A52461BC4EED5000E606E /* AAProgressView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAProgressView.swift; sourceTree = ""; }; + 066A52491BC4EF49000E606E /* AAViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAViewController.swift; sourceTree = ""; }; + 066A524D1BC4EF61000E606E /* AAImagePickerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAImagePickerController.swift; sourceTree = ""; }; + 066A524E1BC4EF61000E606E /* AANavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AANavigationController.swift; sourceTree = ""; }; + 066A524F1BC4EF61000E606E /* AATableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATableViewController.swift; sourceTree = ""; }; + 066A52501BC4EF61000E606E /* AACollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACollectionViewController.swift; sourceTree = ""; }; + 066A52511BC4EF61000E606E /* Alerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Alerts.swift; sourceTree = ""; }; + 066A52521BC4EF61000E606E /* Executions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Executions.swift; sourceTree = ""; }; + 066A52531BC4EF61000E606E /* Navigations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Navigations.swift; sourceTree = ""; }; + 066A525B1BC502EB000E606E /* ActorSDKDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorSDKDelegate.swift; sourceTree = ""; }; + 066A525D1BC503BB000E606E /* ActorApplicationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorApplicationDelegate.swift; sourceTree = ""; }; + 066A52611BC50E7B000E606E /* AACountryViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACountryViewController.swift; sourceTree = ""; }; + 066A52651BC50E7B000E606E /* AAAuthViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthViewController.swift; sourceTree = ""; }; + 066A526C1BC50E8B000E606E /* AAAuthCountryCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthCountryCell.swift; sourceTree = ""; }; + 066A526F1BC5101A000E606E /* ABPhoneField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ABPhoneField.h; sourceTree = ""; }; + 066A52701BC5101A000E606E /* ABPhoneField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ABPhoneField.m; sourceTree = ""; }; + 066A527C1BC51ED0000E606E /* AARootSplitViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARootSplitViewController.swift; sourceTree = ""; }; + 066A527D1BC51ED0000E606E /* AARootTabViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARootTabViewController.swift; sourceTree = ""; }; + 066A527E1BC51ED0000E606E /* AANoSelectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AANoSelectionViewController.swift; sourceTree = ""; }; + 066A52C51BC521EA000E606E /* AAEditTextController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAEditTextController.swift; sourceTree = ""; }; + 066A52C61BC521EA000E606E /* AAEditFieldController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAEditFieldController.swift; sourceTree = ""; }; + 066A52CA1BC521FA000E606E /* AADialogsListContentController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AADialogsListContentController.swift; sourceTree = ""; }; + 066A52CB1BC521FA000E606E /* AADialogsListContentControllerDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AADialogsListContentControllerDelegate.swift; sourceTree = ""; }; + 066A52CF1BC52204000E606E /* AADialogCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AADialogCell.swift; sourceTree = ""; }; + 066A52D01BC52204000E606E /* AADialogSearchCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AADialogSearchCell.swift; sourceTree = ""; }; + 066A52D41BC52378000E606E /* AAContactsListContentController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAContactsListContentController.swift; sourceTree = ""; }; + 066A52D51BC52378000E606E /* AAContactsListContentControllerDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAContactsListContentControllerDelegate.swift; sourceTree = ""; }; + 066A52D91BC52385000E606E /* AAContactActionCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAContactActionCell.swift; sourceTree = ""; }; + 066A52DA1BC52385000E606E /* AAContactCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAContactCell.swift; sourceTree = ""; }; + 066A52DE1BC5241F000E606E /* AAWebActionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAWebActionController.swift; sourceTree = ""; }; + 066A52E21BC52A20000E606E /* AAGroupViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupViewController.swift; sourceTree = ""; }; + 066A52E31BC52A20000E606E /* AAAddParticipantViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAddParticipantViewController.swift; sourceTree = ""; }; + 066A52E41BC52A20000E606E /* AAInviteLinkViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAInviteLinkViewController.swift; sourceTree = ""; }; + 066A52E91BC52A2B000E606E /* AAGroupMemberCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupMemberCell.swift; sourceTree = ""; }; + 066A52EC1BC52B02000E606E /* AASettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsViewController.swift; sourceTree = ""; }; + 066A52ED1BC52B02000E606E /* AASettingsNotificationsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsNotificationsViewController.swift; sourceTree = ""; }; + 066A52EE1BC52B02000E606E /* AASettingsPrivacyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsPrivacyViewController.swift; sourceTree = ""; }; + 066A52EF1BC52B02000E606E /* AASettingsWallpapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsWallpapper.swift; sourceTree = ""; }; + 066A52F51BC52B13000E606E /* AAWallpapperPreviewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAWallpapperPreviewCell.swift; sourceTree = ""; }; + 066A52F61BC52B13000E606E /* AAWallpapperSettingsCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAWallpapperSettingsCell.swift; sourceTree = ""; }; + 066A52FA1BC52FA8000E606E /* AAComposeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAComposeController.swift; sourceTree = ""; }; + 066A52FB1BC52FA8000E606E /* AAGroupCreateViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupCreateViewController.swift; sourceTree = ""; }; + 066A52FC1BC52FA8000E606E /* AAGroupMembersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupMembersController.swift; sourceTree = ""; }; + 066A53031BC53177000E606E /* AAContactsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAContactsViewController.swift; sourceTree = ""; }; + 066A53061BC53183000E606E /* AARecentViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARecentViewController.swift; sourceTree = ""; }; + 066A530A1BC531A2000E606E /* AAUserViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAUserViewController.swift; sourceTree = ""; }; + 066A530D1BC53317000E606E /* AAWallpapperPreviewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAWallpapperPreviewController.swift; sourceTree = ""; }; + 066A530E1BC53317000E606E /* AACorePreviewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACorePreviewController.swift; sourceTree = ""; }; + 066A530F1BC53317000E606E /* AAPhotoPreviewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAPhotoPreviewController.swift; sourceTree = ""; }; + 066A53141BC533D5000E606E /* AAConversationContentController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAConversationContentController.swift; sourceTree = ""; }; + 066A53161BC533DD000E606E /* AABubbles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbles.swift; sourceTree = ""; }; + 066A53191BC533E7000E606E /* AAAutoCompleteCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAutoCompleteCell.swift; sourceTree = ""; }; + 066A531C1BC533F5000E606E /* AABubbleBackgroundProcessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleBackgroundProcessor.swift; sourceTree = ""; }; + 066A531D1BC533F5000E606E /* BubbleLayouts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BubbleLayouts.swift; sourceTree = ""; }; + 066A531E1BC533F5000E606E /* AAMessagesFlowLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAMessagesFlowLayout.swift; sourceTree = ""; }; + 066A531F1BC533F5000E606E /* Caches.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Caches.swift; sourceTree = ""; }; + 066A53251BC53406000E606E /* AABubbleCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleCell.swift; sourceTree = ""; }; + 066A53261BC53406000E606E /* AABubbleTextCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleTextCell.swift; sourceTree = ""; }; + 066A53271BC53406000E606E /* AABubbleServiceCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleServiceCell.swift; sourceTree = ""; }; + 066A53281BC53406000E606E /* AABubbleBaseFileCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleBaseFileCell.swift; sourceTree = ""; }; + 066A53291BC53406000E606E /* AABubbleMediaCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleMediaCell.swift; sourceTree = ""; }; + 066A532A1BC53406000E606E /* AABubbleDocumentCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleDocumentCell.swift; sourceTree = ""; }; + 066A53311BC534F5000E606E /* AAFileTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAFileTypes.swift; sourceTree = ""; }; + 066A53361BC537CA000E606E /* ConversationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConversationViewController.swift; sourceTree = ""; }; + 066A53381BC5456B000E606E /* ActorStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorStyle.swift; sourceTree = ""; }; + 066CBCDB1C8D419F004507E2 /* AAAuthEmailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthEmailViewController.swift; sourceTree = ""; }; + 067B67531D45341D00B9A238 /* AAGroupViewMembersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupViewMembersController.swift; sourceTree = ""; }; + 068AFC381C94A0050055F503 /* AADialogListProcessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AADialogListProcessor.swift; sourceTree = ""; }; + 069CF4C41BCB909A00C66E12 /* CLBackspaceDetectingTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLBackspaceDetectingTextField.h; sourceTree = ""; }; + 069CF4C51BCB909A00C66E12 /* CLBackspaceDetectingTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLBackspaceDetectingTextField.m; sourceTree = ""; }; + 069CF4C61BCB909A00C66E12 /* CLToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLToken.h; sourceTree = ""; }; + 069CF4C71BCB909A00C66E12 /* CLToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLToken.m; sourceTree = ""; }; + 069CF4C81BCB909A00C66E12 /* CLTokenInputView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLTokenInputView.h; sourceTree = ""; }; + 069CF4C91BCB909A00C66E12 /* CLTokenInputView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLTokenInputView.m; sourceTree = ""; }; + 069CF4CA1BCB909A00C66E12 /* CLTokenView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLTokenView.h; sourceTree = ""; }; + 069CF4CB1BCB909A00C66E12 /* CLTokenView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CLTokenView.m; sourceTree = ""; }; + 06ABFE2F1D3FAF800031A0D6 /* GCDAsyncSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDAsyncSocket.h; sourceTree = ""; }; + 06ABFE301D3FAF800031A0D6 /* GCDAsyncSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDAsyncSocket.m; sourceTree = ""; }; + 06ABFE371D3FCCE30031A0D6 /* AAGroupEditInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupEditInfoViewController.swift; sourceTree = ""; }; + 06ABFE391D410D2D0031A0D6 /* AAGroupTypeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupTypeController.swift; sourceTree = ""; }; + 06ABFE3C1D41283A0031A0D6 /* AAGroupAdministrationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAGroupAdministrationViewController.swift; sourceTree = ""; }; + 06B489EC1C9F6EBC0054245B /* AAStickerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAStickerView.swift; sourceTree = ""; }; + 06C1D0761C8BC9FC00B73632 /* AAAuthNameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthNameViewController.swift; sourceTree = ""; }; + 06C1D07A1C8BFE5C00B73632 /* AAAuthPhoneViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthPhoneViewController.swift; sourceTree = ""; }; + 06C1D07D1C8D0DE900B73632 /* Telephony.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Telephony.swift; sourceTree = ""; }; + 06CE898B1BD841C9005A5530 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 06CE898F1BD84DF5005A5530 /* ActorSDKAnalytics.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorSDKAnalytics.swift; sourceTree = ""; }; + 06D5C0561C8D6E20002D5045 /* AAAuthLogInViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthLogInViewController.swift; sourceTree = ""; }; + 06D5C0591C8E9B3B002D5045 /* Promises.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Promises.swift; sourceTree = ""; }; + 06D5C05B1C8EA842002D5045 /* AAAuthOTPViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAAuthOTPViewController.swift; sourceTree = ""; }; + 06E1648E1C96D99F005AFB94 /* CocoaCrypto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaCrypto.swift; sourceTree = ""; }; + 06E164931C96FF3D005AFB94 /* module.map */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = module.map; sourceTree = ""; }; + 06E322C81C69344A00D66F53 /* iOSCallsProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iOSCallsProvider.swift; sourceTree = ""; }; + 06E3230D1C6942C400D66F53 /* WebRTC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebRTC.h; sourceTree = ""; }; + 06E323101C694C1D00D66F53 /* WebRTCExt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebRTCExt.swift; sourceTree = ""; }; + 06E323141C6A7AC000D66F53 /* AACallViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AACallViewController.swift; path = Calls/AACallViewController.swift; sourceTree = ""; }; + 06E3C58A1C746AAC004776CD /* tone.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = tone.m4a; sourceTree = ""; }; + 06E3C58C1C74931F004776CD /* ringtone.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = ringtone.m4a; sourceTree = ""; }; + 06E3C5B71C80EE20004776CD /* AACircleButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACircleButton.swift; sourceTree = ""; }; + 06E7B2461C0F8D7A0090660C /* AALocationPickerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AALocationPickerController.swift; sourceTree = ""; }; + 06E7B2491C0F92140090660C /* AABubbleLocationCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleLocationCell.swift; sourceTree = ""; }; + 06E7B24B1C0FAB500090660C /* AAMapFastView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAMapFastView.swift; sourceTree = ""; }; + 06E7B2511C1345E70090660C /* AAMapPinPointView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAMapPinPointView.swift; sourceTree = ""; }; + 06E7B2531C139B6F0090660C /* AABubbleContactCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleContactCell.swift; sourceTree = ""; }; + 152AA8921C2989270030DEEE /* SLKInputAccessoryView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKInputAccessoryView.h; sourceTree = ""; }; + 152AA8931C2989270030DEEE /* SLKInputAccessoryView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SLKInputAccessoryView.m; sourceTree = ""; }; + 152AA8941C2989270030DEEE /* SLKTextInputbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKTextInputbar.h; sourceTree = ""; }; + 152AA8951C2989270030DEEE /* SLKTextInputbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SLKTextInputbar.m; sourceTree = ""; }; + 152AA8961C2989270030DEEE /* SLKTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKTextView.h; sourceTree = ""; }; + 152AA8971C2989270030DEEE /* SLKTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SLKTextView.m; sourceTree = ""; }; + 152AA8981C2989270030DEEE /* SLKTextView+SLKAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SLKTextView+SLKAdditions.h"; sourceTree = ""; }; + 152AA8991C2989270030DEEE /* SLKTextView+SLKAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SLKTextView+SLKAdditions.m"; sourceTree = ""; }; + 152AA89A1C2989270030DEEE /* SLKTextViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKTextViewController.h; sourceTree = ""; }; + 152AA89B1C2989270030DEEE /* SLKTextViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SLKTextViewController.m; sourceTree = ""; }; + 152AA89C1C2989270030DEEE /* SLKTypingIndicatorProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKTypingIndicatorProtocol.h; sourceTree = ""; }; + 152AA89D1C2989270030DEEE /* SLKTypingIndicatorView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKTypingIndicatorView.h; sourceTree = ""; }; + 152AA89E1C2989270030DEEE /* SLKTypingIndicatorView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SLKTypingIndicatorView.m; sourceTree = ""; }; + 152AA89F1C2989270030DEEE /* SLKUIConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLKUIConstants.h; sourceTree = ""; }; + 152AA8A01C2989270030DEEE /* UIResponder+SLKAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIResponder+SLKAdditions.h"; sourceTree = ""; }; + 152AA8A11C2989270030DEEE /* UIResponder+SLKAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIResponder+SLKAdditions.m"; sourceTree = ""; }; + 152AA8A21C2989270030DEEE /* UIScrollView+SLKAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+SLKAdditions.h"; sourceTree = ""; }; + 152AA8A31C2989270030DEEE /* UIScrollView+SLKAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+SLKAdditions.m"; sourceTree = ""; }; + 152AA8A41C2989270030DEEE /* UIView+SLKAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+SLKAdditions.h"; sourceTree = ""; }; + 152AA8A51C2989270030DEEE /* UIView+SLKAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+SLKAdditions.m"; sourceTree = ""; }; + 152AA8BC1C298BF00030DEEE /* AASettingsSessionsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsSessionsController.swift; sourceTree = ""; }; + 152AA8BE1C298C4B0030DEEE /* AASettingsLastSeenController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsLastSeenController.swift; sourceTree = ""; }; + 153F6B3C1C2A9B1900C0B960 /* begin_record.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = begin_record.caf; sourceTree = ""; }; + 153F6B5A1C2B109400C0B960 /* AABubbleVoiceCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleVoiceCell.swift; sourceTree = ""; }; + 153F6B5C1C2B3AC500C0B960 /* AABubbleStickerCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AABubbleStickerCell.swift; sourceTree = ""; }; + 153F6B601C2BF8EC00C0B960 /* AAAuthWelcomeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AAAuthWelcomeController.swift; path = Auth/AAAuthWelcomeController.swift; sourceTree = ""; }; + 153F6B881C2D7BA300C0B960 /* AATapLabelDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATapLabelDelegate.swift; sourceTree = ""; }; + 153F6B891C2D7BA300C0B960 /* AATapLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AATapLabel.swift; sourceTree = ""; }; + 15D35F0C1C20185500E3717A /* diag_range.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = diag_range.c; sourceTree = ""; }; + 15D35F0D1C20185500E3717A /* diag_range.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = diag_range.h; sourceTree = ""; }; + 15D35F0E1C20185500E3717A /* opus_header.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = opus_header.c; sourceTree = ""; }; + 15D35F0F1C20185500E3717A /* opus_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_header.h; sourceTree = ""; }; + 15D35F101C20185500E3717A /* opusenc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opusenc.h; sourceTree = ""; }; + 15D35F111C20185500E3717A /* opusenc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = opusenc.m; sourceTree = ""; }; + 15D35F121C20185500E3717A /* picture.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = picture.c; sourceTree = ""; }; + 15D35F131C20185500E3717A /* picture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = picture.h; sourceTree = ""; }; + 15D35F141C20185500E3717A /* wav_io.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wav_io.c; sourceTree = ""; }; + 15D35F151C20185500E3717A /* wav_io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_io.h; sourceTree = ""; }; + 15D35F211C20186200E3717A /* bitwise.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitwise.c; sourceTree = ""; }; + 15D35F221C20186200E3717A /* framing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = framing.c; sourceTree = ""; }; + 15D35F231C20186200E3717A /* ogg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ogg.h; sourceTree = ""; }; + 15D35F241C20186200E3717A /* os_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = os_types.h; sourceTree = ""; }; + 15D35F2A1C20187200E3717A /* info.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = info.c; sourceTree = ""; }; + 15D35F2B1C20187200E3717A /* internal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = internal.c; sourceTree = ""; }; + 15D35F2C1C20187200E3717A /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = ""; }; + 15D35F2D1C20187200E3717A /* opusfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = opusfile.c; sourceTree = ""; }; + 15D35F2E1C20187200E3717A /* opusfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opusfile.h; sourceTree = ""; }; + 15D35F2F1C20187200E3717A /* stream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stream.c; sourceTree = ""; }; + 15D35F361C20187E00E3717A /* ASQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASQueue.h; sourceTree = ""; }; + 15D35F371C20187E00E3717A /* ASQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASQueue.m; sourceTree = ""; }; + 15D35F381C20187E00E3717A /* AAOpusAudioRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAOpusAudioRecorder.h; sourceTree = ""; }; + 15D35F391C20187E00E3717A /* AAOpusAudioRecorder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAOpusAudioRecorder.m; sourceTree = ""; }; + 15D35F3A1C20187E00E3717A /* AAAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAAlertView.h; sourceTree = ""; }; + 15D35F3B1C20187E00E3717A /* AAAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAAlertView.m; sourceTree = ""; }; + 15D35F3C1C20187E00E3717A /* AAAudioRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAAudioRecorder.h; sourceTree = ""; }; + 15D35F3D1C20187E00E3717A /* AAAudioRecorder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAAudioRecorder.m; sourceTree = ""; }; + 15D35F3E1C20187E00E3717A /* AATimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AATimer.h; sourceTree = ""; }; + 15D35F3F1C20187E00E3717A /* AATimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AATimer.m; sourceTree = ""; }; + 15D35F401C20187E00E3717A /* AAAudioPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAAudioPlayer.h; sourceTree = ""; }; + 15D35F411C20187E00E3717A /* AAAudioPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAAudioPlayer.m; sourceTree = ""; }; + 15D35F421C20187E00E3717A /* AANativeAudioPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AANativeAudioPlayer.h; sourceTree = ""; }; + 15D35F431C20187E00E3717A /* AANativeAudioPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AANativeAudioPlayer.m; sourceTree = ""; }; + 15D35F441C20187E00E3717A /* AAOpusAudioPlayerAU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAOpusAudioPlayerAU.h; sourceTree = ""; }; + 15D35F451C20187E00E3717A /* AAOpusAudioPlayerAU.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AAOpusAudioPlayerAU.mm; sourceTree = ""; }; + 15D35F461C20187E00E3717A /* AAAudioBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAAudioBuffer.h; sourceTree = ""; }; + 15D35F471C20187E00E3717A /* AAModernConversationAudioPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAModernConversationAudioPlayer.h; sourceTree = ""; }; + 15D35F481C20187E00E3717A /* AAModernConversationAudioPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAModernConversationAudioPlayer.m; sourceTree = ""; }; + 15D35F491C20187E00E3717A /* AAModernConversationAudioPlayerContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAModernConversationAudioPlayerContext.h; sourceTree = ""; }; + 15D35F4A1C20187E00E3717A /* AAModernConversationAudioPlayerContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAModernConversationAudioPlayerContext.m; sourceTree = ""; }; + 15D35F4B1C20187E00E3717A /* NSObject+TGLock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+TGLock.h"; sourceTree = ""; }; + 15D35F4C1C20187E00E3717A /* NSObject+TGLock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+TGLock.m"; sourceTree = ""; }; + 15D35F4D1C20187E00E3717A /* AAModernViewInlineMediaContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAModernViewInlineMediaContext.h; sourceTree = ""; }; + 15D35F4E1C20187E00E3717A /* AAModernViewInlineMediaContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAModernViewInlineMediaContext.m; sourceTree = ""; }; + 15D35F4F1C20187E00E3717A /* AATimerTarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AATimerTarget.h; sourceTree = ""; }; + 15D35F501C20187E00E3717A /* AATimerTarget.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AATimerTarget.m; sourceTree = ""; }; + 15D35F6E1C20196E00E3717A /* AARecordAudioController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARecordAudioController.swift; sourceTree = ""; }; + 15D35F731C201B6B00E3717A /* AACustomPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACustomPresentationController.swift; sourceTree = ""; }; + 15D35F741C201B6B00E3717A /* AACustomPresentationAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AACustomPresentationAnimationController.swift; sourceTree = ""; }; + 15F89F001C211FDE00776ACD /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libopus.a; sourceTree = ""; }; + 15F89F031C211FED00776ACD /* opus_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_defines.h; sourceTree = ""; }; + 15F89F041C211FED00776ACD /* opus_multistream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_multistream.h; sourceTree = ""; }; + 15F89F051C211FED00776ACD /* opus_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_types.h; sourceTree = ""; }; + 15F89F061C211FED00776ACD /* opus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus.h; sourceTree = ""; }; + 15F89F0F1C21317400776ACD /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + 354C3EFA48FBFAEAD0DEEE17 /* Pods_ActorSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ActorSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9AA6A41E1D08568A00957A7F /* AASettingsMediaViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsMediaViewController.swift; sourceTree = ""; }; + 9AAE96471CF81F140092E366 /* AARingtonesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARingtonesViewController.swift; sourceTree = ""; }; + BE237C9C1C422FFA00060648 /* AAStickersKeyboard.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAStickersKeyboard.swift; sourceTree = ""; }; + BE2621561C4656D700A817AB /* AAConvActionSheet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAConvActionSheet.swift; sourceTree = ""; }; + BE2621581C4656EE00A817AB /* AAThumbnailView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAThumbnailView.swift; sourceTree = ""; }; + BE281CC41C502B230042F6D4 /* AAVoiceRecorderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAVoiceRecorderView.swift; sourceTree = ""; }; + BE4DBE6B1C5723BE00A31894 /* AttributedLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributedLabel.swift; sourceTree = ""; }; + BED5A1D11C4839590045FDB0 /* NYTPhotoViewerCloseButtonX.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = NYTPhotoViewerCloseButtonX.png; sourceTree = ""; }; + BED5A1D21C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "NYTPhotoViewerCloseButtonX@2x.png"; sourceTree = ""; }; + BED5A1D31C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "NYTPhotoViewerCloseButtonX@3x.png"; sourceTree = ""; }; + BED5A1D41C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = NYTPhotoViewerCloseButtonXLandscape.png; sourceTree = ""; }; + BED5A1D51C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "NYTPhotoViewerCloseButtonXLandscape@2x.png"; sourceTree = ""; }; + BED5A1D61C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "NYTPhotoViewerCloseButtonXLandscape@3x.png"; sourceTree = ""; }; + BED5A1DE1C48396A0045FDB0 /* NYTPhotoCaptionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoCaptionView.h; sourceTree = ""; }; + BED5A1DF1C48396A0045FDB0 /* NYTPhotoCaptionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoCaptionView.m; sourceTree = ""; }; + BED5A1E01C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoDismissalInteractionController.h; sourceTree = ""; }; + BED5A1E11C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoDismissalInteractionController.m; sourceTree = ""; }; + BED5A1E21C48396A0045FDB0 /* NYTPhotosDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotosDataSource.h; sourceTree = ""; }; + BED5A1E31C48396A0045FDB0 /* NYTPhotosDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosDataSource.m; sourceTree = ""; }; + BED5A1E41C48396A0045FDB0 /* NYTPhotosOverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotosOverlayView.h; sourceTree = ""; }; + BED5A1E51C48396A0045FDB0 /* NYTPhotosOverlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosOverlayView.m; sourceTree = ""; }; + BED5A1E61C48396A0045FDB0 /* NYTPhotosViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotosViewController.h; sourceTree = ""; }; + BED5A1E71C48396A0045FDB0 /* NYTPhotosViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotosViewController.m; sourceTree = ""; }; + BED5A1E81C48396A0045FDB0 /* NYTPhotoTransitionAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoTransitionAnimator.h; sourceTree = ""; }; + BED5A1E91C48396A0045FDB0 /* NYTPhotoTransitionAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoTransitionAnimator.m; sourceTree = ""; }; + BED5A1EA1C48396A0045FDB0 /* NYTPhotoTransitionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoTransitionController.h; sourceTree = ""; }; + BED5A1EB1C48396A0045FDB0 /* NYTPhotoTransitionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoTransitionController.m; sourceTree = ""; }; + BED5A1EC1C48396A0045FDB0 /* NYTPhotoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoViewController.h; sourceTree = ""; }; + BED5A1ED1C48396A0045FDB0 /* NYTPhotoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTPhotoViewController.m; sourceTree = ""; }; + BED5A1EE1C48396A0045FDB0 /* NYTScalingImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTScalingImageView.h; sourceTree = ""; }; + BED5A1EF1C48396A0045FDB0 /* NYTScalingImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NYTScalingImageView.m; sourceTree = ""; }; + BED5A2031C4839790045FDB0 /* NYTPhoto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhoto.h; sourceTree = ""; }; + BED5A2041C4839790045FDB0 /* NYTPhotoCaptionViewLayoutWidthHinting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoCaptionViewLayoutWidthHinting.h; sourceTree = ""; }; + BED5A2051C4839790045FDB0 /* NYTPhotoContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotoContainer.h; sourceTree = ""; }; + BED5A2061C4839790045FDB0 /* NYTPhotosViewControllerDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NYTPhotosViewControllerDataSource.h; sourceTree = ""; }; + BED5A20C1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSBundle+NYTPhotoViewer.h"; sourceTree = ""; }; + BED5A20D1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSBundle+NYTPhotoViewer.m"; sourceTree = ""; }; + BEE6EB001C4D7B7500A2280E /* AASettingsWallpapersController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsWallpapersController.swift; sourceTree = ""; }; + BEE6EB031C4D9A4900A2280E /* AAWallpapersCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAWallpapersCell.swift; sourceTree = ""; }; + BEFE68D41C4657360001F2D6 /* AAThumbnailCollectionCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAThumbnailCollectionCell.swift; sourceTree = ""; }; + E30822B631D108159E8B306B /* Pods-ActorSDK.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorSDK.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK.debug.xcconfig"; sourceTree = ""; }; + F076508E3899D309954904A3 /* Pods-ActorSDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorSDK.release.xcconfig"; path = "Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ -cp -af "${PODS_ROOT}/libjingle_peerconnection/libjingle_peerconnection/Headers/" "${CONFIGURATION_BUILD_DIR}/ActorSDK.framework/Headers/" +/* Begin PBXFrameworksBuildPhase section */ + 066A50CE1BC4AE63000E606E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 06CE898C1BD841C9005A5530 /* SystemConfiguration.framework in Frameworks */, + BEAC2B311C42D683007F7A2F /* libopus.a in Frameworks */, + 066A52001BC4E0B0000E606E /* libsqlite3.tbd in Frameworks */, + BDF21708B376E212CEAEC43D /* Pods_ActorSDK.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ -cp -a "${CONFIGURATION_TEMP_DIR}/j2objc/Public/" "${CONFIGURATION_BUILD_DIR}/ActorSDK.framework/Headers/" +/* Begin PBXGroup section */ + 061850A31C95CBF000C522D5 /* YYKit */ = { + isa = PBXGroup; + children = ( + 061850A41C95CBF000C522D5 /* Component */, + 061850B71C95CBF000C522D5 /* String */, + 061850C21C95CBF000C522D5 /* Utility */, + 061850D31C95CBF000C522D5 /* YYDispatchQueuePool.h */, + 061850D41C95CBF000C522D5 /* YYDispatchQueuePool.m */, + 061850D51C95CBF000C522D5 /* YYLabel.h */, + 061850D61C95CBF000C522D5 /* YYLabel.m */, + 061850D71C95CBF000C522D5 /* YYText.h */, + 061850D81C95CBF000C522D5 /* YYTextView.h */, + 061850D91C95CBF000C522D5 /* YYTextView.m */, + 060134FD1C95ED4C00A18C4E /* YYAsyncLayer.h */, + 060134FE1C95ED4C00A18C4E /* YYAsyncLayer.m */, + 060134FF1C95ED4C00A18C4E /* YYSentinel.h */, + 060135001C95ED4C00A18C4E /* YYSentinel.m */, + 060135011C95ED4C00A18C4E /* YYTransaction.h */, + 060135021C95ED4C00A18C4E /* YYTransaction.m */, + ); + name = YYKit; + path = Libs/YYKit; + sourceTree = ""; + }; + 061850A41C95CBF000C522D5 /* Component */ = { + isa = PBXGroup; + children = ( + 061850A51C95CBF000C522D5 /* YYTextContainerView.h */, + 061850A61C95CBF000C522D5 /* YYTextContainerView.m */, + 061850A71C95CBF000C522D5 /* YYTextDebugOption.h */, + 061850A81C95CBF000C522D5 /* YYTextDebugOption.m */, + 061850A91C95CBF000C522D5 /* YYTextEffectWindow.h */, + 061850AA1C95CBF000C522D5 /* YYTextEffectWindow.m */, + 061850AB1C95CBF000C522D5 /* YYTextInput.h */, + 061850AC1C95CBF000C522D5 /* YYTextInput.m */, + 061850AD1C95CBF000C522D5 /* YYTextKeyboardManager.h */, + 061850AE1C95CBF000C522D5 /* YYTextKeyboardManager.m */, + 061850AF1C95CBF000C522D5 /* YYTextLayout.h */, + 061850B01C95CBF000C522D5 /* YYTextLayout.m */, + 061850B11C95CBF000C522D5 /* YYTextLine.h */, + 061850B21C95CBF000C522D5 /* YYTextLine.m */, + 061850B31C95CBF000C522D5 /* YYTextMagnifier.h */, + 061850B41C95CBF000C522D5 /* YYTextMagnifier.m */, + 061850B51C95CBF000C522D5 /* YYTextSelectionView.h */, + 061850B61C95CBF000C522D5 /* YYTextSelectionView.m */, + ); + path = Component; + sourceTree = ""; + }; + 061850B71C95CBF000C522D5 /* String */ = { + isa = PBXGroup; + children = ( + 061850B81C95CBF000C522D5 /* YYTextArchiver.h */, + 061850B91C95CBF000C522D5 /* YYTextArchiver.m */, + 061850BA1C95CBF000C522D5 /* YYTextAttribute.h */, + 061850BB1C95CBF000C522D5 /* YYTextAttribute.m */, + 061850BC1C95CBF000C522D5 /* YYTextParser.h */, + 061850BD1C95CBF000C522D5 /* YYTextParser.m */, + 061850BE1C95CBF000C522D5 /* YYTextRubyAnnotation.h */, + 061850BF1C95CBF000C522D5 /* YYTextRubyAnnotation.m */, + 061850C01C95CBF000C522D5 /* YYTextRunDelegate.h */, + 061850C11C95CBF000C522D5 /* YYTextRunDelegate.m */, + ); + path = String; + sourceTree = ""; + }; + 061850C21C95CBF000C522D5 /* Utility */ = { + isa = PBXGroup; + children = ( + 061850C31C95CBF000C522D5 /* NSAttributedString+YYText.h */, + 061850C41C95CBF000C522D5 /* NSAttributedString+YYText.m */, + 061850C51C95CBF000C522D5 /* NSParagraphStyle+YYText.h */, + 061850C61C95CBF000C522D5 /* NSParagraphStyle+YYText.m */, + 061850C71C95CBF000C522D5 /* UIPasteboard+YYText.h */, + 061850C81C95CBF000C522D5 /* UIPasteboard+YYText.m */, + 061850C91C95CBF000C522D5 /* UIView+YYText.h */, + 061850CA1C95CBF000C522D5 /* UIView+YYText.m */, + 061850CB1C95CBF000C522D5 /* YYTextAsyncLayer.h */, + 061850CC1C95CBF000C522D5 /* YYTextAsyncLayer.m */, + 061850CD1C95CBF000C522D5 /* YYTextTransaction.h */, + 061850CE1C95CBF000C522D5 /* YYTextTransaction.m */, + 061850CF1C95CBF000C522D5 /* YYTextUtilities.h */, + 061850D01C95CBF000C522D5 /* YYTextUtilities.m */, + 061850D11C95CBF000C522D5 /* YYTextWeakProxy.h */, + 061850D21C95CBF000C522D5 /* YYTextWeakProxy.m */, + ); + path = Utility; + sourceTree = ""; + }; + 065975081BC7C4F300B8C7DF /* Resources */ = { + isa = PBXGroup; + children = ( + 0659751D1BC7C84200B8C7DF /* Backgrounds */, + 065975501BC7DD3C00B8C7DF /* Highlighter */, + 06230F431BC95C0E00A4807B /* ABPhoneFieldCodes.txt */, + 0659753A1BC7D22200B8C7DF /* Images.xcassets */, + 06E3C58C1C74931F004776CD /* ringtone.m4a */, + 065975461BC7D34200B8C7DF /* Localizable.strings */, + 06230F441BC95C0E00A4807B /* PhoneFormats.dat */, + 153F6B3C1C2A9B1900C0B960 /* begin_record.caf */, + 065975491BC7DBA000B8C7DF /* iapetus.caf */, + 0659754A1BC7DBA000B8C7DF /* notification.caf */, + 06E3C58A1C746AAC004776CD /* tone.m4a */, + ); + path = Resources; + sourceTree = ""; + }; + 0659751D1BC7C84200B8C7DF /* Backgrounds */ = { + isa = PBXGroup; + children = ( + 0659751E1BC7C84E00B8C7DF /* bg_1.jpg */, + 063074181BD68E370053DEAF /* bg_1_preview.jpg */, + 065975201BC7C84E00B8C7DF /* bg_2.jpg */, + 063074171BD68E370053DEAF /* bg_2_preview.jpg */, + 0659751F1BC7C84E00B8C7DF /* bg_3.jpg */, + 063074161BD68E370053DEAF /* bg_3_preview.jpg */, + ); + path = Backgrounds; + sourceTree = ""; + }; + 065975501BC7DD3C00B8C7DF /* Highlighter */ = { + isa = PBXGroup; + children = ( + 0659754E1BC7DD3C00B8C7DF /* highlight-default.min.css */, + 0659754F1BC7DD3C00B8C7DF /* highlight.min.js */, + ); + path = Highlighter; + sourceTree = ""; + }; + 066A50C81BC4AE63000E606E = { + isa = PBXGroup; + children = ( + 066A50D41BC4AE63000E606E /* ActorSDK */, + 2F428D134E194A828C3DF863 /* Frameworks */, + 066A50D31BC4AE63000E606E /* Products */, + F0BB28A250FF185B1F4D414D /* Pods */, + ); + sourceTree = ""; + }; + 066A50D31BC4AE63000E606E /* Products */ = { + isa = PBXGroup; + children = ( + 066A50D21BC4AE63000E606E /* ActorSDK.framework */, + ); + name = Products; + sourceTree = ""; + }; + 066A50D41BC4AE63000E606E /* ActorSDK */ = { + isa = PBXGroup; + children = ( + 069CF4151BCA5DB500C66E12 /* Sources */, + 065975081BC7C4F300B8C7DF /* Resources */, + ); + path = ActorSDK; + sourceTree = ""; + }; + 066A511D1BC4B4BD000E606E /* ActorCore */ = { + isa = PBXGroup; + children = ( + 066A51851BC4C377000E606E /* Providers */, + 066A51681BC4C366000E606E /* ActorCoreExt.swift */, + 065975041BC757A300B8C7DF /* ActorRuntime.swift */, + 066A52051BC4E962000E606E /* Makefile */, + 066A52041BC4E962000E606E /* convert.py */, + ); + path = ActorCore; + sourceTree = ""; + }; + 066A51201BC4B53C000E606E /* SwiftExtensions */ = { + isa = PBXGroup; + children = ( + 066A51211BC4B55C000E606E /* AADevice.swift */, + 066A51551BC4BEF5000E606E /* AALocalized.swift */, + 066A514F1BC4BE06000E606E /* AARegex.swift */, + 066A51401BC4BB5C000E606E /* AssosiatedObject.swift */, + 066A514B1BC4BD05000E606E /* Collections.swift */, + 066A51231BC4B56D000E606E /* Colors.swift */, + 066A51491BC4BCE0000E606E /* Dispatch.swift */, + 066A51451BC4BBC3000E606E /* Fonts.swift */, + 066A51531BC4BE95000E606E /* Images.swift */, + 066A51511BC4BE34000E606E /* Logs.swift */, + 066A514D1BC4BDE4000E606E /* Numbers.swift */, + 066A51431BC4BBAF000E606E /* Strings.swift */, + 066A51471BC4BBF4000E606E /* Views.swift */, + 06D5C0591C8E9B3B002D5045 /* Promises.swift */, + ); + path = SwiftExtensions; + sourceTree = ""; + }; + 066A51571BC4C112000E606E /* Utils */ = { + isa = PBXGroup; + children = ( + 15D35F721C201B5300E3717A /* Categories */, + 152AA8901C29887A0030DEEE /* Extensions */, + 06129AA81C8394700099286B /* AAAudioManager.swift */, + 06129AAA1C83B80A0099286B /* AAAudioRouter.swift */, + 066A53311BC534F5000E606E /* AAFileTypes.swift */, + 066A515A1BC4C178000E606E /* AAHashMap.swift */, + 066A51581BC4C14A000E606E /* AASwiftlyLRU.swift */, + 066A51641BC4C366000E606E /* AATools.swift */, + 065975381BC7CA7B00B8C7DF /* Bundle.swift */, + 06C1D07D1C8D0DE900B73632 /* Telephony.swift */, + ); + path = Utils; + sourceTree = ""; + }; + 066A516E1BC4C369000E606E /* FMDB */ = { + isa = PBXGroup; + children = ( + 066A51711BC4C373000E606E /* FMDatabase+Private.h */, + 066A516F1BC4C373000E606E /* FMDatabase.h */, + 066A51701BC4C373000E606E /* FMDatabase.m */, + 066A51721BC4C373000E606E /* FMDatabaseAdditions.h */, + 066A51731BC4C373000E606E /* FMDatabaseAdditions.m */, + 066A51741BC4C373000E606E /* FMDatabasePool.h */, + 066A51751BC4C373000E606E /* FMDatabasePool.m */, + 066A51761BC4C373000E606E /* FMDatabaseQueue.h */, + 066A51771BC4C373000E606E /* FMDatabaseQueue.m */, + 066A51781BC4C373000E606E /* FMResultSet.h */, + 066A51791BC4C373000E606E /* FMResultSet.m */, + ); + path = FMDB; + sourceTree = ""; + }; + 066A51851BC4C377000E606E /* Providers */ = { + isa = PBXGroup; + children = ( + 066A51941BC4C385000E606E /* Storage */, + 065975531BC7DF5100B8C7DF /* CocoaAssetsRuntime.swift */, + 066A518B1BC4C383000E606E /* CocoaFileSystemRuntime.swift */, + 066A518A1BC4C383000E606E /* CocoaHttpRuntime.swift */, + 066A51891BC4C383000E606E /* CocoaNetworkRuntime.swift */, + 066A51861BC4C383000E606E /* CocoaStorageRuntime.swift */, + 065A06B51C6CEFE00012EA09 /* CocoaWebRTCRuntime.swift */, + 06129AA51C8359FB0099286B /* CocoaLifecycleRuntime.swift */, + 0618509F1C95CA2600C522D5 /* CocoaDispatcher.swift */, + 06E1648E1C96D99F005AFB94 /* CocoaCrypto.swift */, + 066A51871BC4C383000E606E /* iOSNotificationProvider.swift */, + 066A51881BC4C383000E606E /* iOSPhoneBookProvider.swift */, + 06E322C81C69344A00D66F53 /* iOSCallsProvider.swift */, + ); + path = Providers; + sourceTree = ""; + }; + 066A51941BC4C385000E606E /* Storage */ = { + isa = PBXGroup; + children = ( + 066A516E1BC4C369000E606E /* FMDB */, + 065975011BC7534100B8C7DF /* FMDBBridge.swift */, + 066A51991BC4C390000E606E /* FMDBExtensions.swift */, + 066A51961BC4C390000E606E /* FMDBKeyValue.swift */, + 066A51951BC4C390000E606E /* FMDBList.swift */, + 066A51981BC4C390000E606E /* UDPreferencesStorage.swift */, + ); + path = Storage; + sourceTree = ""; + }; + 066A52131BC4EDEB000E606E /* Views */ = { + isa = PBXGroup; + children = ( + 069CF4C31BCB908C00C66E12 /* CLTokenInputView */, + 066A52321BC4EEBA000E606E /* Cells */, + 066A52141BC4EE04000E606E /* AAAvatarView.swift */, + 06B489EC1C9F6EBC0054245B /* AAStickerView.swift */, + 066A523A1BC4EECD000E606E /* AABigPlaceholderView.swift */, + 06E7B24B1C0FAB500090660C /* AAMapFastView.swift */, + 06E7B2511C1345E70090660C /* AAMapPinPointView.swift */, + 066A52461BC4EED5000E606E /* AAProgressView.swift */, + 066A523C1BC4EECD000E606E /* AATableViewHeader.swift */, + 066A523D1BC4EECD000E606E /* AATableViewSeparator.swift */, + 06E3C5B71C80EE20004776CD /* AACircleButton.swift */, + 065974A61BC62B3600B8C7DF /* ViewExtensions.swift */, + ); + path = Views; + sourceTree = ""; + }; + 066A52181BC4EE9A000E606E /* Managed Runtime */ = { + isa = PBXGroup; + children = ( + 066A52501BC4EF61000E606E /* AACollectionViewController.swift */, + 066A521E1BC4EEAC000E606E /* AAContentTableController.swift */, + 066A524D1BC4EF61000E606E /* AAImagePickerController.swift */, + 066A521B1BC4EEAC000E606E /* AAManagedRange.swift */, + 066A521A1BC4EEAC000E606E /* AAManagedSection.swift */, + 066A52191BC4EEAC000E606E /* AAManagedTable.swift */, + 066A521F1BC4EEAC000E606E /* AAManagedTableController.swift */, + 066A524E1BC4EF61000E606E /* AANavigationController.swift */, + 066A524F1BC4EF61000E606E /* AATableViewController.swift */, + 066A52491BC4EF49000E606E /* AAViewController.swift */, + 066A52511BC4EF61000E606E /* Alerts.swift */, + 066A52521BC4EF61000E606E /* Executions.swift */, + 066A52211BC4EEAC000E606E /* ManagedAlerts.swift */, + 066A521C1BC4EEAC000E606E /* ManagedBindedCells.swift */, + 066A521D1BC4EEAC000E606E /* ManagedCells.swift */, + 066A52201BC4EEAC000E606E /* ManagedTableExtensions.swift */, + 066A52531BC4EF61000E606E /* Navigations.swift */, + ); + path = "Managed Runtime"; + sourceTree = ""; + }; + 066A52321BC4EEBA000E606E /* Cells */ = { + isa = PBXGroup; + children = ( + 066A523F1BC4EECD000E606E /* AAAvatarCell.swift */, + 066A522C1BC4EEBA000E606E /* AACommonCell.swift */, + 066A52311BC4EEBA000E606E /* AAEditCell.swift */, + 066A52301BC4EEBA000E606E /* AAHeaderCell.swift */, + 066A522F1BC4EEBA000E606E /* AATableViewCell.swift */, + 066A522D1BC4EEBA000E606E /* AATextCell.swift */, + 066A522E1BC4EEBA000E606E /* AATitledCell.swift */, + 0618509D1C9582DD00C522D5 /* AABackgroundCellRenderer.swift */, + ); + path = Cells; + sourceTree = ""; + }; + 066A525F1BC50E53000E606E /* Controllers */ = { + isa = PBXGroup; + children = ( + 06C1D0751C8BC55100B73632 /* Welcome */, + 066A52601BC50E6B000E606E /* Auth */, + 066A52F91BC52FA0000E606E /* Compose */, + 066A53021BC53171000E606E /* Contacts */, + 066A53351BC537BF000E606E /* Conversation */, + 066A52E11BC52A16000E606E /* Group */, + 06E7B2451C0F8D410090660C /* Location */, + 066A53051BC5317B000E606E /* Recent */, + 066A527B1BC51EC6000E606E /* Root */, + 9AAE96461CF81F140092E366 /* Ringtones */, + 066A52EB1BC52AF8000E606E /* Settings */, + 066A53091BC53197000E606E /* User */, + 06E323131C6A7AA300D66F53 /* Calls */, + 066A52C41BC521D5000E606E /* Content */, + 066A52181BC4EE9A000E606E /* Managed Runtime */, + ); + path = Controllers; + sourceTree = ""; + }; + 066A52601BC50E6B000E606E /* Auth */ = { + isa = PBXGroup; + children = ( + 066A526B1BC50E83000E606E /* Cells */, + 066A526E1BC51007000E606E /* Views */, + 066CBCDA1C8D4121004507E2 /* Controllers */, + 06D5C0561C8D6E20002D5045 /* AAAuthLogInViewController.swift */, + 06C1D0761C8BC9FC00B73632 /* AAAuthNameViewController.swift */, + 06C1D07A1C8BFE5C00B73632 /* AAAuthPhoneViewController.swift */, + 066CBCDB1C8D419F004507E2 /* AAAuthEmailViewController.swift */, + 06D5C05B1C8EA842002D5045 /* AAAuthOTPViewController.swift */, + ); + path = Auth; + sourceTree = ""; + }; + 066A526B1BC50E83000E606E /* Cells */ = { + isa = PBXGroup; + children = ( + 066A526C1BC50E8B000E606E /* AAAuthCountryCell.swift */, + ); + path = Cells; + sourceTree = ""; + }; + 066A526E1BC51007000E606E /* Views */ = { + isa = PBXGroup; + children = ( + 066A526F1BC5101A000E606E /* ABPhoneField.h */, + 066A52701BC5101A000E606E /* ABPhoneField.m */, + 06230F401BC95BD200A4807B /* RMPhoneFormat.h */, + 06230F3F1BC95BD200A4807B /* RMPhoneFormat.m */, + ); + path = Views; + sourceTree = ""; + }; + 066A527B1BC51EC6000E606E /* Root */ = { + isa = PBXGroup; + children = ( + 066A527E1BC51ED0000E606E /* AANoSelectionViewController.swift */, + 066A527C1BC51ED0000E606E /* AARootSplitViewController.swift */, + 066A527D1BC51ED0000E606E /* AARootTabViewController.swift */, + ); + path = Root; + sourceTree = ""; + }; + 066A52C41BC521D5000E606E /* Content */ = { + isa = PBXGroup; + children = ( + 066A52D31BC5236B000E606E /* Contacts List */, + 066A53131BC533C5000E606E /* Conversation */, + 066A52C91BC521F1000E606E /* Dialogs List */, + 066A52E01BC52422000E606E /* Input */, + 066A530C1BC5330D000E606E /* Previews */, + 066A52DD1BC52419000E606E /* WebActions */, + ); + path = Content; + sourceTree = ""; + }; + 066A52C91BC521F1000E606E /* Dialogs List */ = { + isa = PBXGroup; + children = ( + 066A52CE1BC521FD000E606E /* Cells */, + 066A52CA1BC521FA000E606E /* AADialogsListContentController.swift */, + 066A52CB1BC521FA000E606E /* AADialogsListContentControllerDelegate.swift */, + ); + path = "Dialogs List"; + sourceTree = ""; + }; + 066A52CE1BC521FD000E606E /* Cells */ = { + isa = PBXGroup; + children = ( + 066A52CF1BC52204000E606E /* AADialogCell.swift */, + 066A52D01BC52204000E606E /* AADialogSearchCell.swift */, + 068AFC381C94A0050055F503 /* AADialogListProcessor.swift */, + ); + path = Cells; + sourceTree = ""; + }; + 066A52D31BC5236B000E606E /* Contacts List */ = { + isa = PBXGroup; + children = ( + 066A52D81BC5237B000E606E /* Cells */, + 066A52D41BC52378000E606E /* AAContactsListContentController.swift */, + 066A52D51BC52378000E606E /* AAContactsListContentControllerDelegate.swift */, + ); + path = "Contacts List"; + sourceTree = ""; + }; + 066A52D81BC5237B000E606E /* Cells */ = { + isa = PBXGroup; + children = ( + 066A52D91BC52385000E606E /* AAContactActionCell.swift */, + 066A52DA1BC52385000E606E /* AAContactCell.swift */, + ); + path = Cells; + sourceTree = ""; + }; + 066A52DD1BC52419000E606E /* WebActions */ = { + isa = PBXGroup; + children = ( + 066A52DE1BC5241F000E606E /* AAWebActionController.swift */, + ); + path = WebActions; + sourceTree = ""; + }; + 066A52E01BC52422000E606E /* Input */ = { + isa = PBXGroup; + children = ( + 066A52C61BC521EA000E606E /* AAEditFieldController.swift */, + 066A52C51BC521EA000E606E /* AAEditTextController.swift */, + ); + path = Input; + sourceTree = ""; + }; + 066A52E11BC52A16000E606E /* Group */ = { + isa = PBXGroup; + children = ( + 066A52E81BC52A25000E606E /* Cells */, + 066A52E21BC52A20000E606E /* AAGroupViewController.swift */, + 06ABFE371D3FCCE30031A0D6 /* AAGroupEditInfoViewController.swift */, + 067B67531D45341D00B9A238 /* AAGroupViewMembersController.swift */, + 06ABFE3C1D41283A0031A0D6 /* AAGroupAdministrationViewController.swift */, + 06ABFE391D410D2D0031A0D6 /* AAGroupTypeController.swift */, + 066A52E31BC52A20000E606E /* AAAddParticipantViewController.swift */, + 066A52E41BC52A20000E606E /* AAInviteLinkViewController.swift */, + ); + path = Group; + sourceTree = ""; + }; + 066A52E81BC52A25000E606E /* Cells */ = { + isa = PBXGroup; + children = ( + 066A52E91BC52A2B000E606E /* AAGroupMemberCell.swift */, + ); + path = Cells; + sourceTree = ""; + }; + 066A52EB1BC52AF8000E606E /* Settings */ = { + isa = PBXGroup; + children = ( + BEE6EAFF1C4D7B5600A2280E /* Wallpapers */, + 066A52F41BC52B09000E606E /* Cells */, + 066A52EC1BC52B02000E606E /* AASettingsViewController.swift */, + 066A52ED1BC52B02000E606E /* AASettingsNotificationsViewController.swift */, + 066A52EE1BC52B02000E606E /* AASettingsPrivacyViewController.swift */, + 152AA8BE1C298C4B0030DEEE /* AASettingsLastSeenController.swift */, + 152AA8BC1C298BF00030DEEE /* AASettingsSessionsController.swift */, + 9AA6A41E1D08568A00957A7F /* AASettingsMediaViewController.swift */, + 066A52EF1BC52B02000E606E /* AASettingsWallpapper.swift */, + ); + path = Settings; + sourceTree = ""; + }; + 066A52F41BC52B09000E606E /* Cells */ = { + isa = PBXGroup; + children = ( + 066A52F51BC52B13000E606E /* AAWallpapperPreviewCell.swift */, + 066A52F61BC52B13000E606E /* AAWallpapperSettingsCell.swift */, + ); + path = Cells; + sourceTree = ""; + }; + 066A52F91BC52FA0000E606E /* Compose */ = { + isa = PBXGroup; + children = ( + 066A52FA1BC52FA8000E606E /* AAComposeController.swift */, + 066A52FB1BC52FA8000E606E /* AAGroupCreateViewController.swift */, + 066A52FC1BC52FA8000E606E /* AAGroupMembersController.swift */, + ); + path = Compose; + sourceTree = ""; + }; + 066A53021BC53171000E606E /* Contacts */ = { + isa = PBXGroup; + children = ( + 066A53031BC53177000E606E /* AAContactsViewController.swift */, + ); + path = Contacts; + sourceTree = ""; + }; + 066A53051BC5317B000E606E /* Recent */ = { + isa = PBXGroup; + children = ( + 066A53061BC53183000E606E /* AARecentViewController.swift */, + ); + path = Recent; + sourceTree = ""; + }; + 066A53091BC53197000E606E /* User */ = { + isa = PBXGroup; + children = ( + 066A530A1BC531A2000E606E /* AAUserViewController.swift */, + ); + path = User; + sourceTree = ""; + }; + 066A530C1BC5330D000E606E /* Previews */ = { + isa = PBXGroup; + children = ( + 066A530E1BC53317000E606E /* AACorePreviewController.swift */, + 066A530F1BC53317000E606E /* AAPhotoPreviewController.swift */, + 066A530D1BC53317000E606E /* AAWallpapperPreviewController.swift */, + ); + path = Previews; + sourceTree = ""; + }; + 066A53131BC533C5000E606E /* Conversation */ = { + isa = PBXGroup; + children = ( + 066A53241BC533FD000E606E /* Cell */, + 066A531B1BC533EB000E606E /* Layouting */, + 066A53181BC533E0000E606E /* Suggestion */, + 15D35F6D1C20196700E3717A /* Views */, + 066A53161BC533DD000E606E /* AABubbles.swift */, + 066A53141BC533D5000E606E /* AAConversationContentController.swift */, + 065975061BC7BB4000B8C7DF /* AANavigationBadge.swift */, + ); + path = Conversation; + sourceTree = ""; + }; + 066A53181BC533E0000E606E /* Suggestion */ = { + isa = PBXGroup; + children = ( + 066A53191BC533E7000E606E /* AAAutoCompleteCell.swift */, + ); + path = Suggestion; + sourceTree = ""; + }; + 066A531B1BC533EB000E606E /* Layouting */ = { + isa = PBXGroup; + children = ( + 066A531C1BC533F5000E606E /* AABubbleBackgroundProcessor.swift */, + 066A531E1BC533F5000E606E /* AAMessagesFlowLayout.swift */, + 066A531D1BC533F5000E606E /* BubbleLayouts.swift */, + 066A531F1BC533F5000E606E /* Caches.swift */, + ); + path = Layouting; + sourceTree = ""; + }; + 066A53241BC533FD000E606E /* Cell */ = { + isa = PBXGroup; + children = ( + 066A53251BC53406000E606E /* AABubbleCell.swift */, + 066A53261BC53406000E606E /* AABubbleTextCell.swift */, + 066A53281BC53406000E606E /* AABubbleBaseFileCell.swift */, + 153F6B5C1C2B3AC500C0B960 /* AABubbleStickerCell.swift */, + 066A532A1BC53406000E606E /* AABubbleDocumentCell.swift */, + 066A53291BC53406000E606E /* AABubbleMediaCell.swift */, + 153F6B5A1C2B109400C0B960 /* AABubbleVoiceCell.swift */, + 066A53271BC53406000E606E /* AABubbleServiceCell.swift */, + 06E7B2491C0F92140090660C /* AABubbleLocationCell.swift */, + 06E7B2531C139B6F0090660C /* AABubbleContactCell.swift */, + ); + path = Cell; + sourceTree = ""; + }; + 066A53351BC537BF000E606E /* Conversation */ = { + isa = PBXGroup; + children = ( + 066A53361BC537CA000E606E /* ConversationViewController.swift */, + ); + path = Conversation; + sourceTree = ""; + }; + 066CBCDA1C8D4121004507E2 /* Controllers */ = { + isa = PBXGroup; + children = ( + 066A52651BC50E7B000E606E /* AAAuthViewController.swift */, + 065974A41BC621F100B8C7DF /* AAAuthNavigationController.swift */, + 066A52611BC50E7B000E606E /* AACountryViewController.swift */, + 064E41B41CA1D2FF00A4A9D1 /* AABigAlertController.swift */, + ); + name = Controllers; + sourceTree = ""; + }; + 069CF4151BCA5DB500C66E12 /* Sources */ = { + isa = PBXGroup; + children = ( + 066A525F1BC50E53000E606E /* Controllers */, + 066A511D1BC4B4BD000E606E /* ActorCore */, + 066A51201BC4B53C000E606E /* SwiftExtensions */, + 066A51571BC4C112000E606E /* Utils */, + 06E322CB1C69392F00D66F53 /* Libs */, + 066A52131BC4EDEB000E606E /* Views */, + 066A525D1BC503BB000E606E /* ActorApplicationDelegate.swift */, + 066A50D51BC4AE63000E606E /* ActorSDK.h */, + 066A50E11BC4AF9F000E606E /* ActorSDK.swift */, + 06CE898F1BD84DF5005A5530 /* ActorSDKAnalytics.swift */, + 066A525B1BC502EB000E606E /* ActorSDKDelegate.swift */, + 066A53381BC5456B000E606E /* ActorStyle.swift */, + 066A50D71BC4AE63000E606E /* Info.plist */, + ); + path = Sources; + sourceTree = ""; + }; + 069CF4C31BCB908C00C66E12 /* CLTokenInputView */ = { + isa = PBXGroup; + children = ( + 069CF4C41BCB909A00C66E12 /* CLBackspaceDetectingTextField.h */, + 069CF4C51BCB909A00C66E12 /* CLBackspaceDetectingTextField.m */, + 069CF4C61BCB909A00C66E12 /* CLToken.h */, + 069CF4C71BCB909A00C66E12 /* CLToken.m */, + 069CF4C81BCB909A00C66E12 /* CLTokenInputView.h */, + 069CF4C91BCB909A00C66E12 /* CLTokenInputView.m */, + 069CF4CA1BCB909A00C66E12 /* CLTokenView.h */, + 069CF4CB1BCB909A00C66E12 /* CLTokenView.m */, + ); + path = CLTokenInputView; + sourceTree = ""; + }; + 06ABFE261D3FAF1A0031A0D6 /* CocoaAsyncSocket */ = { + isa = PBXGroup; + children = ( + 06ABFE2F1D3FAF800031A0D6 /* GCDAsyncSocket.h */, + 06ABFE301D3FAF800031A0D6 /* GCDAsyncSocket.m */, + ); + name = CocoaAsyncSocket; + sourceTree = ""; + }; + 06C1D0751C8BC55100B73632 /* Welcome */ = { + isa = PBXGroup; + children = ( + 153F6B601C2BF8EC00C0B960 /* AAAuthWelcomeController.swift */, + ); + name = Welcome; + sourceTree = ""; + }; + 06E164921C96FF15005AFB94 /* CommonCrypto */ = { + isa = PBXGroup; + children = ( + 06E164931C96FF3D005AFB94 /* module.map */, + ); + name = CommonCrypto; + path = Libs/CommonCrypto; + sourceTree = ""; + }; + 06E322CB1C69392F00D66F53 /* Libs */ = { + isa = PBXGroup; + children = ( + 06ABFE261D3FAF1A0031A0D6 /* CocoaAsyncSocket */, + 06E164921C96FF15005AFB94 /* CommonCrypto */, + 061850A31C95CBF000C522D5 /* YYKit */, + 15D35F0A1C20182900E3717A /* AudioRecorder */, + 06E3230D1C6942C400D66F53 /* WebRTC.h */, + 06E323101C694C1D00D66F53 /* WebRTCExt.swift */, + 0601BBB11CA4C7DE00AEFA81 /* ElegantPresentations.swift */, + 0601BBB31CA4C80D00AEFA81 /* ElegantPresentationController.swift */, + ); + name = Libs; + sourceTree = ""; + }; + 06E323131C6A7AA300D66F53 /* Calls */ = { + isa = PBXGroup; + children = ( + 06E323141C6A7AC000D66F53 /* AACallViewController.swift */, + ); + name = Calls; + sourceTree = ""; + }; + 06E7B2451C0F8D410090660C /* Location */ = { + isa = PBXGroup; + children = ( + 06E7B2461C0F8D7A0090660C /* AALocationPickerController.swift */, + ); + path = Location; + sourceTree = ""; + }; + 152AA8901C29887A0030DEEE /* Extensions */ = { + isa = PBXGroup; + children = ( + BE4DBE6B1C5723BE00A31894 /* AttributedLabel.swift */, + BED5A1CF1C4839200045FDB0 /* NYTPhotoViewer */, + 152AA8911C29891B0030DEEE /* SlackTextViewController */, + 153F6B871C2D7B9700C0B960 /* TapedLabel */, + ); + path = Extensions; + sourceTree = ""; + }; + 152AA8911C29891B0030DEEE /* SlackTextViewController */ = { + isa = PBXGroup; + children = ( + 153F6B471C2B03A400C0B960 /* Ext */, + 152AA8921C2989270030DEEE /* SLKInputAccessoryView.h */, + 152AA8931C2989270030DEEE /* SLKInputAccessoryView.m */, + 152AA8941C2989270030DEEE /* SLKTextInputbar.h */, + 152AA8951C2989270030DEEE /* SLKTextInputbar.m */, + 152AA8981C2989270030DEEE /* SLKTextView+SLKAdditions.h */, + 152AA8991C2989270030DEEE /* SLKTextView+SLKAdditions.m */, + 152AA8961C2989270030DEEE /* SLKTextView.h */, + 152AA8971C2989270030DEEE /* SLKTextView.m */, + 152AA89A1C2989270030DEEE /* SLKTextViewController.h */, + 152AA89B1C2989270030DEEE /* SLKTextViewController.m */, + 152AA89C1C2989270030DEEE /* SLKTypingIndicatorProtocol.h */, + 152AA89D1C2989270030DEEE /* SLKTypingIndicatorView.h */, + 152AA89E1C2989270030DEEE /* SLKTypingIndicatorView.m */, + 152AA89F1C2989270030DEEE /* SLKUIConstants.h */, + 152AA8A01C2989270030DEEE /* UIResponder+SLKAdditions.h */, + 152AA8A11C2989270030DEEE /* UIResponder+SLKAdditions.m */, + 152AA8A21C2989270030DEEE /* UIScrollView+SLKAdditions.h */, + 152AA8A31C2989270030DEEE /* UIScrollView+SLKAdditions.m */, + 152AA8A41C2989270030DEEE /* UIView+SLKAdditions.h */, + 152AA8A51C2989270030DEEE /* UIView+SLKAdditions.m */, + ); + path = SlackTextViewController; + sourceTree = ""; + }; + 153F6B471C2B03A400C0B960 /* Ext */ = { + isa = PBXGroup; + children = ( + ); + path = Ext; + sourceTree = ""; + }; + 153F6B871C2D7B9700C0B960 /* TapedLabel */ = { + isa = PBXGroup; + children = ( + 153F6B891C2D7BA300C0B960 /* AATapLabel.swift */, + 153F6B881C2D7BA300C0B960 /* AATapLabelDelegate.swift */, + ); + path = TapedLabel; + sourceTree = ""; + }; + 15D35F0A1C20182900E3717A /* AudioRecorder */ = { + isa = PBXGroup; + children = ( + 15F89EFE1C211FCE00776ACD /* libopus */, + 15D35F201C20185B00E3717A /* ogg */, + 15D35F0B1C20184700E3717A /* opusenc */, + 15D35F291C20186400E3717A /* opusfile */, + 15D35F3A1C20187E00E3717A /* AAAlertView.h */, + 15D35F3B1C20187E00E3717A /* AAAlertView.m */, + 15D35F461C20187E00E3717A /* AAAudioBuffer.h */, + 15D35F401C20187E00E3717A /* AAAudioPlayer.h */, + 15D35F411C20187E00E3717A /* AAAudioPlayer.m */, + 15D35F3C1C20187E00E3717A /* AAAudioRecorder.h */, + 15D35F3D1C20187E00E3717A /* AAAudioRecorder.m */, + 15D35F471C20187E00E3717A /* AAModernConversationAudioPlayer.h */, + 15D35F481C20187E00E3717A /* AAModernConversationAudioPlayer.m */, + 15D35F491C20187E00E3717A /* AAModernConversationAudioPlayerContext.h */, + 15D35F4A1C20187E00E3717A /* AAModernConversationAudioPlayerContext.m */, + 15D35F4D1C20187E00E3717A /* AAModernViewInlineMediaContext.h */, + 15D35F4E1C20187E00E3717A /* AAModernViewInlineMediaContext.m */, + 15D35F421C20187E00E3717A /* AANativeAudioPlayer.h */, + 15D35F431C20187E00E3717A /* AANativeAudioPlayer.m */, + 15D35F441C20187E00E3717A /* AAOpusAudioPlayerAU.h */, + 15D35F451C20187E00E3717A /* AAOpusAudioPlayerAU.mm */, + 15D35F381C20187E00E3717A /* AAOpusAudioRecorder.h */, + 15D35F391C20187E00E3717A /* AAOpusAudioRecorder.m */, + 15D35F3E1C20187E00E3717A /* AATimer.h */, + 15D35F3F1C20187E00E3717A /* AATimer.m */, + 15D35F4F1C20187E00E3717A /* AATimerTarget.h */, + 15D35F501C20187E00E3717A /* AATimerTarget.m */, + 15D35F361C20187E00E3717A /* ASQueue.h */, + 15D35F371C20187E00E3717A /* ASQueue.m */, + 15D35F4B1C20187E00E3717A /* NSObject+TGLock.h */, + 15D35F4C1C20187E00E3717A /* NSObject+TGLock.m */, + ); + name = AudioRecorder; + path = Utils/AudioRecorder; + sourceTree = ""; + }; + 15D35F0B1C20184700E3717A /* opusenc */ = { + isa = PBXGroup; + children = ( + 15D35F0C1C20185500E3717A /* diag_range.c */, + 15D35F0D1C20185500E3717A /* diag_range.h */, + 15D35F0E1C20185500E3717A /* opus_header.c */, + 15D35F0F1C20185500E3717A /* opus_header.h */, + 15D35F101C20185500E3717A /* opusenc.h */, + 15D35F111C20185500E3717A /* opusenc.m */, + 15D35F121C20185500E3717A /* picture.c */, + 15D35F131C20185500E3717A /* picture.h */, + 15D35F141C20185500E3717A /* wav_io.c */, + 15D35F151C20185500E3717A /* wav_io.h */, + ); + path = opusenc; + sourceTree = ""; + }; + 15D35F201C20185B00E3717A /* ogg */ = { + isa = PBXGroup; + children = ( + 15D35F211C20186200E3717A /* bitwise.c */, + 15D35F221C20186200E3717A /* framing.c */, + 15D35F231C20186200E3717A /* ogg.h */, + 15D35F241C20186200E3717A /* os_types.h */, + ); + path = ogg; + sourceTree = ""; + }; + 15D35F291C20186400E3717A /* opusfile */ = { + isa = PBXGroup; + children = ( + 15D35F2A1C20187200E3717A /* info.c */, + 15D35F2B1C20187200E3717A /* internal.c */, + 15D35F2C1C20187200E3717A /* internal.h */, + 15D35F2D1C20187200E3717A /* opusfile.c */, + 15D35F2E1C20187200E3717A /* opusfile.h */, + 15D35F2F1C20187200E3717A /* stream.c */, + ); + path = opusfile; + sourceTree = ""; + }; + 15D35F6D1C20196700E3717A /* Views */ = { + isa = PBXGroup; + children = ( + BE281CC31C502B070042F6D4 /* VoiceView */, + BE2621551C46569800A817AB /* AttachmentView */, + 15D35F6E1C20196E00E3717A /* AARecordAudioController.swift */, + BE237C9C1C422FFA00060648 /* AAStickersKeyboard.swift */, + ); + path = Views; + sourceTree = ""; + }; + 15D35F721C201B5300E3717A /* Categories */ = { + isa = PBXGroup; + children = ( + 15D35F741C201B6B00E3717A /* AACustomPresentationAnimationController.swift */, + 15D35F731C201B6B00E3717A /* AACustomPresentationController.swift */, + ); + path = Categories; + sourceTree = ""; + }; + 15F89EFE1C211FCE00776ACD /* libopus */ = { + isa = PBXGroup; + children = ( + 15F89F021C211FE100776ACD /* headers */, + 15F89EFF1C211FD700776ACD /* lib */, + ); + path = libopus; + sourceTree = ""; + }; + 15F89EFF1C211FD700776ACD /* lib */ = { + isa = PBXGroup; + children = ( + 15F89F001C211FDE00776ACD /* libopus.a */, + ); + path = lib; + sourceTree = ""; + }; + 15F89F021C211FE100776ACD /* headers */ = { + isa = PBXGroup; + children = ( + 15F89F061C211FED00776ACD /* opus.h */, + 15F89F031C211FED00776ACD /* opus_defines.h */, + 15F89F041C211FED00776ACD /* opus_multistream.h */, + 15F89F051C211FED00776ACD /* opus_types.h */, + ); + path = headers; + sourceTree = ""; + }; + 2F428D134E194A828C3DF863 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 06CE898B1BD841C9005A5530 /* SystemConfiguration.framework */, + 066A51FF1BC4E0B0000E606E /* libsqlite3.tbd */, + 354C3EFA48FBFAEAD0DEEE17 /* Pods_ActorSDK.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9AAE96461CF81F140092E366 /* Ringtones */ = { + isa = PBXGroup; + children = ( + 9AAE96471CF81F140092E366 /* AARingtonesViewController.swift */, + ); + path = Ringtones; + sourceTree = ""; + }; + BE2621551C46569800A817AB /* AttachmentView */ = { + isa = PBXGroup; + children = ( + BE2621561C4656D700A817AB /* AAConvActionSheet.swift */, + BE2621581C4656EE00A817AB /* AAThumbnailView.swift */, + BEFE68D41C4657360001F2D6 /* AAThumbnailCollectionCell.swift */, + ); + name = AttachmentView; + sourceTree = ""; + }; + BE281CC31C502B070042F6D4 /* VoiceView */ = { + isa = PBXGroup; + children = ( + BE281CC41C502B230042F6D4 /* AAVoiceRecorderView.swift */, + ); + name = VoiceView; + sourceTree = ""; + }; + BED5A1CF1C4839200045FDB0 /* NYTPhotoViewer */ = { + isa = PBXGroup; + children = ( + BED5A1DD1C4839610045FDB0 /* Classes */, + BED5A1D01C4839510045FDB0 /* Assets */, + ); + name = NYTPhotoViewer; + sourceTree = ""; + }; + BED5A1D01C4839510045FDB0 /* Assets */ = { + isa = PBXGroup; + children = ( + BED5A1D11C4839590045FDB0 /* NYTPhotoViewerCloseButtonX.png */, + BED5A1D21C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@2x.png */, + BED5A1D31C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@3x.png */, + BED5A1D41C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape.png */, + BED5A1D51C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@2x.png */, + BED5A1D61C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@3x.png */, + ); + name = Assets; + sourceTree = ""; + }; + BED5A1DD1C4839610045FDB0 /* Classes */ = { + isa = PBXGroup; + children = ( + BED5A20B1C48397F0045FDB0 /* ResourseLoading */, + BED5A2021C4839710045FDB0 /* Protocols */, + BED5A1DE1C48396A0045FDB0 /* NYTPhotoCaptionView.h */, + BED5A1DF1C48396A0045FDB0 /* NYTPhotoCaptionView.m */, + BED5A1E01C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.h */, + BED5A1E11C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.m */, + BED5A1E21C48396A0045FDB0 /* NYTPhotosDataSource.h */, + BED5A1E31C48396A0045FDB0 /* NYTPhotosDataSource.m */, + BED5A1E41C48396A0045FDB0 /* NYTPhotosOverlayView.h */, + BED5A1E51C48396A0045FDB0 /* NYTPhotosOverlayView.m */, + BED5A1E61C48396A0045FDB0 /* NYTPhotosViewController.h */, + BED5A1E71C48396A0045FDB0 /* NYTPhotosViewController.m */, + BED5A1E81C48396A0045FDB0 /* NYTPhotoTransitionAnimator.h */, + BED5A1E91C48396A0045FDB0 /* NYTPhotoTransitionAnimator.m */, + BED5A1EA1C48396A0045FDB0 /* NYTPhotoTransitionController.h */, + BED5A1EB1C48396A0045FDB0 /* NYTPhotoTransitionController.m */, + BED5A1EC1C48396A0045FDB0 /* NYTPhotoViewController.h */, + BED5A1ED1C48396A0045FDB0 /* NYTPhotoViewController.m */, + BED5A1EE1C48396A0045FDB0 /* NYTScalingImageView.h */, + BED5A1EF1C48396A0045FDB0 /* NYTScalingImageView.m */, + ); + name = Classes; + sourceTree = ""; + }; + BED5A2021C4839710045FDB0 /* Protocols */ = { + isa = PBXGroup; + children = ( + BED5A2031C4839790045FDB0 /* NYTPhoto.h */, + BED5A2041C4839790045FDB0 /* NYTPhotoCaptionViewLayoutWidthHinting.h */, + BED5A2051C4839790045FDB0 /* NYTPhotoContainer.h */, + BED5A2061C4839790045FDB0 /* NYTPhotosViewControllerDataSource.h */, + ); + name = Protocols; + sourceTree = ""; + }; + BED5A20B1C48397F0045FDB0 /* ResourseLoading */ = { + isa = PBXGroup; + children = ( + BED5A20C1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.h */, + BED5A20D1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.m */, + ); + name = ResourseLoading; + sourceTree = ""; + }; + BEE6EAFF1C4D7B5600A2280E /* Wallpapers */ = { + isa = PBXGroup; + children = ( + BEE6EB021C4D9A1B00A2280E /* Cells */, + BEE6EB001C4D7B7500A2280E /* AASettingsWallpapersController.swift */, + ); + name = Wallpapers; + sourceTree = ""; + }; + BEE6EB021C4D9A1B00A2280E /* Cells */ = { + isa = PBXGroup; + children = ( + BEE6EB031C4D9A4900A2280E /* AAWallpapersCell.swift */, + ); + name = Cells; + sourceTree = ""; + }; + F0BB28A250FF185B1F4D414D /* Pods */ = { + isa = PBXGroup; + children = ( + E30822B631D108159E8B306B /* Pods-ActorSDK.debug.xcconfig */, + F076508E3899D309954904A3 /* Pods-ActorSDK.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ +/* Begin PBXHeadersBuildPhase section */ + 066A50CF1BC4AE63000E606E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 060135031C95ED4C00A18C4E /* YYAsyncLayer.h in Headers */, + 069CF4D21BCB909A00C66E12 /* CLTokenView.h in Headers */, + 066A51831BC4C373000E606E /* FMResultSet.h in Headers */, + 15F89F091C211FED00776ACD /* opus_types.h in Headers */, + 060135071C95ED4C00A18C4E /* YYTransaction.h in Headers */, + 066A517D1BC4C373000E606E /* FMDatabaseAdditions.h in Headers */, + 069CF4D01BCB909A00C66E12 /* CLTokenInputView.h in Headers */, + 060135051C95ED4C00A18C4E /* YYSentinel.h in Headers */, + 066A517F1BC4C373000E606E /* FMDatabasePool.h in Headers */, + 066A51811BC4C373000E606E /* FMDatabaseQueue.h in Headers */, + 066A517A1BC4C373000E606E /* FMDatabase.h in Headers */, + 069CF4CC1BCB909A00C66E12 /* CLBackspaceDetectingTextField.h in Headers */, + 061850F21C95CBF000C522D5 /* YYTextRubyAnnotation.h in Headers */, + 066A50D61BC4AE63000E606E /* ActorSDK.h in Headers */, + 061850E01C95CBF000C522D5 /* YYTextInput.h in Headers */, + 15D35F621C20187E00E3717A /* AAModernConversationAudioPlayer.h in Headers */, + 066A517C1BC4C373000E606E /* FMDatabase+Private.h in Headers */, + 15D35F5B1C20187E00E3717A /* AAAudioPlayer.h in Headers */, + 152AA8B11C2989270030DEEE /* SLKTypingIndicatorView.h in Headers */, + 152AA8A81C2989270030DEEE /* SLKTextInputbar.h in Headers */, + 061850E81C95CBF000C522D5 /* YYTextMagnifier.h in Headers */, + 061850DE1C95CBF000C522D5 /* YYTextEffectWindow.h in Headers */, + 066A52731BC5101A000E606E /* ABPhoneField.h in Headers */, + 061850FA1C95CBF000C522D5 /* UIPasteboard+YYText.h in Headers */, + 061850E61C95CBF000C522D5 /* YYTextLine.h in Headers */, + 061850F61C95CBF000C522D5 /* NSAttributedString+YYText.h in Headers */, + 152AA8AA1C2989270030DEEE /* SLKTextView.h in Headers */, + 152AA8B01C2989270030DEEE /* SLKTypingIndicatorProtocol.h in Headers */, + 152AA8AC1C2989270030DEEE /* SLKTextView+SLKAdditions.h in Headers */, + 06ABFE331D3FAF800031A0D6 /* GCDAsyncSocket.h in Headers */, + 152AA8AE1C2989270030DEEE /* SLKTextViewController.h in Headers */, + 152AA8B31C2989270030DEEE /* SLKUIConstants.h in Headers */, + 152AA8B61C2989270030DEEE /* UIScrollView+SLKAdditions.h in Headers */, + 061850DA1C95CBF000C522D5 /* YYTextContainerView.h in Headers */, + BED5A2111C48413C0045FDB0 /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */, + BED5A2121C48413C0045FDB0 /* NYTPhotoContainer.h in Headers */, + 061850EE1C95CBF000C522D5 /* YYTextAttribute.h in Headers */, + 061851081C95CBF000C522D5 /* YYLabel.h in Headers */, + BED5A2131C48413C0045FDB0 /* NYTPhotosViewControllerDataSource.h in Headers */, + 061851041C95CBF000C522D5 /* YYTextWeakProxy.h in Headers */, + 15D35F681C20187E00E3717A /* AAModernViewInlineMediaContext.h in Headers */, + 152AA8B81C2989270030DEEE /* UIView+SLKAdditions.h in Headers */, + 061850F41C95CBF000C522D5 /* YYTextRunDelegate.h in Headers */, + BED5A1FE1C48396A0045FDB0 /* NYTPhotoViewController.h in Headers */, + 061850EC1C95CBF000C522D5 /* YYTextArchiver.h in Headers */, + 061850E41C95CBF000C522D5 /* YYTextLayout.h in Headers */, + 061850F01C95CBF000C522D5 /* YYTextParser.h in Headers */, + BED5A1F81C48396A0045FDB0 /* NYTPhotosViewController.h in Headers */, + 061851001C95CBF000C522D5 /* YYTextTransaction.h in Headers */, + 15D35F641C20187E00E3717A /* AAModernConversationAudioPlayerContext.h in Headers */, + 061851021C95CBF000C522D5 /* YYTextUtilities.h in Headers */, + 0618510A1C95CBF000C522D5 /* YYText.h in Headers */, + BED5A2071C4839790045FDB0 /* NYTPhoto.h in Headers */, + 15D35F571C20187E00E3717A /* AAAudioRecorder.h in Headers */, + 15F89F071C211FED00776ACD /* opus_defines.h in Headers */, + 061850E21C95CBF000C522D5 /* YYTextKeyboardManager.h in Headers */, + 15D35F341C20187200E3717A /* opusfile.h in Headers */, + 15D35F661C20187E00E3717A /* NSObject+TGLock.h in Headers */, + 061850EA1C95CBF000C522D5 /* YYTextSelectionView.h in Headers */, + 061850FC1C95CBF000C522D5 /* UIView+YYText.h in Headers */, + 15D35F281C20186200E3717A /* os_types.h in Headers */, + 15D35F191C20185500E3717A /* opus_header.h in Headers */, + 061850DC1C95CBF000C522D5 /* YYTextDebugOption.h in Headers */, + 15F89F081C211FED00776ACD /* opus_multistream.h in Headers */, + 15D35F1F1C20185500E3717A /* wav_io.h in Headers */, + 15D35F171C20185500E3717A /* diag_range.h in Headers */, + 15D35F5F1C20187E00E3717A /* AAOpusAudioPlayerAU.h in Headers */, + 15D35F551C20187E00E3717A /* AAAlertView.h in Headers */, + 0618510B1C95CBF000C522D5 /* YYTextView.h in Headers */, + 061850F81C95CBF000C522D5 /* NSParagraphStyle+YYText.h in Headers */, + 061850FE1C95CBF000C522D5 /* YYTextAsyncLayer.h in Headers */, + 15D35F5D1C20187E00E3717A /* AANativeAudioPlayer.h in Headers */, + 15D35F271C20186200E3717A /* ogg.h in Headers */, + 15D35F321C20187200E3717A /* internal.h in Headers */, + 15D35F1A1C20185500E3717A /* opusenc.h in Headers */, + 15D35F591C20187E00E3717A /* AATimer.h in Headers */, + 15D35F531C20187E00E3717A /* AAOpusAudioRecorder.h in Headers */, + 15D35F611C20187E00E3717A /* AAAudioBuffer.h in Headers */, + 061851061C95CBF000C522D5 /* YYDispatchQueuePool.h in Headers */, + 15D35F6A1C20187E00E3717A /* AATimerTarget.h in Headers */, + 15F89F0A1C211FED00776ACD /* opus.h in Headers */, + 15D35F511C20187E00E3717A /* ASQueue.h in Headers */, + 15D35F1D1C20185500E3717A /* picture.h in Headers */, + 06E3230E1C69445C00D66F53 /* WebRTC.h in Headers */, + 06230F421BC95BD200A4807B /* RMPhoneFormat.h in Headers */, + 069CF4CE1BCB909A00C66E12 /* CLToken.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ -cp -a "${PROJECT_DIR}/../sdk-core/core/core-shared/src/main/resources/" "${CONFIGURATION_BUILD_DIR}/ActorSDK.framework/" - - 066A52131BC4EDEB000E606E - - children - - 069CF4C31BCB908C00C66E12 - 066A52321BC4EEBA000E606E - 066A52141BC4EE04000E606E - 06B489EC1C9F6EBC0054245B - 066A523A1BC4EECD000E606E - 06E7B24B1C0FAB500090660C - 06E7B2511C1345E70090660C - 066A52461BC4EED5000E606E - 066A523C1BC4EECD000E606E - 066A523D1BC4EECD000E606E - 06E3C5B71C80EE20004776CD - 065974A61BC62B3600B8C7DF - - isa - PBXGroup - path - Views - sourceTree - <group> - - 066A52141BC4EE04000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAvatarView.swift - sourceTree - <group> - - 066A52151BC4EE04000E606E - - fileRef - 066A52141BC4EE04000E606E - isa - PBXBuildFile - - 066A52181BC4EE9A000E606E - - children - - 066A52501BC4EF61000E606E - 066A521E1BC4EEAC000E606E - 066A524D1BC4EF61000E606E - 066A521B1BC4EEAC000E606E - 066A521A1BC4EEAC000E606E - 066A52191BC4EEAC000E606E - 066A521F1BC4EEAC000E606E - 066A524E1BC4EF61000E606E - 066A524F1BC4EF61000E606E - 066A52491BC4EF49000E606E - 066A52511BC4EF61000E606E - 066A52521BC4EF61000E606E - 066A52211BC4EEAC000E606E - 066A521C1BC4EEAC000E606E - 066A521D1BC4EEAC000E606E - 066A52201BC4EEAC000E606E - 066A52531BC4EF61000E606E - - isa - PBXGroup - path - Managed Runtime - sourceTree - <group> - - 066A52191BC4EEAC000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAManagedTable.swift - sourceTree - <group> - - 066A521A1BC4EEAC000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAManagedSection.swift - sourceTree - <group> - - 066A521B1BC4EEAC000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAManagedRange.swift - sourceTree - <group> - - 066A521C1BC4EEAC000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ManagedBindedCells.swift - sourceTree - <group> - - 066A521D1BC4EEAC000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ManagedCells.swift - sourceTree - <group> - - 066A521E1BC4EEAC000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAContentTableController.swift - sourceTree - <group> - - 066A521F1BC4EEAC000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAManagedTableController.swift - sourceTree - <group> - - 066A52201BC4EEAC000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ManagedTableExtensions.swift - sourceTree - <group> - - 066A52211BC4EEAC000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ManagedAlerts.swift - sourceTree - <group> - - 066A52221BC4EEAC000E606E - - fileRef - 066A52191BC4EEAC000E606E - isa - PBXBuildFile - settings - - COMPILER_FLAGS - -w - - - 066A52231BC4EEAC000E606E - - fileRef - 066A521A1BC4EEAC000E606E - isa - PBXBuildFile - - 066A52241BC4EEAC000E606E - - fileRef - 066A521B1BC4EEAC000E606E - isa - PBXBuildFile - - 066A52251BC4EEAC000E606E - - fileRef - 066A521C1BC4EEAC000E606E - isa - PBXBuildFile - - 066A52261BC4EEAC000E606E - - fileRef - 066A521D1BC4EEAC000E606E - isa - PBXBuildFile - - 066A52271BC4EEAC000E606E - - fileRef - 066A521E1BC4EEAC000E606E - isa - PBXBuildFile - - 066A52281BC4EEAC000E606E - - fileRef - 066A521F1BC4EEAC000E606E - isa - PBXBuildFile - - 066A52291BC4EEAC000E606E - - fileRef - 066A52201BC4EEAC000E606E - isa - PBXBuildFile - - 066A522A1BC4EEAC000E606E - - fileRef - 066A52211BC4EEAC000E606E - isa - PBXBuildFile - - 066A522C1BC4EEBA000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AACommonCell.swift - sourceTree - <group> - - 066A522D1BC4EEBA000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AATextCell.swift - sourceTree - <group> - - 066A522E1BC4EEBA000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AATitledCell.swift - sourceTree - <group> - - 066A522F1BC4EEBA000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AATableViewCell.swift - sourceTree - <group> - - 066A52301BC4EEBA000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAHeaderCell.swift - sourceTree - <group> - - 066A52311BC4EEBA000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAEditCell.swift - sourceTree - <group> - - 066A52321BC4EEBA000E606E - - children - - 066A523F1BC4EECD000E606E - 066A522C1BC4EEBA000E606E - 066A52311BC4EEBA000E606E - 066A52301BC4EEBA000E606E - 066A522F1BC4EEBA000E606E - 066A522D1BC4EEBA000E606E - 066A522E1BC4EEBA000E606E - 0618509D1C9582DD00C522D5 - - isa - PBXGroup - path - Cells - sourceTree - <group> - - 066A52341BC4EEBA000E606E - - fileRef - 066A522C1BC4EEBA000E606E - isa - PBXBuildFile - - 066A52351BC4EEBA000E606E - - fileRef - 066A522D1BC4EEBA000E606E - isa - PBXBuildFile - - 066A52361BC4EEBA000E606E - - fileRef - 066A522E1BC4EEBA000E606E - isa - PBXBuildFile - - 066A52371BC4EEBA000E606E - - fileRef - 066A522F1BC4EEBA000E606E - isa - PBXBuildFile - - 066A52381BC4EEBA000E606E - - fileRef - 066A52301BC4EEBA000E606E - isa - PBXBuildFile - - 066A52391BC4EEBA000E606E - - fileRef - 066A52311BC4EEBA000E606E - isa - PBXBuildFile - - 066A523A1BC4EECD000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABigPlaceholderView.swift - sourceTree - <group> - - 066A523C1BC4EECD000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AATableViewHeader.swift - sourceTree - <group> - - 066A523D1BC4EECD000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AATableViewSeparator.swift - sourceTree - <group> - - 066A523F1BC4EECD000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAvatarCell.swift - sourceTree - <group> - - 066A52401BC4EECD000E606E - - fileRef - 066A523A1BC4EECD000E606E - isa - PBXBuildFile - - 066A52421BC4EECD000E606E - - fileRef - 066A523C1BC4EECD000E606E - isa - PBXBuildFile - - 066A52431BC4EECD000E606E - - fileRef - 066A523D1BC4EECD000E606E - isa - PBXBuildFile - - 066A52451BC4EECD000E606E - - fileRef - 066A523F1BC4EECD000E606E - isa - PBXBuildFile - - 066A52461BC4EED5000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAProgressView.swift - sourceTree - <group> - - 066A52481BC4EED5000E606E - - fileRef - 066A52461BC4EED5000E606E - isa - PBXBuildFile - - 066A52491BC4EF49000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAViewController.swift - sourceTree - <group> - - 066A524B1BC4EF49000E606E - - fileRef - 066A52491BC4EF49000E606E - isa - PBXBuildFile - - 066A524D1BC4EF61000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAImagePickerController.swift - sourceTree - <group> - - 066A524E1BC4EF61000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AANavigationController.swift - sourceTree - <group> - - 066A524F1BC4EF61000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AATableViewController.swift - sourceTree - <group> - - 066A52501BC4EF61000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AACollectionViewController.swift - sourceTree - <group> - - 066A52511BC4EF61000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Alerts.swift - sourceTree - <group> - - 066A52521BC4EF61000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Executions.swift - sourceTree - <group> - - 066A52531BC4EF61000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Navigations.swift - sourceTree - <group> - - 066A52541BC4EF61000E606E - - fileRef - 066A524D1BC4EF61000E606E - isa - PBXBuildFile - - 066A52551BC4EF61000E606E - - fileRef - 066A524E1BC4EF61000E606E - isa - PBXBuildFile - - 066A52561BC4EF61000E606E - - fileRef - 066A524F1BC4EF61000E606E - isa - PBXBuildFile - - 066A52571BC4EF61000E606E - - fileRef - 066A52501BC4EF61000E606E - isa - PBXBuildFile - - 066A52581BC4EF61000E606E - - fileRef - 066A52511BC4EF61000E606E - isa - PBXBuildFile - - 066A52591BC4EF61000E606E - - fileRef - 066A52521BC4EF61000E606E - isa - PBXBuildFile - - 066A525A1BC4EF61000E606E - - fileRef - 066A52531BC4EF61000E606E - isa - PBXBuildFile - - 066A525B1BC502EB000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ActorSDKDelegate.swift - sourceTree - <group> - - 066A525C1BC502EB000E606E - - fileRef - 066A525B1BC502EB000E606E - isa - PBXBuildFile - - 066A525D1BC503BB000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ActorApplicationDelegate.swift - sourceTree - <group> - - 066A525E1BC503BB000E606E - - fileRef - 066A525D1BC503BB000E606E - isa - PBXBuildFile - - 066A525F1BC50E53000E606E - - children - - 06C1D0751C8BC55100B73632 - 066A52601BC50E6B000E606E - 066A52F91BC52FA0000E606E - 066A53021BC53171000E606E - 066A53351BC537BF000E606E - 066A52E11BC52A16000E606E - 06E7B2451C0F8D410090660C - 066A53051BC5317B000E606E - 066A527B1BC51EC6000E606E - 9AAE96461CF81F140092E366 - 066A52EB1BC52AF8000E606E - 066A53091BC53197000E606E - 06E323131C6A7AA300D66F53 - 066A52C41BC521D5000E606E - 066A52181BC4EE9A000E606E - - isa - PBXGroup - path - Controllers - sourceTree - <group> - - 066A52601BC50E6B000E606E - - children - - 066A526B1BC50E83000E606E - 066A526E1BC51007000E606E - 066CBCDA1C8D4121004507E2 - 06D5C0561C8D6E20002D5045 - 06C1D0761C8BC9FC00B73632 - 06C1D07A1C8BFE5C00B73632 - 066CBCDB1C8D419F004507E2 - 06D5C05B1C8EA842002D5045 - - isa - PBXGroup - path - Auth - sourceTree - <group> - - 066A52611BC50E7B000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AACountryViewController.swift - sourceTree - <group> - - 066A52651BC50E7B000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAuthViewController.swift - sourceTree - <group> - - 066A52661BC50E7B000E606E - - fileRef - 066A52611BC50E7B000E606E - isa - PBXBuildFile - - 066A526A1BC50E7B000E606E - - fileRef - 066A52651BC50E7B000E606E - isa - PBXBuildFile - - 066A526B1BC50E83000E606E - - children - - 066A526C1BC50E8B000E606E - - isa - PBXGroup - path - Cells - sourceTree - <group> - - 066A526C1BC50E8B000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAuthCountryCell.swift - sourceTree - <group> - - 066A526D1BC50E8B000E606E - - fileRef - 066A526C1BC50E8B000E606E - isa - PBXBuildFile - - 066A526E1BC51007000E606E - - children - - 066A526F1BC5101A000E606E - 066A52701BC5101A000E606E - 06230F401BC95BD200A4807B - 06230F3F1BC95BD200A4807B - - isa - PBXGroup - path - Views - sourceTree - <group> - - 066A526F1BC5101A000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - ABPhoneField.h - sourceTree - <group> - - 066A52701BC5101A000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - ABPhoneField.m - sourceTree - <group> - - 066A52731BC5101A000E606E - - fileRef - 066A526F1BC5101A000E606E - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 066A52741BC5101A000E606E - - fileRef - 066A52701BC5101A000E606E - isa - PBXBuildFile - - 066A527B1BC51EC6000E606E - - children - - 066A527E1BC51ED0000E606E - 066A527C1BC51ED0000E606E - 066A527D1BC51ED0000E606E - - isa - PBXGroup - path - Root - sourceTree - <group> - - 066A527C1BC51ED0000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AARootSplitViewController.swift - sourceTree - <group> - - 066A527D1BC51ED0000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AARootTabViewController.swift - sourceTree - <group> - - 066A527E1BC51ED0000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AANoSelectionViewController.swift - sourceTree - <group> - - 066A527F1BC51ED0000E606E - - fileRef - 066A527C1BC51ED0000E606E - isa - PBXBuildFile - - 066A52801BC51ED0000E606E - - fileRef - 066A527D1BC51ED0000E606E - isa - PBXBuildFile - - 066A52811BC51ED0000E606E - - fileRef - 066A527E1BC51ED0000E606E - isa - PBXBuildFile - - 066A52C41BC521D5000E606E - - children - - 066A52D31BC5236B000E606E - 066A53131BC533C5000E606E - 066A52C91BC521F1000E606E - 066A52E01BC52422000E606E - 066A530C1BC5330D000E606E - 066A52DD1BC52419000E606E - - isa - PBXGroup - path - Content - sourceTree - <group> - - 066A52C51BC521EA000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAEditTextController.swift - sourceTree - <group> - - 066A52C61BC521EA000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAEditFieldController.swift - sourceTree - <group> - - 066A52C71BC521EA000E606E - - fileRef - 066A52C51BC521EA000E606E - isa - PBXBuildFile - - 066A52C81BC521EA000E606E - - fileRef - 066A52C61BC521EA000E606E - isa - PBXBuildFile - - 066A52C91BC521F1000E606E - - children - - 066A52CE1BC521FD000E606E - 066A52CA1BC521FA000E606E - 066A52CB1BC521FA000E606E - - isa - PBXGroup - path - Dialogs List - sourceTree - <group> - - 066A52CA1BC521FA000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AADialogsListContentController.swift - sourceTree - <group> - - 066A52CB1BC521FA000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AADialogsListContentControllerDelegate.swift - sourceTree - <group> - - 066A52CC1BC521FA000E606E - - fileRef - 066A52CA1BC521FA000E606E - isa - PBXBuildFile - - 066A52CD1BC521FA000E606E - - fileRef - 066A52CB1BC521FA000E606E - isa - PBXBuildFile - - 066A52CE1BC521FD000E606E - - children - - 066A52CF1BC52204000E606E - 066A52D01BC52204000E606E - 068AFC381C94A0050055F503 - - isa - PBXGroup - path - Cells - sourceTree - <group> - - 066A52CF1BC52204000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AADialogCell.swift - sourceTree - <group> - - 066A52D01BC52204000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AADialogSearchCell.swift - sourceTree - <group> - - 066A52D11BC52204000E606E - - fileRef - 066A52CF1BC52204000E606E - isa - PBXBuildFile - - 066A52D21BC52204000E606E - - fileRef - 066A52D01BC52204000E606E - isa - PBXBuildFile - - 066A52D31BC5236B000E606E - - children - - 066A52D81BC5237B000E606E - 066A52D41BC52378000E606E - 066A52D51BC52378000E606E - - isa - PBXGroup - path - Contacts List - sourceTree - <group> - - 066A52D41BC52378000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAContactsListContentController.swift - sourceTree - <group> - - 066A52D51BC52378000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAContactsListContentControllerDelegate.swift - sourceTree - <group> - - 066A52D61BC52378000E606E - - fileRef - 066A52D41BC52378000E606E - isa - PBXBuildFile - - 066A52D71BC52378000E606E - - fileRef - 066A52D51BC52378000E606E - isa - PBXBuildFile - - 066A52D81BC5237B000E606E - - children - - 066A52D91BC52385000E606E - 066A52DA1BC52385000E606E - - isa - PBXGroup - path - Cells - sourceTree - <group> - - 066A52D91BC52385000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAContactActionCell.swift - sourceTree - <group> - - 066A52DA1BC52385000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAContactCell.swift - sourceTree - <group> - - 066A52DB1BC52385000E606E - - fileRef - 066A52D91BC52385000E606E - isa - PBXBuildFile - - 066A52DC1BC52385000E606E - - fileRef - 066A52DA1BC52385000E606E - isa - PBXBuildFile - - 066A52DD1BC52419000E606E - - children - - 066A52DE1BC5241F000E606E - - isa - PBXGroup - path - WebActions - sourceTree - <group> - - 066A52DE1BC5241F000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAWebActionController.swift - sourceTree - <group> - - 066A52DF1BC5241F000E606E - - fileRef - 066A52DE1BC5241F000E606E - isa - PBXBuildFile - - 066A52E01BC52422000E606E - - children - - 066A52C61BC521EA000E606E - 066A52C51BC521EA000E606E - - isa - PBXGroup - path - Input - sourceTree - <group> - - 066A52E11BC52A16000E606E - - children - - 066A52E81BC52A25000E606E - 066A52E21BC52A20000E606E - 06ABFE371D3FCCE30031A0D6 - 067B67531D45341D00B9A238 - 06ABFE3C1D41283A0031A0D6 - 06ABFE391D410D2D0031A0D6 - 066A52E31BC52A20000E606E - 066A52E41BC52A20000E606E - - isa - PBXGroup - path - Group - sourceTree - <group> - - 066A52E21BC52A20000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAGroupViewController.swift - sourceTree - <group> - - 066A52E31BC52A20000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAddParticipantViewController.swift - sourceTree - <group> - - 066A52E41BC52A20000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAInviteLinkViewController.swift - sourceTree - <group> - - 066A52E51BC52A20000E606E - - fileRef - 066A52E21BC52A20000E606E - isa - PBXBuildFile - - 066A52E61BC52A20000E606E - - fileRef - 066A52E31BC52A20000E606E - isa - PBXBuildFile - - 066A52E71BC52A20000E606E - - fileRef - 066A52E41BC52A20000E606E - isa - PBXBuildFile - - 066A52E81BC52A25000E606E - - children - - 066A52E91BC52A2B000E606E - - isa - PBXGroup - path - Cells - sourceTree - <group> - - 066A52E91BC52A2B000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAGroupMemberCell.swift - sourceTree - <group> - - 066A52EA1BC52A2B000E606E - - fileRef - 066A52E91BC52A2B000E606E - isa - PBXBuildFile - - 066A52EB1BC52AF8000E606E - - children - - BEE6EAFF1C4D7B5600A2280E - 066A52F41BC52B09000E606E - 066A52EC1BC52B02000E606E - 066A52ED1BC52B02000E606E - 066A52EE1BC52B02000E606E - 152AA8BE1C298C4B0030DEEE - 152AA8BC1C298BF00030DEEE - 9AA6A41E1D08568A00957A7F - 066A52EF1BC52B02000E606E - - isa - PBXGroup - path - Settings - sourceTree - <group> - - 066A52EC1BC52B02000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AASettingsViewController.swift - sourceTree - <group> - - 066A52ED1BC52B02000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AASettingsNotificationsViewController.swift - sourceTree - <group> - - 066A52EE1BC52B02000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AASettingsPrivacyViewController.swift - sourceTree - <group> - - 066A52EF1BC52B02000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AASettingsWallpapper.swift - sourceTree - <group> - - 066A52F01BC52B02000E606E - - fileRef - 066A52EC1BC52B02000E606E - isa - PBXBuildFile - - 066A52F11BC52B02000E606E - - fileRef - 066A52ED1BC52B02000E606E - isa - PBXBuildFile - - 066A52F21BC52B02000E606E - - fileRef - 066A52EE1BC52B02000E606E - isa - PBXBuildFile - - 066A52F31BC52B02000E606E - - fileRef - 066A52EF1BC52B02000E606E - isa - PBXBuildFile - - 066A52F41BC52B09000E606E - - children - - 066A52F51BC52B13000E606E - 066A52F61BC52B13000E606E - - isa - PBXGroup - path - Cells - sourceTree - <group> - - 066A52F51BC52B13000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAWallpapperPreviewCell.swift - sourceTree - <group> - - 066A52F61BC52B13000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAWallpapperSettingsCell.swift - sourceTree - <group> - - 066A52F71BC52B13000E606E - - fileRef - 066A52F51BC52B13000E606E - isa - PBXBuildFile - - 066A52F81BC52B13000E606E - - fileRef - 066A52F61BC52B13000E606E - isa - PBXBuildFile - - 066A52F91BC52FA0000E606E - - children - - 066A52FA1BC52FA8000E606E - 066A52FB1BC52FA8000E606E - 066A52FC1BC52FA8000E606E - - isa - PBXGroup - path - Compose - sourceTree - <group> - - 066A52FA1BC52FA8000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAComposeController.swift - sourceTree - <group> - - 066A52FB1BC52FA8000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAGroupCreateViewController.swift - sourceTree - <group> - - 066A52FC1BC52FA8000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAGroupMembersController.swift - sourceTree - <group> - - 066A52FD1BC52FA8000E606E - - fileRef - 066A52FA1BC52FA8000E606E - isa - PBXBuildFile - - 066A52FE1BC52FA9000E606E - - fileRef - 066A52FB1BC52FA8000E606E - isa - PBXBuildFile - - 066A52FF1BC52FA9000E606E - - fileRef - 066A52FC1BC52FA8000E606E - isa - PBXBuildFile - - 066A53021BC53171000E606E - - children - - 066A53031BC53177000E606E - - isa - PBXGroup - path - Contacts - sourceTree - <group> - - 066A53031BC53177000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAContactsViewController.swift - sourceTree - <group> - - 066A53041BC53177000E606E - - fileRef - 066A53031BC53177000E606E - isa - PBXBuildFile - - 066A53051BC5317B000E606E - - children - - 066A53061BC53183000E606E - - isa - PBXGroup - path - Recent - sourceTree - <group> - - 066A53061BC53183000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AARecentViewController.swift - sourceTree - <group> - - 066A53071BC53183000E606E - - fileRef - 066A53061BC53183000E606E - isa - PBXBuildFile - - 066A53091BC53197000E606E - - children - - 066A530A1BC531A2000E606E - - isa - PBXGroup - path - User - sourceTree - <group> - - 066A530A1BC531A2000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAUserViewController.swift - sourceTree - <group> - - 066A530B1BC531A2000E606E - - fileRef - 066A530A1BC531A2000E606E - isa - PBXBuildFile - - 066A530C1BC5330D000E606E - - children - - 066A530E1BC53317000E606E - 066A530F1BC53317000E606E - 066A530D1BC53317000E606E - - isa - PBXGroup - path - Previews - sourceTree - <group> - - 066A530D1BC53317000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAWallpapperPreviewController.swift - sourceTree - <group> - - 066A530E1BC53317000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AACorePreviewController.swift - sourceTree - <group> - - 066A530F1BC53317000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAPhotoPreviewController.swift - sourceTree - <group> - - 066A53101BC53317000E606E - - fileRef - 066A530D1BC53317000E606E - isa - PBXBuildFile - - 066A53111BC53317000E606E - - fileRef - 066A530E1BC53317000E606E - isa - PBXBuildFile - - 066A53121BC53317000E606E - - fileRef - 066A530F1BC53317000E606E - isa - PBXBuildFile - - 066A53131BC533C5000E606E - - children - - 066A53241BC533FD000E606E - 066A531B1BC533EB000E606E - 066A53181BC533E0000E606E - 15D35F6D1C20196700E3717A - 066A53161BC533DD000E606E - 066A53141BC533D5000E606E - 065975061BC7BB4000B8C7DF - - isa - PBXGroup - path - Conversation - sourceTree - <group> - - 066A53141BC533D5000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAConversationContentController.swift - sourceTree - <group> - - 066A53151BC533D5000E606E - - fileRef - 066A53141BC533D5000E606E - isa - PBXBuildFile - - 066A53161BC533DD000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABubbles.swift - sourceTree - <group> - - 066A53171BC533DD000E606E - - fileRef - 066A53161BC533DD000E606E - isa - PBXBuildFile - - 066A53181BC533E0000E606E - - children - - 066A53191BC533E7000E606E - - isa - PBXGroup - path - Suggestion - sourceTree - <group> - - 066A53191BC533E7000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAutoCompleteCell.swift - sourceTree - <group> - - 066A531A1BC533E7000E606E - - fileRef - 066A53191BC533E7000E606E - isa - PBXBuildFile - - 066A531B1BC533EB000E606E - - children - - 066A531C1BC533F5000E606E - 066A531E1BC533F5000E606E - 066A531D1BC533F5000E606E - 066A531F1BC533F5000E606E - - isa - PBXGroup - path - Layouting - sourceTree - <group> - - 066A531C1BC533F5000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABubbleBackgroundProcessor.swift - sourceTree - <group> - - 066A531D1BC533F5000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - BubbleLayouts.swift - sourceTree - <group> - - 066A531E1BC533F5000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAMessagesFlowLayout.swift - sourceTree - <group> - - 066A531F1BC533F5000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Caches.swift - sourceTree - <group> - - 066A53201BC533F5000E606E - - fileRef - 066A531C1BC533F5000E606E - isa - PBXBuildFile - - 066A53211BC533F5000E606E - - fileRef - 066A531D1BC533F5000E606E - isa - PBXBuildFile - - 066A53221BC533F5000E606E - - fileRef - 066A531E1BC533F5000E606E - isa - PBXBuildFile - - 066A53231BC533F5000E606E - - fileRef - 066A531F1BC533F5000E606E - isa - PBXBuildFile - - 066A53241BC533FD000E606E - - children - - 066A53251BC53406000E606E - 066A53261BC53406000E606E - 066A53281BC53406000E606E - 153F6B5C1C2B3AC500C0B960 - 066A532A1BC53406000E606E - 066A53291BC53406000E606E - 153F6B5A1C2B109400C0B960 - 066A53271BC53406000E606E - 06E7B2491C0F92140090660C - 06E7B2531C139B6F0090660C - - isa - PBXGroup - path - Cell - sourceTree - <group> - - 066A53251BC53406000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABubbleCell.swift - sourceTree - <group> - - 066A53261BC53406000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABubbleTextCell.swift - sourceTree - <group> - - 066A53271BC53406000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABubbleServiceCell.swift - sourceTree - <group> - - 066A53281BC53406000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABubbleBaseFileCell.swift - sourceTree - <group> - - 066A53291BC53406000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABubbleMediaCell.swift - sourceTree - <group> - - 066A532A1BC53406000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABubbleDocumentCell.swift - sourceTree - <group> - - 066A532B1BC53406000E606E - - fileRef - 066A53251BC53406000E606E - isa - PBXBuildFile - - 066A532C1BC53406000E606E - - fileRef - 066A53261BC53406000E606E - isa - PBXBuildFile - - 066A532D1BC53406000E606E - - fileRef - 066A53271BC53406000E606E - isa - PBXBuildFile - - 066A532E1BC53406000E606E - - fileRef - 066A53281BC53406000E606E - isa - PBXBuildFile - - 066A532F1BC53406000E606E - - fileRef - 066A53291BC53406000E606E - isa - PBXBuildFile - - 066A53301BC53406000E606E - - fileRef - 066A532A1BC53406000E606E - isa - PBXBuildFile - - 066A53311BC534F5000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAFileTypes.swift - sourceTree - <group> - - 066A53331BC534F5000E606E - - fileRef - 066A53311BC534F5000E606E - isa - PBXBuildFile - - 066A53351BC537BF000E606E - - children - - 066A53361BC537CA000E606E - - isa - PBXGroup - path - Conversation - sourceTree - <group> - - 066A53361BC537CA000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ConversationViewController.swift - sourceTree - <group> - - 066A53371BC537CA000E606E - - fileRef - 066A53361BC537CA000E606E - isa - PBXBuildFile - - 066A53381BC5456B000E606E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ActorStyle.swift - sourceTree - <group> - - 066A53391BC5456B000E606E - - fileRef - 066A53381BC5456B000E606E - isa - PBXBuildFile - - 066CBCDA1C8D4121004507E2 - - children - - 066A52651BC50E7B000E606E - 065974A41BC621F100B8C7DF - 066A52611BC50E7B000E606E - 064E41B41CA1D2FF00A4A9D1 - - isa - PBXGroup - name - Controllers - sourceTree - <group> - - 066CBCDB1C8D419F004507E2 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAuthEmailViewController.swift - sourceTree - <group> - - 066CBCDC1C8D419F004507E2 - - fileRef - 066CBCDB1C8D419F004507E2 - isa - PBXBuildFile - - 067B67531D45341D00B9A238 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAGroupViewMembersController.swift - sourceTree - <group> - - 067B67541D45341D00B9A238 - - fileRef - 067B67531D45341D00B9A238 - isa - PBXBuildFile - - 068AFC381C94A0050055F503 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AADialogListProcessor.swift - sourceTree - <group> - - 068AFC391C94A0050055F503 - - fileRef - 068AFC381C94A0050055F503 - isa - PBXBuildFile - - 069CF4151BCA5DB500C66E12 - - children - - 066A525F1BC50E53000E606E - 066A511D1BC4B4BD000E606E - 066A51201BC4B53C000E606E - 066A51571BC4C112000E606E - 06E322CB1C69392F00D66F53 - 066A52131BC4EDEB000E606E - 066A525D1BC503BB000E606E - 066A50D51BC4AE63000E606E - 066A50E11BC4AF9F000E606E - 06CE898F1BD84DF5005A5530 - 066A525B1BC502EB000E606E - 066A53381BC5456B000E606E - 066A50D71BC4AE63000E606E - - isa - PBXGroup - path - Sources - sourceTree - <group> - - 069CF4C31BCB908C00C66E12 - - children - - 069CF4C41BCB909A00C66E12 - 069CF4C51BCB909A00C66E12 - 069CF4C61BCB909A00C66E12 - 069CF4C71BCB909A00C66E12 - 069CF4C81BCB909A00C66E12 - 069CF4C91BCB909A00C66E12 - 069CF4CA1BCB909A00C66E12 - 069CF4CB1BCB909A00C66E12 - - isa - PBXGroup - path - CLTokenInputView - sourceTree - <group> - - 069CF4C41BCB909A00C66E12 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - CLBackspaceDetectingTextField.h - sourceTree - <group> - - 069CF4C51BCB909A00C66E12 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - CLBackspaceDetectingTextField.m - sourceTree - <group> - - 069CF4C61BCB909A00C66E12 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - CLToken.h - sourceTree - <group> - - 069CF4C71BCB909A00C66E12 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - CLToken.m - sourceTree - <group> - - 069CF4C81BCB909A00C66E12 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - CLTokenInputView.h - sourceTree - <group> - - 069CF4C91BCB909A00C66E12 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - CLTokenInputView.m - sourceTree - <group> - - 069CF4CA1BCB909A00C66E12 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - CLTokenView.h - sourceTree - <group> - - 069CF4CB1BCB909A00C66E12 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - CLTokenView.m - sourceTree - <group> - - 069CF4CC1BCB909A00C66E12 - - fileRef - 069CF4C41BCB909A00C66E12 - isa - PBXBuildFile - - 069CF4CD1BCB909A00C66E12 - - fileRef - 069CF4C51BCB909A00C66E12 - isa - PBXBuildFile - - 069CF4CE1BCB909A00C66E12 - - fileRef - 069CF4C61BCB909A00C66E12 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 069CF4CF1BCB909A00C66E12 - - fileRef - 069CF4C71BCB909A00C66E12 - isa - PBXBuildFile - - 069CF4D01BCB909A00C66E12 - - fileRef - 069CF4C81BCB909A00C66E12 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 069CF4D11BCB909A00C66E12 - - fileRef - 069CF4C91BCB909A00C66E12 - isa - PBXBuildFile - - 069CF4D21BCB909A00C66E12 - - fileRef - 069CF4CA1BCB909A00C66E12 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 069CF4D31BCB909A00C66E12 - - fileRef - 069CF4CB1BCB909A00C66E12 - isa - PBXBuildFile - - 06ABFE261D3FAF1A0031A0D6 - - children - - 06ABFE2F1D3FAF800031A0D6 - 06ABFE301D3FAF800031A0D6 - - isa - PBXGroup - name - CocoaAsyncSocket - sourceTree - <group> - - 06ABFE2F1D3FAF800031A0D6 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - GCDAsyncSocket.h - sourceTree - <group> - - 06ABFE301D3FAF800031A0D6 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - GCDAsyncSocket.m - sourceTree - <group> - - 06ABFE331D3FAF800031A0D6 - - fileRef - 06ABFE2F1D3FAF800031A0D6 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 06ABFE341D3FAF800031A0D6 - - fileRef - 06ABFE301D3FAF800031A0D6 - isa - PBXBuildFile - - 06ABFE371D3FCCE30031A0D6 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAGroupEditInfoViewController.swift - sourceTree - <group> - - 06ABFE381D3FCCE30031A0D6 - - fileRef - 06ABFE371D3FCCE30031A0D6 - isa - PBXBuildFile - - 06ABFE391D410D2D0031A0D6 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAGroupTypeController.swift - sourceTree - <group> - - 06ABFE3A1D410D2D0031A0D6 - - fileRef - 06ABFE391D410D2D0031A0D6 - isa - PBXBuildFile - - 06ABFE3C1D41283A0031A0D6 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAGroupAdministrationViewController.swift - sourceTree - <group> - - 06ABFE3D1D41283A0031A0D6 - - fileRef - 06ABFE3C1D41283A0031A0D6 - isa - PBXBuildFile - - 06B489EC1C9F6EBC0054245B - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAStickerView.swift - sourceTree - <group> - - 06B489ED1C9F6EBD0054245B - - fileRef - 06B489EC1C9F6EBC0054245B - isa - PBXBuildFile - - 06C1D0751C8BC55100B73632 - - children - - 153F6B601C2BF8EC00C0B960 - - isa - PBXGroup - name - Welcome - sourceTree - <group> - - 06C1D0761C8BC9FC00B73632 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAuthNameViewController.swift - sourceTree - <group> - - 06C1D0771C8BC9FC00B73632 - - fileRef - 06C1D0761C8BC9FC00B73632 - isa - PBXBuildFile - - 06C1D07A1C8BFE5C00B73632 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAuthPhoneViewController.swift - sourceTree - <group> - - 06C1D07B1C8BFE5C00B73632 - - fileRef - 06C1D07A1C8BFE5C00B73632 - isa - PBXBuildFile - - 06C1D07D1C8D0DE900B73632 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Telephony.swift - sourceTree - <group> - - 06C1D07E1C8D0DEA00B73632 - - fileRef - 06C1D07D1C8D0DE900B73632 - isa - PBXBuildFile - - 06CE898B1BD841C9005A5530 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - SystemConfiguration.framework - path - System/Library/Frameworks/SystemConfiguration.framework - sourceTree - SDKROOT - - 06CE898C1BD841C9005A5530 - - fileRef - 06CE898B1BD841C9005A5530 - isa - PBXBuildFile - - 06CE898F1BD84DF5005A5530 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - ActorSDKAnalytics.swift - sourceTree - <group> - - 06CE89901BD84DF5005A5530 - - fileRef - 06CE898F1BD84DF5005A5530 - isa - PBXBuildFile - - 06D5C0561C8D6E20002D5045 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAuthLogInViewController.swift - sourceTree - <group> - - 06D5C0571C8D6E20002D5045 - - fileRef - 06D5C0561C8D6E20002D5045 - isa - PBXBuildFile - - 06D5C0591C8E9B3B002D5045 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - Promises.swift - sourceTree - <group> - - 06D5C05A1C8E9B3B002D5045 - - fileRef - 06D5C0591C8E9B3B002D5045 - isa - PBXBuildFile - - 06D5C05B1C8EA842002D5045 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAAuthOTPViewController.swift - sourceTree - <group> - - 06D5C05C1C8EA842002D5045 - - fileRef - 06D5C05B1C8EA842002D5045 - isa - PBXBuildFile - - 06E1648E1C96D99F005AFB94 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - CocoaCrypto.swift - sourceTree - <group> - - 06E1648F1C96D99F005AFB94 - - fileRef - 06E1648E1C96D99F005AFB94 - isa - PBXBuildFile - - 06E164921C96FF15005AFB94 - - children - - 06E164931C96FF3D005AFB94 - - isa - PBXGroup - name - CommonCrypto - path - Libs/CommonCrypto - sourceTree - <group> - - 06E164931C96FF3D005AFB94 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.module-map - path - module.map - sourceTree - <group> - - 06E322C81C69344A00D66F53 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - iOSCallsProvider.swift - sourceTree - <group> - - 06E322C91C69344A00D66F53 - - fileRef - 06E322C81C69344A00D66F53 - isa - PBXBuildFile - - 06E322CB1C69392F00D66F53 - - children - - 06ABFE261D3FAF1A0031A0D6 - 06E164921C96FF15005AFB94 - 061850A31C95CBF000C522D5 - 15D35F0A1C20182900E3717A - 06E3230D1C6942C400D66F53 - 06E323101C694C1D00D66F53 - 0601BBB11CA4C7DE00AEFA81 - 0601BBB31CA4C80D00AEFA81 - - isa - PBXGroup - name - Libs - sourceTree - <group> - - 06E3230D1C6942C400D66F53 - - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - WebRTC.h - sourceTree - <group> - - 06E3230E1C69445C00D66F53 - - fileRef - 06E3230D1C6942C400D66F53 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 06E323101C694C1D00D66F53 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - WebRTCExt.swift - sourceTree - <group> - - 06E323111C694C1D00D66F53 - - fileRef - 06E323101C694C1D00D66F53 - isa - PBXBuildFile - - 06E323131C6A7AA300D66F53 - - children - - 06E323141C6A7AC000D66F53 - - isa - PBXGroup - name - Calls - sourceTree - <group> - - 06E323141C6A7AC000D66F53 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - name - AACallViewController.swift - path - Calls/AACallViewController.swift - sourceTree - <group> - - 06E323151C6A7AC000D66F53 - - fileRef - 06E323141C6A7AC000D66F53 - isa - PBXBuildFile - - 06E3C58A1C746AAC004776CD - - isa - PBXFileReference - lastKnownFileType - file - path - tone.m4a - sourceTree - <group> - - 06E3C58B1C746CCC004776CD - - fileRef - 06E3C58A1C746AAC004776CD - isa - PBXBuildFile - - 06E3C58C1C74931F004776CD - - isa - PBXFileReference - lastKnownFileType - file - path - ringtone.m4a - sourceTree - <group> - - 06E3C58D1C749320004776CD - - fileRef - 06E3C58C1C74931F004776CD - isa - PBXBuildFile - - 06E3C5B71C80EE20004776CD - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AACircleButton.swift - sourceTree - <group> - - 06E3C5B81C80EE21004776CD - - fileRef - 06E3C5B71C80EE20004776CD - isa - PBXBuildFile - - 06E7B2451C0F8D410090660C - - children - - 06E7B2461C0F8D7A0090660C - - isa - PBXGroup - path - Location - sourceTree - <group> - - 06E7B2461C0F8D7A0090660C - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AALocationPickerController.swift - sourceTree - <group> - - 06E7B2471C0F8D7A0090660C - - fileRef - 06E7B2461C0F8D7A0090660C - isa - PBXBuildFile - - 06E7B2491C0F92140090660C - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABubbleLocationCell.swift - sourceTree - <group> - - 06E7B24A1C0F92140090660C - - fileRef - 06E7B2491C0F92140090660C - isa - PBXBuildFile - - 06E7B24B1C0FAB500090660C - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAMapFastView.swift - sourceTree - <group> - - 06E7B24C1C0FAB500090660C - - fileRef - 06E7B24B1C0FAB500090660C - isa - PBXBuildFile - - 06E7B2511C1345E70090660C - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAMapPinPointView.swift - sourceTree - <group> - - 06E7B2521C1345E70090660C - - fileRef - 06E7B2511C1345E70090660C - isa - PBXBuildFile - - 06E7B2531C139B6F0090660C - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABubbleContactCell.swift - sourceTree - <group> - - 06E7B2541C139B6F0090660C - - fileRef - 06E7B2531C139B6F0090660C - isa - PBXBuildFile - - 152AA8901C29887A0030DEEE - - children - - BE4DBE6B1C5723BE00A31894 - BED5A1CF1C4839200045FDB0 - 152AA8911C29891B0030DEEE - 153F6B871C2D7B9700C0B960 - - isa - PBXGroup - path - Extensions - sourceTree - <group> - - 152AA8911C29891B0030DEEE - - children - - 153F6B471C2B03A400C0B960 - 152AA8921C2989270030DEEE - 152AA8931C2989270030DEEE - 152AA8941C2989270030DEEE - 152AA8951C2989270030DEEE - 152AA8981C2989270030DEEE - 152AA8991C2989270030DEEE - 152AA8961C2989270030DEEE - 152AA8971C2989270030DEEE - 152AA89A1C2989270030DEEE - 152AA89B1C2989270030DEEE - 152AA89C1C2989270030DEEE - 152AA89D1C2989270030DEEE - 152AA89E1C2989270030DEEE - 152AA89F1C2989270030DEEE - 152AA8A01C2989270030DEEE - 152AA8A11C2989270030DEEE - 152AA8A21C2989270030DEEE - 152AA8A31C2989270030DEEE - 152AA8A41C2989270030DEEE - 152AA8A51C2989270030DEEE - - isa - PBXGroup - path - SlackTextViewController - sourceTree - <group> - - 152AA8921C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - SLKInputAccessoryView.h - sourceTree - <group> - - 152AA8931C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - SLKInputAccessoryView.m - sourceTree - <group> - - 152AA8941C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - SLKTextInputbar.h - sourceTree - <group> - - 152AA8951C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - SLKTextInputbar.m - sourceTree - <group> - - 152AA8961C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - SLKTextView.h - sourceTree - <group> - - 152AA8971C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - SLKTextView.m - sourceTree - <group> - - 152AA8981C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - SLKTextView+SLKAdditions.h - sourceTree - <group> - - 152AA8991C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - SLKTextView+SLKAdditions.m - sourceTree - <group> - - 152AA89A1C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - SLKTextViewController.h - sourceTree - <group> - - 152AA89B1C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - SLKTextViewController.m - sourceTree - <group> - - 152AA89C1C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - SLKTypingIndicatorProtocol.h - sourceTree - <group> - - 152AA89D1C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - SLKTypingIndicatorView.h - sourceTree - <group> - - 152AA89E1C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - SLKTypingIndicatorView.m - sourceTree - <group> - - 152AA89F1C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - SLKUIConstants.h - sourceTree - <group> - - 152AA8A01C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - UIResponder+SLKAdditions.h - sourceTree - <group> - - 152AA8A11C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - UIResponder+SLKAdditions.m - sourceTree - <group> - - 152AA8A21C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - UIScrollView+SLKAdditions.h - sourceTree - <group> - - 152AA8A31C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - UIScrollView+SLKAdditions.m - sourceTree - <group> - - 152AA8A41C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - UIView+SLKAdditions.h - sourceTree - <group> - - 152AA8A51C2989270030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - UIView+SLKAdditions.m - sourceTree - <group> - - 152AA8A71C2989270030DEEE - - fileRef - 152AA8931C2989270030DEEE - isa - PBXBuildFile - - 152AA8A81C2989270030DEEE - - fileRef - 152AA8941C2989270030DEEE - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 152AA8A91C2989270030DEEE - - fileRef - 152AA8951C2989270030DEEE - isa - PBXBuildFile - - 152AA8AA1C2989270030DEEE - - fileRef - 152AA8961C2989270030DEEE - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 152AA8AB1C2989270030DEEE - - fileRef - 152AA8971C2989270030DEEE - isa - PBXBuildFile - - 152AA8AC1C2989270030DEEE - - fileRef - 152AA8981C2989270030DEEE - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 152AA8AD1C2989270030DEEE - - fileRef - 152AA8991C2989270030DEEE - isa - PBXBuildFile - - 152AA8AE1C2989270030DEEE - - fileRef - 152AA89A1C2989270030DEEE - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 152AA8AF1C2989270030DEEE - - fileRef - 152AA89B1C2989270030DEEE - isa - PBXBuildFile - - 152AA8B01C2989270030DEEE - - fileRef - 152AA89C1C2989270030DEEE - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 152AA8B11C2989270030DEEE - - fileRef - 152AA89D1C2989270030DEEE - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 152AA8B21C2989270030DEEE - - fileRef - 152AA89E1C2989270030DEEE - isa - PBXBuildFile - - 152AA8B31C2989270030DEEE - - fileRef - 152AA89F1C2989270030DEEE - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 152AA8B51C2989270030DEEE - - fileRef - 152AA8A11C2989270030DEEE - isa - PBXBuildFile - - 152AA8B61C2989270030DEEE - - fileRef - 152AA8A21C2989270030DEEE - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 152AA8B71C2989270030DEEE - - fileRef - 152AA8A31C2989270030DEEE - isa - PBXBuildFile - - 152AA8B81C2989270030DEEE - - fileRef - 152AA8A41C2989270030DEEE - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 152AA8B91C2989270030DEEE - - fileRef - 152AA8A51C2989270030DEEE - isa - PBXBuildFile - - 152AA8BC1C298BF00030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AASettingsSessionsController.swift - sourceTree - <group> - - 152AA8BD1C298BF00030DEEE - - fileRef - 152AA8BC1C298BF00030DEEE - isa - PBXBuildFile - - 152AA8BE1C298C4B0030DEEE - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AASettingsLastSeenController.swift - sourceTree - <group> - - 152AA8BF1C298C4B0030DEEE - - fileRef - 152AA8BE1C298C4B0030DEEE - isa - PBXBuildFile - - 153F6B3C1C2A9B1900C0B960 - - isa - PBXFileReference - lastKnownFileType - file - path - begin_record.caf - sourceTree - <group> - - 153F6B471C2B03A400C0B960 - - children - - isa - PBXGroup - path - Ext - sourceTree - <group> - - 153F6B5A1C2B109400C0B960 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABubbleVoiceCell.swift - sourceTree - <group> - - 153F6B5B1C2B109400C0B960 - - fileRef - 153F6B5A1C2B109400C0B960 - isa - PBXBuildFile - - 153F6B5C1C2B3AC500C0B960 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AABubbleStickerCell.swift - sourceTree - <group> - - 153F6B5D1C2B3AC500C0B960 - - fileRef - 153F6B5C1C2B3AC500C0B960 - isa - PBXBuildFile - - 153F6B601C2BF8EC00C0B960 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - name - AAAuthWelcomeController.swift - path - Auth/AAAuthWelcomeController.swift - sourceTree - <group> - - 153F6B611C2BF8EC00C0B960 - - fileRef - 153F6B601C2BF8EC00C0B960 - isa - PBXBuildFile - - 153F6B871C2D7B9700C0B960 - - children - - 153F6B891C2D7BA300C0B960 - 153F6B881C2D7BA300C0B960 - - isa - PBXGroup - path - TapedLabel - sourceTree - <group> - - 153F6B881C2D7BA300C0B960 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AATapLabelDelegate.swift - sourceTree - <group> - - 153F6B891C2D7BA300C0B960 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AATapLabel.swift - sourceTree - <group> - - 153F6B8A1C2D7BA300C0B960 - - fileRef - 153F6B881C2D7BA300C0B960 - isa - PBXBuildFile - - 153F6B8B1C2D7BA400C0B960 - - fileRef - 153F6B891C2D7BA300C0B960 - isa - PBXBuildFile - - 15D35F0A1C20182900E3717A - - children - - 15F89EFE1C211FCE00776ACD - 15D35F201C20185B00E3717A - 15D35F0B1C20184700E3717A - 15D35F291C20186400E3717A - 15D35F3A1C20187E00E3717A - 15D35F3B1C20187E00E3717A - 15D35F461C20187E00E3717A - 15D35F401C20187E00E3717A - 15D35F411C20187E00E3717A - 15D35F3C1C20187E00E3717A - 15D35F3D1C20187E00E3717A - 15D35F471C20187E00E3717A - 15D35F481C20187E00E3717A - 15D35F491C20187E00E3717A - 15D35F4A1C20187E00E3717A - 15D35F4D1C20187E00E3717A - 15D35F4E1C20187E00E3717A - 15D35F421C20187E00E3717A - 15D35F431C20187E00E3717A - 15D35F441C20187E00E3717A - 15D35F451C20187E00E3717A - 15D35F381C20187E00E3717A - 15D35F391C20187E00E3717A - 15D35F3E1C20187E00E3717A - 15D35F3F1C20187E00E3717A - 15D35F4F1C20187E00E3717A - 15D35F501C20187E00E3717A - 15D35F361C20187E00E3717A - 15D35F371C20187E00E3717A - 15D35F4B1C20187E00E3717A - 15D35F4C1C20187E00E3717A - - isa - PBXGroup - name - AudioRecorder - path - Utils/AudioRecorder - sourceTree - <group> - - 15D35F0B1C20184700E3717A - - children - - 15D35F0C1C20185500E3717A - 15D35F0D1C20185500E3717A - 15D35F0E1C20185500E3717A - 15D35F0F1C20185500E3717A - 15D35F101C20185500E3717A - 15D35F111C20185500E3717A - 15D35F121C20185500E3717A - 15D35F131C20185500E3717A - 15D35F141C20185500E3717A - 15D35F151C20185500E3717A - - isa - PBXGroup - path - opusenc - sourceTree - <group> - - 15D35F0C1C20185500E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.c - path - diag_range.c - sourceTree - <group> - - 15D35F0D1C20185500E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - diag_range.h - sourceTree - <group> - - 15D35F0E1C20185500E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.c - path - opus_header.c - sourceTree - <group> - - 15D35F0F1C20185500E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - opus_header.h - sourceTree - <group> - - 15D35F101C20185500E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - opusenc.h - sourceTree - <group> - - 15D35F111C20185500E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - opusenc.m - sourceTree - <group> - - 15D35F121C20185500E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.c - path - picture.c - sourceTree - <group> - - 15D35F131C20185500E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - picture.h - sourceTree - <group> - - 15D35F141C20185500E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.c - path - wav_io.c - sourceTree - <group> - - 15D35F151C20185500E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - wav_io.h - sourceTree - <group> - - 15D35F161C20185500E3717A - - fileRef - 15D35F0C1C20185500E3717A - isa - PBXBuildFile - - 15D35F171C20185500E3717A - - fileRef - 15D35F0D1C20185500E3717A - isa - PBXBuildFile - - 15D35F181C20185500E3717A - - fileRef - 15D35F0E1C20185500E3717A - isa - PBXBuildFile - - 15D35F191C20185500E3717A - - fileRef - 15D35F0F1C20185500E3717A - isa - PBXBuildFile - - 15D35F1A1C20185500E3717A - - fileRef - 15D35F101C20185500E3717A - isa - PBXBuildFile - - 15D35F1B1C20185500E3717A - - fileRef - 15D35F111C20185500E3717A - isa - PBXBuildFile - settings - - COMPILER_FLAGS - -w - - - 15D35F1C1C20185500E3717A - - fileRef - 15D35F121C20185500E3717A - isa - PBXBuildFile - settings - - COMPILER_FLAGS - -w - - - 15D35F1D1C20185500E3717A - - fileRef - 15D35F131C20185500E3717A - isa - PBXBuildFile - - 15D35F1E1C20185500E3717A - - fileRef - 15D35F141C20185500E3717A - isa - PBXBuildFile - - 15D35F1F1C20185500E3717A - - fileRef - 15D35F151C20185500E3717A - isa - PBXBuildFile - - 15D35F201C20185B00E3717A - - children - - 15D35F211C20186200E3717A - 15D35F221C20186200E3717A - 15D35F231C20186200E3717A - 15D35F241C20186200E3717A - - isa - PBXGroup - path - ogg - sourceTree - <group> - - 15D35F211C20186200E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.c - path - bitwise.c - sourceTree - <group> - - 15D35F221C20186200E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.c - path - framing.c - sourceTree - <group> - - 15D35F231C20186200E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - ogg.h - sourceTree - <group> - - 15D35F241C20186200E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - os_types.h - sourceTree - <group> - - 15D35F251C20186200E3717A - - fileRef - 15D35F211C20186200E3717A - isa - PBXBuildFile - - 15D35F261C20186200E3717A - - fileRef - 15D35F221C20186200E3717A - isa - PBXBuildFile - settings - - COMPILER_FLAGS - -w - - - 15D35F271C20186200E3717A - - fileRef - 15D35F231C20186200E3717A - isa - PBXBuildFile - - 15D35F281C20186200E3717A - - fileRef - 15D35F241C20186200E3717A - isa - PBXBuildFile - - 15D35F291C20186400E3717A - - children - - 15D35F2A1C20187200E3717A - 15D35F2B1C20187200E3717A - 15D35F2C1C20187200E3717A - 15D35F2D1C20187200E3717A - 15D35F2E1C20187200E3717A - 15D35F2F1C20187200E3717A - - isa - PBXGroup - path - opusfile - sourceTree - <group> - - 15D35F2A1C20187200E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.c - path - info.c - sourceTree - <group> - - 15D35F2B1C20187200E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.c - path - internal.c - sourceTree - <group> - - 15D35F2C1C20187200E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - internal.h - sourceTree - <group> - - 15D35F2D1C20187200E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.c - path - opusfile.c - sourceTree - <group> - - 15D35F2E1C20187200E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - opusfile.h - sourceTree - <group> - - 15D35F2F1C20187200E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.c - path - stream.c - sourceTree - <group> - - 15D35F301C20187200E3717A - - fileRef - 15D35F2A1C20187200E3717A - isa - PBXBuildFile - settings - - COMPILER_FLAGS - -w - - - 15D35F311C20187200E3717A - - fileRef - 15D35F2B1C20187200E3717A - isa - PBXBuildFile - - 15D35F321C20187200E3717A - - fileRef - 15D35F2C1C20187200E3717A - isa - PBXBuildFile - - 15D35F331C20187200E3717A - - fileRef - 15D35F2D1C20187200E3717A - isa - PBXBuildFile - settings - - COMPILER_FLAGS - -w - - - 15D35F341C20187200E3717A - - fileRef - 15D35F2E1C20187200E3717A - isa - PBXBuildFile - - 15D35F351C20187200E3717A - - fileRef - 15D35F2F1C20187200E3717A - isa - PBXBuildFile - - 15D35F361C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - ASQueue.h - sourceTree - <group> - - 15D35F371C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - ASQueue.m - sourceTree - <group> - - 15D35F381C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - AAOpusAudioRecorder.h - sourceTree - <group> - - 15D35F391C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - AAOpusAudioRecorder.m - sourceTree - <group> - - 15D35F3A1C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - AAAlertView.h - sourceTree - <group> - - 15D35F3B1C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - AAAlertView.m - sourceTree - <group> - - 15D35F3C1C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - AAAudioRecorder.h - sourceTree - <group> - - 15D35F3D1C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - AAAudioRecorder.m - sourceTree - <group> - - 15D35F3E1C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - AATimer.h - sourceTree - <group> - - 15D35F3F1C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - AATimer.m - sourceTree - <group> - - 15D35F401C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - AAAudioPlayer.h - sourceTree - <group> - - 15D35F411C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - AAAudioPlayer.m - sourceTree - <group> - - 15D35F421C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - AANativeAudioPlayer.h - sourceTree - <group> - - 15D35F431C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - AANativeAudioPlayer.m - sourceTree - <group> - - 15D35F441C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - AAOpusAudioPlayerAU.h - sourceTree - <group> - - 15D35F451C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.cpp.objcpp - path - AAOpusAudioPlayerAU.mm - sourceTree - <group> - - 15D35F461C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - AAAudioBuffer.h - sourceTree - <group> - - 15D35F471C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - AAModernConversationAudioPlayer.h - sourceTree - <group> - - 15D35F481C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - AAModernConversationAudioPlayer.m - sourceTree - <group> - - 15D35F491C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - AAModernConversationAudioPlayerContext.h - sourceTree - <group> - - 15D35F4A1C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - AAModernConversationAudioPlayerContext.m - sourceTree - <group> - - 15D35F4B1C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NSObject+TGLock.h - sourceTree - <group> - - 15D35F4C1C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NSObject+TGLock.m - sourceTree - <group> - - 15D35F4D1C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - AAModernViewInlineMediaContext.h - sourceTree - <group> - - 15D35F4E1C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - AAModernViewInlineMediaContext.m - sourceTree - <group> - - 15D35F4F1C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - AATimerTarget.h - sourceTree - <group> - - 15D35F501C20187E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - AATimerTarget.m - sourceTree - <group> - - 15D35F511C20187E00E3717A - - fileRef - 15D35F361C20187E00E3717A - isa - PBXBuildFile - - 15D35F521C20187E00E3717A - - fileRef - 15D35F371C20187E00E3717A - isa - PBXBuildFile - - 15D35F531C20187E00E3717A - - fileRef - 15D35F381C20187E00E3717A - isa - PBXBuildFile - - 15D35F541C20187E00E3717A - - fileRef - 15D35F391C20187E00E3717A - isa - PBXBuildFile - settings - - COMPILER_FLAGS - -w - - - 15D35F551C20187E00E3717A - - fileRef - 15D35F3A1C20187E00E3717A - isa - PBXBuildFile - - 15D35F561C20187E00E3717A - - fileRef - 15D35F3B1C20187E00E3717A - isa - PBXBuildFile - - 15D35F571C20187E00E3717A - - fileRef - 15D35F3C1C20187E00E3717A - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 15D35F591C20187E00E3717A - - fileRef - 15D35F3E1C20187E00E3717A - isa - PBXBuildFile - - 15D35F5A1C20187E00E3717A - - fileRef - 15D35F3F1C20187E00E3717A - isa - PBXBuildFile - - 15D35F5B1C20187E00E3717A - - fileRef - 15D35F401C20187E00E3717A - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 15D35F5C1C20187E00E3717A - - fileRef - 15D35F411C20187E00E3717A - isa - PBXBuildFile - - 15D35F5D1C20187E00E3717A - - fileRef - 15D35F421C20187E00E3717A - isa - PBXBuildFile - - 15D35F5E1C20187E00E3717A - - fileRef - 15D35F431C20187E00E3717A - isa - PBXBuildFile - - 15D35F5F1C20187E00E3717A - - fileRef - 15D35F441C20187E00E3717A - isa - PBXBuildFile - - 15D35F601C20187E00E3717A - - fileRef - 15D35F451C20187E00E3717A - isa - PBXBuildFile - settings - - COMPILER_FLAGS - -w - - - 15D35F611C20187E00E3717A - - fileRef - 15D35F461C20187E00E3717A - isa - PBXBuildFile - - 15D35F621C20187E00E3717A - - fileRef - 15D35F471C20187E00E3717A - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 15D35F631C20187E00E3717A - - fileRef - 15D35F481C20187E00E3717A - isa - PBXBuildFile - - 15D35F641C20187E00E3717A - - fileRef - 15D35F491C20187E00E3717A - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 15D35F651C20187E00E3717A - - fileRef - 15D35F4A1C20187E00E3717A - isa - PBXBuildFile - - 15D35F661C20187E00E3717A - - fileRef - 15D35F4B1C20187E00E3717A - isa - PBXBuildFile - - 15D35F671C20187E00E3717A - - fileRef - 15D35F4C1C20187E00E3717A - isa - PBXBuildFile - - 15D35F681C20187E00E3717A - - fileRef - 15D35F4D1C20187E00E3717A - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - 15D35F691C20187E00E3717A - - fileRef - 15D35F4E1C20187E00E3717A - isa - PBXBuildFile - - 15D35F6A1C20187E00E3717A - - fileRef - 15D35F4F1C20187E00E3717A - isa - PBXBuildFile - - 15D35F6B1C20187E00E3717A - - fileRef - 15D35F501C20187E00E3717A - isa - PBXBuildFile - - 15D35F6D1C20196700E3717A - - children - - BE281CC31C502B070042F6D4 - BE2621551C46569800A817AB - 15D35F6E1C20196E00E3717A - BE237C9C1C422FFA00060648 - - isa - PBXGroup - path - Views - sourceTree - <group> - - 15D35F6E1C20196E00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AARecordAudioController.swift - sourceTree - <group> - - 15D35F6F1C20196E00E3717A - - fileRef - 15D35F6E1C20196E00E3717A - isa - PBXBuildFile - - 15D35F721C201B5300E3717A - - children - - 15D35F741C201B6B00E3717A - 15D35F731C201B6B00E3717A - - isa - PBXGroup - path - Categories - sourceTree - <group> - - 15D35F731C201B6B00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AACustomPresentationController.swift - sourceTree - <group> - - 15D35F741C201B6B00E3717A - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AACustomPresentationAnimationController.swift - sourceTree - <group> - - 15D35F751C201B6B00E3717A - - fileRef - 15D35F731C201B6B00E3717A - isa - PBXBuildFile - - 15D35F761C201B6B00E3717A - - fileRef - 15D35F741C201B6B00E3717A - isa - PBXBuildFile - - 15D35F781C20273D00E3717A - - fileRef - 15D35F3D1C20187E00E3717A - isa - PBXBuildFile - settings - - COMPILER_FLAGS - -w - - - 15F89EFE1C211FCE00776ACD - - children - - 15F89F021C211FE100776ACD - 15F89EFF1C211FD700776ACD - - isa - PBXGroup - path - libopus - sourceTree - <group> - - 15F89EFF1C211FD700776ACD - - children - - 15F89F001C211FDE00776ACD - - isa - PBXGroup - path - lib - sourceTree - <group> - - 15F89F001C211FDE00776ACD - - isa - PBXFileReference - lastKnownFileType - archive.ar - path - libopus.a - sourceTree - <group> - - 15F89F021C211FE100776ACD - - children - - 15F89F061C211FED00776ACD - 15F89F031C211FED00776ACD - 15F89F041C211FED00776ACD - 15F89F051C211FED00776ACD - - isa - PBXGroup - path - headers - sourceTree - <group> - - 15F89F031C211FED00776ACD - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - opus_defines.h - sourceTree - <group> - - 15F89F041C211FED00776ACD - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - opus_multistream.h - sourceTree - <group> - - 15F89F051C211FED00776ACD - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - opus_types.h - sourceTree - <group> - - 15F89F061C211FED00776ACD - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - opus.h - sourceTree - <group> - - 15F89F071C211FED00776ACD - - fileRef - 15F89F031C211FED00776ACD - isa - PBXBuildFile - - 15F89F081C211FED00776ACD - - fileRef - 15F89F041C211FED00776ACD - isa - PBXBuildFile - - 15F89F091C211FED00776ACD - - fileRef - 15F89F051C211FED00776ACD - isa - PBXBuildFile - - 15F89F0A1C211FED00776ACD - - fileRef - 15F89F061C211FED00776ACD - isa - PBXBuildFile - - 15F89F0F1C21317400776ACD - - isa - PBXFileReference - lastKnownFileType - text.plist.strings - name - es - path - es.lproj/Localizable.strings - sourceTree - <group> - - 2F428D134E194A828C3DF863 - - children - - 06CE898B1BD841C9005A5530 - 066A51FF1BC4E0B0000E606E - 354C3EFA48FBFAEAD0DEEE17 - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - 354C3EFA48FBFAEAD0DEEE17 - - explicitFileType - wrapper.framework - includeInIndex - 0 - isa - PBXFileReference - path - Pods_ActorSDK.framework - sourceTree - BUILT_PRODUCTS_DIR - - 5B00FFD27DD7E01F43B31D13 - - buildActionMask - 2147483647 - files - - inputPaths - - isa - PBXShellScriptBuildPhase - name - [CP] Check Pods Manifest.lock - outputPaths - - runOnlyForDeploymentPostprocessing - 0 - shellPath - /bin/sh - shellScript - diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null -if [[ $? != 0 ]] ; then - cat << EOM -error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. -EOM - exit 1 -fi - - showEnvVarsInLog - 0 - - 9AA6A41E1D08568A00957A7F - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AASettingsMediaViewController.swift - sourceTree - <group> - - 9AA6A41F1D08568A00957A7F - - fileRef - 9AA6A41E1D08568A00957A7F - isa - PBXBuildFile - - 9AAE96461CF81F140092E366 - - children - - 9AAE96471CF81F140092E366 - - isa - PBXGroup - path - Ringtones - sourceTree - <group> - - 9AAE96471CF81F140092E366 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AARingtonesViewController.swift - sourceTree - <group> - - 9AAE96481CF81F140092E366 - - fileRef - 9AAE96471CF81F140092E366 - isa - PBXBuildFile - - A2ED258362D73946D3AE7FB4 - - buildActionMask - 2147483647 - files - - inputPaths - - isa - PBXShellScriptBuildPhase - name - [CP] Copy Pods Resources - outputPaths - - runOnlyForDeploymentPostprocessing - 0 - shellPath - /bin/sh - shellScript - "${SRCROOT}/Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK-resources.sh" - - showEnvVarsInLog - 0 - - BDF21708B376E212CEAEC43D - - fileRef - 354C3EFA48FBFAEAD0DEEE17 - isa - PBXBuildFile - - BE237C9C1C422FFA00060648 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAStickersKeyboard.swift - sourceTree - <group> - - BE237C9D1C422FFA00060648 - - fileRef - BE237C9C1C422FFA00060648 - isa - PBXBuildFile - - BE2621551C46569800A817AB - - children - - BE2621561C4656D700A817AB - BE2621581C4656EE00A817AB - BEFE68D41C4657360001F2D6 - - isa - PBXGroup - name - AttachmentView - sourceTree - <group> - - BE2621561C4656D700A817AB - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAConvActionSheet.swift - sourceTree - <group> - - BE2621571C4656D700A817AB - - fileRef - BE2621561C4656D700A817AB - isa - PBXBuildFile - - BE2621581C4656EE00A817AB - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAThumbnailView.swift - sourceTree - <group> - - BE2621591C4656EE00A817AB - - fileRef - BE2621581C4656EE00A817AB - isa - PBXBuildFile - - BE281CC31C502B070042F6D4 - - children - - BE281CC41C502B230042F6D4 - - isa - PBXGroup - name - VoiceView - sourceTree - <group> - - BE281CC41C502B230042F6D4 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAVoiceRecorderView.swift - sourceTree - <group> - - BE281CC51C502B230042F6D4 - - fileRef - BE281CC41C502B230042F6D4 - isa - PBXBuildFile - - BE4DBE6B1C5723BE00A31894 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AttributedLabel.swift - sourceTree - <group> - - BE4DBE6C1C5723BE00A31894 - - fileRef - BE4DBE6B1C5723BE00A31894 - isa - PBXBuildFile - - BEAC2B311C42D683007F7A2F - - fileRef - 15F89F001C211FDE00776ACD - isa - PBXBuildFile - - BED5A1CF1C4839200045FDB0 - - children - - BED5A1DD1C4839610045FDB0 - BED5A1D01C4839510045FDB0 - - isa - PBXGroup - name - NYTPhotoViewer - sourceTree - <group> - - BED5A1D01C4839510045FDB0 - - children - - BED5A1D11C4839590045FDB0 - BED5A1D21C4839590045FDB0 - BED5A1D31C4839590045FDB0 - BED5A1D41C4839590045FDB0 - BED5A1D51C4839590045FDB0 - BED5A1D61C4839590045FDB0 - - isa - PBXGroup - name - Assets - sourceTree - <group> - - BED5A1D11C4839590045FDB0 - - isa - PBXFileReference - lastKnownFileType - image.png - path - NYTPhotoViewerCloseButtonX.png - sourceTree - <group> - - BED5A1D21C4839590045FDB0 - - isa - PBXFileReference - lastKnownFileType - image.png - path - NYTPhotoViewerCloseButtonX@2x.png - sourceTree - <group> - - BED5A1D31C4839590045FDB0 - - isa - PBXFileReference - lastKnownFileType - image.png - path - NYTPhotoViewerCloseButtonX@3x.png - sourceTree - <group> - - BED5A1D41C4839590045FDB0 - - isa - PBXFileReference - lastKnownFileType - image.png - path - NYTPhotoViewerCloseButtonXLandscape.png - sourceTree - <group> - - BED5A1D51C4839590045FDB0 - - isa - PBXFileReference - lastKnownFileType - image.png - path - NYTPhotoViewerCloseButtonXLandscape@2x.png - sourceTree - <group> - - BED5A1D61C4839590045FDB0 - - isa - PBXFileReference - lastKnownFileType - image.png - path - NYTPhotoViewerCloseButtonXLandscape@3x.png - sourceTree - <group> - - BED5A1D71C4839590045FDB0 - - fileRef - BED5A1D11C4839590045FDB0 - isa - PBXBuildFile - - BED5A1D81C4839590045FDB0 - - fileRef - BED5A1D21C4839590045FDB0 - isa - PBXBuildFile - - BED5A1D91C4839590045FDB0 - - fileRef - BED5A1D31C4839590045FDB0 - isa - PBXBuildFile - - BED5A1DA1C4839590045FDB0 - - fileRef - BED5A1D41C4839590045FDB0 - isa - PBXBuildFile - - BED5A1DB1C4839590045FDB0 - - fileRef - BED5A1D51C4839590045FDB0 - isa - PBXBuildFile - - BED5A1DC1C4839590045FDB0 - - fileRef - BED5A1D61C4839590045FDB0 - isa - PBXBuildFile - - BED5A1DD1C4839610045FDB0 - - children - - BED5A20B1C48397F0045FDB0 - BED5A2021C4839710045FDB0 - BED5A1DE1C48396A0045FDB0 - BED5A1DF1C48396A0045FDB0 - BED5A1E01C48396A0045FDB0 - BED5A1E11C48396A0045FDB0 - BED5A1E21C48396A0045FDB0 - BED5A1E31C48396A0045FDB0 - BED5A1E41C48396A0045FDB0 - BED5A1E51C48396A0045FDB0 - BED5A1E61C48396A0045FDB0 - BED5A1E71C48396A0045FDB0 - BED5A1E81C48396A0045FDB0 - BED5A1E91C48396A0045FDB0 - BED5A1EA1C48396A0045FDB0 - BED5A1EB1C48396A0045FDB0 - BED5A1EC1C48396A0045FDB0 - BED5A1ED1C48396A0045FDB0 - BED5A1EE1C48396A0045FDB0 - BED5A1EF1C48396A0045FDB0 - - isa - PBXGroup - name - Classes - sourceTree - <group> - - BED5A1DE1C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTPhotoCaptionView.h - sourceTree - <group> - - BED5A1DF1C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NYTPhotoCaptionView.m - sourceTree - <group> - - BED5A1E01C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTPhotoDismissalInteractionController.h - sourceTree - <group> - - BED5A1E11C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NYTPhotoDismissalInteractionController.m - sourceTree - <group> - - BED5A1E21C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTPhotosDataSource.h - sourceTree - <group> - - BED5A1E31C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NYTPhotosDataSource.m - sourceTree - <group> - - BED5A1E41C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTPhotosOverlayView.h - sourceTree - <group> - - BED5A1E51C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NYTPhotosOverlayView.m - sourceTree - <group> - - BED5A1E61C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTPhotosViewController.h - sourceTree - <group> - - BED5A1E71C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NYTPhotosViewController.m - sourceTree - <group> - - BED5A1E81C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTPhotoTransitionAnimator.h - sourceTree - <group> - - BED5A1E91C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NYTPhotoTransitionAnimator.m - sourceTree - <group> - - BED5A1EA1C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTPhotoTransitionController.h - sourceTree - <group> - - BED5A1EB1C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NYTPhotoTransitionController.m - sourceTree - <group> - - BED5A1EC1C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTPhotoViewController.h - sourceTree - <group> - - BED5A1ED1C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NYTPhotoViewController.m - sourceTree - <group> - - BED5A1EE1C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTScalingImageView.h - sourceTree - <group> - - BED5A1EF1C48396A0045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NYTScalingImageView.m - sourceTree - <group> - - BED5A1F11C48396A0045FDB0 - - fileRef - BED5A1DF1C48396A0045FDB0 - isa - PBXBuildFile - - BED5A1F31C48396A0045FDB0 - - fileRef - BED5A1E11C48396A0045FDB0 - isa - PBXBuildFile - - BED5A1F51C48396A0045FDB0 - - fileRef - BED5A1E31C48396A0045FDB0 - isa - PBXBuildFile - - BED5A1F71C48396A0045FDB0 - - fileRef - BED5A1E51C48396A0045FDB0 - isa - PBXBuildFile - - BED5A1F81C48396A0045FDB0 - - fileRef - BED5A1E61C48396A0045FDB0 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - BED5A1F91C48396A0045FDB0 - - fileRef - BED5A1E71C48396A0045FDB0 - isa - PBXBuildFile - - BED5A1FB1C48396A0045FDB0 - - fileRef - BED5A1E91C48396A0045FDB0 - isa - PBXBuildFile - - BED5A1FD1C48396A0045FDB0 - - fileRef - BED5A1EB1C48396A0045FDB0 - isa - PBXBuildFile - - BED5A1FE1C48396A0045FDB0 - - fileRef - BED5A1EC1C48396A0045FDB0 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - BED5A1FF1C48396A0045FDB0 - - fileRef - BED5A1ED1C48396A0045FDB0 - isa - PBXBuildFile - - BED5A2011C48396A0045FDB0 - - fileRef - BED5A1EF1C48396A0045FDB0 - isa - PBXBuildFile - - BED5A2021C4839710045FDB0 - - children - - BED5A2031C4839790045FDB0 - BED5A2041C4839790045FDB0 - BED5A2051C4839790045FDB0 - BED5A2061C4839790045FDB0 - - isa - PBXGroup - name - Protocols - sourceTree - <group> - - BED5A2031C4839790045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTPhoto.h - sourceTree - <group> - - BED5A2041C4839790045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTPhotoCaptionViewLayoutWidthHinting.h - sourceTree - <group> - - BED5A2051C4839790045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTPhotoContainer.h - sourceTree - <group> - - BED5A2061C4839790045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NYTPhotosViewControllerDataSource.h - sourceTree - <group> - - BED5A2071C4839790045FDB0 - - fileRef - BED5A2031C4839790045FDB0 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - BED5A20B1C48397F0045FDB0 - - children - - BED5A20C1C4839880045FDB0 - BED5A20D1C4839880045FDB0 - - isa - PBXGroup - name - ResourseLoading - sourceTree - <group> - - BED5A20C1C4839880045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - path - NSBundle+NYTPhotoViewer.h - sourceTree - <group> - - BED5A20D1C4839880045FDB0 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - NSBundle+NYTPhotoViewer.m - sourceTree - <group> - - BED5A20F1C4839880045FDB0 - - fileRef - BED5A20D1C4839880045FDB0 - isa - PBXBuildFile - - BED5A2111C48413C0045FDB0 - - fileRef - BED5A2041C4839790045FDB0 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - BED5A2121C48413C0045FDB0 - - fileRef - BED5A2051C4839790045FDB0 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - BED5A2131C48413C0045FDB0 - - fileRef - BED5A2061C4839790045FDB0 - isa - PBXBuildFile - settings - - ATTRIBUTES - - Public - - - - BEE6EAFF1C4D7B5600A2280E - - children - - BEE6EB021C4D9A1B00A2280E - BEE6EB001C4D7B7500A2280E - - isa - PBXGroup - name - Wallpapers - sourceTree - <group> - - BEE6EB001C4D7B7500A2280E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AASettingsWallpapersController.swift - sourceTree - <group> - - BEE6EB011C4D7B7500A2280E - - fileRef - BEE6EB001C4D7B7500A2280E - isa - PBXBuildFile - - BEE6EB021C4D9A1B00A2280E - - children - - BEE6EB031C4D9A4900A2280E - - isa - PBXGroup - name - Cells - sourceTree - <group> - - BEE6EB031C4D9A4900A2280E - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAWallpapersCell.swift - sourceTree - <group> - - BEE6EB041C4D9A4900A2280E - - fileRef - BEE6EB031C4D9A4900A2280E - isa - PBXBuildFile - - BEF11DB61C466D800076400A - - fileRef - 153F6B3C1C2A9B1900C0B960 - isa - PBXBuildFile - - BEFE68D41C4657360001F2D6 - - fileEncoding - 4 - isa - PBXFileReference - lastKnownFileType - sourcecode.swift - path - AAThumbnailCollectionCell.swift - sourceTree - <group> - - BEFE68D51C4657360001F2D6 - - fileRef - BEFE68D41C4657360001F2D6 - isa - PBXBuildFile - - E30822B631D108159E8B306B - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text.xcconfig - name - Pods-ActorSDK.debug.xcconfig - path - Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK.debug.xcconfig - sourceTree - <group> - - F076508E3899D309954904A3 - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text.xcconfig - name - Pods-ActorSDK.release.xcconfig - path - Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK.release.xcconfig - sourceTree - <group> - - F0BB28A250FF185B1F4D414D - - children - - E30822B631D108159E8B306B - F076508E3899D309954904A3 - - isa - PBXGroup - name - Pods - sourceTree - <group> - - - rootObject - 066A50C91BC4AE63000E606E - - +/* Begin PBXNativeTarget section */ + 066A50D11BC4AE63000E606E /* ActorSDK */ = { + isa = PBXNativeTarget; + buildConfigurationList = 066A50DA1BC4AE63000E606E /* Build configuration list for PBXNativeTarget "ActorSDK" */; + buildPhases = ( + 5B00FFD27DD7E01F43B31D13 /* [CP] Check Pods Manifest.lock */, + 066A52091BC4EA95000E606E /* Build and Install Actor Core */, + 066A50CD1BC4AE63000E606E /* Sources */, + 066A50CF1BC4AE63000E606E /* Headers */, + 066A50CE1BC4AE63000E606E /* Frameworks */, + 066A50D01BC4AE63000E606E /* Resources */, + A2ED258362D73946D3AE7FB4 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ActorSDK; + productName = ActorSDK; + productReference = 066A50D21BC4AE63000E606E /* ActorSDK.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 066A50C91BC4AE63000E606E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; + ORGANIZATIONNAME = "Steve Kite"; + TargetAttributes = { + 066A50D11BC4AE63000E606E = { + CreatedOnToolsVersion = 7.0; + DevelopmentTeam = HVJR44Y5B6; + LastSwiftMigration = 0800; + }; + }; + }; + buildConfigurationList = 066A50CC1BC4AE63000E606E /* Build configuration list for PBXProject "ActorSDK" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ru, + "zh-Hans", + Base, + es, + ); + mainGroup = 066A50C81BC4AE63000E606E; + productRefGroup = 066A50D31BC4AE63000E606E /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 066A50D11BC4AE63000E606E /* ActorSDK */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 066A50D01BC4AE63000E606E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 06230F451BC95C0E00A4807B /* ABPhoneFieldCodes.txt in Resources */, + 0630741B1BD68E370053DEAF /* bg_1_preview.jpg in Resources */, + BED5A1D91C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@3x.png in Resources */, + BED5A1D81C4839590045FDB0 /* NYTPhotoViewerCloseButtonX@2x.png in Resources */, + BED5A1D71C4839590045FDB0 /* NYTPhotoViewerCloseButtonX.png in Resources */, + 06230F461BC95C0E00A4807B /* PhoneFormats.dat in Resources */, + 065975511BC7DD3C00B8C7DF /* highlight-default.min.css in Resources */, + 0659754B1BC7DBA000B8C7DF /* iapetus.caf in Resources */, + BED5A1DC1C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@3x.png in Resources */, + 0630741A1BD68E370053DEAF /* bg_2_preview.jpg in Resources */, + 065975221BC7C84E00B8C7DF /* bg_3.jpg in Resources */, + 065975211BC7C84E00B8C7DF /* bg_1.jpg in Resources */, + 0659753B1BC7D22200B8C7DF /* Images.xcassets in Resources */, + 065975231BC7C84E00B8C7DF /* bg_2.jpg in Resources */, + 065975521BC7DD3C00B8C7DF /* highlight.min.js in Resources */, + 065975441BC7D34200B8C7DF /* Localizable.strings in Resources */, + 06E3C58B1C746CCC004776CD /* tone.m4a in Resources */, + BED5A1DB1C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape@2x.png in Resources */, + 06E3C58D1C749320004776CD /* ringtone.m4a in Resources */, + 0659754C1BC7DBA000B8C7DF /* notification.caf in Resources */, + BEF11DB61C466D800076400A /* begin_record.caf in Resources */, + 063074191BD68E370053DEAF /* bg_3_preview.jpg in Resources */, + BED5A1DA1C4839590045FDB0 /* NYTPhotoViewerCloseButtonXLandscape.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 066A52091BC4EA95000E606E /* Build and Install Actor Core */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Build and Install Actor Core"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\n\ncd ActorSDK/Sources/ActorCore\nmake translate\nmake build -j3\n\ncd \"${CONFIGURATION_TEMP_DIR}/j2objc/\"\npython \"${PROJECT_DIR}/ActorSDK/Sources/ActorCore/convert.py\" \"${PROJECT_DIR}/ActorSDK/Sources/ActorCore/ActorCore.h\"\n\ncp -af \"${PODS_ROOT}/libjingle_peerconnection/libjingle_peerconnection/Headers/\" \"${CONFIGURATION_BUILD_DIR}/ActorSDK.framework/Headers/\"\n\ncp -a \"${CONFIGURATION_TEMP_DIR}/j2objc/Public/\" \"${CONFIGURATION_BUILD_DIR}/ActorSDK.framework/Headers/\"\n\n\ncp -a \"${PROJECT_DIR}/../sdk-core/core/core-shared/src/main/resources/\" \"${CONFIGURATION_BUILD_DIR}/ActorSDK.framework/\""; + }; + 5B00FFD27DD7E01F43B31D13 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run \'pod install\' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + A2ED258362D73946D3AE7FB4 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 066A50CD1BC4AE63000E606E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 15D35F781C20273D00E3717A /* AAAudioRecorder.m in Sources */, + 15D35F181C20185500E3717A /* opus_header.c in Sources */, + 066A52F81BC52B13000E606E /* AAWallpapperSettingsCell.swift in Sources */, + BEFE68D51C4657360001F2D6 /* AAThumbnailCollectionCell.swift in Sources */, + 066A51591BC4C14A000E606E /* AASwiftlyLRU.swift in Sources */, + 061850F11C95CBF000C522D5 /* YYTextParser.m in Sources */, + BED5A1FB1C48396A0045FDB0 /* NYTPhotoTransitionAnimator.m in Sources */, + 15D35F161C20185500E3717A /* diag_range.c in Sources */, + 061850E11C95CBF000C522D5 /* YYTextInput.m in Sources */, + 9AA6A41F1D08568A00957A7F /* AASettingsMediaViewController.swift in Sources */, + 066A525E1BC503BB000E606E /* ActorApplicationDelegate.swift in Sources */, + 061850F31C95CBF000C522D5 /* YYTextRubyAnnotation.m in Sources */, + BED5A1F91C48396A0045FDB0 /* NYTPhotosViewController.m in Sources */, + 066A53101BC53317000E606E /* AAWallpapperPreviewController.swift in Sources */, + 152AA8B91C2989270030DEEE /* UIView+SLKAdditions.m in Sources */, + 066A52F21BC52B02000E606E /* AASettingsPrivacyViewController.swift in Sources */, + 15D35F561C20187E00E3717A /* AAAlertView.m in Sources */, + 060135061C95ED4C00A18C4E /* YYSentinel.m in Sources */, + 061850DB1C95CBF000C522D5 /* YYTextContainerView.m in Sources */, + 15D35F301C20187200E3717A /* info.c in Sources */, + 066A532E1BC53406000E606E /* AABubbleBaseFileCell.swift in Sources */, + 06ABFE3D1D41283A0031A0D6 /* AAGroupAdministrationViewController.swift in Sources */, + 066A514A1BC4BCE0000E606E /* Dispatch.swift in Sources */, + 066A52401BC4EECD000E606E /* AABigPlaceholderView.swift in Sources */, + BED5A1F51C48396A0045FDB0 /* NYTPhotosDataSource.m in Sources */, + 066A52FF1BC52FA9000E606E /* AAGroupMembersController.swift in Sources */, + 066A53301BC53406000E606E /* AABubbleDocumentCell.swift in Sources */, + 066A52FD1BC52FA8000E606E /* AAComposeController.swift in Sources */, + 066A52351BC4EEBA000E606E /* AATextCell.swift in Sources */, + 061850A01C95CA2600C522D5 /* CocoaDispatcher.swift in Sources */, + 066A51461BC4BBC3000E606E /* Fonts.swift in Sources */, + 066A52271BC4EEAC000E606E /* AAContentTableController.swift in Sources */, + 066A51411BC4BB5C000E606E /* AssosiatedObject.swift in Sources */, + 066A52E51BC52A20000E606E /* AAGroupViewController.swift in Sources */, + 0618509E1C9582DD00C522D5 /* AABackgroundCellRenderer.swift in Sources */, + 15D35F691C20187E00E3717A /* AAModernViewInlineMediaContext.m in Sources */, + 066A52251BC4EEAC000E606E /* ManagedBindedCells.swift in Sources */, + 15D35F601C20187E00E3717A /* AAOpusAudioPlayerAU.mm in Sources */, + 061850EB1C95CBF000C522D5 /* YYTextSelectionView.m in Sources */, + 15D35F1C1C20185500E3717A /* picture.c in Sources */, + 066A532B1BC53406000E606E /* AABubbleCell.swift in Sources */, + 061850E91C95CBF000C522D5 /* YYTextMagnifier.m in Sources */, + 06E323151C6A7AC000D66F53 /* AACallViewController.swift in Sources */, + 066A52C71BC521EA000E606E /* AAEditTextController.swift in Sources */, + 061850FD1C95CBF000C522D5 /* UIView+YYText.m in Sources */, + 153F6B5D1C2B3AC500C0B960 /* AABubbleStickerCell.swift in Sources */, + 15D35F1E1C20185500E3717A /* wav_io.c in Sources */, + 065974A51BC621F100B8C7DF /* AAAuthNavigationController.swift in Sources */, + 068AFC391C94A0050055F503 /* AADialogListProcessor.swift in Sources */, + BED5A1FF1C48396A0045FDB0 /* NYTPhotoViewController.m in Sources */, + 066A518E1BC4C383000E606E /* iOSNotificationProvider.swift in Sources */, + 06E7B2541C139B6F0090660C /* AABubbleContactCell.swift in Sources */, + 066A52CC1BC521FA000E606E /* AADialogsListContentController.swift in Sources */, + 061850E31C95CBF000C522D5 /* YYTextKeyboardManager.m in Sources */, + 066A52571BC4EF61000E606E /* AACollectionViewController.swift in Sources */, + 066A532F1BC53406000E606E /* AABubbleMediaCell.swift in Sources */, + 06ABFE3A1D410D2D0031A0D6 /* AAGroupTypeController.swift in Sources */, + 15D35F631C20187E00E3717A /* AAModernConversationAudioPlayer.m in Sources */, + 066A527F1BC51ED0000E606E /* AARootSplitViewController.swift in Sources */, + 066A52481BC4EED5000E606E /* AAProgressView.swift in Sources */, + 066A51921BC4C383000E606E /* CocoaFileSystemRuntime.swift in Sources */, + 066A52DC1BC52385000E606E /* AAContactCell.swift in Sources */, + 065975071BC7BB4000B8C7DF /* AANavigationBadge.swift in Sources */, + 066A518D1BC4C383000E606E /* CocoaStorageRuntime.swift in Sources */, + 066A52F01BC52B02000E606E /* AASettingsViewController.swift in Sources */, + 060135081C95ED4C00A18C4E /* YYTransaction.m in Sources */, + 066A52741BC5101A000E606E /* ABPhoneField.m in Sources */, + 153F6B611C2BF8EC00C0B960 /* AAAuthWelcomeController.swift in Sources */, + 152AA8A91C2989270030DEEE /* SLKTextInputbar.m in Sources */, + BED5A1F31C48396A0045FDB0 /* NYTPhotoDismissalInteractionController.m in Sources */, + 066A53071BC53183000E606E /* AARecentViewController.swift in Sources */, + 061850EF1C95CBF000C522D5 /* YYTextAttribute.m in Sources */, + 06230F411BC95BD200A4807B /* RMPhoneFormat.m in Sources */, + BE4DBE6C1C5723BE00A31894 /* AttributedLabel.swift in Sources */, + 066A52361BC4EEBA000E606E /* AATitledCell.swift in Sources */, + 066A52431BC4EECD000E606E /* AATableViewSeparator.swift in Sources */, + 061851011C95CBF000C522D5 /* YYTextTransaction.m in Sources */, + 066A52341BC4EEBA000E606E /* AACommonCell.swift in Sources */, + 15D35F311C20187200E3717A /* internal.c in Sources */, + 061850F91C95CBF000C522D5 /* NSParagraphStyle+YYText.m in Sources */, + 06E1648F1C96D99F005AFB94 /* CocoaCrypto.swift in Sources */, + 066A52DF1BC5241F000E606E /* AAWebActionController.swift in Sources */, + 066A51221BC4B55C000E606E /* AADevice.swift in Sources */, + 066A532D1BC53406000E606E /* AABubbleServiceCell.swift in Sources */, + 065974A71BC62B3600B8C7DF /* ViewExtensions.swift in Sources */, + 066A52F11BC52B02000E606E /* AASettingsNotificationsViewController.swift in Sources */, + 061850FF1C95CBF000C522D5 /* YYTextAsyncLayer.m in Sources */, + 065A06B61C6CEFE00012EA09 /* CocoaWebRTCRuntime.swift in Sources */, + 15D35F5A1C20187E00E3717A /* AATimer.m in Sources */, + 066A52381BC4EEBA000E606E /* AAHeaderCell.swift in Sources */, + 06C1D0771C8BC9FC00B73632 /* AAAuthNameViewController.swift in Sources */, + 066A524B1BC4EF49000E606E /* AAViewController.swift in Sources */, + 066A51521BC4BE34000E606E /* Logs.swift in Sources */, + 066A52D71BC52378000E606E /* AAContactsListContentControllerDelegate.swift in Sources */, + 061850FB1C95CBF000C522D5 /* UIPasteboard+YYText.m in Sources */, + 066A51241BC4B56D000E606E /* Colors.swift in Sources */, + 066A53171BC533DD000E606E /* AABubbles.swift in Sources */, + 153F6B8B1C2D7BA400C0B960 /* AATapLabel.swift in Sources */, + 06ABFE341D3FAF800031A0D6 /* GCDAsyncSocket.m in Sources */, + 061850E71C95CBF000C522D5 /* YYTextLine.m in Sources */, + 066A52081BC4E962000E606E /* Makefile in Sources */, + 066A53231BC533F5000E606E /* Caches.swift in Sources */, + 06E7B2471C0F8D7A0090660C /* AALocationPickerController.swift in Sources */, + 061851031C95CBF000C522D5 /* YYTextUtilities.m in Sources */, + 066A51501BC4BE06000E606E /* AARegex.swift in Sources */, + 06CE89901BD84DF5005A5530 /* ActorSDKAnalytics.swift in Sources */, + 061850DD1C95CBF000C522D5 /* YYTextDebugOption.m in Sources */, + 15D35F6F1C20196E00E3717A /* AARecordAudioController.swift in Sources */, + 069CF4D31BCB909A00C66E12 /* CLTokenView.m in Sources */, + 066A52F71BC52B13000E606E /* AAWallpapperPreviewCell.swift in Sources */, + 0601BBB41CA4C80D00AEFA81 /* ElegantPresentationController.swift in Sources */, + 066A51541BC4BE95000E606E /* Images.swift in Sources */, + 152AA8A71C2989270030DEEE /* SLKInputAccessoryView.m in Sources */, + 066A52801BC51ED0000E606E /* AARootTabViewController.swift in Sources */, + 061850E51C95CBF000C522D5 /* YYTextLayout.m in Sources */, + 066A522A1BC4EEAC000E606E /* ManagedAlerts.swift in Sources */, + 069CF4D11BCB909A00C66E12 /* CLTokenInputView.m in Sources */, + 061851051C95CBF000C522D5 /* YYTextWeakProxy.m in Sources */, + 066A52451BC4EECD000E606E /* AAAvatarCell.swift in Sources */, + BE237C9D1C422FFA00060648 /* AAStickersKeyboard.swift in Sources */, + 066A52D21BC52204000E606E /* AADialogSearchCell.swift in Sources */, + 066A52371BC4EEBA000E606E /* AATableViewCell.swift in Sources */, + 066A51481BC4BBF4000E606E /* Views.swift in Sources */, + 066A53151BC533D5000E606E /* AAConversationContentController.swift in Sources */, + 066A52151BC4EE04000E606E /* AAAvatarView.swift in Sources */, + 066A52591BC4EF61000E606E /* Executions.swift in Sources */, + 153F6B8A1C2D7BA300C0B960 /* AATapLabelDelegate.swift in Sources */, + 15D35F5E1C20187E00E3717A /* AANativeAudioPlayer.m in Sources */, + 9AAE96481CF81F140092E366 /* AARingtonesViewController.swift in Sources */, + 066A52DB1BC52385000E606E /* AAContactActionCell.swift in Sources */, + 15D35F331C20187200E3717A /* opusfile.c in Sources */, + 065975391BC7CA7B00B8C7DF /* Bundle.swift in Sources */, + 15D35F6B1C20187E00E3717A /* AATimerTarget.m in Sources */, + 066A53111BC53317000E606E /* AACorePreviewController.swift in Sources */, + 066A519B1BC4C390000E606E /* FMDBKeyValue.swift in Sources */, + 15D35F521C20187E00E3717A /* ASQueue.m in Sources */, + 15D35F651C20187E00E3717A /* AAModernConversationAudioPlayerContext.m in Sources */, + 061851071C95CBF000C522D5 /* YYDispatchQueuePool.m in Sources */, + 066A52F31BC52B02000E606E /* AASettingsWallpapper.swift in Sources */, + 066A53041BC53177000E606E /* AAContactsViewController.swift in Sources */, + 066A51801BC4C373000E606E /* FMDatabasePool.m in Sources */, + 061850F51C95CBF000C522D5 /* YYTextRunDelegate.m in Sources */, + 06129AA91C8394700099286B /* AAAudioManager.swift in Sources */, + 06C1D07B1C8BFE5C00B73632 /* AAAuthPhoneViewController.swift in Sources */, + 0618510C1C95CBF000C522D5 /* YYTextView.m in Sources */, + 066A518F1BC4C383000E606E /* iOSPhoneBookProvider.swift in Sources */, + 060135041C95ED4C00A18C4E /* YYAsyncLayer.m in Sources */, + 066A530B1BC531A2000E606E /* AAUserViewController.swift in Sources */, + 06E3C5B81C80EE21004776CD /* AACircleButton.swift in Sources */, + 153F6B5B1C2B109400C0B960 /* AABubbleVoiceCell.swift in Sources */, + 061851091C95CBF000C522D5 /* YYLabel.m in Sources */, + 15D35F251C20186200E3717A /* bitwise.c in Sources */, + 066A531A1BC533E7000E606E /* AAAutoCompleteCell.swift in Sources */, + 065975051BC757A300B8C7DF /* ActorRuntime.swift in Sources */, + 066A517B1BC4C373000E606E /* FMDatabase.m in Sources */, + 06C1D07E1C8D0DEA00B73632 /* Telephony.swift in Sources */, + BE2621591C4656EE00A817AB /* AAThumbnailView.swift in Sources */, + 066A52561BC4EF61000E606E /* AATableViewController.swift in Sources */, + 152AA8AB1C2989270030DEEE /* SLKTextView.m in Sources */, + 066A52D61BC52378000E606E /* AAContactsListContentController.swift in Sources */, + 065975021BC7534100B8C7DF /* FMDBBridge.swift in Sources */, + 15D35F351C20187200E3717A /* stream.c in Sources */, + BED5A1F71C48396A0045FDB0 /* NYTPhotosOverlayView.m in Sources */, + 066A519E1BC4C390000E606E /* FMDBExtensions.swift in Sources */, + 066A52E61BC52A20000E606E /* AAAddParticipantViewController.swift in Sources */, + 066A52C81BC521EA000E606E /* AAEditFieldController.swift in Sources */, + 066A532C1BC53406000E606E /* AABubbleTextCell.swift in Sources */, + BE2621571C4656D700A817AB /* AAConvActionSheet.swift in Sources */, + 066A52261BC4EEAC000E606E /* ManagedCells.swift in Sources */, + 066A53221BC533F5000E606E /* AAMessagesFlowLayout.swift in Sources */, + 15D35F541C20187E00E3717A /* AAOpusAudioRecorder.m in Sources */, + 06E322C91C69344A00D66F53 /* iOSCallsProvider.swift in Sources */, + 066A53371BC537CA000E606E /* ConversationViewController.swift in Sources */, + 066A519D1BC4C390000E606E /* UDPreferencesStorage.swift in Sources */, + 069CF4CD1BCB909A00C66E12 /* CLBackspaceDetectingTextField.m in Sources */, + 15D35F1B1C20185500E3717A /* opusenc.m in Sources */, + 152AA8BD1C298BF00030DEEE /* AASettingsSessionsController.swift in Sources */, + 066A515B1BC4C178000E606E /* AAHashMap.swift in Sources */, + 066A52811BC51ED0000E606E /* AANoSelectionViewController.swift in Sources */, + BEE6EB041C4D9A4900A2280E /* AAWallpapersCell.swift in Sources */, + 152AA8B21C2989270030DEEE /* SLKTypingIndicatorView.m in Sources */, + 066A52281BC4EEAC000E606E /* AAManagedTableController.swift in Sources */, + 065975541BC7DF5100B8C7DF /* CocoaAssetsRuntime.swift in Sources */, + 06E7B2521C1345E70090660C /* AAMapPinPointView.swift in Sources */, + 06129AAB1C83B80B0099286B /* AAAudioRouter.swift in Sources */, + 066A53121BC53317000E606E /* AAPhotoPreviewController.swift in Sources */, + 066A52391BC4EEBA000E606E /* AAEditCell.swift in Sources */, + 066A526D1BC50E8B000E606E /* AAAuthCountryCell.swift in Sources */, + 152AA8AF1C2989270030DEEE /* SLKTextViewController.m in Sources */, + 066A51911BC4C383000E606E /* CocoaHttpRuntime.swift in Sources */, + BE281CC51C502B230042F6D4 /* AAVoiceRecorderView.swift in Sources */, + 066A53211BC533F5000E606E /* BubbleLayouts.swift in Sources */, + 066A51821BC4C373000E606E /* FMDatabaseQueue.m in Sources */, + 061850F71C95CBF000C522D5 /* NSAttributedString+YYText.m in Sources */, + 066A525A1BC4EF61000E606E /* Navigations.swift in Sources */, + 066A51841BC4C373000E606E /* FMResultSet.m in Sources */, + 066A514E1BC4BDE4000E606E /* Numbers.swift in Sources */, + 06B489ED1C9F6EBD0054245B /* AAStickerView.swift in Sources */, + 15D35F671C20187E00E3717A /* NSObject+TGLock.m in Sources */, + 06D5C05C1C8EA842002D5045 /* AAAuthOTPViewController.swift in Sources */, + 15D35F5C1C20187E00E3717A /* AAAudioPlayer.m in Sources */, + 152AA8BF1C298C4B0030DEEE /* AASettingsLastSeenController.swift in Sources */, + 066A51561BC4BEF5000E606E /* AALocalized.swift in Sources */, + 069CF4CF1BCB909A00C66E12 /* CLToken.m in Sources */, + 15D35F751C201B6B00E3717A /* AACustomPresentationController.swift in Sources */, + 066A51441BC4BBAF000E606E /* Strings.swift in Sources */, + BEE6EB011C4D7B7500A2280E /* AASettingsWallpapersController.swift in Sources */, + BED5A2011C48396A0045FDB0 /* NYTScalingImageView.m in Sources */, + 066A53331BC534F5000E606E /* AAFileTypes.swift in Sources */, + 066A52FE1BC52FA9000E606E /* AAGroupCreateViewController.swift in Sources */, + 066A52E71BC52A20000E606E /* AAInviteLinkViewController.swift in Sources */, + 152AA8AD1C2989270030DEEE /* SLKTextView+SLKAdditions.m in Sources */, + 152AA8B71C2989270030DEEE /* UIScrollView+SLKAdditions.m in Sources */, + 066A52241BC4EEAC000E606E /* AAManagedRange.swift in Sources */, + 061850ED1C95CBF000C522D5 /* YYTextArchiver.m in Sources */, + 066A50E21BC4AF9F000E606E /* ActorSDK.swift in Sources */, + 15D35F761C201B6B00E3717A /* AACustomPresentationAnimationController.swift in Sources */, + 06E7B24C1C0FAB500090660C /* AAMapFastView.swift in Sources */, + BED5A1F11C48396A0045FDB0 /* NYTPhotoCaptionView.m in Sources */, + BED5A20F1C4839880045FDB0 /* NSBundle+NYTPhotoViewer.m in Sources */, + 06129AA61C8359FB0099286B /* CocoaLifecycleRuntime.swift in Sources */, + 066A516D1BC4C366000E606E /* ActorCoreExt.swift in Sources */, + 066A517E1BC4C373000E606E /* FMDatabaseAdditions.m in Sources */, + 066A519A1BC4C390000E606E /* FMDBList.swift in Sources */, + 066A52221BC4EEAC000E606E /* AAManagedTable.swift in Sources */, + 152AA8B51C2989270030DEEE /* UIResponder+SLKAdditions.m in Sources */, + 066A52EA1BC52A2B000E606E /* AAGroupMemberCell.swift in Sources */, + 066A52291BC4EEAC000E606E /* ManagedTableExtensions.swift in Sources */, + BED5A1FD1C48396A0045FDB0 /* NYTPhotoTransitionController.m in Sources */, + 066A514C1BC4BD05000E606E /* Collections.swift in Sources */, + 066A526A1BC50E7B000E606E /* AAAuthViewController.swift in Sources */, + 066A52541BC4EF61000E606E /* AAImagePickerController.swift in Sources */, + 066A525C1BC502EB000E606E /* ActorSDKDelegate.swift in Sources */, + 066A52551BC4EF61000E606E /* AANavigationController.swift in Sources */, + 066A52421BC4EECD000E606E /* AATableViewHeader.swift in Sources */, + 06D5C05A1C8E9B3B002D5045 /* Promises.swift in Sources */, + 064E41B51CA1D2FF00A4A9D1 /* AABigAlertController.swift in Sources */, + 066A52CD1BC521FA000E606E /* AADialogsListContentControllerDelegate.swift in Sources */, + 15D35F261C20186200E3717A /* framing.c in Sources */, + 06D5C0571C8D6E20002D5045 /* AAAuthLogInViewController.swift in Sources */, + 06E323111C694C1D00D66F53 /* WebRTCExt.swift in Sources */, + 066A52231BC4EEAC000E606E /* AAManagedSection.swift in Sources */, + 066A52D11BC52204000E606E /* AADialogCell.swift in Sources */, + 066A51901BC4C383000E606E /* CocoaNetworkRuntime.swift in Sources */, + 06ABFE381D3FCCE30031A0D6 /* AAGroupEditInfoViewController.swift in Sources */, + 06E7B24A1C0F92140090660C /* AABubbleLocationCell.swift in Sources */, + 067B67541D45341D00B9A238 /* AAGroupViewMembersController.swift in Sources */, + 066A52581BC4EF61000E606E /* Alerts.swift in Sources */, + 066A51691BC4C366000E606E /* AATools.swift in Sources */, + 066A53201BC533F5000E606E /* AABubbleBackgroundProcessor.swift in Sources */, + 066CBCDC1C8D419F004507E2 /* AAAuthEmailViewController.swift in Sources */, + 061850DF1C95CBF000C522D5 /* YYTextEffectWindow.m in Sources */, + 066A52661BC50E7B000E606E /* AACountryViewController.swift in Sources */, + 0601BBB21CA4C7DE00AEFA81 /* ElegantPresentations.swift in Sources */, + 066A53391BC5456B000E606E /* ActorStyle.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 065975461BC7D34200B8C7DF /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 0659754D1BC7DCED00B8C7DF /* Base */, + 15F89F0F1C21317400776ACD /* es */, + 065975451BC7D34200B8C7DF /* pt */, + 065975471BC7D34400B8C7DF /* ru */, + 065975481BC7D34600B8C7DF /* zh-Hans */, + ); + name = Localizable.strings; + path = .; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 066A50D81BC4AE63000E606E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 066A50D91BC4AE63000E606E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 066A50DB1BC4AE63000E606E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E30822B631D108159E8B306B /* Pods-ActorSDK.debug.xcconfig */; + buildSettings = { + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/build/Debug-iphoneos", + "$(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks", + ); + GCC_DYNAMIC_NO_PIC = NO; + GCC_LINK_WITH_DYNAMIC_LIBRARIES = YES; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; + INFOPLIST_FILE = "$(SRCROOT)/ActorSDK/Sources/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_NO_PIE = NO; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(CONFIGURATION_TEMP_DIR)/j2objc/Objects/", + "$(PROJECT_DIR)/ActorSDK/Sources/Utils", + "$(PROJECT_DIR)/ActorSDK/Sources/Utils/AudioRecorder/libopus/lib", + "$(inherited)", + "$(PROJECT_DIR)/ActorSDK/Libs", + ); + MACH_O_TYPE = mh_dylib; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-lactor", + "$(inherited)", + "-framework", + j2objc, + ); + PRODUCT_BUNDLE_IDENTIFIER = im.actor.ActorSDK; + PRODUCT_NAME = ActorSDK; + PROVISIONING_PROFILE = ""; + SKIP_INSTALL = YES; + STRIP_INSTALLED_PRODUCT = YES; + SWIFT_INCLUDE_PATHS = "$(PROJECT_DIR)/ActorSDK/Sources/Libs/CommonCrypto $(PROJECT_DIR)/IDZSwiftCommonCrypto/Frameworks/$(PLATFORM_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + VALID_ARCHS = "arm64 armv7"; + WARNING_CFLAGS = "-Wno-nullability-completeness"; + }; + name = Debug; + }; + 066A50DC1BC4AE63000E606E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F076508E3899D309954904A3 /* Pods-ActorSDK.release.xcconfig */; + buildSettings = { + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/build/Debug-iphoneos", + "$(PROJECT_DIR)/Pods/J2ObjC-Framework/Frameworks", + ); + GCC_DYNAMIC_NO_PIC = NO; + GCC_LINK_WITH_DYNAMIC_LIBRARIES = YES; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; + INFOPLIST_FILE = "$(SRCROOT)/ActorSDK/Sources/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_NO_PIE = NO; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(CONFIGURATION_TEMP_DIR)/j2objc/Objects/", + "$(PROJECT_DIR)/ActorSDK/Sources/Utils", + "$(PROJECT_DIR)/ActorSDK/Sources/Utils/AudioRecorder/libopus/lib", + "$(inherited)", + "$(PROJECT_DIR)/ActorSDK/Libs", + ); + MACH_O_TYPE = mh_dylib; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-lactor", + "$(inherited)", + "-framework", + j2objc, + ); + PRODUCT_BUNDLE_IDENTIFIER = im.actor.ActorSDK; + PRODUCT_NAME = ActorSDK; + PROVISIONING_PROFILE = ""; + SKIP_INSTALL = YES; + STRIP_INSTALLED_PRODUCT = YES; + SWIFT_INCLUDE_PATHS = "$(PROJECT_DIR)/ActorSDK/Sources/Libs/CommonCrypto $(PROJECT_DIR)/IDZSwiftCommonCrypto/Frameworks/$(PLATFORM_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + VALID_ARCHS = "arm64 armv7"; + WARNING_CFLAGS = "-Wno-nullability-completeness"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 066A50CC1BC4AE63000E606E /* Build configuration list for PBXProject "ActorSDK" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 066A50D81BC4AE63000E606E /* Debug */, + 066A50D91BC4AE63000E606E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 066A50DA1BC4AE63000E606E /* Build configuration list for PBXNativeTarget "ActorSDK" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 066A50DB1BC4AE63000E606E /* Debug */, + 066A50DC1BC4AE63000E606E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 066A50C91BC4AE63000E606E /* Project object */; +} diff --git a/actor-sdk/sdk-core-ios/ActorSDK/.DS_Store b/actor-sdk/sdk-core-ios/ActorSDK/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9262881e327578972671afb3f3bb776f0ee32f76 GIT binary patch literal 6148 zcmeHKyJ`bL3>+nf7}B^*xxbJ6Skn z9}|?70#ZNokHBnItNC7EuRlvUwjqcbB$He$_FvJKzoG~57b<7gP z<_Tgi921$LSyG8fwHh%j>CCsP>xE-t(qT1xSe ACCommand { + open class func copyFileCommand(_ from: String, to: String) -> ACCommand { return CopyCommand(from: from, to: to) } - class func zipDirectoryCommand(_ from: String, to: String) -> ACCommand { + open class func zipDirectoryCommand(_ from: String, to: String) -> ACCommand { return ZipCommand(dir: from, to: to) } - class func isValidEmail(_ testStr:String) -> Bool { + open class func isValidEmail(_ testStr:String) -> Bool { let emailRegEx = "^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}" From afecc1f40e653214b6243c8101964054ffc26f3d Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 13 Nov 2016 22:01:01 -0200 Subject: [PATCH 147/253] alteracoes --- .../sdk-core-android/android-sdk/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml index 8bd73c7e08..3a09fac396 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ android:pathPrefix="/join/" android:scheme="https" /> From 4c8f7bd1ee204e1513a5e552911c94f6d7a14883 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 16 Nov 2016 14:49:17 -0200 Subject: [PATCH 148/253] alteracoes no core da api --- actor-sdk/sdk-api/actor.json | 25475 +++------------- .../models/im/actor/api/scheme.mps | 100 + .../java/im/actor/core/api/ApiSurvey.java | 106 + .../im/actor/core/api/parser/RpcParser.java | 2 + .../core/api/rpc/RequestCreateSurvey.java | 64 + .../core/api/rpc/RequestJoinGroupByPeer2.java | 64 + .../actor-core/src/main/actor-api/actor.json | 25475 +++------------- .../service/groups/GroupsServiceImpl.scala | 38 +- .../service/survey/SurveyServiceImpl.scala | 48 + 9 files changed, 8367 insertions(+), 43005 deletions(-) create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiSurvey.java create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestCreateSurvey.java create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestJoinGroupByPeer2.java create mode 100644 actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala diff --git a/actor-sdk/sdk-api/actor.json b/actor-sdk/sdk-api/actor.json index b27bd3cb55..fe74653bd4 100644 --- a/actor-sdk/sdk-api/actor.json +++ b/actor-sdk/sdk-api/actor.json @@ -77,10 +77,9 @@ "name": "PASSWORD", "id": 2 } - ] - } - }, - { + ] + } + }, { "type": "enum", "content": { "name": "EmailActivationType", @@ -97,20521 +96,3862 @@ "name": "PASSWORD", "id": 3 } - ] - } - }, - { - "type": "rpc", + ] + } + },{"type":"rpc","content":{ +"name":"StartPhoneAuth", +"header":191, +"response":{"type":"anonymous","header":193, "doc":[ +"Phone Activation response",{"type":"reference","argument":"transactionHash","category":"danger","description":" Hash of transaction"},{"type":"reference","argument":"isRegistered","category":"full","description":" Is User registered"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"PhoneActivationType"}},"id":3,"name":"activationType"} +]}, +"doc":[ +"Start Phone Activation",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number"},{"type":"reference","argument":"appId","category":"hidden","description":"Appication Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages of device"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"SendCodeByPhoneCall", +"header":197, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Dial phone and dictate auth code",{"type":"reference","argument":"transactionHash","category":"danger","description":"Transaction hash"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +]}},{"type":"rpc","content":{ +"name":"StartEmailAuth", +"header":185, +"response":{"type":"anonymous","header":186, "doc":[ +"Email Activation response",{"type":"reference","argument":"transactionHash","category":"danger","description":" Hash of activation transaction"},{"type":"reference","argument":"isRegistered","category":"full","description":" true if user is registered"},{"type":"reference","argument":"activationType","category":"full","description":" Email Activation type"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +,{"type":{"type":"enum","childType":"EmailActivationType"},"id":3,"name":"activationType"} +]}, +"doc":[ +"Start EMail Activation",{"type":"reference","argument":"email","category":"full","description":"Email"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"StartAnonymousAuth", +"header":198, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Starting Anonymous login",{"type":"reference","argument":"name","category":"full","description":"Name of new user"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ +{"type":"string","id":1,"name":"name"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"StartTokenAuth", +"header":203, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Starting token-based login",{"type":"reference","argument":"token","category":"full","description":"Token for authentication"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"StartUsernameAuth", +"header":2571, +"response":{"type":"anonymous","header":2572, "doc":[ +"Result of login auth start. If is not registered move to signup.",{"type":"reference","argument":"transactionHash","category":"danger","description":" Authentication transaction hash"},{"type":"reference","argument":"isRegistered","category":"full","description":" If user is registered with this username"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +]}, +"doc":[ +"Starting Login Authentication",{"type":"reference","argument":"username","category":"full","description":"Username for signing in"},{"type":"reference","argument":"appId","category":"hidden","description":"Application id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"Time Zone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages of device"}],"attributes":[ +{"type":"string","id":1,"name":"username"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"ValidateCode", +"header":189, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Performing user sign in.",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"code","category":"hidden","description":"Activation code"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"code"} +]}},{"type":"rpc","content":{ +"name":"ValidatePassword", +"header":207, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Validation of account password",{"type":"reference","argument":"transactionHash","category":"full","description":"Hash of transaction"},{"type":"reference","argument":"password","category":"full","description":"Password for account"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"password"} +]}},{"type":"rpc","content":{ +"name":"GetOAuth2Params", +"header":194, +"response":{"type":"anonymous","header":195, "doc":[ +{"type":"reference","argument":"authUrl","category":"hidden","description":" Authentication url"}] ,"attributes":[{"type":"string","id":1,"name":"authUrl"} +]}, +"doc":[ +"Loading OAuth2 Parameters",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"redirectUrl","category":"full","description":"Redirect URL for Application"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"redirectUrl"} +]}},{"type":"rpc","content":{ +"name":"CompleteOAuth2", +"header":196, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Complete OAuth2 Authentication",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"code","category":"danger","description":"Authentication Code"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"code"} +]}},{"type":"rpc","content":{ +"name":"SignUp", +"header":190, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Perform user SignUp",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"name","category":"full","description":"User name"},{"type":"reference","argument":"sex","category":"full","description":"Optional user sex"},{"type":"reference","argument":"password","category":"full","description":"Password for password-based accounts"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"name"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"Sex"}},"id":3,"name":"sex"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"password"} +]}},{"type":"response","content":{ +"name":"Auth", +"header":5, +"doc":[ +"Authentication result",{"type":"reference","argument":"user","category":"compact","description":" The authenticated User"},{"type":"reference","argument":"config","category":"full","description":" Current config of server"}],"attributes":[ +{"type":{"type":"struct","childType":"User"},"id":2,"name":"user"} +,{"type":{"type":"struct","childType":"Config"},"id":3,"name":"config"} +]}}, { + "type":"struct", + "content": { + "name":"AuthSession", +"doc":[ +"Authentication session",{"type":"reference","argument":"id","category":"full","description":" Unuque ID of session"},{"type":"reference","argument":"authHolder","category":"full","description":" holder of session. 0 - this device, 1 - other."},{"type":"reference","argument":"appId","category":"full","description":" Application Id (user in SignIn/SignUp)"},{"type":"reference","argument":"appTitle","category":"full","description":" Title of application"},{"type":"reference","argument":"deviceTitle","category":"full","description":" Title of device"},{"type":"reference","argument":"authTime","category":"full","description":" Time of session creating"},{"type":"reference","argument":"authLocation","category":"hidden","description":" two-letter country code of session create"},{"type":"reference","argument":"latitude","category":"hidden","description":" optional latitude of auth if available"},{"type":"reference","argument":"longitude","category":"hidden","description":" optional longitude of auth if available"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":{"type":"enum","childType":"AuthHolder"},"id":2,"name":"authHolder"} +,{"type":"int32","id":3,"name":"appId"} +,{"type":"string","id":4,"name":"appTitle"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":"int32","id":6,"name":"authTime"} +,{"type":"string","id":7,"name":"authLocation"} +,{"type":{"type":"opt","childType":"double"},"id":8,"name":"latitude"} +,{"type":{"type":"opt","childType":"double"},"id":9,"name":"longitude"} +]}}, { + "type": "enum", "content": { - "name": "StartPhoneAuth", - "header": 191, - "response": { - "type": "anonymous", - "header": 193, - "doc": [ - "Phone Activation response", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": " Hash of transaction" - }, - { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " Is User registered" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "bool", - "id": 2, - "name": "isRegistered" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "PhoneActivationType" - } - }, - "id": 3, - "name": "activationType" - } - ] - }, - "doc": [ - "Start Phone Activation", - { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": "Phone number" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Appication Id" - }, + "name": "AuthHolder", + "values": [ { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" + "name": "ThisDevice", + "id": 1 }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, + "name": "OtherDevice", + "id": 2 + } + ] + } + },{"type":"rpc","content":{ +"name":"GetAuthSessions", +"header":80, +"response":{"type":"anonymous","header":81, "doc":[ +"Current Auth sessions",{"type":"reference","argument":"userAuths","category":"compact","description":" User authentications"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"AuthSession"}},"id":1,"name":"userAuths"} +]}, +"doc":[ +"Getting of all active user's authentication sessions"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"TerminateSession", +"header":82, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"SignOut on specified user's session",{"type":"reference","argument":"id","category":"full","description":"id from AuthItem"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +]}},{"type":"rpc","content":{ +"name":"TerminateAllSessions", +"header":83, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"SignOut on all exept current sessions"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"SignOut", +"header":84, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"SignOut current session"],"attributes":[ +]}},{"type":"comment","content":"OBSOLETE METHODS"},{"type":"rpc","content":{ +"name":"SignInObsolete", +"header":3, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Performing user signin",{"type":"reference","argument":"phoneNumber","category":"danger","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"smsCode","category":"danger","description":"Confirmation code from SMS"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device title like 'Steven's iPhone'"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"appKey","category":"hidden","description":"Application API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"string","id":2,"name":"smsHash"} +,{"type":"string","id":3,"name":"smsCode"} +,{"type":"bytes","id":5,"name":"deviceHash"} +,{"type":"string","id":6,"name":"deviceTitle"} +,{"type":"int32","id":7,"name":"appId"} +,{"type":"string","id":8,"name":"appKey"} +]}},{"type":"rpc","content":{ +"name":"SignUpObsolete", +"header":4, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Performing user signup. If user perform signup on already registered user it just override previous","profile information",{"type":"reference","argument":"phoneNumber","category":"danger","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"smsCode","category":"danger","description":"Confirmation code from SMS"},{"type":"reference","argument":"name","category":"full","description":"User name"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device title like 'Steven's iPhone'"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"appKey","category":"hidden","description":"pplication API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"string","id":2,"name":"smsHash"} +,{"type":"string","id":3,"name":"smsCode"} +,{"type":"string","id":4,"name":"name"} +,{"type":"bytes","id":7,"name":"deviceHash"} +,{"type":"string","id":8,"name":"deviceTitle"} +,{"type":"int32","id":9,"name":"appId"} +,{"type":"string","id":10,"name":"appKey"} +,{"type":"bool","id":11,"name":"isSilent"} +]}},{"type":"rpc","content":{ +"name":"SendAuthCodeObsolete", +"header":1, +"response":{"type":"anonymous","header":2, "doc":[ +"Sms Request response",{"type":"reference","argument":"smsHash","category":"danger","description":" Hash of SMS request"},{"type":"reference","argument":"isRegistered","category":"full","description":" true if user is registered"}] ,"attributes":[{"type":"string","id":1,"name":"smsHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +]}, +"doc":[ +"Sending SMS with activation code",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number in international format"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +]}},{"type":"rpc","content":{ +"name":"SendAuthCallObsolete", +"header":90, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Requesting Phone activation",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"string","id":2,"name":"smsHash"} +,{"type":"int32","id":3,"name":"appId"} +,{"type":"string","id":4,"name":"apiKey"} +]}}]}, { + "title": "Users", + "package": "users", + "doc": [ + "Users are objects that secured by accessHash. You can't load user profile by it's id.", + "You can't send message to user without finding it's object in Updates or by calling", + "method for user search, contacts import or some other methods.", + "", + "Applications need to keep all Users information forever.", + "", + "Each User have optional localName - name of user that was set by current user and can be changed", + "any time by calling EditUserLocalName method." + ], + "items": [ + { + "type": "enum", + "content": { + "name": "Sex", + "values": [ { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" + "name": "Unknown", + "id": 1 }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" + "name": "Male", + "id": 2 }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages of device" + "name": "Female", + "id": 3 } - ], - "attributes": [ + ] + } + }, { + "type": "enum", + "content": { + "name": "ContactType", + "values": [ { - "type": "int64", - "id": 1, - "name": "phoneNumber" + "name": "Phone", + "id": 1 }, { - "type": "int32", - "id": 2, - "name": "appId" + "name": "Email", + "id": 2 }, { - "type": "string", - "id": 3, - "name": "apiKey" + "name": "Web", + "id": 3 }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, + "name": "Social", + "id": 4 + } + ] + } + }, { + "type":"struct", + "content": { + "name":"ContactRecord", +"doc":[ +"Contact information record",{"type":"reference","argument":"type","category":"full","description":" Record type"},{"type":"reference","argument":"typeSpec","category":"hidden","description":" Value for specification type of contact, for example 'mobile/standalone/office' for phones or 'vk/fb/telegram' for extenrnal networks."},{"type":"reference","argument":"stringValue","category":"full","description":" String value of record"},{"type":"reference","argument":"longValue","category":"full","description":" Long value of record"},{"type":"reference","argument":"title","category":"full","description":" Title of record"},{"type":"reference","argument":"subtitle","category":"hidden","description":" Subtitle of record"}],"expandable":"true","attributes":[ +{"type":{"type":"enum","childType":"ContactType"},"id":1,"name":"type"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"typeSpec"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"stringValue"} +,{"type":{"type":"opt","childType":"int64"},"id":3,"name":"longValue"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"title"} +,{"type":{"type":"opt","childType":"string"},"id":5,"name":"subtitle"} +]}}, { + "type":"struct", + "content": { + "name":"User", +"doc":[ +"Main user object",{"type":"reference","argument":"id","category":"full","description":" uid"},{"type":"reference","argument":"accessHash","category":"danger","description":" user's access hash"},{"type":"reference","argument":"name","category":"full","description":" user's name"},{"type":"reference","argument":"localName","category":"full","description":" user's local name"},{"type":"reference","argument":"nick","category":"full","description":" User's nickname"},{"type":"reference","argument":"sex","category":"full","description":" optional sex of user"},{"type":"reference","argument":"avatar","category":"compact","description":" avatar of user"},{"type":"reference","argument":"isBot","category":"full","description":" Is user actually bot. By default is false."},{"type":"reference","argument":"ext","category":"full","description":" Extension values"},{"type":"reference","argument":"about","category":"full","description":" [DEPRECATED] User's about information"},{"type":"reference","argument":"contactInfo","category":"compact","description":" [DEPRECATED] Contact information of user"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" [DEPRECATED] Preferred user languages"},{"type":"reference","argument":"timeZone","category":"full","description":" [DEPRECATED] Time Zone of user in TZ format"},{"type":"reference","argument":"botCommands","category":"full","description":" [DEPRECATED] Available Bot Commands"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"name"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"localName"} +,{"type":{"type":"opt","childType":"string"},"id":13,"name":"nick"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"Sex"}},"id":5,"name":"sex"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":8,"name":"avatar"} +,{"type":{"type":"opt","childType":"bool"},"id":11,"name":"isBot"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":20,"name":"ext"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":12,"name":"contactInfo", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":14,"name":"about", "deprecated":"true"} +,{"type":{"type":"list","childType":"string"},"id":16,"name":"preferredLanguages", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":17,"name":"timeZone", "deprecated":"true"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":19,"name":"botCommands", "deprecated":"true"} +]}}, { + "type":"struct", + "content": { + "name":"FullUser", +"doc":[ +"Full User representation",{"type":"reference","argument":"id","category":"full","description":" User's Id"},{"type":"reference","argument":"contactInfo","category":"compact","description":" User's contact information"},{"type":"reference","argument":"about","category":"full","description":" User's about information"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" Preferred user languages"},{"type":"reference","argument":"timeZone","category":"full","description":" Time Zone of user in TZ format"},{"type":"reference","argument":"botCommands","category":"full","description":" Available Commands for Bot"},{"type":"reference","argument":"ext","category":"full","description":" Extension values. NOTE: This values are not related to ext field in User object."},{"type":"reference","argument":"isBlocked","category":"full","description":" Is user blocked. Default is false."}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"id"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":2,"name":"contactInfo"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} +,{"type":{"type":"list","childType":"string"},"id":4,"name":"preferredLanguages"} +,{"type":{"type":"opt","childType":"string"},"id":5,"name":"timeZone"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":6,"name":"botCommands"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":7,"name":"ext"} +,{"type":{"type":"opt","childType":"bool"},"id":8,"name":"isBlocked"} +]}}, { + "type":"struct", + "content": { + "name":"BotCommand", +"doc":[ +"Available bot commands",{"type":"reference","argument":"slashCommand","category":"full","description":" Slash command name (wihtout slash)"},{"type":"reference","argument":"description","category":"full","description":" Slash command description"},{"type":"reference","argument":"locKey","category":"full","description":" Optional Localization Key for i18n"}],"attributes":[ +{"type":"string","id":1,"name":"slashCommand"} +,{"type":"string","id":2,"name":"description"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"locKey"} +]}},{"type":"rpc","content":{ +"name":"EditUserLocalName", +"header":96, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Renaming of user's visible name",{"type":"reference","argument":"uid","category":"full","description":"target User's uid"},{"type":"reference","argument":"accessHash","category":"danger","description":"User's accessHash"},{"type":"reference","argument":"name","category":"full","description":"New user name"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"name"} +]}},{"type":"update","content":{ +"name":"UserAvatarChanged", +"header":16, +"doc":[ +"Update about avatar changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"avatar","category":"compact","description":" user's new avatar"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":2,"name":"avatar"} +]}},{"type":"update","content":{ +"name":"UserNameChanged", +"header":32, +"doc":[ +"Update about name changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"name","category":"full","description":" user's name"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"string","id":2,"name":"name"} +]}},{"type":"update","content":{ +"name":"UserLocalNameChanged", +"header":51, +"doc":[ +"Update about local name changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"localName","category":"full","description":" new user's local name"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"localName"} +]}},{"type":"update","content":{ +"name":"UserContactsChanged", +"header":134, +"doc":[ +"Update about contact information change",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"contactRecords","category":"compact","description":" new phones list"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":4,"name":"contactRecords"} +]}},{"type":"update","content":{ +"name":"UserNickChanged", +"header":209, +"doc":[ +"Update about nick changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"nickname","category":"full","description":" user's new nickname"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"nickname"} +]}},{"type":"update","content":{ +"name":"UserAboutChanged", +"header":210, +"doc":[ +"Update about user's about changed",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"about","category":"full","description":" User's about"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} +]}},{"type":"update","content":{ +"name":"UserPreferredLanguagesChanged", +"header":212, +"doc":[ +"Update about user's preferred languages",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" User's preferred languages. Can be empty."}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"list","childType":"string"},"id":2,"name":"preferredLanguages"} +]}},{"type":"update","content":{ +"name":"UserTimeZoneChanged", +"header":216, +"doc":[ +"User TimeZone changed",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"timeZone","category":"full","description":" User's new time zone in TZ format"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"timeZone"} +]}},{"type":"update","content":{ +"name":"UserBotCommandsChanged", +"header":217, +"doc":[ +"Update about bot commands changed",{"type":"reference","argument":"uid","category":"full","description":" User's Id"},{"type":"reference","argument":"commands","category":"full","description":" New List of commands"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":2,"name":"commands"} +]}},{"type":"update","content":{ +"name":"UserExtChanged", +"header":218, +"doc":[ +"Update about user ext changed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"ext","category":"full","description":" New Ext Value in User (NOT FullUser) object."}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} +]}},{"type":"update","content":{ +"name":"UserFullExtChanged", +"header":219, +"doc":[ +"Update about user ext changed",{"type":"reference","argument":"uid","category":"full","description":" User's Id"},{"type":"reference","argument":"ext","category":"full","description":" New Ext Value in FullUser (NOT User) object."}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":3,"name":"ext"} +]}},{"type":"rpc","content":{ +"name":"LoadFullUsers", +"header":2649, +"response":{"type":"anonymous","header":2650, "doc":[ +{"type":"reference","argument":"fullUsers","category":"compact","description":" Loaded users"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"FullUser"}},"id":1,"name":"fullUsers"} +]}, +"doc":[ +"Loading Full User information",{"type":"reference","argument":"userPeers","category":"compact","description":"User's peers to load. Should be non-empy"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"userPeers"} +]}}]}, { + "title": "Profile", + "package": "profile", + "items": [ +{"type":"rpc","content":{ +"name":"EditName", +"header":53, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing account's name",{"type":"reference","argument":"name","category":"full","description":"New name"}],"attributes":[ +{"type":"string","id":1,"name":"name"} +]}},{"type":"rpc","content":{ +"name":"EditNickName", +"header":205, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing account's nickname",{"type":"reference","argument":"nickname","category":"full","description":"New Nickname"}],"attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"nickname"} +]}},{"type":"rpc","content":{ +"name":"CheckNickName", +"header":206, +"response":{"type":"reference","name":"Bool"}, +"doc":[ +"Checking availability of nickname",{"type":"reference","argument":"nickname","category":"full","description":"Nickname for checking"}],"attributes":[ +{"type":"string","id":1,"name":"nickname"} +]}},{"type":"rpc","content":{ +"name":"EditAbout", +"header":212, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing about information",{"type":"reference","argument":"about","category":"full","description":"new about information"}],"attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"about"} +]}},{"type":"rpc","content":{ +"name":"EditAvatar", +"header":31, +"response":{"type":"anonymous","header":103, "doc":[ +"Response for change account avatar",{"type":"reference","argument":"avatar","category":"full","description":" New avatar"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"}] ,"attributes":[{"type":{"type":"struct","childType":"Avatar"},"id":1,"name":"avatar"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +]}, +"doc":[ +"Changing account's avatar",{"type":"reference","argument":"fileLocation","category":"compact","description":"File Location of uploaded unencrypted avatar"}],"attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} +]}},{"type":"rpc","content":{ +"name":"RemoveAvatar", +"header":91, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Removing account's avatar"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"EditMyTimeZone", +"header":144, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Updating user's time zone",{"type":"reference","argument":"tz","category":"full","description":"New Time Zone"}],"attributes":[ +{"type":"string","id":1,"name":"tz"} +]}},{"type":"rpc","content":{ +"name":"EditMyPreferredLanguages", +"header":145, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing preffered languages",{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preffered Languages"}],"attributes":[ +{"type":{"type":"list","childType":"string"},"id":1,"name":"preferredLanguages"} +]}}]}, { + "title": "Contacts", + "package": "contacts", + "doc": [ + "Before working with contact list is is useful to import contacts from phone first by calling", + "method ImportContacts#0x07.", + "", + "All phone numbers MUST be preprocessed before import by some library (like libphonenumber)", + "and build international phone number depending on current users phone and/or locale.", + "", + "For loading contact list from server use GetContacts#0x57.", + "If during this call there are some updates about contact list change", + "it is recommended to call it again. Also applications need to sync contacts on application start.", + "", + "For searching for users without adding to contacts list use method FindContacts#0x70.", + "", + "For adding/deleting contacts AddContact#0x72 and DeleteContact#0x59." + ], + "items": [ + { + "type":"struct", + "content": { + "name":"PhoneToImport", +"doc":[ +"Phone for import",{"type":"reference","argument":"phoneNumber","category":"full","description":" phone number for import in international format"},{"type":"reference","argument":"name","category":"full","description":" optional name for contact"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +]}}, { + "type":"struct", + "content": { + "name":"EmailToImport", +"doc":[ +"Email for import",{"type":"reference","argument":"email","category":"full","description":" email for importing"},{"type":"reference","argument":"name","category":"full","description":" optional name for contact"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +]}},{"type":"rpc","content":{ +"name":"ImportContacts", +"header":7, +"response":{"type":"anonymous","header":8, "doc":[ +"Imported contacts",{"type":"reference","argument":"users","category":"compact","description":" Imported users"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number if users are imported"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state if users are imported"},{"type":"reference","argument":"userPeers","category":"full","description":" Imported user peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +]}, +"doc":[ +"Importing phones and emails for building contact list","Maximum amount of items for import per method call equals to 100.",{"type":"reference","argument":"phones","category":"compact","description":"Phones for import"},{"type":"reference","argument":"emails","category":"compact","description":"Emails for import"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"PhoneToImport"}},"id":1,"name":"phones"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EmailToImport"}},"id":2,"name":"emails"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"empty"},{"type":"rpc","content":{ +"name":"GetContacts", +"header":87, +"response":{"type":"anonymous","header":88, "doc":[ +"Current contact list",{"type":"reference","argument":"users","category":"hidden","description":" User list if list is changed"},{"type":"reference","argument":"isNotChanged","category":"full","description":" is list changed"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":"bool","id":2,"name":"isNotChanged"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"userPeers"} +]}, +"doc":[ +"Getting current contact list","SHA256 hash of list of a comma-separated list of contact UIDs in ascending","order may be passed in contactsHash parameter.","If the contact list was not changed, isNotChanged will be true.",{"type":"reference","argument":"contactsHash","category":"full","description":"Hash of saved list in application"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":"string","id":1,"name":"contactsHash"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"RemoveContact", +"header":89, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Removing contact from contact list",{"type":"reference","argument":"uid","category":"full","description":"Contact's UID"},{"type":"reference","argument":"accessHash","category":"danger","description":"Contact's AccessHash"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"AddContact", +"header":114, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Adding contact to contact list",{"type":"reference","argument":"uid","category":"full","description":"Contact's UID"},{"type":"reference","argument":"accessHash","category":"danger","description":"Contact's AccessHash"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"SearchContacts", +"header":112, +"response":{"type":"anonymous","header":113, "doc":[ +"Founded users",{"type":"reference","argument":"users","category":"compact","description":" Founded users"},{"type":"reference","argument":"userPeers","category":"compact","description":" Founded users peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":2,"name":"userPeers"} +]}, +"doc":[ +"Searching contacts by user's query",{"type":"reference","argument":"request","category":"full","description":"Search query"}],"attributes":[ +{"type":"string","id":1,"name":"request"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"empty"},{"type":"update","content":{ +"name":"ContactRegistered", +"header":5, +"doc":[ +"Update about contact registration",{"type":"reference","argument":"uid","category":"full","description":" contact's uid"},{"type":"reference","argument":"isSilent","category":"full","description":" is registration silent. If this value is true then don't show notification about registration"},{"type":"reference","argument":"date","category":"full","description":" date of registration"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"bool","id":2,"name":"isSilent"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +]}},{"type":"update","content":{ +"name":"ContactsAdded", +"header":40, +"doc":[ +"Update about contacts added",{"type":"reference","argument":"uids","category":"compact","description":" added contacts"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"uids"} +]}},{"type":"update","content":{ +"name":"ContactsRemoved", +"header":41, +"doc":[ +"Update about contacts removed",{"type":"reference","argument":"uids","category":"compact","description":" removed contacts"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"uids"} +]}}]}, { + "title": "Privacy", + "package": "privacy", + "items": [ +{"type":"rpc","content":{ +"name":"BlockUser", +"header":2636, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Block User",{"type":"reference","argument":"peer","category":"full","description":"Peer for blocking"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"UnblockUser", +"header":2637, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Unblock User",{"type":"reference","argument":"peer","category":"full","description":"Peer for unblocking"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"LoadBlockedUsers", +"header":2638, +"response":{"type":"anonymous","header":2639, "doc":[ +{"type":"reference","argument":"userPeers","category":"full","description":" Blocked user peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"userPeers"} +]}, +"doc":[ +"Load Blocked Users"],"attributes":[ +]}},{"type":"update","content":{ +"name":"UserBlocked", +"header":2629, +"doc":[ +"Update about User Blocked",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +]}},{"type":"update","content":{ +"name":"UserUnblocked", +"header":2630, +"doc":[ +"Update about User Unblocked",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +]}}]}, { + "title": "Messaging", + "package": "messaging", + "doc": [ + "Actor can work with encrypted and plain messages in one conversation. For both types of messages API", + "contains a bit different methods. Also encrypted and plain messages have different schemes.", + "

Messages

", + "Message entity contains:", + "
    ", + "
  • PeerType - group chat or private
  • ", + "
  • PeerId - group or user id of conversation
  • ", + "
  • RandomId - unique id of message that generated by sender. In Encrypted messages random id is encrypted.
  • ", + "
  • Date - date of message (calculated on server)
  • ", + "
  • Content
  • ", + "
", + "

Message content

", + "Message can be one of three basic types of messages: Text Message, File Message and Service message.", + "All messages can contain extensions. For example we can send text message and add markdown extension with", + "formatted text in markdown and clients that support this extension will show markdown, and that clients that", + "not supported extension then show simple text. File messages can have photo, video or voice extensions.", + "Service message can have extensions extensions such as \"user added\", \"group created\", \"avatar changed\", etc.", + "

Send messages

", + "Sending messages looks same for encrypted and plain messages. Client MUST prepare all required data", + "before sending message (for example FastThumb for photo/video/documents) and call required methods.", + "Encrypted messages differs here only by a little different scheme and encryption.", + "

WRONG_KEYS and incorrect keys

", + "For sending encrypted messages client MUST send messages encrypted for all own and receivers keys.", + "If client send encryption with missing, old or incorrect keys it will receive WRONG_KEYS.", + "In WRONG_KEYS you need to deserialize relatedData from RpcError to WrongKeysErrorData", + "and get detailed information about keys. Sometimes there are some broken keys on server and client can't", + "encrypt messages with it than client MUST send empty encrypted key in request elsewhere API return WRONG_KEYS.", + "

Encrypted messages and New Devices

", + "When you send message to someone and when he registered with new device there are no way to receive old encrypted", + "messages on new device and because of this there are a problem about read/delivery statuses.", + "Alice send messages to Bob, but Bob lose his device and buy new iPhone and installed Actor.", + "Alice receive notification about new device and send another message. Bob open chat with Alice and", + "send read status with maximum message read date. Alice will mark all sent messages as read and one that", + "was not delivered. We can use status notifications per message, but in VERY heavy conversations it will be", + "a lot of unnecessary traffic. For resolving this small issue we have different ways of message statuses", + "for encrypted and plain messages. Also it is recomended to mark all undelivered messages on new device update as", + "not devered with warring sign.", + "

Message Read and Delivery

", + "There are two different ways for read and delivery statuses for encrypted and plain messages.", + "For encrypted messages used status change by RandomId and for plain messages used by maximum", + "date of read/delivered message." + ], + "items": [ + { + "type":"struct", + "content": { + "name":"MessageAttributes", +"doc":[ +"Message Attributes",{"type":"reference","argument":"isMentioned","category":"full","description":" Is mentioned. If set overrides built-in value."},{"type":"reference","argument":"isHighlighted","category":"full","description":" Is message highlighted. Default is false."},{"type":"reference","argument":"isNotified","category":"full","description":" Is notified. If set overrides built-in settings."},{"type":"reference","argument":"isOnlyForYou","category":"full","description":" If this message is only for you. Default is false"}],"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"isMentioned"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isHighlighted"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isNotified"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isOnlyForYou"} +]}}, { + "type":"struct", + "content": { + "name":"QuotedMessage", +"doc":[ +"Quoted Message",{"type":"reference","argument":"messageId","category":"full","description":" Message Id if present"},{"type":"reference","argument":"publicGroupId","category":"full","description":" Public Group id if present"},{"type":"reference","argument":"senderUserId","category":"full","description":" Sender of message"},{"type":"reference","argument":"messageDate","category":"full","description":" Date of message"},{"type":"reference","argument":"quotedMessageContent","category":"full","description":" Optional Quoted Message Content. Can be empty if messageId is present and message is in current peer."}],"attributes":[ +{"type":{"type":"opt","childType":{"type":"alias","childType":"randomId"}},"id":1,"name":"messageId"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"groupId"}},"id":2,"name":"publicGroupId"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"senderUserId"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"messageDate"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"Message"}},"id":5,"name":"quotedMessageContent"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"Message","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"TextMessage", +"doc":[ +"Text message",{"type":"reference","argument":"text","category":"danger","description":" the text"},{"type":"reference","argument":"mentions","category":"full","description":" User mentions in message"},{"type":"reference","argument":"ext","category":"full","description":" Optional bytes of extension"}],"trait":{"name":"Message","key":1},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"text"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"mentions"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"TextMessageEx"}},"id":3,"name":"ext"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"TextMessageEx","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"TextExMarkdown", +"doc":[ +"Markdown extension",{"type":"reference","argument":"markdown","category":"full","description":" Markdown text"}],"trait":{"name":"TextMessageEx","key":1},"expandable":"true","attributes":[ +{"type":"string","id":2,"name":"markdown"} +]}}, { + "type":"struct", + "content": { + "name":"TextModernMessage", +"doc":[ +"Modern text message",{"type":"reference","argument":"text","category":"full","description":" optional text of message"},{"type":"reference","argument":"senderNameOverride","category":"full","description":" optional overriding of sender"},{"type":"reference","argument":"senderPhotoOverride","category":"full","description":" optional overriding sender's photo"},{"type":"reference","argument":"style","category":"full","description":" optional paragraph style"},{"type":"reference","argument":"attaches","category":"full","description":" optional Attaches of message"}],"trait":{"name":"TextMessageEx","key":2},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"text"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"senderNameOverride"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":3,"name":"senderPhotoOverride"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ParagraphStyle"}},"id":4,"name":"style"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"TextModernAttach"}},"id":5,"name":"attaches"} +]}}, { + "type":"struct", + "content": { + "name":"ParagraphStyle", +"doc":[ +"Paragraph style",{"type":"reference","argument":"showParagraph","category":"full","description":" Show quote-like paragraph?"},{"type":"reference","argument":"paragraphColor","category":"full","description":" Override paragraph color"},{"type":"reference","argument":"bgColor","category":"full","description":" Override background color"}],"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"showParagraph"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"Color"}},"id":2,"name":"paragraphColor"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"Color"}},"id":3,"name":"bgColor"} +]}}, { + "type":"struct", + "content": { + "name":"TextModernAttach", +"doc":[ +"Attaches to message",{"type":"reference","argument":"title","category":"full","description":" Attach of message"},{"type":"reference","argument":"titleUrl","category":"full","description":" Attach title url"},{"type":"reference","argument":"titleIcon","category":"full","description":" Attach title icon"},{"type":"reference","argument":"text","category":"full","description":" Attach text"},{"type":"reference","argument":"style","category":"full","description":" Attach style"}],"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"title"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"titleUrl"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":3,"name":"titleIcon"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"text"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ParagraphStyle"}},"id":5,"name":"style"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"TextModernField"}},"id":6,"name":"fields"} +]}}, { + "type":"struct", + "content": { + "name":"TextModernField", +"doc":[ +"Modern message fields",{"type":"reference","argument":"title","category":"full","description":" Field title"},{"type":"reference","argument":"value","category":"full","description":" Field value"},{"type":"reference","argument":"isShort","category":"full","description":" Is field can be shown in compact way (default is TRUE)"}],"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"title"} +,{"type":"string","id":2,"name":"value"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isShort"} +]}}, { + "type":"struct", + "content": { + "name":"TextCommand", +"doc":[ +"Text Command Message for bots",{"type":"reference","argument":"command","category":"full","description":" Slash-Command For execution"},{"type":"reference","argument":"args","category":"full","description":" Arguments of slash command"}],"trait":{"name":"TextMessageEx","key":3},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"command"} +,{"type":"string","id":2,"name":"args"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceMessage", +"doc":[ +"Service message",{"type":"reference","argument":"text","category":"full","description":" service message text"},{"type":"reference","argument":"ext","category":"compact","description":" Extension"}],"trait":{"name":"Message","key":2},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"text"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"ServiceEx"}},"id":3,"name":"ext"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"ServiceEx","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserInvited", +"doc":[ +"Service message about adding user to group",{"type":"reference","argument":"invitedUid","category":"full","description":" added user id"}],"trait":{"name":"ServiceEx","key":1},"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"invitedUid"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserJoined", +"doc":[ +"Service message about user join to group"],"trait":{"name":"ServiceEx","key":17},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserKicked", +"doc":[ +"Service message about kicking user from group",{"type":"reference","argument":"kickedUid","category":"full","description":" kicked user id"}],"trait":{"name":"ServiceEx","key":2},"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"kickedUid"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserLeft", +"doc":[ +"Service message about user left group"],"trait":{"name":"ServiceEx","key":3},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExGroupCreated", +"doc":[ +"Service message about group creating"],"trait":{"name":"ServiceEx","key":4},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedTitle", +"doc":[ +"Service message about group title change",{"type":"reference","argument":"title","category":"full","description":" New group title"}],"trait":{"name":"ServiceEx","key":5},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"title"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedTopic", +"doc":[ +"Service message on group topic change",{"type":"reference","argument":"topic","category":"full","description":" New group topic"}],"trait":{"name":"ServiceEx","key":18},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"topic"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedAbout", +"doc":[ +"Service message on group about change",{"type":"reference","argument":"about","category":"full","description":" New group about"}],"trait":{"name":"ServiceEx","key":19},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"about"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedAvatar", +"doc":[ +"Service message about avatar change",{"type":"reference","argument":"avatar","category":"compact","description":" Updated avatar"}],"trait":{"name":"ServiceEx","key":6},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":1,"name":"avatar"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExContactRegistered", +"doc":[ +"Service message about user registration",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"trait":{"name":"ServiceEx","key":8},"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExPhoneMissed", +"doc":[ +"Update about missing phone call"],"trait":{"name":"ServiceEx","key":9},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExPhoneCall", +"doc":[ +"Update about phone call",{"type":"reference","argument":"duration","category":"full","description":" Duration of a phone call"}],"trait":{"name":"ServiceEx","key":16},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChatArchived", +"doc":[ +"Message about chat archived"],"trait":{"name":"ServiceEx","key":20},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChatRestored", +"doc":[ +"Message about chat restored"],"trait":{"name":"ServiceEx","key":21},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"DocumentMessage", +"doc":[ +"File message",{"type":"reference","argument":"fileId","category":"full","description":" file id"},{"type":"reference","argument":"accessHash","category":"danger","description":" file access hash"},{"type":"reference","argument":"fileSize","category":"full","description":" file size"},{"type":"reference","argument":"name","category":"full","description":" name of file"},{"type":"reference","argument":"mimeType","category":"full","description":" mimetype of file"},{"type":"reference","argument":"thumb","category":"compact","description":" optional thumb of file. JPEG less that 90x90 with 60-70 quality."},{"type":"reference","argument":"ext","category":"compact","description":" Extension"}],"trait":{"name":"Message","key":3},"expandable":"true","attributes":[ +{"type":"int64","id":1,"name":"fileId"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"int32","id":3,"name":"fileSize"} +,{"type":"string","id":4,"name":"name"} +,{"type":"string","id":5,"name":"mimeType"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"FastThumb"}},"id":6,"name":"thumb"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"DocumentEx"}},"id":8,"name":"ext"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"DocumentEx","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"DocumentExPhoto", +"doc":[ +"File photo extension. Can be set ONLY for JPEG.",{"type":"reference","argument":"w","category":"full","description":" image width"},{"type":"reference","argument":"h","category":"full","description":" image height"}],"trait":{"name":"DocumentEx","key":1},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExVideo", +"doc":[ +"File video extension",{"type":"reference","argument":"w","category":"full","description":" video width"},{"type":"reference","argument":"h","category":"full","description":" video height"},{"type":"reference","argument":"duration","category":"full","description":" video duration"}],"trait":{"name":"DocumentEx","key":2},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"int32","id":3,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExVoice", +"doc":[ +"File voice extension",{"type":"reference","argument":"duration","category":"full","description":" voice duration"}],"trait":{"name":"DocumentEx","key":3},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExAnimation", +"doc":[ +"Animation extension. Can be set ONLY for GIF.",{"type":"reference","argument":"w","category":"full","description":" Animation width"},{"type":"reference","argument":"h","category":"full","description":" Animation height"}],"trait":{"name":"DocumentEx","key":6},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExAnimationVid", +"doc":[ +"Animation video extension. More compact version of Animation with video codec instead of GIF.","Can be set ONLY for MP4.",{"type":"reference","argument":"w","category":"full","description":" Animation width"},{"type":"reference","argument":"h","category":"full","description":" Animation height"},{"type":"reference","argument":"duration","category":"full","description":" Animation duration"}],"trait":{"name":"DocumentEx","key":7},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"int32","id":3,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"JsonMessage", +"doc":[ +"Custom-data JsonMessage",{"type":"reference","argument":"rawJson","category":"danger","description":" JSON object"}],"trait":{"name":"Message","key":4},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"rawJson"} +]}}, { + "type":"struct", + "content": { + "name":"UnsupportedMessage", +"doc":[ +"Explicit type for unsupported message"],"trait":{"name":"Message","key":5},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"StickerMessage", +"doc":[ +"Sticker message",{"type":"reference","argument":"stickerId","category":"full","description":" Optional Unique ID of sticker"},{"type":"reference","argument":"fastPreview","category":"full","description":" Optional Fast preview of sticker in webp format"},{"type":"reference","argument":"image512","category":"full","description":" Optional 512x512 sticker image in webp format"},{"type":"reference","argument":"image256","category":"full","description":" Optional 256x256 sticker image in webp format"},{"type":"reference","argument":"stickerCollectionId","category":"full","description":" Optional Collection ID"},{"type":"reference","argument":"stickerCollectionAccessHash","category":"full","description":" Optional Collection Access Hash"}],"trait":{"name":"Message","key":6},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"int32"},"id":1,"name":"stickerId"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"fastPreview"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":3,"name":"image512"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":4,"name":"image256"} +,{"type":{"type":"opt","childType":"int32"},"id":5,"name":"stickerCollectionId"} +,{"type":{"type":"opt","childType":"int64"},"id":6,"name":"stickerCollectionAccessHash"} +]}}, { + "type":"struct", + "content": { + "name":"BinaryMessage", +"doc":[ +"Binary Message. Useful for implementing your own content types",{"type":"reference","argument":"contentTag","category":"full","description":" Content Tag"},{"type":"reference","argument":"msg","category":"compact","description":" Message contents"}],"trait":{"name":"Message","key":7},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"contentTag"} +,{"type":"bytes","id":2,"name":"msg"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptedMessage", +"doc":[ +"Encrypted Message",{"type":"reference","argument":"box","category":"full","description":" Encrypted box"}],"trait":{"name":"Message","key":8},"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"EncryptedBox"},"id":1,"name":"box"} +]}}, { + "type":"struct", + "content": { + "name":"EmptyMessage", +"doc":[ +"Empty Message"],"trait":{"name":"Message","key":9},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"DialogShort", +"doc":[ +"Short Dialog from grouped conversation list",{"type":"reference","argument":"peer","category":"full","description":" Peer of conversation"},{"type":"reference","argument":"counter","category":"full","description":" Conversation unread count"},{"type":"reference","argument":"date","category":"full","description":" Conversation top message date"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":"int32","id":2,"name":"counter"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}}, { + "type":"struct", + "content": { + "name":"DialogGroup", +"doc":[ +"Grouped dialog list",{"type":"reference","argument":"title","category":"full","description":" Title of group"},{"type":"reference","argument":"key","category":"full","description":" Key of group"},{"type":"reference","argument":"dialogs","category":"full","description":" Conversations in group"}],"attributes":[ +{"type":"string","id":1,"name":"title"} +,{"type":"string","id":2,"name":"key"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"DialogShort"}},"id":3,"name":"dialogs"} +]}}, { + "type":"struct", + "content": { + "name":"MessageReaction", +"doc":[ +"Reaction to message",{"type":"reference","argument":"users","category":"full","description":" User's reaction"},{"type":"reference","argument":"code","category":"full","description":" Reaction EMOJI code"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"users"} +,{"type":"string","id":2,"name":"code"} +]}}, { + "type":"struct", + "content": { + "name":"MessageOutReference", +"doc":[ +"Message Out Reference",{"type":"reference","argument":"peer","category":"full","description":" Out Peer of message"},{"type":"reference","argument":"rid","category":"full","description":" Message random id"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +]}},{"type":"rpc","content":{ +"name":"SendMessage", +"header":92, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Sending plain message",{"type":"reference","argument":"peer","category":"full","description":"Destination peer for message"},{"type":"reference","argument":"rid","category":"full","description":"Message random id (generated on client side)"},{"type":"reference","argument":"message","category":"full","description":"The message"},{"type":"reference","argument":"isOnlyForUser","category":"full","description":"If message is shown only for specific user"},{"type":"reference","argument":"quotedMessageReference","category":"full","description":"Quoted message if present"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":4,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":5,"name":"isOnlyForUser"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageOutReference"}},"id":6,"name":"quotedMessageReference"} +]}},{"type":"rpc","content":{ +"name":"UpdateMessage", +"header":2658, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Changing Message content",{"type":"reference","argument":"peer","category":"full","description":"Destination Peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"updatedMessage","category":"full","description":"Updated Message content"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":3,"name":"updatedMessage"} +]}},{"type":"rpc","content":{ +"name":"MessageReceived", +"header":55, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Confirmation of plain message receive by device",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"date","category":"full","description":"Maximum date of received messages"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"rpc","content":{ +"name":"MessageRead", +"header":57, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Marking plain messages as read",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"date","category":"full","description":"Maximum date of read messages"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"rpc","content":{ +"name":"DeleteMessage", +"header":98, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Deleting messages",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rids","category":"full","description":"Message random id"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":3,"name":"rids"} +]}},{"type":"rpc","content":{ +"name":"ClearChat", +"header":99, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Clearing of conversation (without removing dialog from dialogs list)",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"DeleteChat", +"header":100, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Deleting of conversation (also leave group for group conversations)",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"ArchiveChat", +"header":2654, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Archiving chat",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"MessageSetReaction", +"header":210, +"response":{"type":"reference","name":"ReactionsResponse"}, +"doc":[ +"Setting Message reaction",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"code","category":"full","description":"Reaction code"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":"string","id":3,"name":"code"} +]}},{"type":"rpc","content":{ +"name":"MessageRemoveReaction", +"header":220, +"response":{"type":"reference","name":"ReactionsResponse"}, +"doc":[ +"Removing Message reaction",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"code","category":"full","description":"Reaction code"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":"string","id":3,"name":"code"} +]}},{"type":"response","content":{ +"name":"ReactionsResponse", +"header":219, +"doc":[ +"Response for reactions change"],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":3,"name":"reactions"} +]}},{"type":"update","content":{ +"name":"Message", +"header":55, +"doc":[ +"Update about plain message",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"senderUid","category":"full","description":" Sender of message"},{"type":"reference","argument":"date","category":"full","description":" date of message"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"message","category":"full","description":" message content"},{"type":"reference","argument":"attributes","category":"full","description":" optional message attributes"},{"type":"reference","argument":"quotedMessage","category":"full","description":" optional quoted message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"senderUid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":6,"name":"attributes"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":7,"name":"quotedMessage"} +]}},{"type":"update","content":{ +"name":"MessageContentChanged", +"header":162, +"doc":[ +"Update about message change",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"message","category":"full","description":" Message content"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":3,"name":"message"} +]}},{"type":"update","content":{ +"name":"MessageQuotedChanged", +"header":169, +"doc":[ +"Update about quoted message changed",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"quotedMessage","category":"full","description":" Quoted Message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":3,"name":"quotedMessage"} +]}},{"type":"update","content":{ +"name":"MessageDateChanged", +"header":163, +"doc":[ +"Update about message date changed",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"update","content":{ +"name":"MessageSent", +"header":4, +"doc":[ +"Update about message sent",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"update","content":{ +"name":"MessageReceived", +"header":54, +"doc":[ +"Update about message received",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of received message"},{"type":"reference","argument":"receivedDate","category":"full","description":" Date of receive"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"receivedDate"} +]}},{"type":"update","content":{ +"name":"MessageRead", +"header":19, +"doc":[ +"Update about message read",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of read message"},{"type":"reference","argument":"readDate","category":"full","description":" Date of read"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"readDate"} +]}},{"type":"update","content":{ +"name":"MessageReadByMe", +"header":50, +"doc":[ +"Update about message read by me",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of read message"},{"type":"reference","argument":"unreadCounter","category":"full","description":" Optional unread counter in conversation"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} +,{"type":{"type":"opt","childType":"int32"},"id":3,"name":"unreadCounter"} +]}},{"type":"update","content":{ +"name":"MessageDelete", +"header":46, +"doc":[ +"Update about message delete",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rids","category":"full","description":" Deleted messages"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"rids"} +]}},{"type":"update","content":{ +"name":"ChatClear", +"header":47, +"doc":[ +"Update about chat clear",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatDelete", +"header":48, +"doc":[ +"Update about chat delete",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatArchive", +"header":94, +"doc":[ +"Update about chat archive",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatDropCache", +"header":2690, +"doc":[ +"Update about cache drop",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatGroupsChanged", +"header":1, +"doc":[ +"Update about chat groups changed. Called only when adding, removing and reordering of grouped dialog.",{"type":"reference","argument":"dialogs","category":"compact","description":" New dialgos list"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":1,"name":"dialogs"} +]}},{"type":"update","content":{ +"name":"ReactionsUpdate", +"header":222, +"doc":[ +"Update about reactions change",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Message random id"},{"type":"reference","argument":"reactions","category":"full","description":" New Reactions"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":3,"name":"reactions"} +]}}, { + "type": "enum", + "content": { + "name": "MessageState", + "values": [ { - "type": "string", - "id": 5, - "name": "deviceTitle" + "name": "Sent", + "id": 1 }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" + "name": "Received", + "id": 2 }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SendCodeByPhoneCall", - "header": 197, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Dial phone and dictate auth code", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Transaction hash" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" + "name": "Read", + "id": 3 } - ] - } - }, - { - "type": "rpc", + ] + } + }, { + "type":"struct", + "content": { + "name":"MessageContainer", +"doc":[ +"Message from history",{"type":"reference","argument":"senderUid","category":"full","description":" Sender of mesasge"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"},{"type":"reference","argument":"message","category":"full","description":" Content of message"},{"type":"reference","argument":"reactions","category":"full","description":" Message reactions"},{"type":"reference","argument":"attribute","category":"full","description":" Optional message attributes"},{"type":"reference","argument":"quotedMessage","category":"full","description":" Optional quoted Message"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"senderUid"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"MessageState"}},"id":6,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":7,"name":"reactions"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":8,"name":"attribute"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":9,"name":"quotedMessage"} +]}}, { + "type": "enum", "content": { - "name": "StartEmailAuth", - "header": 185, - "response": { - "type": "anonymous", - "header": 186, - "doc": [ - "Email Activation response", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": " Hash of activation transaction" - }, - { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " true if user is registered" - }, - { - "type": "reference", - "argument": "activationType", - "category": "full", - "description": " Email Activation type" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "bool", - "id": 2, - "name": "isRegistered" - }, - { - "type": { - "type": "enum", - "childType": "EmailActivationType" - }, - "id": 3, - "name": "activationType" - } - ] - }, - "doc": [ - "Start EMail Activation", - { - "type": "reference", - "argument": "email", - "category": "full", - "description": "Email" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application Id" - }, + "name": "ListLoadMode", + "values": [ { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" + "name": "Forward", + "id": 1 }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + "name": "Backward", + "id": 2 }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, + "name": "Both", + "id": 3 + } + ] + } + },{"type":"rpc","content":{ +"name":"LoadHistory", +"header":118, +"response":{"type":"anonymous","header":119, "doc":[ +"Loaded history",{"type":"reference","argument":"history","category":"compact","description":" Messages"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":1,"name":"history"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupPeers"} +]}, +"doc":[ +"Loading history of chat",{"type":"reference","argument":"peer","category":"full","description":"Peer of conversation"},{"type":"reference","argument":"date","category":"full","description":"start date of messages for loading or 0 for loading from start"},{"type":"reference","argument":"loadMode","category":"full","description":"Loading mode: Forward loading, backward or both ways"},{"type":"reference","argument":"limit","category":"full","description":"maximum amount of messages (max is 100)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"ListLoadMode"}},"id":5,"name":"loadMode"} +,{"type":"int32","id":4,"name":"limit"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":6,"name":"optimizations"} +]}}, { + "type":"struct", + "content": { + "name":"Dialog", +"doc":[ +"Conversation from history",{"type":"reference","argument":"peer","category":"full","description":" Peer of conversation"},{"type":"reference","argument":"unreadCount","category":"full","description":" plain messages unread messages count"},{"type":"reference","argument":"sortDate","category":"full","description":" date of conversation for sorting"},{"type":"reference","argument":"senderUid","category":"full","description":" Sender of top message (may be zero)"},{"type":"reference","argument":"rid","category":"full","description":" Random ID of top message (may be zero)"},{"type":"reference","argument":"date","category":"full","description":" Date of top message (can't be zero)"},{"type":"reference","argument":"message","category":"full","description":" Content of message"},{"type":"reference","argument":"firstUnreadDate","category":"full","description":" Date of first unread message"},{"type":"reference","argument":"attributes","category":"full","description":" Optional top message attributes"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":"int32","id":3,"name":"unreadCount"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"sortDate"} +,{"type":{"type":"alias","childType":"userId"},"id":5,"name":"senderUid"} +,{"type":{"type":"alias","childType":"randomId"},"id":6,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":7,"name":"date"} +,{"type":{"type":"trait","childType":"Message"},"id":8,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"MessageState"}},"id":9,"name":"state"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"date"}},"id":10,"name":"firstUnreadDate"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":11,"name":"attributes"} +]}},{"type":"rpc","content":{ +"name":"LoadDialogs", +"header":104, +"response":{"type":"anonymous","header":105, "doc":[ +"Loaded dialogs",{"type":"reference","argument":"groups","category":"compact","description":" Loaded groups"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"dialogs","category":"compact","description":" Loaded dialogs"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Dialog"}},"id":3,"name":"dialogs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":5,"name":"groupPeers"} +]}, +"doc":[ +"Loading conversation history",{"type":"reference","argument":"minDate","category":"full","description":"start date of conversation loading. Use 0 to load latest messages"},{"type":"reference","argument":"limit","category":"full","description":"limit maximum amount of messages (max is 100)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"alias","childType":"date"},"id":1,"name":"minDate"} +,{"type":"int32","id":2,"name":"limit"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LoadArchived", +"header":2651, +"response":{"type":"anonymous","header":2652, "doc":[ +"Archived dialogs",{"type":"reference","argument":"groups","category":"full","description":" Referenced groups"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"dialogs","category":"full","description":" Archived dialogs"},{"type":"reference","argument":"nextOffset","category":"compact","description":" Offset for next bunch"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Dialog"}},"id":3,"name":"dialogs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupPeers"} +,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"nextOffset"} +]}, +"doc":[ +"Loading archived messages",{"type":"reference","argument":"nextOffset","category":"compact","description":"Optional next offset"},{"type":"reference","argument":"limit","category":"full","description":"Maximum number of elements"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"opt","childType":"bytes"},"id":1,"name":"nextOffset"} +,{"type":"int32","id":2,"name":"limit"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LoadGroupedDialogs", +"header":225, +"response":{"type":"anonymous","header":226, "doc":[ +"Loaded grouped dialogs",{"type":"reference","argument":"dialogs","category":"compact","description":" Loaded groups of dialogs"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"groups","category":"full","description":" Loaded groups"},{"type":"reference","argument":"showArchived","category":"full","description":" Show archived section"},{"type":"reference","argument":"showInvite","category":"full","description":" Show invite message"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":1,"name":"dialogs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"showArchived"} +,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"showInvite"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":6,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":7,"name":"groupPeers"} +]}, +"doc":[ +"Load all dialogs from grouped list"],"attributes":[ +{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":1,"name":"optimizations"} +]}},{"type":"response","content":{ +"name":"DialogsOrder", +"header":235, +"doc":[ +"Dialogs order response",{"type":"reference","argument":"seq","category":"full","description":" update seq"},{"type":"reference","argument":"state","category":"full","description":" update state"},{"type":"reference","argument":"groups","category":"full","description":" Update groups"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":3,"name":"groups"} +]}},{"type":"rpc","content":{ +"name":"HideDialog", +"header":231, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Hide Dialog from grouped list",{"type":"reference","argument":"peer","category":"full","description":"Dialog peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"ShowDialog", +"header":232, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Show Dialog in grouped list"],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"FavouriteDialog", +"header":224, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Marking dialog as favourite",{"type":"reference","argument":"peer","category":"full","description":"Peer for favouriting"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"UnfavouriteDialog", +"header":227, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Making dialog as unfavourite",{"type":"reference","argument":"peer","category":"full","description":"Peer for favouriting"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"NotifyDialogOpened", +"header":2785, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Notifying about dialog open",{"type":"reference","argument":"peer","category":"full","description":"Peer that was opened"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}}]}, { + "title": "Groups", + "package": "groups", + "items": [ +{"type":"comment","content":"Entities"}, { + "type":"struct", + "content": { + "name":"Member", +"doc":[ +"Member information",{"type":"reference","argument":"uid","category":"full","description":" User id"},{"type":"reference","argument":"inviterUid","category":"full","description":" User inviter id"},{"type":"reference","argument":"date","category":"full","description":" Adding date"},{"type":"reference","argument":"isAdmin","category":"full","description":" is member admin of group"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"inviterUid"} +,{"type":"int64","id":3,"name":"date"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isAdmin"} +]}}, { + "type": "enum", + "content": { + "name": "GroupType", + "values": [ { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" + "name": "GROUP", + "id": 1 }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" + "name": "CHANNEL", + "id": 2 } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "email" - }, + ] + } + }, { + "type": "enum", + "content": { + "name": "GroupPermissions", + "values": [ { - "type": "int32", - "id": 2, - "name": "appId" + "name": "SEND_MESSAGE", + "id": 1 }, { - "type": "string", - "id": 3, - "name": "apiKey" + "name": "CLEAR", + "id": 2 }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" + "name": "LEAVE", + "id": 3 }, { - "type": "string", - "id": 5, - "name": "deviceTitle" + "name": "DELETE", + "id": 4 }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" + "name": "JOIN", + "id": 5 }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" + "name": "VIEW_INFO", + "id": 6 } - ] - } - }, - { - "type": "rpc", + ] + } + }, { + "type": "enum", "content": { - "name": "StartAnonymousAuth", - "header": 198, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Starting Anonymous login", - { - "type": "reference", - "argument": "name", - "category": "full", - "description": "Name of new user" - }, + "name": "GroupFullPermissions", + "values": [ { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application Id" + "name": "EDIT_INFO", + "id": 1 }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" + "name": "VIEW_MEMBERS", + "id": 2 }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + "name": "INVITE_MEMBERS", + "id": 3 }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" + "name": "INVITE_VIA_LINK", + "id": 4 }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" + "name": "CALL", + "id": 5 }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "name" + "name": "EDIT_ADMIN_SETTINGS", + "id": 6 }, { - "type": "int32", - "id": 2, - "name": "appId" + "name": "VIEW_ADMINS", + "id": 7 }, { - "type": "string", - "id": 3, - "name": "apiKey" + "name": "EDIT_ADMINS", + "id": 8 }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" + "name": "KICK_INVITED", + "id": 9 }, { - "type": "string", - "id": 5, - "name": "deviceTitle" + "name": "KICK_ANYONE", + "id": 10 }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" + "name": "EDIT_FOREIGN", + "id": 11 }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" + "name": "DELETE_FOREIGN", + "id": 12 } - ] - } - }, + ] + } + }, { + "type":"struct", + "content": { + "name":"Group", +"doc":[ +"Group information","","Permissions.","Permissions of this structure is about group messages operation, such as","ability to send messages, clear chat, leave group and so on. This operations","Can be held outside of the Group Info page.","","Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.","If default is TRUE then ONE == FALSE.","Bits:","0 - canSendMessage. Default is FALSE.","1 - canClear. Default is FALSE.","2 - canLeave. Default is FALSE.","3 - canDelete. Default is FALSE.","4 - canJoin. Default is FALSE.","5 - canViewInfo. Default is FALSE.","",{"type":"reference","argument":"id","category":"full","description":" group id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Access hash of group"},{"type":"reference","argument":"title","category":"full","description":" Title of group"},{"type":"reference","argument":"avatar","category":"compact","description":" Avatar of group"},{"type":"reference","argument":"membersCount","category":"full","description":" Number of members"},{"type":"reference","argument":"isHidden","category":"full","description":" Is group hidden (not showing it in recent list). Default is false."},{"type":"reference","argument":"isMember","category":"full","description":" Is current user a member of a group. Default is true."},{"type":"reference","argument":"groupType","category":"full","description":" Group Type. Used only for displaying information. Default is GROUP."},{"type":"reference","argument":"permissions","category":"full","description":" Permissions of group object"},{"type":"reference","argument":"isDeleted","category":"full","description":" Is this group deleted"},{"type":"reference","argument":"ext","category":"full","description":" Group extension Data"},{"type":"reference","argument":"isAdmin","category":"full","description":" [DEPRECATED] Is current user an admin of a group"},{"type":"reference","argument":"theme","category":"hidden","description":" [DEPRECATED] Theme of group"},{"type":"reference","argument":"about","category":"hidden","description":" [DEPRECATED] About of group"},{"type":"reference","argument":"creatorUid","category":"hidden","description":" [DEPRECATED] Group creator"},{"type":"reference","argument":"members","category":"compact","description":" [DEPRECATED] Members of group"},{"type":"reference","argument":"createDate","category":"full","description":" [DEPRECATED] Date of creation"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":4,"name":"avatar"} +,{"type":{"type":"opt","childType":"int32"},"id":24,"name":"membersCount"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isMember"} +,{"type":{"type":"opt","childType":"bool"},"id":20,"name":"isHidden"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"GroupType"}},"id":25,"name":"groupType"} +,{"type":{"type":"opt","childType":"int64"},"id":26,"name":"permissions"} +,{"type":{"type":"opt","childType":"bool"},"id":27,"name":"isDeleted"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":22,"name":"ext"} +,{"type":{"type":"opt","childType":"bool"},"id":16,"name":"isAdmin", "deprecated":"true"} +,{"type":{"type":"alias","childType":"userId"},"id":8,"name":"creatorUid", "deprecated":"true"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":9,"name":"members", "deprecated":"true"} +,{"type":{"type":"alias","childType":"date"},"id":10,"name":"createDate", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":17,"name":"theme", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":18,"name":"about", "deprecated":"true"} +]}}, { + "type":"struct", + "content": { + "name":"GroupFull", +"doc":[ +"Goup Full information","Permissions.","Idea of Group Full mermissions is about Group Info pages. This permissions","are usefull only when trying to view and update group settings and not related","to chat messages itself.","Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.","If default is TRUE then ONE == FALSE.","Bits:","0 - canEditInfo. Default is FALSE.","1 - canViewMembers. Default is FALSE.","2 - canInviteMembers. Default is FALSE.","3 - canInviteViaLink. Default is FALSE.","4 - canCall. Default is FALSE.","5 - canEditAdminSettings. Default is FALSE.","6 - canViewAdmins. Default is FALSE.","7 - canEditAdmins. Default is FALSE.","8 - canKickInvited. Default is FALSE.","9 - canKickAnyone. Default is FALSE.","10 - canEditForeign. Default is FALSE.","11 - canDeleteForeign. Default is FALSE.","",{"type":"reference","argument":"id","category":"full","description":" Group Id"},{"type":"reference","argument":"createDate","category":"full","description":" Date created"},{"type":"reference","argument":"ownerUid","category":"full","description":" Optional group owner"},{"type":"reference","argument":"members","category":"full","description":" Group members. Can be empty when isAsyncMembers enabled."},{"type":"reference","argument":"theme","category":"full","description":" Group Theme"},{"type":"reference","argument":"about","category":"full","description":" Group about"},{"type":"reference","argument":"isAsyncMembers","category":"full","description":" Is Members need to be loaded asynchronous. Default is false."},{"type":"reference","argument":"isSharedHistory","category":"full","description":" Is history shared among all users. Default is false."},{"type":"reference","argument":"shortName","category":"full","description":" Group's short name"},{"type":"reference","argument":"permissions","category":"full","description":" Group Permissions"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"id"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"createDate"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":5,"name":"ownerUid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":12,"name":"members"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"theme"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":7,"name":"ext"} +,{"type":{"type":"opt","childType":"bool"},"id":11,"name":"isAsyncMembers"} +,{"type":{"type":"opt","childType":"bool"},"id":10,"name":"isSharedHistory"} +,{"type":{"type":"opt","childType":"string"},"id":14,"name":"shortName"} +,{"type":{"type":"opt","childType":"int64"},"id":27,"name":"permissions"} +]}},{"type":"rpc","content":{ +"name":"LoadFullGroups", +"header":2782, +"response":{"type":"anonymous","header":2783, "doc":[ +{"type":"reference","argument":"groups","category":"compact","description":" Groups to load"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"GroupFull"}},"id":1,"name":"groups"} +]}, +"doc":[ +"Loading Full Groups",{"type":"reference","argument":"groups","category":"compact","description":"Groups to load"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} +]}},{"type":"rpc","content":{ +"name":"LoadMembers", +"header":2786, +"response":{"type":"anonymous","header":2787, "doc":[ +{"type":"reference","argument":"users","category":"full","description":" Group members"},{"type":"reference","argument":"next","category":"full","description":" Load more reference"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":3,"name":"members"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"next"} +]}, +"doc":[ +"Loading group members",{"type":"reference","argument":"group","category":"full","description":"Group peer"},{"type":"reference","argument":"limit","category":"full","description":"Limit members"},{"type":"reference","argument":"next","category":"full","description":"Load more reference"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"group"} +,{"type":"int32","id":2,"name":"limit"} +,{"type":{"type":"opt","childType":"bytes"},"id":3,"name":"next"} +]}},{"type":"comment","content":"Update"},{"type":"update","content":{ +"name":"GroupTitleChanged", +"header":2609, +"doc":[ +"Update about title changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"title","category":"full","description":" Group Title"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"string","id":2,"name":"title"} +]}},{"type":"update","content":{ +"name":"GroupAvatarChanged", +"header":2610, +"doc":[ +"Update about avatar changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"avatar","category":"full","description":" Group Avatar"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":2,"name":"avatar"} +]}},{"type":"update","content":{ +"name":"GroupTopicChanged", +"header":2616, +"doc":[ +"Update about topic changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"topic","category":"full","description":" Updated topic"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"topic"} +]}},{"type":"update","content":{ +"name":"GroupAboutChanged", +"header":2617, +"doc":[ +"Update about about changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"about","category":"full","description":" Updated about"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} +]}},{"type":"update","content":{ +"name":"GroupExtChanged", +"header":2613, +"doc":[ +"Update about ext changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"ext","category":"full","description":" Updated ext"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} +]}},{"type":"update","content":{ +"name":"GroupFullExtChanged", +"header":2618, +"doc":[ +"Update about full ext changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"ext","category":"full","description":" Updated ext"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} +]}},{"type":"update","content":{ +"name":"GroupShortNameChanged", +"header":2628, +"doc":[ +"Group's short name changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"shortName","category":"full","description":" Group short name"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"shortName"} +]}},{"type":"update","content":{ +"name":"GroupOwnerChanged", +"header":2619, +"doc":[ +"Update about owner changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"userId","category":"full","description":" New Owner"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"userId"} +]}},{"type":"update","content":{ +"name":"GroupHistoryShared", +"header":2620, +"doc":[ +"Update about history shared",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"update","content":{ +"name":"GroupDeleted", +"header":2658, +"doc":[ +"Update about group deleted",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"update","content":{ +"name":"GroupPermissionsChanged", +"header":2663, +"doc":[ +"Update about group permissions changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"permissions","category":"full","description":" New Permissions"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int64","id":2,"name":"permissions"} +]}},{"type":"update","content":{ +"name":"GroupFullPermissionsChanged", +"header":2664, +"doc":[ +"Update about Full Group permissions changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"permissions","category":"full","description":" New Permissions"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int64","id":2,"name":"permissions"} +]}},{"type":"comment","content":" "},{"type":"update","content":{ +"name":"GroupMemberChanged", +"header":2612, +"doc":[ +"Update about membership changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"isMember","category":"full","description":" Is current user a member"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"bool","id":2,"name":"isMember"} +]}},{"type":"update","content":{ +"name":"GroupMembersBecameAsync", +"header":2615, +"doc":[ +"Update about members became async",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"update","content":{ +"name":"GroupMembersUpdated", +"header":2614, +"doc":[ +"Update about members updated",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"members","category":"full","description":" Group Members"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":2,"name":"members"} +]}},{"type":"update","content":{ +"name":"GroupMemberDiff", +"header":2623, +"doc":[ +"Update about members changed",{"type":"reference","argument":"removedUsers","category":"full","description":" Removed Users"},{"type":"reference","argument":"addedMembers","category":"full","description":" Added members"},{"type":"reference","argument":"membersCount","category":"full","description":" Current Members count"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"removedUsers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":3,"name":"addedMembers"} +,{"type":"int32","id":4,"name":"membersCount"} +]}},{"type":"update","content":{ +"name":"GroupMembersCountChanged", +"header":2622, +"doc":[ +"Update about members count changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"membersCount","category":"full","description":" Members count"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int32","id":2,"name":"membersCount"} +]}},{"type":"update","content":{ +"name":"GroupMemberAdminChanged", +"header":2627, +"doc":[ +"Update about member admin changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"userId","category":"full","description":" User Id"},{"type":"reference","argument":"isAdmin","category":"full","description":" Is Admin flag"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"userId"} +,{"type":"bool","id":3,"name":"isAdmin"} +]}},{"type":"comment","content":"Actions"},{"type":"rpc","content":{ +"name":"CreateGroup", +"header":230, +"response":{"type":"anonymous","header":216, "doc":[ +"Created group",{"type":"reference","argument":"seq","category":"full","description":" Update Seq"},{"type":"reference","argument":"state","category":"compact","description":" Update state"},{"type":"reference","argument":"group","category":"full","description":" Created group"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"userPeers","category":"full","description":" Referenced users"},{"type":"reference","argument":"date","category":"full","description":" Group creation date"}] ,"attributes":[{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} +,{"type":{"type":"struct","childType":"Group"},"id":3,"name":"group"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userPeers"} +]}, +"doc":[ +"Creating group chat",{"type":"reference","argument":"rid","category":"full","description":"Random Id for avoiding double create"},{"type":"reference","argument":"title","category":"full","description":"Group Title"},{"type":"reference","argument":"users","category":"hidden","description":"Members of group"},{"type":"reference","argument":"groupType","category":"full","description":"Group Type"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"rid"} +,{"type":"string","id":2,"name":"title"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"GroupType"}},"id":6,"name":"groupType"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":7,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupTitle", +"header":85, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Changing group title",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"title","category":"full","description":"new group title"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupAvatar", +"header":86, +"response":{"type":"anonymous","header":115, "doc":[ +"Updated group avatar",{"type":"reference","argument":"avatar","category":"compact","description":" Changed avatar"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"},{"type":"reference","argument":"date","category":"full","description":" Avatar change date"}] ,"attributes":[{"type":{"type":"struct","childType":"Avatar"},"id":1,"name":"avatar"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}, +"doc":[ +"Changing group avatar",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"fileLocation","category":"compact","description":"uploaded file for avatar"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"struct","childType":"FileLocation"},"id":3,"name":"fileLocation"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"RemoveGroupAvatar", +"header":101, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Removing group avatar",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupShortName", +"header":2793, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Edit Group Short Name",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"shortName","category":"full","description":"New group's short name"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"shortName"} +]}},{"type":"rpc","content":{ +"name":"EditGroupTopic", +"header":211, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Edit group topic",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random id of operation"},{"type":"reference","argument":"topic","category":"full","description":"New Topic"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"topic"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":4,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupAbout", +"header":213, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Edit Group About",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random id of operation"},{"type":"reference","argument":"about","category":"full","description":"New About"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"InviteUser", +"header":69, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Inviting user to group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"user","category":"full","description":"Users for invitation"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":3,"name":"user"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LeaveGroup", +"header":70, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Leaving group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LeaveAndDelete", +"header":2721, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Leave group and Delete Chat",{"type":"reference","argument":"groupPeer","category":"full","description":"Group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"KickUser", +"header":71, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Kicking user from group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"user","category":"full","description":"users for removing"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":3,"name":"user"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"JoinGroupByPeer", +"header":2722, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Join group by peer",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"JoinGroupByPeer2", +"header":44561, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Join group by peer without a necessity of invite",{"type":"reference","argument":"groupPeer","category":"hidden","description":"Groups peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"comment","content":"Administration"},{"type":"rpc","content":{ +"name":"MakeUserAdmin", +"header":2784, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Make user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} +]}},{"type":"rpc","content":{ +"name":"DismissUserAdmin", +"header":2791, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Dismissing user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} +]}},{"type":"rpc","content":{ +"name":"TransferOwnership", +"header":2789, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Transfer ownership of group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"newOwner","category":"full","description":"New group's owner"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"newOwner"} +]}}, { + "type":"struct", + "content": { + "name":"AdminSettings", +"doc":[ +"Admin Settings",{"type":"reference","argument":"showAdminsToMembers","category":"full","description":" Show admins in member list"},{"type":"reference","argument":"canMembersInvite","category":"full","description":" Can members of a group invite people"},{"type":"reference","argument":"canMembersEditGroupInfo","category":"full","description":" Can members edit group info"},{"type":"reference","argument":"canAdminsEditGroupInfo","category":"full","description":" Can admins edit group info"},{"type":"reference","argument":"showJoinLeaveMessages","category":"full","description":" Should join and leave messages be visible to members"}],"expandable":"true","attributes":[ +{"type":"bool","id":1,"name":"showAdminsToMembers"} +,{"type":"bool","id":2,"name":"canMembersInvite"} +,{"type":"bool","id":3,"name":"canMembersEditGroupInfo"} +,{"type":"bool","id":4,"name":"canAdminsEditGroupInfo"} +,{"type":"bool","id":5,"name":"showJoinLeaveMessages"} +]}},{"type":"rpc","content":{ +"name":"LoadAdminSettings", +"header":2790, +"response":{"type":"anonymous","header":2794, "doc":[ +"Loaded settings",{"type":"reference","argument":"settings","category":"full","description":" Current group admin settings"}] ,"attributes":[{"type":{"type":"struct","childType":"AdminSettings"},"id":1,"name":"settings"} +]}, +"doc":[ +"Loading administration settings",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"SaveAdminSettings", +"header":2792, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Save administartion settings",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's Peer"},{"type":"reference","argument":"settings","category":"full","description":"Group's settings"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"AdminSettings"},"id":2,"name":"settings"} +]}},{"type":"rpc","content":{ +"name":"DeleteGroup", +"header":2795, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Delete Group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"ShareHistory", +"header":2796, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Share History",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"comment","content":"Invite"},{"type":"response","content":{ +"name":"InviteUrl", +"header":178, +"doc":[ +"Response for invite url methods"],"attributes":[ +{"type":"string","id":1,"name":"url"} +]}},{"type":"rpc","content":{ +"name":"GetGroupInviteUrl", +"header":177, +"response":{"type":"reference","name":"InviteUrl"}, +"doc":[ +"Building invite url",{"type":"reference","argument":"groupPeer","category":"full","description":"Destination group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"RevokeInviteUrl", +"header":179, +"response":{"type":"reference","name":"InviteUrl"}, +"doc":[ +"Revoking invite urls",{"type":"reference","argument":"groupPeer","category":"full","description":"Destination group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"JoinGroup", +"header":180, +"response":{"type":"anonymous","header":181, "doc":[ +{"type":"reference","argument":"group","category":"hidden","description":" Joined group"},{"type":"reference","argument":"users","category":"hidden","description":" Users from members"},{"type":"reference","argument":"userPeers","category":"hidden","description":" User Peers"},{"type":"reference","argument":"rid","category":"full","description":" Random id"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"hidden","description":" State"},{"type":"reference","argument":"date","category":"full","description":" Date of join"}] ,"attributes":[{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":5,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":7,"name":"userPeers"} +,{"type":{"type":"alias","childType":"randomId"},"id":6,"name":"rid"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}, +"doc":[ +"Join group method",{"type":"reference","argument":"token","category":"full","description":"Url or Token for joining to group"},{"type":"reference","argument":"optimizations","category":"hidden","description":"Enabled Optimizations"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"comment","content":"Obsolete Actions"},{"type":"rpc","content":{ +"name":"CreateGroupObsolete", +"header":65, +"response":{"type":"anonymous","header":66, "doc":[ +"Created group",{"type":"reference","argument":"groupPeer","category":"full","description":" Peer of created group"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"},{"type":"reference","argument":"users","category":"compact","description":" Members of created group"},{"type":"reference","argument":"date","category":"full","description":" Group creation date"}] ,"attributes":[{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":"int32","id":3,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":4,"name":"state"} +,{"type":{"type":"list","childType":"int32"},"id":5,"name":"users"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} +]}, +"doc":[ +"[OBSOLETE] Creating group chat",{"type":"reference","argument":"rid","category":"full","description":"Random Id for avoiding double create"},{"type":"reference","argument":"title","category":"full","description":"Title of new group"},{"type":"reference","argument":"users","category":"compact","description":"Members of new group"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"rid"} +,{"type":"string","id":2,"name":"title"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} +]}},{"type":"rpc","content":{ +"name":"EnterGroupObsolete", +"header":199, +"response":{"type":"anonymous","header":200, "doc":[ +"Joined group",{"type":"reference","argument":"group","category":"full","description":" Joined group"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"rid","category":"full","description":" Rid of join message"},{"type":"reference","argument":"seq","category":"full","description":" Seq of Update"},{"type":"reference","argument":"state","category":"full","description":" State of Update"},{"type":"reference","argument":"date","category":"full","description":" Date of update"}] ,"attributes":[{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"rid"} +,{"type":"int32","id":4,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":5,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} +]}, +"doc":[ +"[OBSOLETE] Join random group by peer id",{"type":"reference","argument":"peer","category":"full","description":"Public group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"MakeUserAdminObsolete", +"header":214, +"response":{"type":"anonymous","header":215, "doc":[ +{"type":"reference","argument":"members","category":"full","description":" new members"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":1,"name":"members"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +]}, +"doc":[ +"[OBSOLETE] Make user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} +]}},{"type":"comment","content":"Obsolete Updates"},{"type":"update","content":{ +"name":"GroupInviteObsolete", +"header":36, +"doc":[ +"Update about inviting current user to group",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"inviteUid","category":"full","description":" Inviter UID. If equals to current uid than group created by user."},{"type":"reference","argument":"date","category":"full","description":" Date of creating"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":9,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":5,"name":"inviteUid"} +,{"type":{"type":"alias","childType":"date"},"id":8,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupUserInvitedObsolete", +"header":21, +"doc":[ +"Update about inviting user to group",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Added user ID"},{"type":"reference","argument":"inviterUid","category":"full","description":" Inviter user ID"},{"type":"reference","argument":"date","category":"full","description":" Date of adding user to group"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"inviterUid"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupUserLeaveObsolete", +"header":23, +"doc":[ +"Update about leaving user",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" User's ID"},{"type":"reference","argument":"date","category":"full","description":" Date of user leave"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupUserKickObsolete", +"header":24, +"doc":[ +"Update about kicking user",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Kicked user's ID"},{"type":"reference","argument":"kickerUid","category":"full","description":" Kicker user's ID"},{"type":"reference","argument":"date","category":"full","description":" Date of user kick"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"kickerUid"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupMembersUpdateObsolete", +"header":44, +"doc":[ +"Silent group members update",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"members","category":"full","description":" New members list"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":2,"name":"members"} +]}},{"type":"update","content":{ +"name":"GroupTitleChangedObsolete", +"header":38, +"doc":[ +"Update about group title change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Changer UID"},{"type":"reference","argument":"title","category":"full","description":" New Title of group"},{"type":"reference","argument":"date","category":"full","description":" Date of title change"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupTopicChangedObsolete", +"header":213, +"doc":[ +"Update about group topic change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Changer UID"},{"type":"reference","argument":"topic","category":"full","description":" New topic of group"},{"type":"reference","argument":"date","category":"full","description":" Date of theme change"},{"type":"reference","argument":"rid","category":"full","description":" Randomd Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"topic"} +,{"type":{"type":"alias","childType":"date"},"id":5,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupAboutChangedObsolete", +"header":214, +"doc":[ +"Update about group about change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"about","category":"full","description":" Group about"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} +]}},{"type":"update","content":{ +"name":"GroupAvatarChangedObsolete", +"header":39, +"doc":[ +"Update about group avatar change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Avatar changer uid"},{"type":"reference","argument":"avatar","category":"compact","description":" New Avatar. If null then avatar is removed"},{"type":"reference","argument":"date","category":"full","description":" Date of avatar change"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":3,"name":"avatar"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}}]}, { + "title": "Stickers", + "package": "stickers", + "doc": [ + "Stickers support in Actor" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"StickerDescriptor", +"doc":[ +"Descriptor of a Sticker",{"type":"reference","argument":"id","category":"full","description":" Sticker unique id"},{"type":"reference","argument":"emoji","category":"full","description":" Emoji code for sticker"},{"type":"reference","argument":"image128","category":"full","description":" Image of sticker 128x128 in WebP format"},{"type":"reference","argument":"image512","category":"full","description":" Image of sticker 512x512 in WebP format"},{"type":"reference","argument":"image256","category":"full","description":" Image of sticker 256x256 in WebP format"}],"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"emoji"} +,{"type":{"type":"struct","childType":"ImageLocation"},"id":3,"name":"image128"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":4,"name":"image512"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":5,"name":"image256"} +]}}, { + "type":"struct", + "content": { + "name":"StickerCollection", +"doc":[ +"Sticker collection",{"type":"reference","argument":"id","category":"full","description":" Unique id of a collection"},{"type":"reference","argument":"accessHash","category":"full","description":" Access Hash of a collection"},{"type":"reference","argument":"stickers","category":"compact","description":" Sticker list"}],"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"StickerDescriptor"}},"id":3,"name":"stickers"} +]}},{"type":"response","content":{ +"name":"StickersReponse", +"header":240, +"doc":[ +"Stickers response",{"type":"reference","argument":"collections","category":"full","description":" Sticker collections"},{"type":"reference","argument":"seq","category":"full","description":" Seq of update"},{"type":"reference","argument":"state","category":"full","description":" State of update"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +]}},{"type":"rpc","content":{ +"name":"LoadOwnStickers", +"header":238, +"response":{"type":"anonymous","header":239, "doc":[ +"Own Stickers collections",{"type":"reference","argument":"ownStickers","category":"hidden","description":" Own sticker collections"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"ownStickers"} +]}, +"doc":[ +"Loading own stickers"],"attributes":[ +]}},{"type":"update","content":{ +"name":"OwnStickersChanged", +"header":161, +"doc":[ +"Own Stickers changed",{"type":"reference","argument":"collections","category":"compact","description":" New own sticker collections"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} +]}},{"type":"update","content":{ +"name":"StickerCollectionsChanged", +"header":164, +"doc":[ +"Sticker collection changed",{"type":"reference","argument":"collections","category":"full","description":" Updated sticker collections"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} +]}},{"type":"rpc","content":{ +"name":"AddStickerCollection", +"header":244, +"response":{"type":"reference","name":"StickersReponse"}, +"doc":[ +"Adding sticker collection",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"RemoveStickerCollection", +"header":245, +"response":{"type":"reference","name":"StickersReponse"}, +"doc":[ +"Removing sticker collection",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"LoadStickerCollection", +"header":246, +"response":{"type":"anonymous","header":247, "doc":[ +"Loaded collection",{"type":"reference","argument":"collection","category":"full","description":" Collection of stickers"}] ,"attributes":[{"type":{"type":"struct","childType":"StickerCollection"},"id":1,"name":"collection"} +]}, +"doc":[ +"Loading stickers",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}]}, { + "title": "Search", + "package": "search", + "doc": [ + "Searching API" + ], + "items": [ { - "type": "rpc", + "type": "enum", "content": { - "name": "StartTokenAuth", - "header": 203, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Starting token-based login", + "name": "SearchPeerType", + "values": [ { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Token for authentication" + "name": "Groups", + "id": 1 }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application Id" + "name": "Contacts", + "id": 2 }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, + "name": "Public", + "id": 3 + } + ] + } + }, { + "type": "enum", + "content": { + "name": "SearchContentType", + "values": [ { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + "name": "Any", + "id": 1 }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, - { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" - }, - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - }, - { - "type": "int32", - "id": 2, - "name": "appId" - }, - { - "type": "string", - "id": 3, - "name": "apiKey" - }, - { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, - { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "StartUsernameAuth", - "header": 2571, - "response": { - "type": "anonymous", - "header": 2572, - "doc": [ - "Result of login auth start. If is not registered move to signup.", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": " Authentication transaction hash" - }, - { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " If user is registered with this username" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "bool", - "id": 2, - "name": "isRegistered" - } - ] - }, - "doc": [ - "Starting Login Authentication", - { - "type": "reference", - "argument": "username", - "category": "full", - "description": "Username for signing in" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application id" - }, - { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, - { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, - { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, - { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "Time Zone of device" - }, - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages of device" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "username" - }, - { - "type": "int32", - "id": 2, - "name": "appId" - }, - { - "type": "string", - "id": 3, - "name": "apiKey" - }, - { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, - { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ValidateCode", - "header": 189, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Performing user sign in.", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, - { - "type": "reference", - "argument": "code", - "category": "hidden", - "description": "Activation code" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "string", - "id": 2, - "name": "code" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ValidatePassword", - "header": 207, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Validation of account password", - { - "type": "reference", - "argument": "transactionHash", - "category": "full", - "description": "Hash of transaction" - }, - { - "type": "reference", - "argument": "password", - "category": "full", - "description": "Password for account" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "string", - "id": 2, - "name": "password" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetOAuth2Params", - "header": 194, - "response": { - "type": "anonymous", - "header": 195, - "doc": [ - { - "type": "reference", - "argument": "authUrl", - "category": "hidden", - "description": " Authentication url" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "authUrl" - } - ] - }, - "doc": [ - "Loading OAuth2 Parameters", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, - { - "type": "reference", - "argument": "redirectUrl", - "category": "full", - "description": "Redirect URL for Application" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "string", - "id": 2, - "name": "redirectUrl" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "CompleteOAuth2", - "header": 196, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Complete OAuth2 Authentication", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, - { - "type": "reference", - "argument": "code", - "category": "danger", - "description": "Authentication Code" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "string", - "id": 2, - "name": "code" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SignUp", - "header": 190, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Perform user SignUp", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": "User name" - }, - { - "type": "reference", - "argument": "sex", - "category": "full", - "description": "Optional user sex" - }, - { - "type": "reference", - "argument": "password", - "category": "full", - "description": "Password for password-based accounts" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "string", - "id": 2, - "name": "name" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "Sex" - } - }, - "id": 3, - "name": "sex" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "password" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "Auth", - "header": 5, - "doc": [ - "Authentication result", - { - "type": "reference", - "argument": "user", - "category": "compact", - "description": " The authenticated User" - }, - { - "type": "reference", - "argument": "config", - "category": "full", - "description": " Current config of server" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "User" - }, - "id": 2, - "name": "user" - }, - { - "type": { - "type": "struct", - "childType": "Config" - }, - "id": 3, - "name": "config" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "AuthSession", - "doc": [ - "Authentication session", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Unuque ID of session" - }, - { - "type": "reference", - "argument": "authHolder", - "category": "full", - "description": " holder of session. 0 - this device, 1 - other." - }, - { - "type": "reference", - "argument": "appId", - "category": "full", - "description": " Application Id (user in SignIn/SignUp)" - }, - { - "type": "reference", - "argument": "appTitle", - "category": "full", - "description": " Title of application" - }, - { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": " Title of device" - }, - { - "type": "reference", - "argument": "authTime", - "category": "full", - "description": " Time of session creating" - }, - { - "type": "reference", - "argument": "authLocation", - "category": "hidden", - "description": " two-letter country code of session create" - }, - { - "type": "reference", - "argument": "latitude", - "category": "hidden", - "description": " optional latitude of auth if available" - }, - { - "type": "reference", - "argument": "longitude", - "category": "hidden", - "description": " optional longitude of auth if available" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": { - "type": "enum", - "childType": "AuthHolder" - }, - "id": 2, - "name": "authHolder" - }, - { - "type": "int32", - "id": 3, - "name": "appId" - }, - { - "type": "string", - "id": 4, - "name": "appTitle" - }, - { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, - { - "type": "int32", - "id": 6, - "name": "authTime" - }, - { - "type": "string", - "id": 7, - "name": "authLocation" - }, - { - "type": { - "type": "opt", - "childType": "double" - }, - "id": 8, - "name": "latitude" - }, - { - "type": { - "type": "opt", - "childType": "double" - }, - "id": 9, - "name": "longitude" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "AuthHolder", - "values": [ - { - "name": "ThisDevice", - "id": 1 - }, - { - "name": "OtherDevice", - "id": 2 - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetAuthSessions", - "header": 80, - "response": { - "type": "anonymous", - "header": 81, - "doc": [ - "Current Auth sessions", - { - "type": "reference", - "argument": "userAuths", - "category": "compact", - "description": " User authentications" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "AuthSession" - } - }, - "id": 1, - "name": "userAuths" - } - ] - }, - "doc": [ - "Getting of all active user's authentication sessions" - ], - "attributes": [] - } - }, - { - "type": "rpc", - "content": { - "name": "TerminateSession", - "header": 82, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "SignOut on specified user's session", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "id from AuthItem" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "TerminateAllSessions", - "header": 83, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "SignOut on all exept current sessions" - ], - "attributes": [] - } - }, - { - "type": "rpc", - "content": { - "name": "SignOut", - "header": 84, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "SignOut current session" - ], - "attributes": [] - } - }, - { - "type": "comment", - "content": "OBSOLETE METHODS" - }, - { - "type": "rpc", - "content": { - "name": "SignInObsolete", - "header": 3, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Performing user signin", - { - "type": "reference", - "argument": "phoneNumber", - "category": "danger", - "description": "Phone number in international format" - }, - { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": "Code request hash from RequestAuthCode" - }, - { - "type": "reference", - "argument": "smsCode", - "category": "danger", - "description": "Confirmation code from SMS" - }, - { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, - { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device title like 'Steven's iPhone'" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, - { - "type": "reference", - "argument": "appKey", - "category": "hidden", - "description": "Application API key" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, - { - "type": "string", - "id": 2, - "name": "smsHash" - }, - { - "type": "string", - "id": 3, - "name": "smsCode" - }, - { - "type": "bytes", - "id": 5, - "name": "deviceHash" - }, - { - "type": "string", - "id": 6, - "name": "deviceTitle" - }, - { - "type": "int32", - "id": 7, - "name": "appId" - }, - { - "type": "string", - "id": 8, - "name": "appKey" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SignUpObsolete", - "header": 4, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Performing user signup. If user perform signup on already registered user it just override previous", - "profile information", - { - "type": "reference", - "argument": "phoneNumber", - "category": "danger", - "description": "Phone number in international format" - }, - { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": "Code request hash from RequestAuthCode" - }, - { - "type": "reference", - "argument": "smsCode", - "category": "danger", - "description": "Confirmation code from SMS" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": "User name" - }, - { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, - { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device title like 'Steven's iPhone'" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, - { - "type": "reference", - "argument": "appKey", - "category": "hidden", - "description": "pplication API key" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, - { - "type": "string", - "id": 2, - "name": "smsHash" - }, - { - "type": "string", - "id": 3, - "name": "smsCode" - }, - { - "type": "string", - "id": 4, - "name": "name" - }, - { - "type": "bytes", - "id": 7, - "name": "deviceHash" - }, - { - "type": "string", - "id": 8, - "name": "deviceTitle" - }, - { - "type": "int32", - "id": 9, - "name": "appId" - }, - { - "type": "string", - "id": 10, - "name": "appKey" - }, - { - "type": "bool", - "id": 11, - "name": "isSilent" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SendAuthCodeObsolete", - "header": 1, - "response": { - "type": "anonymous", - "header": 2, - "doc": [ - "Sms Request response", - { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": " Hash of SMS request" - }, - { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " true if user is registered" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "smsHash" - }, - { - "type": "bool", - "id": 2, - "name": "isRegistered" - } - ] - }, - "doc": [ - "Sending SMS with activation code", - { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": "Phone number in international format" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, - { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, - { - "type": "int32", - "id": 2, - "name": "appId" - }, - { - "type": "string", - "id": 3, - "name": "apiKey" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SendAuthCallObsolete", - "header": 90, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Requesting Phone activation", - { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": "Phone number in international format" - }, - { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": "Code request hash from RequestAuthCode" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, - { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, - { - "type": "string", - "id": 2, - "name": "smsHash" - }, - { - "type": "int32", - "id": 3, - "name": "appId" - }, - { - "type": "string", - "id": 4, - "name": "apiKey" - } - ] - } - } - ] - }, - { - "title": "Users", - "package": "users", - "doc": [ - "Users are objects that secured by accessHash. You can't load user profile by it's id.", - "You can't send message to user without finding it's object in Updates or by calling", - "method for user search, contacts import or some other methods.", - "", - "Applications need to keep all Users information forever.", - "", - "Each User have optional localName - name of user that was set by current user and can be changed", - "any time by calling EditUserLocalName method." - ], - "items": [ - { - "type": "enum", - "content": { - "name": "Sex", - "values": [ - { - "name": "Unknown", - "id": 1 - }, - { - "name": "Male", - "id": 2 - }, - { - "name": "Female", - "id": 3 - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "ContactType", - "values": [ - { - "name": "Phone", - "id": 1 - }, - { - "name": "Email", - "id": 2 - }, - { - "name": "Web", - "id": 3 - }, - { - "name": "Social", - "id": 4 - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ContactRecord", - "doc": [ - "Contact information record", - { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Record type" - }, - { - "type": "reference", - "argument": "typeSpec", - "category": "hidden", - "description": " Value for specification type of contact, for example 'mobile/standalone/office' for phones or 'vk/fb/telegram' for extenrnal networks." - }, - { - "type": "reference", - "argument": "stringValue", - "category": "full", - "description": " String value of record" - }, - { - "type": "reference", - "argument": "longValue", - "category": "full", - "description": " Long value of record" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Title of record" - }, - { - "type": "reference", - "argument": "subtitle", - "category": "hidden", - "description": " Subtitle of record" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "enum", - "childType": "ContactType" - }, - "id": 1, - "name": "type" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "typeSpec" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "stringValue" - }, - { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 3, - "name": "longValue" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "title" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 5, - "name": "subtitle" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "User", - "doc": [ - "Main user object", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " uid" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " user's access hash" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " user's name" - }, - { - "type": "reference", - "argument": "localName", - "category": "full", - "description": " user's local name" - }, - { - "type": "reference", - "argument": "nick", - "category": "full", - "description": " User's nickname" - }, - { - "type": "reference", - "argument": "sex", - "category": "full", - "description": " optional sex of user" - }, - { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " avatar of user" - }, - { - "type": "reference", - "argument": "isBot", - "category": "full", - "description": " Is user actually bot. By default is false." - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Extension values" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " [DEPRECATED] User's about information" - }, - { - "type": "reference", - "argument": "contactInfo", - "category": "compact", - "description": " [DEPRECATED] Contact information of user" - }, - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": " [DEPRECATED] Preferred user languages" - }, - { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": " [DEPRECATED] Time Zone of user in TZ format" - }, - { - "type": "reference", - "argument": "botCommands", - "category": "full", - "description": " [DEPRECATED] Available Bot Commands" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": "string", - "id": 3, - "name": "name" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "localName" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 13, - "name": "nick" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "Sex" - } - }, - "id": 5, - "name": "sex" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 8, - "name": "avatar" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 11, - "name": "isBot" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 20, - "name": "ext" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ContactRecord" - } - }, - "id": 12, - "name": "contactInfo", - "deprecated": "true" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 14, - "name": "about", - "deprecated": "true" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 16, - "name": "preferredLanguages", - "deprecated": "true" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 17, - "name": "timeZone", - "deprecated": "true" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "BotCommand" - } - }, - "id": 19, - "name": "botCommands", - "deprecated": "true" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "FullUser", - "doc": [ - "Full User representation", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " User's Id" - }, - { - "type": "reference", - "argument": "contactInfo", - "category": "compact", - "description": " User's contact information" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " User's about information" - }, - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": " Preferred user languages" - }, - { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": " Time Zone of user in TZ format" - }, - { - "type": "reference", - "argument": "botCommands", - "category": "full", - "description": " Available Commands for Bot" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Extension values. NOTE: This values are not related to ext field in User object." - }, - { - "type": "reference", - "argument": "isBlocked", - "category": "full", - "description": " Is user blocked. Default is false." - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ContactRecord" - } - }, - "id": 2, - "name": "contactInfo" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "about" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 4, - "name": "preferredLanguages" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 5, - "name": "timeZone" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "BotCommand" - } - }, - "id": 6, - "name": "botCommands" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 7, - "name": "ext" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 8, - "name": "isBlocked" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "BotCommand", - "doc": [ - "Available bot commands", - { - "type": "reference", - "argument": "slashCommand", - "category": "full", - "description": " Slash command name (wihtout slash)" - }, - { - "type": "reference", - "argument": "description", - "category": "full", - "description": " Slash command description" - }, - { - "type": "reference", - "argument": "locKey", - "category": "full", - "description": " Optional Localization Key for i18n" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "slashCommand" - }, - { - "type": "string", - "id": 2, - "name": "description" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "locKey" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditUserLocalName", - "header": 96, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Renaming of user's visible name", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": "target User's uid" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": "User's accessHash" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": "New user name" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": "string", - "id": 3, - "name": "name" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserAvatarChanged", - "header": 16, - "doc": [ - "Update about avatar changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, - { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " user's new avatar" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 2, - "name": "avatar" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserNameChanged", - "header": 32, - "doc": [ - "Update about name changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " user's name" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": "string", - "id": 2, - "name": "name" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserLocalNameChanged", - "header": 51, - "doc": [ - "Update about local name changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, - { - "type": "reference", - "argument": "localName", - "category": "full", - "description": " new user's local name" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "localName" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserContactsChanged", - "header": 134, - "doc": [ - "Update about contact information change", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, - { - "type": "reference", - "argument": "contactRecords", - "category": "compact", - "description": " new phones list" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ContactRecord" - } - }, - "id": 4, - "name": "contactRecords" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserNickChanged", - "header": 209, - "doc": [ - "Update about nick changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, - { - "type": "reference", - "argument": "nickname", - "category": "full", - "description": " user's new nickname" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "nickname" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserAboutChanged", - "header": 210, - "doc": [ - "Update about user's about changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's uid" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " User's about" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "about" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserPreferredLanguagesChanged", - "header": 212, - "doc": [ - "Update about user's preferred languages", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's uid" - }, - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": " User's preferred languages. Can be empty." - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 2, - "name": "preferredLanguages" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserTimeZoneChanged", - "header": 216, - "doc": [ - "User TimeZone changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's uid" - }, - { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": " User's new time zone in TZ format" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "timeZone" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserBotCommandsChanged", - "header": 217, - "doc": [ - "Update about bot commands changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's Id" - }, - { - "type": "reference", - "argument": "commands", - "category": "full", - "description": " New List of commands" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "BotCommand" - } - }, - "id": 2, - "name": "commands" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserExtChanged", - "header": 218, - "doc": [ - "Update about user ext changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " New Ext Value in User (NOT FullUser) object." - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 2, - "name": "ext" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserFullExtChanged", - "header": 219, - "doc": [ - "Update about user ext changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's Id" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " New Ext Value in FullUser (NOT User) object." - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 3, - "name": "ext" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadFullUsers", - "header": 2649, - "response": { - "type": "anonymous", - "header": 2650, - "doc": [ - { - "type": "reference", - "argument": "fullUsers", - "category": "compact", - "description": " Loaded users" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "FullUser" - } - }, - "id": 1, - "name": "fullUsers" - } - ] - }, - "doc": [ - "Loading Full User information", - { - "type": "reference", - "argument": "userPeers", - "category": "compact", - "description": "User's peers to load. Should be non-empy" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "userPeers" - } - ] - } - } - ] - }, - { - "title": "Profile", - "package": "profile", - "items": [ - { - "type": "rpc", - "content": { - "name": "EditName", - "header": 53, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing account's name", - { - "type": "reference", - "argument": "name", - "category": "full", - "description": "New name" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "name" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditNickName", - "header": 205, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing account's nickname", - { - "type": "reference", - "argument": "nickname", - "category": "full", - "description": "New Nickname" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "nickname" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "CheckNickName", - "header": 206, - "response": { - "type": "reference", - "name": "Bool" - }, - "doc": [ - "Checking availability of nickname", - { - "type": "reference", - "argument": "nickname", - "category": "full", - "description": "Nickname for checking" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "nickname" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditAbout", - "header": 212, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing about information", - { - "type": "reference", - "argument": "about", - "category": "full", - "description": "new about information" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "about" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditAvatar", - "header": 31, - "response": { - "type": "anonymous", - "header": 103, - "doc": [ - "Response for change account avatar", - { - "type": "reference", - "argument": "avatar", - "category": "full", - "description": " New avatar" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Avatar" - }, - "id": 1, - "name": "avatar" - }, - { - "type": "int32", - "id": 2, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - } - ] - }, - "doc": [ - "Changing account's avatar", - { - "type": "reference", - "argument": "fileLocation", - "category": "compact", - "description": "File Location of uploaded unencrypted avatar" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "fileLocation" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RemoveAvatar", - "header": 91, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Removing account's avatar" - ], - "attributes": [] - } - }, - { - "type": "rpc", - "content": { - "name": "EditMyTimeZone", - "header": 144, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Updating user's time zone", - { - "type": "reference", - "argument": "tz", - "category": "full", - "description": "New Time Zone" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "tz" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditMyPreferredLanguages", - "header": 145, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing preffered languages", - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preffered Languages" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 1, - "name": "preferredLanguages" - } - ] - } - } - ] - }, - { - "title": "Contacts", - "package": "contacts", - "doc": [ - "Before working with contact list is is useful to import contacts from phone first by calling", - "method ImportContacts#0x07.", - "", - "All phone numbers MUST be preprocessed before import by some library (like libphonenumber)", - "and build international phone number depending on current users phone and/or locale.", - "", - "For loading contact list from server use GetContacts#0x57.", - "If during this call there are some updates about contact list change", - "it is recommended to call it again. Also applications need to sync contacts on application start.", - "", - "For searching for users without adding to contacts list use method FindContacts#0x70.", - "", - "For adding/deleting contacts AddContact#0x72 and DeleteContact#0x59." - ], - "items": [ - { - "type": "struct", - "content": { - "name": "PhoneToImport", - "doc": [ - "Phone for import", - { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": " phone number for import in international format" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " optional name for contact" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EmailToImport", - "doc": [ - "Email for import", - { - "type": "reference", - "argument": "email", - "category": "full", - "description": " email for importing" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " optional name for contact" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "email" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ImportContacts", - "header": 7, - "response": { - "type": "anonymous", - "header": 8, - "doc": [ - "Imported contacts", - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Imported users" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number if users are imported" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state if users are imported" - }, - { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Imported user peers" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 1, - "name": "users" - }, - { - "type": "int32", - "id": 2, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 4, - "name": "userPeers" - } - ] - }, - "doc": [ - "Importing phones and emails for building contact list", - "Maximum amount of items for import per method call equals to 100.", - { - "type": "reference", - "argument": "phones", - "category": "compact", - "description": "Phones for import" - }, - { - "type": "reference", - "argument": "emails", - "category": "compact", - "description": "Emails for import" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "PhoneToImport" - } - }, - "id": 1, - "name": "phones" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EmailToImport" - } - }, - "id": 2, - "name": "emails" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - } - ] - } - }, - { - "type": "empty" - }, - { - "type": "rpc", - "content": { - "name": "GetContacts", - "header": 87, - "response": { - "type": "anonymous", - "header": 88, - "doc": [ - "Current contact list", - { - "type": "reference", - "argument": "users", - "category": "hidden", - "description": " User list if list is changed" - }, - { - "type": "reference", - "argument": "isNotChanged", - "category": "full", - "description": " is list changed" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 1, - "name": "users" - }, - { - "type": "bool", - "id": 2, - "name": "isNotChanged" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "userPeers" - } - ] - }, - "doc": [ - "Getting current contact list", - "SHA256 hash of list of a comma-separated list of contact UIDs in ascending", - "order may be passed in contactsHash parameter.", - "If the contact list was not changed, isNotChanged will be true.", - { - "type": "reference", - "argument": "contactsHash", - "category": "full", - "description": "Hash of saved list in application" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "contactsHash" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RemoveContact", - "header": 89, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Removing contact from contact list", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": "Contact's UID" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": "Contact's AccessHash" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "AddContact", - "header": 114, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Adding contact to contact list", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": "Contact's UID" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": "Contact's AccessHash" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SearchContacts", - "header": 112, - "response": { - "type": "anonymous", - "header": 113, - "doc": [ - "Founded users", - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Founded users" - }, - { - "type": "reference", - "argument": "userPeers", - "category": "compact", - "description": " Founded users peers" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 1, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 2, - "name": "userPeers" - } - ] - }, - "doc": [ - "Searching contacts by user's query", - { - "type": "reference", - "argument": "request", - "category": "full", - "description": "Search query" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "request" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - } - ] - } - }, - { - "type": "empty" - }, - { - "type": "update", - "content": { - "name": "ContactRegistered", - "header": 5, - "doc": [ - "Update about contact registration", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " contact's uid" - }, - { - "type": "reference", - "argument": "isSilent", - "category": "full", - "description": " is registration silent. If this value is true then don't show notification about registration" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " date of registration" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": "bool", - "id": 2, - "name": "isSilent" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ContactsAdded", - "header": 40, - "doc": [ - "Update about contacts added", - { - "type": "reference", - "argument": "uids", - "category": "compact", - "description": " added contacts" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 1, - "name": "uids" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ContactsRemoved", - "header": 41, - "doc": [ - "Update about contacts removed", - { - "type": "reference", - "argument": "uids", - "category": "compact", - "description": " removed contacts" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 1, - "name": "uids" - } - ] - } - } - ] - }, - { - "title": "Privacy", - "package": "privacy", - "items": [ - { - "type": "rpc", - "content": { - "name": "BlockUser", - "header": 2636, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Block User", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for blocking" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnblockUser", - "header": 2637, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Unblock User", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for unblocking" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadBlockedUsers", - "header": 2638, - "response": { - "type": "anonymous", - "header": 2639, - "doc": [ - { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Blocked user peers" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "userPeers" - } - ] - }, - "doc": [ - "Load Blocked Users" - ], - "attributes": [] - } - }, - { - "type": "update", - "content": { - "name": "UserBlocked", - "header": 2629, - "doc": [ - "Update about User Blocked", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserUnblocked", - "header": 2630, - "doc": [ - "Update about User Unblocked", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - } - ] - } - } - ] - }, - { - "title": "Messaging", - "package": "messaging", - "doc": [ - "Actor can work with encrypted and plain messages in one conversation. For both types of messages API", - "contains a bit different methods. Also encrypted and plain messages have different schemes.", - "

Messages

", - "Message entity contains:", - "
    ", - "
  • PeerType - group chat or private
  • ", - "
  • PeerId - group or user id of conversation
  • ", - "
  • RandomId - unique id of message that generated by sender. In Encrypted messages random id is encrypted.
  • ", - "
  • Date - date of message (calculated on server)
  • ", - "
  • Content
  • ", - "
", - "

Message content

", - "Message can be one of three basic types of messages: Text Message, File Message and Service message.", - "All messages can contain extensions. For example we can send text message and add markdown extension with", - "formatted text in markdown and clients that support this extension will show markdown, and that clients that", - "not supported extension then show simple text. File messages can have photo, video or voice extensions.", - "Service message can have extensions extensions such as \"user added\", \"group created\", \"avatar changed\", etc.", - "

Send messages

", - "Sending messages looks same for encrypted and plain messages. Client MUST prepare all required data", - "before sending message (for example FastThumb for photo/video/documents) and call required methods.", - "Encrypted messages differs here only by a little different scheme and encryption.", - "

WRONG_KEYS and incorrect keys

", - "For sending encrypted messages client MUST send messages encrypted for all own and receivers keys.", - "If client send encryption with missing, old or incorrect keys it will receive WRONG_KEYS.", - "In WRONG_KEYS you need to deserialize relatedData from RpcError to WrongKeysErrorData", - "and get detailed information about keys. Sometimes there are some broken keys on server and client can't", - "encrypt messages with it than client MUST send empty encrypted key in request elsewhere API return WRONG_KEYS.", - "

Encrypted messages and New Devices

", - "When you send message to someone and when he registered with new device there are no way to receive old encrypted", - "messages on new device and because of this there are a problem about read/delivery statuses.", - "Alice send messages to Bob, but Bob lose his device and buy new iPhone and installed Actor.", - "Alice receive notification about new device and send another message. Bob open chat with Alice and", - "send read status with maximum message read date. Alice will mark all sent messages as read and one that", - "was not delivered. We can use status notifications per message, but in VERY heavy conversations it will be", - "a lot of unnecessary traffic. For resolving this small issue we have different ways of message statuses", - "for encrypted and plain messages. Also it is recomended to mark all undelivered messages on new device update as", - "not devered with warring sign.", - "

Message Read and Delivery

", - "There are two different ways for read and delivery statuses for encrypted and plain messages.", - "For encrypted messages used status change by RandomId and for plain messages used by maximum", - "date of read/delivered message." - ], - "items": [ - { - "type": "struct", - "content": { - "name": "MessageAttributes", - "doc": [ - "Message Attributes", - { - "type": "reference", - "argument": "isMentioned", - "category": "full", - "description": " Is mentioned. If set overrides built-in value." - }, - { - "type": "reference", - "argument": "isHighlighted", - "category": "full", - "description": " Is message highlighted. Default is false." - }, - { - "type": "reference", - "argument": "isNotified", - "category": "full", - "description": " Is notified. If set overrides built-in settings." - }, - { - "type": "reference", - "argument": "isOnlyForYou", - "category": "full", - "description": " If this message is only for you. Default is false" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "isMentioned" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isHighlighted" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isNotified" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "isOnlyForYou" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "QuotedMessage", - "doc": [ - "Quoted Message", - { - "type": "reference", - "argument": "messageId", - "category": "full", - "description": " Message Id if present" - }, - { - "type": "reference", - "argument": "publicGroupId", - "category": "full", - "description": " Public Group id if present" - }, - { - "type": "reference", - "argument": "senderUserId", - "category": "full", - "description": " Sender of message" - }, - { - "type": "reference", - "argument": "messageDate", - "category": "full", - "description": " Date of message" - }, - { - "type": "reference", - "argument": "quotedMessageContent", - "category": "full", - "description": " Optional Quoted Message Content. Can be empty if messageId is present and message is in current peer." - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 1, - "name": "messageId" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "groupId" - } - }, - "id": 2, - "name": "publicGroupId" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "senderUserId" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "messageDate" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "Message" - } - }, - "id": 5, - "name": "quotedMessageContent" - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "Message", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "TextMessage", - "doc": [ - "Text message", - { - "type": "reference", - "argument": "text", - "category": "danger", - "description": " the text" - }, - { - "type": "reference", - "argument": "mentions", - "category": "full", - "description": " User mentions in message" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Optional bytes of extension" - } - ], - "trait": { - "name": "Message", - "key": 1 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "text" - }, - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "mentions" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "TextMessageEx" - } - }, - "id": 3, - "name": "ext" - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "TextMessageEx", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "TextExMarkdown", - "doc": [ - "Markdown extension", - { - "type": "reference", - "argument": "markdown", - "category": "full", - "description": " Markdown text" - } - ], - "trait": { - "name": "TextMessageEx", - "key": 1 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 2, - "name": "markdown" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "TextModernMessage", - "doc": [ - "Modern text message", - { - "type": "reference", - "argument": "text", - "category": "full", - "description": " optional text of message" - }, - { - "type": "reference", - "argument": "senderNameOverride", - "category": "full", - "description": " optional overriding of sender" - }, - { - "type": "reference", - "argument": "senderPhotoOverride", - "category": "full", - "description": " optional overriding sender's photo" - }, - { - "type": "reference", - "argument": "style", - "category": "full", - "description": " optional paragraph style" - }, - { - "type": "reference", - "argument": "attaches", - "category": "full", - "description": " optional Attaches of message" - } - ], - "trait": { - "name": "TextMessageEx", - "key": 2 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "text" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "senderNameOverride" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 3, - "name": "senderPhotoOverride" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ParagraphStyle" - } - }, - "id": 4, - "name": "style" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "TextModernAttach" - } - }, - "id": 5, - "name": "attaches" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ParagraphStyle", - "doc": [ - "Paragraph style", - { - "type": "reference", - "argument": "showParagraph", - "category": "full", - "description": " Show quote-like paragraph?" - }, - { - "type": "reference", - "argument": "paragraphColor", - "category": "full", - "description": " Override paragraph color" - }, - { - "type": "reference", - "argument": "bgColor", - "category": "full", - "description": " Override background color" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "showParagraph" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "Color" - } - }, - "id": 2, - "name": "paragraphColor" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "Color" - } - }, - "id": 3, - "name": "bgColor" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "TextModernAttach", - "doc": [ - "Attaches to message", - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Attach of message" - }, - { - "type": "reference", - "argument": "titleUrl", - "category": "full", - "description": " Attach title url" - }, - { - "type": "reference", - "argument": "titleIcon", - "category": "full", - "description": " Attach title icon" - }, - { - "type": "reference", - "argument": "text", - "category": "full", - "description": " Attach text" - }, - { - "type": "reference", - "argument": "style", - "category": "full", - "description": " Attach style" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "title" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "titleUrl" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 3, - "name": "titleIcon" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "text" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ParagraphStyle" - } - }, - "id": 5, - "name": "style" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "TextModernField" - } - }, - "id": 6, - "name": "fields" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "TextModernField", - "doc": [ - "Modern message fields", - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Field title" - }, - { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Field value" - }, - { - "type": "reference", - "argument": "isShort", - "category": "full", - "description": " Is field can be shown in compact way (default is TRUE)" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "title" - }, - { - "type": "string", - "id": 2, - "name": "value" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isShort" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "TextCommand", - "doc": [ - "Text Command Message for bots", - { - "type": "reference", - "argument": "command", - "category": "full", - "description": " Slash-Command For execution" - }, - { - "type": "reference", - "argument": "args", - "category": "full", - "description": " Arguments of slash command" - } - ], - "trait": { - "name": "TextMessageEx", - "key": 3 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "command" - }, - { - "type": "string", - "id": 2, - "name": "args" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceMessage", - "doc": [ - "Service message", - { - "type": "reference", - "argument": "text", - "category": "full", - "description": " service message text" - }, - { - "type": "reference", - "argument": "ext", - "category": "compact", - "description": " Extension" - } - ], - "trait": { - "name": "Message", - "key": 2 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "text" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "ServiceEx" - } - }, - "id": 3, - "name": "ext" - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "ServiceEx", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExUserInvited", - "doc": [ - "Service message about adding user to group", - { - "type": "reference", - "argument": "invitedUid", - "category": "full", - "description": " added user id" - } - ], - "trait": { - "name": "ServiceEx", - "key": 1 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "invitedUid" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExUserJoined", - "doc": [ - "Service message about user join to group" - ], - "trait": { - "name": "ServiceEx", - "key": 17 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExUserKicked", - "doc": [ - "Service message about kicking user from group", - { - "type": "reference", - "argument": "kickedUid", - "category": "full", - "description": " kicked user id" - } - ], - "trait": { - "name": "ServiceEx", - "key": 2 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "kickedUid" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExUserLeft", - "doc": [ - "Service message about user left group" - ], - "trait": { - "name": "ServiceEx", - "key": 3 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExGroupCreated", - "doc": [ - "Service message about group creating" - ], - "trait": { - "name": "ServiceEx", - "key": 4 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExChangedTitle", - "doc": [ - "Service message about group title change", - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " New group title" - } - ], - "trait": { - "name": "ServiceEx", - "key": 5 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "title" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExChangedTopic", - "doc": [ - "Service message on group topic change", - { - "type": "reference", - "argument": "topic", - "category": "full", - "description": " New group topic" - } - ], - "trait": { - "name": "ServiceEx", - "key": 18 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "topic" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExChangedAbout", - "doc": [ - "Service message on group about change", - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " New group about" - } - ], - "trait": { - "name": "ServiceEx", - "key": 19 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "about" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExChangedAvatar", - "doc": [ - "Service message about avatar change", - { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " Updated avatar" - } - ], - "trait": { - "name": "ServiceEx", - "key": 6 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 1, - "name": "avatar" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExContactRegistered", - "doc": [ - "Service message about user registration", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User Id" - } - ], - "trait": { - "name": "ServiceEx", - "key": 8 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExPhoneMissed", - "doc": [ - "Update about missing phone call" - ], - "trait": { - "name": "ServiceEx", - "key": 9 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExPhoneCall", - "doc": [ - "Update about phone call", - { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " Duration of a phone call" - } - ], - "trait": { - "name": "ServiceEx", - "key": 16 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "duration" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExChatArchived", - "doc": [ - "Message about chat archived" - ], - "trait": { - "name": "ServiceEx", - "key": 20 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExChatRestored", - "doc": [ - "Message about chat restored" - ], - "trait": { - "name": "ServiceEx", - "key": 21 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "DocumentMessage", - "doc": [ - "File message", - { - "type": "reference", - "argument": "fileId", - "category": "full", - "description": " file id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " file access hash" - }, - { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " file size" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " name of file" - }, - { - "type": "reference", - "argument": "mimeType", - "category": "full", - "description": " mimetype of file" - }, - { - "type": "reference", - "argument": "thumb", - "category": "compact", - "description": " optional thumb of file. JPEG less that 90x90 with 60-70 quality." - }, - { - "type": "reference", - "argument": "ext", - "category": "compact", - "description": " Extension" - } - ], - "trait": { - "name": "Message", - "key": 3 - }, - "expandable": "true", - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "fileId" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": "int32", - "id": 3, - "name": "fileSize" - }, - { - "type": "string", - "id": 4, - "name": "name" - }, - { - "type": "string", - "id": 5, - "name": "mimeType" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "FastThumb" - } - }, - "id": 6, - "name": "thumb" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "DocumentEx" - } - }, - "id": 8, - "name": "ext" - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "DocumentEx", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "DocumentExPhoto", - "doc": [ - "File photo extension. Can be set ONLY for JPEG.", - { - "type": "reference", - "argument": "w", - "category": "full", - "description": " image width" - }, - { - "type": "reference", - "argument": "h", - "category": "full", - "description": " image height" - } - ], - "trait": { - "name": "DocumentEx", - "key": 1 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "w" - }, - { - "type": "int32", - "id": 2, - "name": "h" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "DocumentExVideo", - "doc": [ - "File video extension", - { - "type": "reference", - "argument": "w", - "category": "full", - "description": " video width" - }, - { - "type": "reference", - "argument": "h", - "category": "full", - "description": " video height" - }, - { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " video duration" - } - ], - "trait": { - "name": "DocumentEx", - "key": 2 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "w" - }, - { - "type": "int32", - "id": 2, - "name": "h" - }, - { - "type": "int32", - "id": 3, - "name": "duration" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "DocumentExVoice", - "doc": [ - "File voice extension", - { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " voice duration" - } - ], - "trait": { - "name": "DocumentEx", - "key": 3 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "duration" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "DocumentExAnimation", - "doc": [ - "Animation extension. Can be set ONLY for GIF.", - { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Animation width" - }, - { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Animation height" - } - ], - "trait": { - "name": "DocumentEx", - "key": 6 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "w" - }, - { - "type": "int32", - "id": 2, - "name": "h" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "DocumentExAnimationVid", - "doc": [ - "Animation video extension. More compact version of Animation with video codec instead of GIF.", - "Can be set ONLY for MP4.", - { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Animation width" - }, - { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Animation height" - }, - { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " Animation duration" - } - ], - "trait": { - "name": "DocumentEx", - "key": 7 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "w" - }, - { - "type": "int32", - "id": 2, - "name": "h" - }, - { - "type": "int32", - "id": 3, - "name": "duration" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "JsonMessage", - "doc": [ - "Custom-data JsonMessage", - { - "type": "reference", - "argument": "rawJson", - "category": "danger", - "description": " JSON object" - } - ], - "trait": { - "name": "Message", - "key": 4 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "rawJson" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "UnsupportedMessage", - "doc": [ - "Explicit type for unsupported message" - ], - "trait": { - "name": "Message", - "key": 5 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "StickerMessage", - "doc": [ - "Sticker message", - { - "type": "reference", - "argument": "stickerId", - "category": "full", - "description": " Optional Unique ID of sticker" - }, - { - "type": "reference", - "argument": "fastPreview", - "category": "full", - "description": " Optional Fast preview of sticker in webp format" - }, - { - "type": "reference", - "argument": "image512", - "category": "full", - "description": " Optional 512x512 sticker image in webp format" - }, - { - "type": "reference", - "argument": "image256", - "category": "full", - "description": " Optional 256x256 sticker image in webp format" - }, - { - "type": "reference", - "argument": "stickerCollectionId", - "category": "full", - "description": " Optional Collection ID" - }, - { - "type": "reference", - "argument": "stickerCollectionAccessHash", - "category": "full", - "description": " Optional Collection Access Hash" - } - ], - "trait": { - "name": "Message", - "key": 6 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 1, - "name": "stickerId" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "fastPreview" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 3, - "name": "image512" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 4, - "name": "image256" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 5, - "name": "stickerCollectionId" - }, - { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 6, - "name": "stickerCollectionAccessHash" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "BinaryMessage", - "doc": [ - "Binary Message. Useful for implementing your own content types", - { - "type": "reference", - "argument": "contentTag", - "category": "full", - "description": " Content Tag" - }, - { - "type": "reference", - "argument": "msg", - "category": "compact", - "description": " Message contents" - } - ], - "trait": { - "name": "Message", - "key": 7 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "contentTag" - }, - { - "type": "bytes", - "id": 2, - "name": "msg" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EncryptedMessage", - "doc": [ - "Encrypted Message", - { - "type": "reference", - "argument": "box", - "category": "full", - "description": " Encrypted box" - } - ], - "trait": { - "name": "Message", - "key": 8 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "struct", - "childType": "EncryptedBox" - }, - "id": 1, - "name": "box" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EmptyMessage", - "doc": [ - "Empty Message" - ], - "trait": { - "name": "Message", - "key": 9 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "DialogShort", - "doc": [ - "Short Dialog from grouped conversation list", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer of conversation" - }, - { - "type": "reference", - "argument": "counter", - "category": "full", - "description": " Conversation unread count" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Conversation top message date" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": "int32", - "id": 2, - "name": "counter" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "DialogGroup", - "doc": [ - "Grouped dialog list", - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Title of group" - }, - { - "type": "reference", - "argument": "key", - "category": "full", - "description": " Key of group" - }, - { - "type": "reference", - "argument": "dialogs", - "category": "full", - "description": " Conversations in group" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "title" - }, - { - "type": "string", - "id": 2, - "name": "key" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogShort" - } - }, - "id": 3, - "name": "dialogs" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MessageReaction", - "doc": [ - "Reaction to message", - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " User's reaction" - }, - { - "type": "reference", - "argument": "code", - "category": "full", - "description": " Reaction EMOJI code" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 1, - "name": "users" - }, - { - "type": "string", - "id": 2, - "name": "code" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MessageOutReference", - "doc": [ - "Message Out Reference", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Out Peer of message" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Message random id" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SendMessage", - "header": 92, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Sending plain message", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer for message" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id (generated on client side)" - }, - { - "type": "reference", - "argument": "message", - "category": "full", - "description": "The message" - }, - { - "type": "reference", - "argument": "isOnlyForUser", - "category": "full", - "description": "If message is shown only for specific user" - }, - { - "type": "reference", - "argument": "quotedMessageReference", - "category": "full", - "description": "Quoted message if present" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "rid" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 4, - "name": "message" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 5, - "name": "isOnlyForUser" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageOutReference" - } - }, - "id": 6, - "name": "quotedMessageReference" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UpdateMessage", - "header": 2658, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Changing Message content", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination Peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id" - }, - { - "type": "reference", - "argument": "updatedMessage", - "category": "full", - "description": "Updated Message content" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 3, - "name": "updatedMessage" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MessageReceived", - "header": 55, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Confirmation of plain message receive by device", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": "Maximum date of received messages" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MessageRead", - "header": 57, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Marking plain messages as read", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": "Maximum date of read messages" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DeleteMessage", - "header": 98, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Deleting messages", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "rids", - "category": "full", - "description": "Message random id" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 3, - "name": "rids" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ClearChat", - "header": 99, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Clearing of conversation (without removing dialog from dialogs list)", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Conversation peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DeleteChat", - "header": 100, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Deleting of conversation (also leave group for group conversations)", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Conversation peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ArchiveChat", - "header": 2654, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Archiving chat", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Conversation peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MessageSetReaction", - "header": 210, - "response": { - "type": "reference", - "name": "ReactionsResponse" - }, - "doc": [ - "Setting Message reaction", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id" - }, - { - "type": "reference", - "argument": "code", - "category": "full", - "description": "Reaction code" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": "string", - "id": 3, - "name": "code" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MessageRemoveReaction", - "header": 220, - "response": { - "type": "reference", - "name": "ReactionsResponse" - }, - "doc": [ - "Removing Message reaction", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id" - }, - { - "type": "reference", - "argument": "code", - "category": "full", - "description": "Reaction code" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": "string", - "id": 3, - "name": "code" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "ReactionsResponse", - "header": 219, - "doc": [ - "Response for reactions change" - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageReaction" - } - }, - "id": 3, - "name": "reactions" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "Message", - "header": 55, - "doc": [ - "Update about plain message", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "senderUid", - "category": "full", - "description": " Sender of message" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " date of message" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, - { - "type": "reference", - "argument": "message", - "category": "full", - "description": " message content" - }, - { - "type": "reference", - "argument": "attributes", - "category": "full", - "description": " optional message attributes" - }, - { - "type": "reference", - "argument": "quotedMessage", - "category": "full", - "description": " optional quoted message" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "senderUid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 5, - "name": "message" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageAttributes" - } - }, - "id": 6, - "name": "attributes" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "QuotedMessage" - } - }, - "id": 7, - "name": "quotedMessage" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageContentChanged", - "header": 162, - "doc": [ - "Update about message change", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, - { - "type": "reference", - "argument": "message", - "category": "full", - "description": " Message content" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 3, - "name": "message" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageQuotedChanged", - "header": 169, - "doc": [ - "Update about quoted message changed", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, - { - "type": "reference", - "argument": "quotedMessage", - "category": "full", - "description": " Quoted Message" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "QuotedMessage" - } - }, - "id": 3, - "name": "quotedMessage" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageDateChanged", - "header": 163, - "doc": [ - "Update about message date changed", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of message" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageSent", - "header": 4, - "doc": [ - "Update about message sent", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of message" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageReceived", - "header": 54, - "doc": [ - "Update about message received", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "startDate", - "category": "full", - "description": " Start date of received message" - }, - { - "type": "reference", - "argument": "receivedDate", - "category": "full", - "description": " Date of receive" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "startDate" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "receivedDate" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageRead", - "header": 19, - "doc": [ - "Update about message read", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "startDate", - "category": "full", - "description": " Start date of read message" - }, - { - "type": "reference", - "argument": "readDate", - "category": "full", - "description": " Date of read" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "startDate" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "readDate" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageReadByMe", - "header": 50, - "doc": [ - "Update about message read by me", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "startDate", - "category": "full", - "description": " Start date of read message" - }, - { - "type": "reference", - "argument": "unreadCounter", - "category": "full", - "description": " Optional unread counter in conversation" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "startDate" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 3, - "name": "unreadCounter" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageDelete", - "header": 46, - "doc": [ - "Update about message delete", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "rids", - "category": "full", - "description": " Deleted messages" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 2, - "name": "rids" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ChatClear", - "header": 47, - "doc": [ - "Update about chat clear", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ChatDelete", - "header": 48, - "doc": [ - "Update about chat delete", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ChatArchive", - "header": 94, - "doc": [ - "Update about chat archive", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ChatDropCache", - "header": 2690, - "doc": [ - "Update about cache drop", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ChatGroupsChanged", - "header": 1, - "doc": [ - "Update about chat groups changed. Called only when adding, removing and reordering of grouped dialog.", - { - "type": "reference", - "argument": "dialogs", - "category": "compact", - "description": " New dialgos list" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogGroup" - } - }, - "id": 1, - "name": "dialogs" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ReactionsUpdate", - "header": 222, - "doc": [ - "Update about reactions change", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Message random id" - }, - { - "type": "reference", - "argument": "reactions", - "category": "full", - "description": " New Reactions" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageReaction" - } - }, - "id": 3, - "name": "reactions" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "MessageState", - "values": [ - { - "name": "Sent", - "id": 1 - }, - { - "name": "Received", - "id": 2 - }, - { - "name": "Read", - "id": 3 - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MessageContainer", - "doc": [ - "Message from history", - { - "type": "reference", - "argument": "senderUid", - "category": "full", - "description": " Sender of mesasge" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of message" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of message" - }, - { - "type": "reference", - "argument": "message", - "category": "full", - "description": " Content of message" - }, - { - "type": "reference", - "argument": "reactions", - "category": "full", - "description": " Message reactions" - }, - { - "type": "reference", - "argument": "attribute", - "category": "full", - "description": " Optional message attributes" - }, - { - "type": "reference", - "argument": "quotedMessage", - "category": "full", - "description": " Optional quoted Message" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "senderUid" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 5, - "name": "message" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "MessageState" - } - }, - "id": 6, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageReaction" - } - }, - "id": 7, - "name": "reactions" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageAttributes" - } - }, - "id": 8, - "name": "attribute" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "QuotedMessage" - } - }, - "id": 9, - "name": "quotedMessage" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "ListLoadMode", - "values": [ - { - "name": "Forward", - "id": 1 - }, - { - "name": "Backward", - "id": 2 - }, - { - "name": "Both", - "id": 3 - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadHistory", - "header": 118, - "response": { - "type": "anonymous", - "header": 119, - "doc": [ - "Loaded history", - { - "type": "reference", - "argument": "history", - "category": "compact", - "description": " Messages" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageContainer" - } - }, - "id": 1, - "name": "history" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 4, - "name": "userPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 5, - "name": "groups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 6, - "name": "groupPeers" - } - ] - }, - "doc": [ - "Loading history of chat", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer of conversation" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": "start date of messages for loading or 0 for loading from start" - }, - { - "type": "reference", - "argument": "loadMode", - "category": "full", - "description": "Loading mode: Forward loading, backward or both ways" - }, - { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "maximum amount of messages (max is 100)" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "ListLoadMode" - } - }, - "id": 5, - "name": "loadMode" - }, - { - "type": "int32", - "id": 4, - "name": "limit" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 6, - "name": "optimizations" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Dialog", - "doc": [ - "Conversation from history", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer of conversation" - }, - { - "type": "reference", - "argument": "unreadCount", - "category": "full", - "description": " plain messages unread messages count" - }, - { - "type": "reference", - "argument": "sortDate", - "category": "full", - "description": " date of conversation for sorting" - }, - { - "type": "reference", - "argument": "senderUid", - "category": "full", - "description": " Sender of top message (may be zero)" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random ID of top message (may be zero)" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of top message (can't be zero)" - }, - { - "type": "reference", - "argument": "message", - "category": "full", - "description": " Content of message" - }, - { - "type": "reference", - "argument": "firstUnreadDate", - "category": "full", - "description": " Date of first unread message" - }, - { - "type": "reference", - "argument": "attributes", - "category": "full", - "description": " Optional top message attributes" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": "int32", - "id": 3, - "name": "unreadCount" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "sortDate" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 5, - "name": "senderUid" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 6, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 7, - "name": "date" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 8, - "name": "message" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "MessageState" - } - }, - "id": 9, - "name": "state" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "date" - } - }, - "id": 10, - "name": "firstUnreadDate" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageAttributes" - } - }, - "id": 11, - "name": "attributes" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadDialogs", - "header": 104, - "response": { - "type": "anonymous", - "header": 105, - "doc": [ - "Loaded dialogs", - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Loaded groups" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - }, - { - "type": "reference", - "argument": "dialogs", - "category": "compact", - "description": " Loaded dialogs" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 1, - "name": "groups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Dialog" - } - }, - "id": 3, - "name": "dialogs" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 4, - "name": "userPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 5, - "name": "groupPeers" - } - ] - }, - "doc": [ - "Loading conversation history", - { - "type": "reference", - "argument": "minDate", - "category": "full", - "description": "start date of conversation loading. Use 0 to load latest messages" - }, - { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "limit maximum amount of messages (max is 100)" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 1, - "name": "minDate" - }, - { - "type": "int32", - "id": 2, - "name": "limit" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadArchived", - "header": 2651, - "response": { - "type": "anonymous", - "header": 2652, - "doc": [ - "Archived dialogs", - { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Referenced groups" - }, - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Referenced users" - }, - { - "type": "reference", - "argument": "dialogs", - "category": "full", - "description": " Archived dialogs" - }, - { - "type": "reference", - "argument": "nextOffset", - "category": "compact", - "description": " Offset for next bunch" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 1, - "name": "groups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Dialog" - } - }, - "id": 3, - "name": "dialogs" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 5, - "name": "userPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 6, - "name": "groupPeers" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 4, - "name": "nextOffset" - } - ] - }, - "doc": [ - "Loading archived messages", - { - "type": "reference", - "argument": "nextOffset", - "category": "compact", - "description": "Optional next offset" - }, - { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "Maximum number of elements" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 1, - "name": "nextOffset" - }, - { - "type": "int32", - "id": 2, - "name": "limit" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadGroupedDialogs", - "header": 225, - "response": { - "type": "anonymous", - "header": 226, - "doc": [ - "Loaded grouped dialogs", - { - "type": "reference", - "argument": "dialogs", - "category": "compact", - "description": " Loaded groups of dialogs" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - }, - { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Loaded groups" - }, - { - "type": "reference", - "argument": "showArchived", - "category": "full", - "description": " Show archived section" - }, - { - "type": "reference", - "argument": "showInvite", - "category": "full", - "description": " Show invite message" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogGroup" - } - }, - "id": 1, - "name": "dialogs" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "groups" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "showArchived" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 5, - "name": "showInvite" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 6, - "name": "userPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 7, - "name": "groupPeers" - } - ] - }, - "doc": [ - "Load all dialogs from grouped list" - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 1, - "name": "optimizations" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "DialogsOrder", - "header": 235, - "doc": [ - "Dialogs order response", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " update seq" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " update state" - }, - { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Update groups" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogGroup" - } - }, - "id": 3, - "name": "groups" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "HideDialog", - "header": 231, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Hide Dialog from grouped list", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Dialog peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ShowDialog", - "header": 232, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Show Dialog in grouped list" - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "FavouriteDialog", - "header": 224, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Marking dialog as favourite", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for favouriting" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnfavouriteDialog", - "header": 227, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Making dialog as unfavourite", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for favouriting" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "NotifyDialogOpened", - "header": 2785, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Notifying about dialog open", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer that was opened" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - } - ] - }, - { - "title": "Groups", - "package": "groups", - "items": [ - { - "type": "comment", - "content": "Entities" - }, - { - "type": "struct", - "content": { - "name": "Member", - "doc": [ - "Member information", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User id" - }, - { - "type": "reference", - "argument": "inviterUid", - "category": "full", - "description": " User inviter id" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Adding date" - }, - { - "type": "reference", - "argument": "isAdmin", - "category": "full", - "description": " is member admin of group" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "inviterUid" - }, - { - "type": "int64", - "id": 3, - "name": "date" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "isAdmin" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "GroupType", - "values": [ - { - "name": "GROUP", - "id": 1 - }, - { - "name": "CHANNEL", - "id": 2 - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "GroupPermissions", - "values": [ - { - "name": "SEND_MESSAGE", - "id": 1 - }, - { - "name": "CLEAR", - "id": 2 - }, - { - "name": "LEAVE", - "id": 3 - }, - { - "name": "DELETE", - "id": 4 - }, - { - "name": "JOIN", - "id": 5 - }, - { - "name": "VIEW_INFO", - "id": 6 - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "GroupFullPermissions", - "values": [ - { - "name": "EDIT_INFO", - "id": 1 - }, - { - "name": "VIEW_MEMBERS", - "id": 2 - }, - { - "name": "INVITE_MEMBERS", - "id": 3 - }, - { - "name": "INVITE_VIA_LINK", - "id": 4 - }, - { - "name": "CALL", - "id": 5 - }, - { - "name": "EDIT_ADMIN_SETTINGS", - "id": 6 - }, - { - "name": "VIEW_ADMINS", - "id": 7 - }, - { - "name": "EDIT_ADMINS", - "id": 8 - }, - { - "name": "KICK_INVITED", - "id": 9 - }, - { - "name": "KICK_ANYONE", - "id": 10 - }, - { - "name": "EDIT_FOREIGN", - "id": 11 - }, - { - "name": "DELETE_FOREIGN", - "id": 12 - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Group", - "doc": [ - "Group information", - "", - "Permissions.", - "Permissions of this structure is about group messages operation, such as", - "ability to send messages, clear chat, leave group and so on. This operations", - "Can be held outside of the Group Info page.", - "", - "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", - "If default is TRUE then ONE == FALSE.", - "Bits:", - "0 - canSendMessage. Default is FALSE.", - "1 - canClear. Default is FALSE.", - "2 - canLeave. Default is FALSE.", - "3 - canDelete. Default is FALSE.", - "4 - canJoin. Default is FALSE.", - "5 - canViewInfo. Default is FALSE.", - "", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " group id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Access hash of group" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Title of group" - }, - { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " Avatar of group" - }, - { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Number of members" - }, - { - "type": "reference", - "argument": "isHidden", - "category": "full", - "description": " Is group hidden (not showing it in recent list). Default is false." - }, - { - "type": "reference", - "argument": "isMember", - "category": "full", - "description": " Is current user a member of a group. Default is true." - }, - { - "type": "reference", - "argument": "groupType", - "category": "full", - "description": " Group Type. Used only for displaying information. Default is GROUP." - }, - { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " Permissions of group object" - }, - { - "type": "reference", - "argument": "isDeleted", - "category": "full", - "description": " Is this group deleted" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Group extension Data" - }, - { - "type": "reference", - "argument": "isAdmin", - "category": "full", - "description": " [DEPRECATED] Is current user an admin of a group" - }, - { - "type": "reference", - "argument": "theme", - "category": "hidden", - "description": " [DEPRECATED] Theme of group" - }, - { - "type": "reference", - "argument": "about", - "category": "hidden", - "description": " [DEPRECATED] About of group" - }, - { - "type": "reference", - "argument": "creatorUid", - "category": "hidden", - "description": " [DEPRECATED] Group creator" - }, - { - "type": "reference", - "argument": "members", - "category": "compact", - "description": " [DEPRECATED] Members of group" - }, - { - "type": "reference", - "argument": "createDate", - "category": "full", - "description": " [DEPRECATED] Date of creation" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": "string", - "id": 3, - "name": "title" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 4, - "name": "avatar" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 24, - "name": "membersCount" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "isMember" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 20, - "name": "isHidden" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "GroupType" - } - }, - "id": 25, - "name": "groupType" - }, - { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 26, - "name": "permissions" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 27, - "name": "isDeleted" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 22, - "name": "ext" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 16, - "name": "isAdmin", - "deprecated": "true" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 8, - "name": "creatorUid", - "deprecated": "true" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 9, - "name": "members", - "deprecated": "true" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 10, - "name": "createDate", - "deprecated": "true" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 17, - "name": "theme", - "deprecated": "true" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 18, - "name": "about", - "deprecated": "true" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "GroupFull", - "doc": [ - "Goup Full information", - "Permissions.", - "Idea of Group Full mermissions is about Group Info pages. This permissions", - "are usefull only when trying to view and update group settings and not related", - "to chat messages itself.", - "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", - "If default is TRUE then ONE == FALSE.", - "Bits:", - "0 - canEditInfo. Default is FALSE.", - "1 - canViewMembers. Default is FALSE.", - "2 - canInviteMembers. Default is FALSE.", - "3 - canInviteViaLink. Default is FALSE.", - "4 - canCall. Default is FALSE.", - "5 - canEditAdminSettings. Default is FALSE.", - "6 - canViewAdmins. Default is FALSE.", - "7 - canEditAdmins. Default is FALSE.", - "8 - canKickInvited. Default is FALSE.", - "9 - canKickAnyone. Default is FALSE.", - "10 - canEditForeign. Default is FALSE.", - "11 - canDeleteForeign. Default is FALSE.", - "", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "createDate", - "category": "full", - "description": " Date created" - }, - { - "type": "reference", - "argument": "ownerUid", - "category": "full", - "description": " Optional group owner" - }, - { - "type": "reference", - "argument": "members", - "category": "full", - "description": " Group members. Can be empty when isAsyncMembers enabled." - }, - { - "type": "reference", - "argument": "theme", - "category": "full", - "description": " Group Theme" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " Group about" - }, - { - "type": "reference", - "argument": "isAsyncMembers", - "category": "full", - "description": " Is Members need to be loaded asynchronous. Default is false." - }, - { - "type": "reference", - "argument": "isSharedHistory", - "category": "full", - "description": " Is history shared among all users. Default is false." - }, - { - "type": "reference", - "argument": "shortName", - "category": "full", - "description": " Group's short name" - }, - { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " Group Permissions" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "createDate" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 5, - "name": "ownerUid" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 12, - "name": "members" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "theme" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "about" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 7, - "name": "ext" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 11, - "name": "isAsyncMembers" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 10, - "name": "isSharedHistory" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 14, - "name": "shortName" - }, - { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 27, - "name": "permissions" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadFullGroups", - "header": 2782, - "response": { - "type": "anonymous", - "header": 2783, - "doc": [ - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups to load" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupFull" - } - }, - "id": 1, - "name": "groups" - } - ] - }, - "doc": [ - "Loading Full Groups", - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups to load" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 1, - "name": "groups" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadMembers", - "header": 2786, - "response": { - "type": "anonymous", - "header": 2787, - "doc": [ - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Group members" - }, - { - "type": "reference", - "argument": "next", - "category": "full", - "description": " Load more reference" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 3, - "name": "members" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "next" - } - ] - }, - "doc": [ - "Loading group members", - { - "type": "reference", - "argument": "group", - "category": "full", - "description": "Group peer" - }, - { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "Limit members" - }, - { - "type": "reference", - "argument": "next", - "category": "full", - "description": "Load more reference" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "group" - }, - { - "type": "int32", - "id": 2, - "name": "limit" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 3, - "name": "next" - } - ] - } - }, - { - "type": "comment", - "content": "Update" - }, - { - "type": "update", - "content": { - "name": "GroupTitleChanged", - "header": 2609, - "doc": [ - "Update about title changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Group Title" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "string", - "id": 2, - "name": "title" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupAvatarChanged", - "header": 2610, - "doc": [ - "Update about avatar changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "avatar", - "category": "full", - "description": " Group Avatar" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 2, - "name": "avatar" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupTopicChanged", - "header": 2616, - "doc": [ - "Update about topic changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "topic", - "category": "full", - "description": " Updated topic" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "topic" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupAboutChanged", - "header": 2617, - "doc": [ - "Update about about changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " Updated about" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "about" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupExtChanged", - "header": 2613, - "doc": [ - "Update about ext changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Updated ext" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 2, - "name": "ext" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupFullExtChanged", - "header": 2618, - "doc": [ - "Update about full ext changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Updated ext" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 2, - "name": "ext" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupShortNameChanged", - "header": 2628, - "doc": [ - "Group's short name changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "shortName", - "category": "full", - "description": " Group short name" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "shortName" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupOwnerChanged", - "header": 2619, - "doc": [ - "Update about owner changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " New Owner" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "userId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupHistoryShared", - "header": 2620, - "doc": [ - "Update about history shared", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupDeleted", - "header": 2658, - "doc": [ - "Update about group deleted", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupPermissionsChanged", - "header": 2663, - "doc": [ - "Update about group permissions changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " New Permissions" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "int64", - "id": 2, - "name": "permissions" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupFullPermissionsChanged", - "header": 2664, - "doc": [ - "Update about Full Group permissions changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " New Permissions" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "int64", - "id": 2, - "name": "permissions" - } - ] - } - }, - { - "type": "comment", - "content": " " - }, - { - "type": "update", - "content": { - "name": "GroupMemberChanged", - "header": 2612, - "doc": [ - "Update about membership changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "isMember", - "category": "full", - "description": " Is current user a member" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "bool", - "id": 2, - "name": "isMember" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupMembersBecameAsync", - "header": 2615, - "doc": [ - "Update about members became async", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupMembersUpdated", - "header": 2614, - "doc": [ - "Update about members updated", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "members", - "category": "full", - "description": " Group Members" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 2, - "name": "members" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupMemberDiff", - "header": 2623, - "doc": [ - "Update about members changed", - { - "type": "reference", - "argument": "removedUsers", - "category": "full", - "description": " Removed Users" - }, - { - "type": "reference", - "argument": "addedMembers", - "category": "full", - "description": " Added members" - }, - { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Current Members count" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "removedUsers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 3, - "name": "addedMembers" - }, - { - "type": "int32", - "id": 4, - "name": "membersCount" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupMembersCountChanged", - "header": 2622, - "doc": [ - "Update about members count changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Members count" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "int32", - "id": 2, - "name": "membersCount" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupMemberAdminChanged", - "header": 2627, - "doc": [ - "Update about member admin changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " User Id" - }, - { - "type": "reference", - "argument": "isAdmin", - "category": "full", - "description": " Is Admin flag" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "userId" - }, - { - "type": "bool", - "id": 3, - "name": "isAdmin" - } - ] - } - }, - { - "type": "comment", - "content": "Actions" - }, - { - "type": "rpc", - "content": { - "name": "CreateGroup", - "header": 230, - "response": { - "type": "anonymous", - "header": 216, - "doc": [ - "Created group", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Update Seq" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Update state" - }, - { - "type": "reference", - "argument": "group", - "category": "full", - "description": " Created group" - }, - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Referenced users" - }, - { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Referenced users" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Group creation date" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "date" - }, - { - "type": { - "type": "struct", - "childType": "Group" - }, - "id": 3, - "name": "group" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 4, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 5, - "name": "userPeers" - } - ] - }, - "doc": [ - "Creating group chat", - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id for avoiding double create" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": "Group Title" - }, - { - "type": "reference", - "argument": "users", - "category": "hidden", - "description": "Members of group" - }, - { - "type": "reference", - "argument": "groupType", - "category": "full", - "description": "Group Type" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "rid" - }, - { - "type": "string", - "id": 2, - "name": "title" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "users" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "GroupType" - } - }, - "id": 6, - "name": "groupType" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 7, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditGroupTitle", - "header": 85, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Changing group title", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": "new group title" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": "string", - "id": 3, - "name": "title" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditGroupAvatar", - "header": 86, - "response": { - "type": "anonymous", - "header": 115, - "doc": [ - "Updated group avatar", - { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " Changed avatar" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Avatar change date" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Avatar" - }, - "id": 1, - "name": "avatar" - }, - { - "type": "int32", - "id": 2, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - }, - "doc": [ - "Changing group avatar", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "fileLocation", - "category": "compact", - "description": "uploaded file for avatar" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 3, - "name": "fileLocation" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RemoveGroupAvatar", - "header": 101, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Removing group avatar", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditGroupShortName", - "header": 2793, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Edit Group Short Name", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "shortName", - "category": "full", - "description": "New group's short name" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "shortName" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditGroupTopic", - "header": 211, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Edit group topic", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random id of operation" - }, - { - "type": "reference", - "argument": "topic", - "category": "full", - "description": "New Topic" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "topic" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 4, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditGroupAbout", - "header": 213, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Edit Group About", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random id of operation" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": "New About" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "about" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "InviteUser", - "header": 69, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Inviting user to group", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "user", - "category": "full", - "description": "Users for invitation" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 3, - "name": "user" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LeaveGroup", - "header": 70, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Leaving group", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LeaveAndDelete", - "header": 2721, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Leave group and Delete Chat", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "KickUser", - "header": 71, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Kicking user from group", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "user", - "category": "full", - "description": "users for removing" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 3, - "name": "user" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "JoinGroupByPeer", - "header": 2722, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Join group by peer", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "comment", - "content": "Administration" - }, - { - "type": "rpc", - "content": { - "name": "MakeUserAdmin", - "header": 2784, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Make user admin", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "userPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DismissUserAdmin", - "header": 2791, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Dismissing user admin", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "userPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "TransferOwnership", - "header": 2789, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Transfer ownership of group", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "newOwner", - "category": "full", - "description": "New group's owner" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "newOwner" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "AdminSettings", - "doc": [ - "Admin Settings", - { - "type": "reference", - "argument": "showAdminsToMembers", - "category": "full", - "description": " Show admins in member list" - }, - { - "type": "reference", - "argument": "canMembersInvite", - "category": "full", - "description": " Can members of a group invite people" - }, - { - "type": "reference", - "argument": "canMembersEditGroupInfo", - "category": "full", - "description": " Can members edit group info" - }, - { - "type": "reference", - "argument": "canAdminsEditGroupInfo", - "category": "full", - "description": " Can admins edit group info" - }, - { - "type": "reference", - "argument": "showJoinLeaveMessages", - "category": "full", - "description": " Should join and leave messages be visible to members" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "bool", - "id": 1, - "name": "showAdminsToMembers" - }, - { - "type": "bool", - "id": 2, - "name": "canMembersInvite" - }, - { - "type": "bool", - "id": 3, - "name": "canMembersEditGroupInfo" - }, - { - "type": "bool", - "id": 4, - "name": "canAdminsEditGroupInfo" - }, - { - "type": "bool", - "id": 5, - "name": "showJoinLeaveMessages" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadAdminSettings", - "header": 2790, - "response": { - "type": "anonymous", - "header": 2794, - "doc": [ - "Loaded settings", - { - "type": "reference", - "argument": "settings", - "category": "full", - "description": " Current group admin settings" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "AdminSettings" - }, - "id": 1, - "name": "settings" - } - ] - }, - "doc": [ - "Loading administration settings", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SaveAdminSettings", - "header": 2792, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Save administartion settings", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's Peer" - }, - { - "type": "reference", - "argument": "settings", - "category": "full", - "description": "Group's settings" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "struct", - "childType": "AdminSettings" - }, - "id": 2, - "name": "settings" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DeleteGroup", - "header": 2795, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Delete Group", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ShareHistory", - "header": 2796, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Share History", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "comment", - "content": "Invite" - }, - { - "type": "response", - "content": { - "name": "InviteUrl", - "header": 178, - "doc": [ - "Response for invite url methods" - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "url" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetGroupInviteUrl", - "header": 177, - "response": { - "type": "reference", - "name": "InviteUrl" - }, - "doc": [ - "Building invite url", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Destination group peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RevokeInviteUrl", - "header": 179, - "response": { - "type": "reference", - "name": "InviteUrl" - }, - "doc": [ - "Revoking invite urls", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Destination group peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "JoinGroup", - "header": 180, - "response": { - "type": "anonymous", - "header": 181, - "doc": [ - { - "type": "reference", - "argument": "group", - "category": "hidden", - "description": " Joined group" - }, - { - "type": "reference", - "argument": "users", - "category": "hidden", - "description": " Users from members" - }, - { - "type": "reference", - "argument": "userPeers", - "category": "hidden", - "description": " User Peers" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random id" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, - { - "type": "reference", - "argument": "state", - "category": "hidden", - "description": " State" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of join" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Group" - }, - "id": 1, - "name": "group" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 5, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 7, - "name": "userPeers" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 6, - "name": "rid" - }, - { - "type": "int32", - "id": 2, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - }, - "doc": [ - "Join group method", - { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Url or Token for joining to group" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "hidden", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - } - ] - } - }, - { - "type": "comment", - "content": "Obsolete Actions" - }, - { - "type": "rpc", - "content": { - "name": "CreateGroupObsolete", - "header": 65, - "response": { - "type": "anonymous", - "header": 66, - "doc": [ - "Created group", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": " Peer of created group" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Members of created group" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Group creation date" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": "int32", - "id": 3, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 4, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": "int32" - }, - "id": 5, - "name": "users" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "date" - } - ] - }, - "doc": [ - "[OBSOLETE] Creating group chat", - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id for avoiding double create" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": "Title of new group" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Members of new group" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "rid" - }, - { - "type": "string", - "id": 2, - "name": "title" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "users" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EnterGroupObsolete", - "header": 199, - "response": { - "type": "anonymous", - "header": 200, - "doc": [ - "Joined group", - { - "type": "reference", - "argument": "group", - "category": "full", - "description": " Joined group" - }, - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Referenced users" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of join message" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Seq of Update" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of Update" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of update" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Group" - }, - "id": 1, - "name": "group" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "rid" - }, - { - "type": "int32", - "id": 4, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 5, - "name": "state" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "date" - } - ] - }, - "doc": [ - "[OBSOLETE] Join random group by peer id", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Public group peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MakeUserAdminObsolete", - "header": 214, - "response": { - "type": "anonymous", - "header": 215, - "doc": [ - { - "type": "reference", - "argument": "members", - "category": "full", - "description": " new members" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 1, - "name": "members" - }, - { - "type": "int32", - "id": 2, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - } - ] - }, - "doc": [ - "[OBSOLETE] Make user admin", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "userPeer" - } - ] - } - }, - { - "type": "comment", - "content": "Obsolete Updates" - }, - { - "type": "update", - "content": { - "name": "GroupInviteObsolete", - "header": 36, - "doc": [ - "Update about inviting current user to group", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "inviteUid", - "category": "full", - "description": " Inviter UID. If equals to current uid than group created by user." - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of creating" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 9, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 5, - "name": "inviteUid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 8, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupUserInvitedObsolete", - "header": 21, - "doc": [ - "Update about inviting user to group", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Added user ID" - }, - { - "type": "reference", - "argument": "inviterUid", - "category": "full", - "description": " Inviter user ID" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of adding user to group" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "inviterUid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupUserLeaveObsolete", - "header": 23, - "doc": [ - "Update about leaving user", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's ID" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of user leave" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupUserKickObsolete", - "header": 24, - "doc": [ - "Update about kicking user", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Kicked user's ID" - }, - { - "type": "reference", - "argument": "kickerUid", - "category": "full", - "description": " Kicker user's ID" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of user kick" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "kickerUid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupMembersUpdateObsolete", - "header": 44, - "doc": [ - "Silent group members update", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "members", - "category": "full", - "description": " New members list" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 2, - "name": "members" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupTitleChangedObsolete", - "header": 38, - "doc": [ - "Update about group title change", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Changer UID" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " New Title of group" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of title change" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": "string", - "id": 3, - "name": "title" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupTopicChangedObsolete", - "header": 213, - "doc": [ - "Update about group topic change", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Changer UID" - }, - { - "type": "reference", - "argument": "topic", - "category": "full", - "description": " New topic of group" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of theme change" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Randomd Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "topic" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 5, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupAboutChangedObsolete", - "header": 214, - "doc": [ - "Update about group about change", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " Group about" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "about" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupAvatarChangedObsolete", - "header": 39, - "doc": [ - "Update about group avatar change", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Avatar changer uid" - }, - { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " New Avatar. If null then avatar is removed" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of avatar change" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 3, - "name": "avatar" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - } - } - ] - }, - { - "title": "Stickers", - "package": "stickers", - "doc": [ - "Stickers support in Actor" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "StickerDescriptor", - "doc": [ - "Descriptor of a Sticker", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Sticker unique id" - }, - { - "type": "reference", - "argument": "emoji", - "category": "full", - "description": " Emoji code for sticker" - }, - { - "type": "reference", - "argument": "image128", - "category": "full", - "description": " Image of sticker 128x128 in WebP format" - }, - { - "type": "reference", - "argument": "image512", - "category": "full", - "description": " Image of sticker 512x512 in WebP format" - }, - { - "type": "reference", - "argument": "image256", - "category": "full", - "description": " Image of sticker 256x256 in WebP format" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "emoji" - }, - { - "type": { - "type": "struct", - "childType": "ImageLocation" - }, - "id": 3, - "name": "image128" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 4, - "name": "image512" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 5, - "name": "image256" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "StickerCollection", - "doc": [ - "Sticker collection", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Unique id of a collection" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": " Access Hash of a collection" - }, - { - "type": "reference", - "argument": "stickers", - "category": "compact", - "description": " Sticker list" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerDescriptor" - } - }, - "id": 3, - "name": "stickers" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "StickersReponse", - "header": 240, - "doc": [ - "Stickers response", - { - "type": "reference", - "argument": "collections", - "category": "full", - "description": " Sticker collections" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Seq of update" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of update" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "collections" - }, - { - "type": "int32", - "id": 2, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadOwnStickers", - "header": 238, - "response": { - "type": "anonymous", - "header": 239, - "doc": [ - "Own Stickers collections", - { - "type": "reference", - "argument": "ownStickers", - "category": "hidden", - "description": " Own sticker collections" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "ownStickers" - } - ] - }, - "doc": [ - "Loading own stickers" - ], - "attributes": [] - } - }, - { - "type": "update", - "content": { - "name": "OwnStickersChanged", - "header": 161, - "doc": [ - "Own Stickers changed", - { - "type": "reference", - "argument": "collections", - "category": "compact", - "description": " New own sticker collections" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "collections" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "StickerCollectionsChanged", - "header": 164, - "doc": [ - "Sticker collection changed", - { - "type": "reference", - "argument": "collections", - "category": "full", - "description": " Updated sticker collections" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "collections" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "AddStickerCollection", - "header": 244, - "response": { - "type": "reference", - "name": "StickersReponse" - }, - "doc": [ - "Adding sticker collection", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Collection id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": "Collection access hash" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RemoveStickerCollection", - "header": 245, - "response": { - "type": "reference", - "name": "StickersReponse" - }, - "doc": [ - "Removing sticker collection", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Collection id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": "Collection access hash" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadStickerCollection", - "header": 246, - "response": { - "type": "anonymous", - "header": 247, - "doc": [ - "Loaded collection", - { - "type": "reference", - "argument": "collection", - "category": "full", - "description": " Collection of stickers" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "StickerCollection" - }, - "id": 1, - "name": "collection" - } - ] - }, - "doc": [ - "Loading stickers", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Collection id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": "Collection access hash" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - } - ] - }, - { - "title": "Search", - "package": "search", - "doc": [ - "Searching API" - ], - "items": [ - { - "type": "enum", - "content": { - "name": "SearchPeerType", - "values": [ - { - "name": "Groups", - "id": 1 - }, - { - "name": "Contacts", - "id": 2 - }, - { - "name": "Public", - "id": 3 - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "SearchContentType", - "values": [ - { - "name": "Any", - "id": 1 - }, - { - "name": "Text", - "id": 2 - }, - { - "name": "Links", - "id": 3 - }, - { - "name": "Documents", - "id": 4 - }, - { - "name": "Photos", - "id": 5 - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "SearchCondition", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "SearchPeerTypeCondition", - "doc": [ - "Search peer type condition", - { - "type": "reference", - "argument": "peerType", - "category": "full", - "description": " Peer type for searching" - } - ], - "trait": { - "name": "SearchCondition", - "key": 1 - }, - "attributes": [ - { - "type": { - "type": "enum", - "childType": "SearchPeerType" - }, - "id": 1, - "name": "peerType" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "SearchPieceText", - "doc": [ - "Search peer name condition", - { - "type": "reference", - "argument": "query", - "category": "full", - "description": " Search query" - } - ], - "trait": { - "name": "SearchCondition", - "key": 2 - }, - "attributes": [ - { - "type": "string", - "id": 1, - "name": "query" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "SearchAndCondition", - "doc": [ - "Search AND condion", - { - "type": "reference", - "argument": "andQuery", - "category": "full", - "description": " And Query" - } - ], - "trait": { - "name": "SearchCondition", - "key": 3 - }, - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "SearchCondition" - } - }, - "id": 1, - "name": "andQuery" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "SearchOrCondition", - "doc": [ - "Search OR condition", - { - "type": "reference", - "argument": "orQuery", - "category": "full", - "description": " Or Query" - } - ], - "trait": { - "name": "SearchCondition", - "key": 4 - }, - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "SearchCondition" - } - }, - "id": 2, - "name": "orQuery" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "SearchPeerCondition", - "doc": [ - "Serch Peer condition", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer condition" - } - ], - "trait": { - "name": "SearchCondition", - "key": 5 - }, - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "SearchPeerContentType", - "doc": [ - "Search content type condition", - { - "type": "reference", - "argument": "contentType", - "category": "full", - "description": " Content Type" - } - ], - "trait": { - "name": "SearchCondition", - "key": 6 - }, - "attributes": [ - { - "type": { - "type": "enum", - "childType": "SearchContentType" - }, - "id": 1, - "name": "contentType" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "SearchSenderIdConfition", - "doc": [ - "Searching sender uid condition", - { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " sender UID" - } - ], - "trait": { - "name": "SearchCondition", - "key": 7 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "senderId" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "PeerSearchResult", - "doc": [ - "Peer search result", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer information" - }, - { - "type": "reference", - "argument": "optMatchString", - "category": "full", - "description": " Description" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "optMatchString" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "PeerSearch", - "header": 233, - "response": { - "type": "anonymous", - "header": 234, - "doc": [ - "Found peers", - { - "type": "reference", - "argument": "searchResults", - "category": "full", - "description": " Search Results" - }, - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Related users" - }, - { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Related groups" - }, - { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Related user peers" - }, - { - "type": "reference", - "argument": "groupPeers", - "category": "full", - "description": " Related group peers" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "PeerSearchResult" - } - }, - "id": 1, - "name": "searchResults" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "groups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 4, - "name": "userPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 5, - "name": "groupPeers" - } - ] - }, - "doc": [ - "Performing peer search", - { - "type": "reference", - "argument": "query", - "category": "full", - "description": "Search query. Warring not all combinations can be processed by server. (acts as OR)" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "SearchCondition" - } - }, - "id": 1, - "name": "query" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MessageSearchResult", - "doc": [ - "Message container", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Message Peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Message Random Id" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Message Date" - }, - { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " Message sender UID" - }, - { - "type": "reference", - "argument": "content", - "category": "full", - "description": " Message content" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 4, - "name": "senderId" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 5, - "name": "content" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MessageSearchItem", - "doc": [ - "Message Search result container" - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "MessageSearchResult" - }, - "id": 1, - "name": "result" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "MessageSearchResponse", - "header": 218, - "doc": [ - "Search Result", - { - "type": "reference", - "argument": "searchResults", - "category": "full", - "description": " Search results" - }, - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Search users" - }, - { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Search groups" - }, - { - "type": "reference", - "argument": "loadMoreState", - "category": "hidden", - "description": " State for loading more results" - }, - { - "type": "reference", - "argument": "userOutPeers", - "category": "full", - "description": " Search user peers" - }, - { - "type": "reference", - "argument": "groupOutPeers", - "category": "full", - "description": " Search group peers" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageSearchItem" - } - }, - "id": 1, - "name": "searchResults" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "groups" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 4, - "name": "loadMoreState" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 5, - "name": "userOutPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 6, - "name": "groupOutPeers" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MessageSearch", - "header": 217, - "response": { - "type": "reference", - "name": "MessageSearchResponse" - }, - "doc": [ - "Performing message search", - { - "type": "reference", - "argument": "query", - "category": "full", - "description": "Search query" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "trait", - "childType": "SearchCondition" - }, - "id": 1, - "name": "query" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MessageSearchMore", - "header": 222, - "response": { - "type": "reference", - "name": "MessageSearchResponse" - }, - "doc": [ - "Performing message search paging", - { - "type": "reference", - "argument": "loadMoreState", - "category": "hidden", - "description": "State for loading more results" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": "bytes", - "id": 1, - "name": "loadMoreState" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - } - ] - } - } - ] - }, - { - "title": "Public Groups", - "package": "pubgroups", - "doc": [ - "Public group is easy way to find communities" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "PublicGroup", - "doc": [ - "Public Group description", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Group id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Group Access hash" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Group title" - }, - { - "type": "reference", - "argument": "avatar", - "category": "full", - "description": " Group avatar" - }, - { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Members count in group" - }, - { - "type": "reference", - "argument": "friendsCount", - "category": "full", - "description": " Friends count int group" - }, - { - "type": "reference", - "argument": "description", - "category": "full", - "description": " Description of group" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": "string", - "id": 3, - "name": "title" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 7, - "name": "avatar" - }, - { - "type": "int32", - "id": 4, - "name": "membersCount" - }, - { - "type": "int32", - "id": 5, - "name": "friendsCount" - }, - { - "type": "string", - "id": 6, - "name": "description" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetPublicGroups", - "header": 201, - "response": { - "type": "anonymous", - "header": 202, - "doc": [ - "Loaded public groups", - { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " All available groups" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "PublicGroup" - } - }, - "id": 1, - "name": "groups" - } - ] - }, - "doc": [ - "Getting public groups" - ], - "attributes": [] - } - } - ] - }, - { - "title": "Invites", - "package": "invites", - "doc": [ - "Invite mechanizm" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "InviteState", - "doc": [ - "Invite state", - { - "type": "reference", - "argument": "email", - "category": "full", - "description": " Email of invite" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " Name of invited user" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Uid of registered user" - }, - { - "type": "reference", - "argument": "tid", - "category": "full", - "description": " Team id of invite" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "email" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 3, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 4, - "name": "tid" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "InviteList", - "header": 2564, - "doc": [ - "Intites list", - { - "type": "reference", - "argument": "invites", - "category": "full", - "description": " Intvites" - }, - { - "type": "reference", - "argument": "relatedUsers", - "category": "full", - "description": " Related users in invites" - }, - { - "type": "reference", - "argument": "relatedGroups", - "category": "full", - "description": " Related groups in invites" - }, - { - "type": "reference", - "argument": "relatedTeams", - "category": "full", - "description": " Related teams in invites" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "InviteState" - } - }, - "id": 1, - "name": "invites" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "relatedUsers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "relatedGroups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Team" - } - }, - "id": 4, - "name": "relatedTeams" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadOwnSentInvites", - "header": 2563, - "response": { - "type": "reference", - "name": "InviteList" - }, - "doc": [ - "Loading current invite states" - ], - "attributes": [] - } - }, - { - "type": "rpc", - "content": { - "name": "SendInvite", - "header": 2565, - "response": { - "type": "reference", - "name": "InviteList" - }, - "doc": [ - "Sending an email invite", - { - "type": "reference", - "argument": "email", - "category": "full", - "description": "Email for invite" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": "Optional name for invite" - }, - { - "type": "reference", - "argument": "destTeam", - "category": "full", - "description": "Optional team for invite" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "email" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "OutTeam" - } - }, - "id": 3, - "name": "destTeam" - } - ] - } - } - ] - }, - { - "title": "Teams", - "package": "teams", - "doc": [ - "Teams support for Actor" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "Team", - "doc": [ - "Team entity", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Team Id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Team Access Hash" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " Team name" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": "string", - "id": 3, - "name": "name" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "OutTeam", - "doc": [ - "Reference to a team", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Team Id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": " Team access hash" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "TeamsList", - "header": 2562, - "doc": [ - "Teams response", - { - "type": "reference", - "argument": "teams", - "category": "hidden", - "description": " Teams list" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Team" - } - }, - "id": 1, - "name": "teams" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadOwnTeams", - "header": 2561, - "response": { - "type": "reference", - "name": "TeamsList" - }, - "doc": [ - "Loading own teams" - ], - "attributes": [] - } - }, - { - "type": "update", - "content": { - "name": "OwnTeamsChanged", - "header": 165, - "doc": [ - "Update about own teams changed", - { - "type": "reference", - "argument": "ownTeams", - "category": "full", - "description": " Updated own teams list" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Team" - } - }, - "id": 1, - "name": "ownTeams" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "CreateTeam", - "header": 2566, - "response": { - "type": "anonymous", - "header": 2567, - "doc": [ - "Created team response", - { - "type": "reference", - "argument": "createdTeam", - "category": "full", - "description": " Created Team" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Team" - }, - "id": 1, - "name": "createdTeam" - } - ] - }, - "doc": [ - "Creation of a Team", - { - "type": "reference", - "argument": "title", - "category": "full", - "description": "Title of a team" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "title" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "InviteToTeam", - "header": 2568, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Inviting people to team", - { - "type": "reference", - "argument": "user", - "category": "full", - "description": "Dest user" - }, - { - "type": "reference", - "argument": "destTeam", - "category": "full", - "description": "Dest team" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "user" - }, - { - "type": { - "type": "struct", - "childType": "OutTeam" - }, - "id": 3, - "name": "destTeam" - } - ] - } - } - ] - }, - { - "title": "Integrations", - "package": "integrations", - "doc": [ - "Package contains methods for providing integration" - ], - "items": [ - { - "type": "response", - "content": { - "name": "IntegrationToken", - "header": 183, - "doc": [ - "Group token response", - { - "type": "reference", - "argument": "token", - "category": "danger", - "description": " current group token" - }, - { - "type": "reference", - "argument": "url", - "category": "danger", - "description": " current group url" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - }, - { - "type": "string", - "id": 2, - "name": "url" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetIntegrationToken", - "header": 182, - "response": { - "type": "reference", - "name": "IntegrationToken" - }, - "doc": [ - "Getting current group token", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RevokeIntegrationToken", - "header": 184, - "response": { - "type": "reference", - "name": "IntegrationToken" - }, - "doc": [ - "Revoke group token", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - } - ] - }, - { - "title": "Typing and Online", - "package": "weak", - "items": [ - { - "type": "enum", - "content": { - "name": "TypingType", - "values": [ - { - "name": "Text", - "id": 0 - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "Typing", - "header": 27, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Sending typing notification", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "typingType", - "category": "full", - "description": "typing type." - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 3, - "name": "typingType" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "StopTyping", - "header": 30, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Stop typing", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "typingType", - "category": "full", - "description": "typing type" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 2, - "name": "typingType" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "DeviceType", - "values": [ - { - "name": "GENERIC", - "id": 1 - }, - { - "name": "PC", - "id": 2 - }, - { - "name": "MOBILE", - "id": 3 - }, - { - "name": "TABLET", - "id": 4 - }, - { - "name": "WATCH", - "id": 5 - }, - { - "name": "MIRROR", - "id": 6 - }, - { - "name": "CAR", - "id": 7 - }, - { - "name": "TABLE", - "id": 8 - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SetOnline", - "header": 29, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Sending online state", - { - "type": "reference", - "argument": "isOnline", - "category": "full", - "description": "is user online" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "timeout of online state in milliseconds" - }, - { - "type": "reference", - "argument": "deviceType", - "category": "full", - "description": "Optional device type" - }, - { - "type": "reference", - "argument": "deviceCategory", - "category": "full", - "description": "Optional device category, for example android or ios" - } - ], - "attributes": [ - { - "type": "bool", - "id": 1, - "name": "isOnline" - }, - { - "type": { - "type": "alias", - "childType": "msec" - }, - "id": 2, - "name": "timeout" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 3, - "name": "deviceType" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "deviceCategory" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "PauseNotifications", - "header": 166, - "doc": [ - "Update about pausing notifications", - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout for notifications resume" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 1, - "name": "timeout" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "RestoreNotifications", - "header": 167, - "doc": [ - "Update about restoring notifications" - ], - "attributes": [] - } - }, - { - "type": "rpc", - "content": { - "name": "PauseNotifications", - "header": 2641, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Pause notifications", - { - "type": "reference", - "argument": "timeout", - "category": "hidden", - "description": "Timeout of pause" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 1, - "name": "timeout" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RestoreNotifications", - "header": 2642, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Restoring notifications" - ], - "attributes": [] - } - }, - { - "type": "empty" - }, - { - "type": "update", - "content": { - "name": "Typing", - "header": 6, - "doc": [ - "Update about user's typing", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Conversation peer" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "typingType", - "category": "full", - "description": " Type of typing" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 3, - "name": "typingType" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "TypingStop", - "header": 81, - "doc": [ - "Update about user's typing stop", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Conversation peer" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "typingType", - "category": "hidden", - "description": " Type of typing" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 3, - "name": "typingType" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserOnline", - "header": 7, - "doc": [ - "Update about user became online", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 2, - "name": "deviceType" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "deviceCategory" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserOffline", - "header": 8, - "doc": [ - "Update about user became offline", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 2, - "name": "deviceType" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "deviceCategory" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserLastSeen", - "header": 9, - "doc": [ - "Update about user's last seen state", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Last seen time" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "date" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 3, - "name": "deviceType" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "deviceCategory" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupOnline", - "header": 33, - "doc": [ - "Update about group online change", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group id" - }, - { - "type": "reference", - "argument": "count", - "category": "full", - "description": " current online user's count" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "int32", - "id": 2, - "name": "count" - } - ] - } - } - ] - }, - { - "title": "Media and Files", - "package": "files", - "items": [ - { - "type": "struct", - "content": { - "name": "FileLocation", - "doc": [ - "Location of file on server", - { - "type": "reference", - "argument": "fileId", - "category": "full", - "description": " Unique Id of file" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Access hash of file" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "fileId" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ImageLocation", - "doc": [ - "Image location", - { - "type": "reference", - "argument": "fileLocation", - "category": "full", - "description": " Location of file" - }, - { - "type": "reference", - "argument": "width", - "category": "full", - "description": " Width of avatar image" - }, - { - "type": "reference", - "argument": "height", - "category": "full", - "description": " Height of avatar image" - }, - { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " Size of file" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "fileLocation" - }, - { - "type": "int32", - "id": 2, - "name": "width" - }, - { - "type": "int32", - "id": 3, - "name": "height" - }, - { - "type": "int32", - "id": 4, - "name": "fileSize" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "AvatarImage", - "doc": [ - "Avatar Image", - { - "type": "reference", - "argument": "fileLocation", - "category": "full", - "description": " Location of file" - }, - { - "type": "reference", - "argument": "width", - "category": "full", - "description": " Width of avatar image" - }, - { - "type": "reference", - "argument": "height", - "category": "full", - "description": " Height of avatar image" - }, - { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " Size of file" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "fileLocation" - }, - { - "type": "int32", - "id": 2, - "name": "width" - }, - { - "type": "int32", - "id": 3, - "name": "height" - }, - { - "type": "int32", - "id": 4, - "name": "fileSize" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Avatar", - "doc": [ - "Avatar of User or Group", - { - "type": "reference", - "argument": "smallImage", - "category": "compact", - "description": " Optional small image of avatar box in 100x100" - }, - { - "type": "reference", - "argument": "largeImage", - "category": "compact", - "description": " Optional large image of avatar box in 200x200" - }, - { - "type": "reference", - "argument": "fullImage", - "category": "compact", - "description": " Optional full screen image of avatar" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "AvatarImage" - } - }, - "id": 1, - "name": "smallImage" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "AvatarImage" - } - }, - "id": 2, - "name": "largeImage" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "AvatarImage" - } - }, - "id": 3, - "name": "fullImage" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "FastThumb", - "doc": [ - "Fast thumb of media messages. Less than 90x90 and compressed by JPEG with low quality", - { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Width of thumb" - }, - { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Height of thump" - }, - { - "type": "reference", - "argument": "thumb", - "category": "compact", - "description": " compressed image data" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "w" - }, - { - "type": "int32", - "id": 2, - "name": "h" - }, - { - "type": "bytes", - "id": 3, - "name": "thumb" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "Colors", - "values": [ - { - "name": "red", - "id": 1 - }, - { - "name": "yellow", - "id": 2 - }, - { - "name": "green", - "id": 3 - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "Color", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "RgbColor", - "doc": [ - "RGB Color", - { - "type": "reference", - "argument": "rgb", - "category": "full", - "description": " RGB color value" - } - ], - "trait": { - "name": "Color", - "key": 1 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "rgb" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "PredefinedColor", - "doc": [ - "Predefined color", - { - "type": "reference", - "argument": "color", - "category": "hidden", - "description": " Predefined color value" - } - ], - "trait": { - "name": "Color", - "key": 2 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "enum", - "childType": "Colors" - }, - "id": 1, - "name": "color" - } - ] - } - }, - { - "type": "empty" - }, - { - "type": "struct", - "content": { - "name": "HTTPHeader", - "doc": [ - "HTTP Header record", - { - "type": "reference", - "argument": "key", - "category": "full", - "description": " HTTP Header name" - }, - { - "type": "reference", - "argument": "value", - "category": "full", - "description": " HTTP Header value" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "key" - }, - { - "type": "string", - "id": 2, - "name": "value" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "FileUrlDescription", - "doc": [ - "File url description", - { - "type": "reference", - "argument": "fileId", - "category": "full", - "description": " File id of url" - }, - { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url for downloading" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout of url" - }, - { - "type": "reference", - "argument": "unsignedUrl", - "category": "hidden", - "description": " Unsigned URL (used to honor web caches)" - }, - { - "type": "reference", - "argument": "unsignedUrlHeaders", - "category": "hidden", - "description": " Headers that is required to download files with unsigned url" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "fileId" - }, - { - "type": "string", - "id": 2, - "name": "url" - }, - { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 3, - "name": "timeout" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "unsignedUrl" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "HTTPHeader" - } - }, - "id": 5, - "name": "unsignedUrlHeaders" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetFileUrl", - "header": 77, - "response": { - "type": "anonymous", - "header": 78, - "doc": [ - { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url for downloading" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout of url" - }, - { - "type": "reference", - "argument": "unsignedUrl", - "category": "full", - "description": " Unsigned URL (used to honor web caches)" - }, - { - "type": "reference", - "argument": "unsignedUrlHeaders", - "category": "full", - "description": " Headers that is required to download files with unsigned url" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "url" - }, - { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 2, - "name": "timeout" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "unsignedUrl" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "HTTPHeader" - } - }, - "id": 4, - "name": "unsignedUrlHeaders" - } - ] - }, - "doc": [ - "Requesting file URL for downloading", - { - "type": "reference", - "argument": "file", - "category": "full", - "description": "file's location" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "file" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetFileUrls", - "header": 2573, - "response": { - "type": "anonymous", - "header": 2574, - "doc": [ - { - "type": "reference", - "argument": "fileUrls", - "category": "full", - "description": " File urls" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "FileUrlDescription" - } - }, - "id": 1, - "name": "fileUrls" - } - ] - }, - "doc": [ - "Requesting multiple fle URL for downloading", - { - "type": "reference", - "argument": "files", - "category": "hidden", - "description": "File locations to load urls" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "FileLocation" - } - }, - "id": 1, - "name": "files" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetFileUrlBuilder", - "header": 2579, - "response": { - "type": "anonymous", - "header": 2580, - "doc": [ - { - "type": "reference", - "argument": "baseUrl", - "category": "full", - "description": " Base Url for files" - }, - { - "type": "reference", - "argument": "algo", - "category": "full", - "description": " Signature algorithm" - }, - { - "type": "reference", - "argument": "seed", - "category": "full", - "description": " Public-visible seed of signature" - }, - { - "type": "reference", - "argument": "signatureSecret", - "category": "full", - "description": " Signature Secret" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout of url builder" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "baseUrl" - }, - { - "type": "string", - "id": 2, - "name": "algo" - }, - { - "type": "string", - "id": 5, - "name": "seed" - }, - { - "type": "bytes", - "id": 3, - "name": "signatureSecret" - }, - { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 4, - "name": "timeout" - } - ] - }, - "doc": [ - "Get File URL Builder that allows to build file urls from client side", - { - "type": "reference", - "argument": "supportedSignatureAlgorithms", - "category": "hidden", - "description": "Supported signature algorithms by client" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 1, - "name": "supportedSignatureAlgorithms" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetFileUploadUrl", - "header": 97, - "response": { - "type": "anonymous", - "header": 121, - "doc": [ - { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url for uploading" - }, - { - "type": "reference", - "argument": "uploadKey", - "category": "compact", - "description": " Upload key for upload" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "url" - }, - { - "type": "bytes", - "id": 2, - "name": "uploadKey" - } - ] - }, - "doc": [ - "Requesting pload url", - { - "type": "reference", - "argument": "expectedSize", - "category": "full", - "description": "Expected size of uploading file. May be inaccurate. Used for size allocation optimizations." - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "expectedSize" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "CommitFileUpload", - "header": 122, - "response": { - "type": "anonymous", - "header": 138, - "doc": [ - { - "type": "reference", - "argument": "uploadedFileLocation", - "category": "hidden", - "description": " Result file location" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "uploadedFileLocation" - } - ] - }, - "doc": [ - "Comminting uploaded file to storage" - ], - "attributes": [ - { - "type": "bytes", - "id": 1, - "name": "uploadKey" - }, - { - "type": "string", - "id": 2, - "name": "fileName" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetFileUploadPartUrl", - "header": 142, - "response": { - "type": "anonymous", - "header": 141, - "doc": [ - { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Upload file part url" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "url" - } - ] - }, - "doc": [ - "Upload file part", - { - "type": "reference", - "argument": "uploadKey", - "category": "compact", - "description": "Upload Key from requestFileUploadUrl" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "partNumber" - }, - { - "type": "int32", - "id": 2, - "name": "partSize" - }, - { - "type": "bytes", - "id": 3, - "name": "uploadKey" - } - ] - } - } - ] - }, - { - "title": "Features", - "package": "features", - "doc": [ - "Enable feature discovery. Currently available features:", - "* \"call\" - private audio calls" - ], - "items": [ - { - "type": "rpc", - "content": { - "name": "EnableFeature", - "header": 2588, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Enabling feature on the device", - { - "type": "reference", - "argument": "featureName", - "category": "full", - "description": "Feature name" - }, - { - "type": "reference", - "argument": "args", - "category": "danger", - "description": "Optional arguments to a feature" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "featureName" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "args" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DisableFeature", - "header": 2589, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Disabling feature on the device", - { - "type": "reference", - "argument": "featureName", - "category": "full", - "description": "Feature name" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "featureName" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "CheckFeatureEnabled", - "header": 2590, - "response": { - "type": "reference", - "name": "Bool" - }, - "doc": [ - "Method for checking if feature is available to user" - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userOutPeer" - }, - { - "type": "string", - "id": 2, - "name": "featureName" - } - ] - } - } - ] - }, - { - "title": "EventBus", - "package": "eventbus", - "items": [ - { - "type": "rpc", - "content": { - "name": "CreateNewEventBus", - "header": 2665, - "response": { - "type": "anonymous", - "header": 2666, - "doc": [ - "Created new Event Bus", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Event Bus Id" - }, - { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Your Device Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "deviceId" - } - ] - }, - "doc": [ - "Create new Event Bus", - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Optional timeout of Event Bus" - }, - { - "type": "reference", - "argument": "isOwned", - "category": "full", - "description": "Is Event Bus owned by creator" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 1, - "name": "timeout" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isOwned" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "JoinEventBus", - "header": 2668, - "response": { - "type": "anonymous", - "header": 2669, - "doc": [ - { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Your Device Id" - }, - { - "type": "reference", - "argument": "rejoinToken", - "category": "full", - "description": " Token that can be used for rejoining event bus with same device id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "deviceId" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "rejoinToken" - } - ] - }, - "doc": [ - "Joining Event Bus", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Join timeout" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 2, - "name": "timeout" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ReJoinEventBus", - "header": 2675, - "response": { - "type": "anonymous", - "header": 2676, - "doc": [ - { - "type": "reference", - "argument": "deviceId", - "category": "hidden", - "description": " Your Device Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "deviceId" - } - ] - }, - "doc": [ - "Rejoining to event bus after session was disposed", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - }, - { - "type": "reference", - "argument": "rejoinToken", - "category": "full", - "description": "Rejoin Token" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": "bytes", - "id": 2, - "name": "rejoinToken" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "KeepAliveEventBus", - "header": 2670, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Keep Alive Event Bus", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Optional timeout for keep alive" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 2, - "name": "timeout" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DisposeEventBus", - "header": 2667, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Dispose Event Bus", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "PostToEventBus", - "header": 2671, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Event Bus Destination", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Bus Id" - }, - { - "type": "reference", - "argument": "destinations", - "category": "full", - "description": "If Empty need to broadcase message to everyone" - }, - { - "type": "reference", - "argument": "message", - "category": "hidden", - "description": "Message" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 2, - "name": "destinations" - }, - { - "type": "bytes", - "id": 3, - "name": "message" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "EventBusDeviceConnected", - "header": 2561, - "doc": [ - "Update about pubsub device connected", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " ID of Event Bus" - }, - { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " Joined User Id" - }, - { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Joined Device Unique Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "userId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "deviceId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "EventBusDeviceDisconnected", - "header": 2563, - "doc": [ - "Update about device disconnected", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " ID of Event Bus" - }, - { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " Joined User Id" - }, - { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Disconnected Device unique Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "userId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "deviceId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "EventBusMessage", - "header": 2562, - "doc": [ - "Event Bus Message", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Event Bus Id" - }, - { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " Sender of message" - }, - { - "type": "reference", - "argument": "senderDeviceId", - "category": "full", - "description": " Device Id of sender" - }, - { - "type": "reference", - "argument": "message", - "category": "hidden", - "description": " Message" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "senderId" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 3, - "name": "senderDeviceId" - }, - { - "type": "bytes", - "id": 4, - "name": "message" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "EventBusDisposed", - "header": 2564, - "doc": [ - "Event Bus dispose", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Event Bus Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - } - ] - } - } - ] - }, - { - "title": "Values", - "package": "values", - "doc": [ - "Synced Values" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "SyncedValue", - "doc": [ - "Synced Value container", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Unique Id of a value. Unique in the scope of one named value." - }, - { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Optional value" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "value" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadSyncedSet", - "header": 2679, - "response": { - "type": "anonymous", - "header": 2680, - "doc": [ - { - "type": "reference", - "argument": "values", - "category": "full", - "description": " Current set values" - }, - { - "type": "reference", - "argument": "isStrong", - "category": "full", - "description": " Is this value strong and stored in sequence. By default is true." - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "SyncedValue" - } - }, - "id": 1, - "name": "values" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isStrong" - } - ] - }, - "doc": [ - "Loading synced set", - { - "type": "reference", - "argument": "setName", - "category": "hidden", - "description": "readable name of the set" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "setName" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "SynedSetUpdated", - "header": 72, - "doc": [ - "Update about synced set update", - { - "type": "reference", - "argument": "setName", - "category": "full", - "description": " Set Name" - }, - { - "type": "reference", - "argument": "syncedValues", - "category": "full", - "description": " Current set values" - }, - { - "type": "reference", - "argument": "isStrong", - "category": "full", - "description": " Is this value strong and need to be stored on disk" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "setName" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "SyncedValue" - } - }, - "id": 2, - "name": "syncedValues" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isStrong" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "SyncedSetAddedOrUpdated", - "header": 73, - "doc": [ - "Update about added or updated values in the synced set", - { - "type": "reference", - "argument": "setName", - "category": "full", - "description": " Set Name" - }, - { - "type": "reference", - "argument": "addedOrUpdatedValues", - "category": "hidden", - "description": " Added or updated values" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "setName" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "SyncedValue" - } - }, - "id": 2, - "name": "addedOrUpdatedValues" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "SyncedSetRemoved", - "header": 74, - "doc": [ - "Update about removed items from synced set", - { - "type": "reference", - "argument": "setName", - "category": "full", - "description": " Set Name" - }, - { - "type": "reference", - "argument": "removedItems", - "category": "full", - "description": " Removed Items from the set" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "setName" - }, - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 2, - "name": "removedItems" - } - ] - } - } - ] - }, - { - "title": "WebRTC", - "package": "webrtc", - "doc": [ - "WebRTC package that enables support to audio and video calls" - ], - "items": [ - { - "type": "update", - "content": { - "name": "IncomingCall", - "header": 52, - "doc": [ - "Update about incoming call (Sent every 10 seconds)", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, - { - "type": "reference", - "argument": "attemptIndex", - "category": "full", - "description": " Optional attempt Index" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 2, - "name": "attemptIndex" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "CallHandled", - "header": 53, - "doc": [ - "Update about incoming call handled", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, - { - "type": "reference", - "argument": "attemptIndex", - "category": "full", - "description": " Optional attempt Index" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 2, - "name": "attemptIndex" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "CallUpgraded", - "header": 56, - "doc": [ - "Update about call moved to other peer", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Upgraded group id" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 2, - "name": "groupId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetCallInfo", - "header": 2600, - "response": { - "type": "anonymous", - "header": 2606, - "doc": [ - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Users" - }, - { - "type": "reference", - "argument": "eventBusId", - "category": "full", - "description": " Event Bus Id" - }, - { - "type": "reference", - "argument": "isAudioOnlyCall", - "category": "full", - "description": " Is Audio Only Call. Default is true" - }, - { - "type": "reference", - "argument": "isVideoOnlyCall", - "category": "full", - "description": " Is Video Only Call. Default is false." - }, - { - "type": "reference", - "argument": "isVideoPreferred", - "category": "full", - "description": " Is Video preferred" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 2, - "name": "groups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "users" - }, - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 4, - "name": "eventBusId" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 5, - "name": "isAudioOnlyCall" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "isVideoOnlyCall" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 7, - "name": "isVideoPreferred" - } - ] - }, - "doc": [ - "Getting Call Information", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DoCall", - "header": 2597, - "response": { - "type": "anonymous", - "header": 2598, - "doc": [ - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, - { - "type": "reference", - "argument": "eventBusId", - "category": "full", - "description": " Call Event Bus Id" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 2, - "name": "eventBusId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "deviceId" - } - ] - }, - "doc": [ - "Do Call. Right after a call client need to start sending CallInProgress", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "destination peer" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Initial timeout" - }, - { - "type": "reference", - "argument": "isAudioOnlyCall", - "category": "full", - "description": "Is Audio only call. Default is true." - }, - { - "type": "reference", - "argument": "isVideoOnlyCall", - "category": "full", - "description": "Is Video Only call. Default is false." - }, - { - "type": "reference", - "argument": "isVideoPreferred", - "category": "full", - "description": "Is Video preferred" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 2, - "name": "timeout" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isAudioOnlyCall" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "isVideoOnlyCall" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "isVideoPreferred" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UpgradeCall", - "header": 2677, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Method for upgrading a call from private call to group call", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - }, - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer for upgrading" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 2, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DoCallAgain", - "header": 2678, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Call again to user", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - }, - { - "type": "reference", - "argument": "user", - "category": "full", - "description": "User to call again" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "user" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "JoinCall", - "header": 2683, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Joining Call", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RejectCall", - "header": 2684, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Rejecting Call", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "OptimizeSDP", - "header": 2685, - "response": { - "type": "anonymous", - "header": 2686, - "doc": [ - { - "type": "reference", - "argument": "optimizedSDP", - "category": "hidden", - "description": " Optimized version of SDP" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "optimizedSDP" - } - ] - }, - "doc": [ - "Optimizing SDP", - { - "type": "reference", - "argument": "type", - "category": "full", - "description": "Type of SDP (offer or answer)" - }, - { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": "SDP value" - }, - { - "type": "reference", - "argument": "ownSettings", - "category": "full", - "description": "Own Settings" - }, - { - "type": "reference", - "argument": "theirSettings", - "category": "full", - "description": "Their Settings" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "type" - }, - { - "type": "string", - "id": 2, - "name": "sdp" - }, - { - "type": { - "type": "struct", - "childType": "PeerSettings" - }, - "id": 3, - "name": "ownSettings" - }, - { - "type": { - "type": "struct", - "childType": "PeerSettings" - }, - "id": 4, - "name": "theirSettings" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ICEServer", - "doc": [ - "ICE Server description", - { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url to server" - }, - { - "type": "reference", - "argument": "username", - "category": "full", - "description": " Optional username" - }, - { - "type": "reference", - "argument": "credential", - "category": "danger", - "description": " Optional credential" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "url" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "username" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "credential" - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "WebRTCSignaling", - "attributes": [] - } - }, - { - "type": "comment", - "content": "Advertising" - }, - { - "type": "struct", - "content": { - "name": "AdvertiseSelf", - "doc": [ - "Advertizing self to a master mode", - { - "type": "reference", - "argument": "peerSettings", - "category": "full", - "description": " Optional peer Settings" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 21 - }, - "attributes": [ - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "PeerSettings" - } - }, - "id": 1, - "name": "peerSettings" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "AdvertiseMaster", - "doc": [ - "Sent by master" - ], - "trait": { - "name": "WebRTCSignaling", - "key": 26 - }, - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ICEServer" - } - }, - "id": 1, - "name": "server" - } - ] - } - }, - { - "type": "comment", - "content": "Web RTC signaling" - }, - { - "type": "struct", - "content": { - "name": "Candidate", - "doc": [ - "Candidate signal", - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id of candidate" - }, - { - "type": "reference", - "argument": "index", - "category": "full", - "description": " Index of candidate" - }, - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Id of candidate" - }, - { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": " SDP of candidate" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 3 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "sessionId" - }, - { - "type": "int32", - "id": 2, - "name": "index" - }, - { - "type": "string", - "id": 3, - "name": "id" - }, - { - "type": "string", - "id": 4, - "name": "sdp" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Offer", - "doc": [ - "Offer signal", - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id of offer" - }, - { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": " Offer SDP" - }, - { - "type": "reference", - "argument": "ownPeerSettings", - "category": "full", - "description": " Optional Own Peer settings" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 4 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "sessionId" - }, - { - "type": "string", - "id": 2, - "name": "sdp" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "PeerSettings" - } - }, - "id": 3, - "name": "ownPeerSettings" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Answer", - "doc": [ - "Answer signal", - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id of answer" - }, - { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": " Answer SDP" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 5 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "sessionId" - }, - { - "type": "string", - "id": 2, - "name": "sdp" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MediaStreamsUpdated", - "doc": [ - "Update about media stream settings updated. Can be sent before offer/answer.", - { - "type": "reference", - "argument": "isAudioEnabled", - "category": "full", - "description": " Is Audio Enabled in current connection. True by default." - }, - { - "type": "reference", - "argument": "isVideoEnabled", - "category": "full", - "description": " Is Video Enabled in current connection. False by default." - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 28 - }, - "attributes": [ - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "isAudioEnabled" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isVideoEnabled" - } - ] - } - }, - { - "type": "comment", - "content": "Call Controlling events" - }, - { - "type": "struct", - "content": { - "name": "NeedOffer", - "doc": [ - "Notification from master that offer is required", - { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Destination Device Id" - }, - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - }, - { - "type": "reference", - "argument": "peerSettings", - "category": "full", - "description": " Optional peer settings" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 8 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "PeerSettings" - } - }, - "id": 3, - "name": "peerSettings" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "NegotinationSuccessful", - "doc": [ - "Notification about on negotiation is successful", - { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Device Id" - }, - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 24 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EnableConnection", - "doc": [ - "Notification about enabling connection to peer", - { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Device Id" - }, - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 22 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "OnRenegotiationNeeded", - "doc": [ - "Need renegotiate session. For example when streams are changed.", - { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Device Id" - }, - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 25 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "CloseSession", - "doc": [ - "Close this session and be ready to", - { - "type": "reference", - "argument": "device", - "category": "hidden", - "description": " Device Id" - }, - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id for renegotiation" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 6 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "NeedDisconnect", - "doc": [ - "Notification about requirement about required disconnection from peer", - { - "type": "reference", - "argument": "device", - "category": "hidden", - "description": " Device Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 20 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ActiveCall", - "doc": [ - "Active Calls. Used in broadcasting states of current calls.", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Call's peer" - }, - { - "type": "reference", - "argument": "callMembers", - "category": "full", - "description": " Call Members" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 2, - "name": "peer" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "CallMember" - } - }, - "id": 3, - "name": "callMembers" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "CallMemberState", - "values": [ - { - "name": "RINGING", - "id": 1 - }, - { - "name": "RINGING_REACHED", - "id": 4 - }, - { - "name": "CONNECTING", - "id": 2 - }, - { - "name": "CONNECTED", - "id": 3 - }, - { - "name": "ENDED", - "id": 5 - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "CallMemberStateHolder", - "doc": [ - "Call Member state holder", - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State Value" - }, - { - "type": "reference", - "argument": "fallbackIsRinging", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, - { - "type": "reference", - "argument": "fallbackIsConnected", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, - { - "type": "reference", - "argument": "fallbackIsConnecting", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, - { - "type": "reference", - "argument": "fallbackIsRingingReached", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, - { - "type": "reference", - "argument": "fallbackIsEnded", - "category": "full", - "description": " Fallback flag for future compatibility of state" - } - ], - "attributes": [ - { - "type": { - "type": "enum", - "childType": "CallMemberState" - }, - "id": 1, - "name": "state" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "fallbackIsRinging" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "fallbackIsConnected" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "fallbackIsConnecting" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 5, - "name": "fallbackIsRingingReached" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "fallbackIsEnded" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "CallMember", - "doc": [ - "Call Member", - { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " Member User Id" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of member" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "userId" - }, - { - "type": { - "type": "struct", - "childType": "CallMemberStateHolder" - }, - "id": 3, - "name": "state" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "PeerSettings", - "doc": [ - "Peer Settings", - { - "type": "reference", - "argument": "is3DESSupported", - "category": "full", - "description": " Marking if 3DES supported. Default is false." - }, - { - "type": "reference", - "argument": "isMobile", - "category": "full", - "description": " Is Peer a mobile phone. Default is false." - }, - { - "type": "reference", - "argument": "canBeAudioRelay", - "category": "full", - "description": " If peer can audio relay. Default is false." - }, - { - "type": "reference", - "argument": "canPreConnect", - "category": "full", - "description": " If peer can preconnect before answer" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "is3DESSupported" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isMobile" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "canBeAudioRelay" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "canPreConnect" - } - ] - } - } - ] - }, - { - "title": "Config sync", - "package": "configs", - "doc": [ - "Parameter Syncronization across devices. Can be used for simple sync", - "across devices without rewriting server side code." - ], - "items": [ - { - "type": "struct", - "content": { - "name": "Parameter", - "doc": [ - "Syncing Parameter", - { - "type": "reference", - "argument": "key", - "category": "full", - "description": " Key of parameter" - }, - { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Value of parameter" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "key" - }, - { - "type": "string", - "id": 2, - "name": "value" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetParameters", - "header": 134, - "response": { - "type": "anonymous", - "header": 135, - "doc": [ - { - "type": "reference", - "argument": "parameters", - "category": "full", - "description": " Current parameters" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Parameter" - } - }, - "id": 1, - "name": "parameters" - } - ] - }, - "doc": [ - "Getting Parameters" - ], - "attributes": [] - } - }, - { - "type": "rpc", - "content": { - "name": "EditParameter", - "header": 128, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Change parameter value", - { - "type": "reference", - "argument": "key", - "category": "full", - "description": "Key of parameter" - }, - { - "type": "reference", - "argument": "value", - "category": "full", - "description": "Value of parameter" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "key" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "value" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ParameterChanged", - "header": 131, - "doc": [ - "Update about parameter change", - { - "type": "reference", - "argument": "key", - "category": "full", - "description": " Key of parameter" - }, - { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Value of parameter" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "key" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "value" - } - ] - } - } - ] - }, - { - "title": "Stats", - "package": "stats", - "doc": [ - "Saving statistics information" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "EventRecord", - "doc": [ - "Record for stored event" - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 1, - "name": "date" - }, - { - "type": { - "type": "trait", - "childType": "Event" - }, - "id": 2, - "name": "event" - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "Event", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "UntypedEvent", - "doc": [ - "Untyped event", - { - "type": "reference", - "argument": "eventType", - "category": "full", - "description": " Event type" - }, - { - "type": "reference", - "argument": "params", - "category": "full", - "description": " optional params for event" - } - ], - "trait": { - "name": "Event", - "key": 1 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "eventType" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 2, - "name": "params" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ContentViewChanged", - "doc": [ - "Content view event", - { - "type": "reference", - "argument": "contentType", - "category": "full", - "description": " unique content id" - }, - { - "type": "reference", - "argument": "visible", - "category": "full", - "description": " Is content visible" - }, - { - "type": "reference", - "argument": "params", - "category": "full", - "description": " optional params for content view" - } - ], - "trait": { - "name": "Event", - "key": 2 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "contentType" - }, - { - "type": "string", - "id": 2, - "name": "contentId" - }, - { - "type": "bool", - "id": 3, - "name": "visible" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 4, - "name": "params" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "AppVisibleChanged", - "doc": [ - "On App Visible event", - { - "type": "reference", - "argument": "visible", - "category": "full", - "description": " Is app visible" - } - ], - "trait": { - "name": "Event", - "key": 4 - }, - "expandable": "true", - "attributes": [ - { - "type": "bool", - "id": 1, - "name": "visible" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "StoreEvents", - "header": 243, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Storing events on server", - { - "type": "reference", - "argument": "events", - "category": "full", - "description": "Events for storing" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "Event" - } - }, - "id": 1, - "name": "events" - } - ] - } - } - ] - }, - { - "title": "Raw API", - "package": "raw", - "doc": [ - "Schema-less API that is useful for external integrations" - ], - "items": [ - { - "type": "rpc", - "content": { - "name": "RawRequest", - "header": 2569, - "response": { - "type": "anonymous", - "header": 2570, - "doc": [ - "Response of a raw request", - { - "type": "reference", - "argument": "result", - "category": "full", - "description": " Result of request" - } - ], - "attributes": [ - { - "type": { - "type": "trait", - "childType": "RawValue" - }, - "id": 1, - "name": "result" - } - ] - }, - "doc": [ - "Making raw request to external service via shema-less RPC request", - { - "type": "reference", - "argument": "service", - "category": "full", - "description": "Service name for RPC request" - }, - { - "type": "reference", - "argument": "method", - "category": "full", - "description": "Method for execution" - }, - { - "type": "reference", - "argument": "params", - "category": "full", - "description": "Optional params for the method" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "service" - }, - { - "type": "string", - "id": 2, - "name": "method" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 3, - "name": "params" - } - ] - } - } - ] - }, - { - "title": "Wallpappers", - "package": "wallpappers", - "doc": [ - "Wallpappers support" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "Wallpapper", - "doc": [ - "Wallpapper structure", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Wallpapper id" - }, - { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Image width" - }, - { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Image height" - }, - { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " Image file size" - }, - { - "type": "reference", - "argument": "file", - "category": "full", - "description": " Image file reference" - }, - { - "type": "reference", - "argument": "thumb", - "category": "full", - "description": " Image thumb" - } - ], - "attributes": [ - { - "type": "int32", - "id": 7, - "name": "id" - }, - { - "type": "int32", - "id": 1, - "name": "w" - }, - { - "type": "int32", - "id": 2, - "name": "h" - }, - { - "type": "int32", - "id": 3, - "name": "fileSize" - }, - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 5, - "name": "file" - }, - { - "type": { - "type": "struct", - "childType": "FastThumb" - }, - "id": 6, - "name": "thumb" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadWallpappers", - "header": 241, - "response": { - "type": "anonymous", - "header": 242, - "doc": [ - "Loaded Wallpappers", - { - "type": "reference", - "argument": "wallpappers", - "category": "full", - "description": " Available wallpapper list" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Wallpapper" - } - }, - "id": 1, - "name": "wallpappers" - } - ] - }, - "doc": [ - "Load available wallpappers", - { - "type": "reference", - "argument": "maxWidth", - "category": "full", - "description": "Maximum width of wallpapper" - }, - { - "type": "reference", - "argument": "maxHeight", - "category": "full", - "description": "Maximum height of wallpapper" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "maxWidth" - }, - { - "type": "int32", - "id": 2, - "name": "maxHeight" - } - ] - } - } - ] - }, - { - "title": "Push", - "package": "push", - "doc": [ - "Vendor's pushes for receiving push notifications.", - "Push notification contains current sequence number of main sequence." - ], - "items": [ - { - "type": "rpc", - "content": { - "name": "RegisterGooglePush", - "header": 51, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registering push token on server", - { - "type": "reference", - "argument": "projectId", - "category": "hidden", - "description": "Project Id of token" - }, - { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "token value" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "projectId" - }, - { - "type": "string", - "id": 2, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnregisterGooglePush", - "header": 2631, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregistering Google Push", - { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "Token value" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RegisterApplePush", - "header": 76, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registering apple push on server", - { - "type": "reference", - "argument": "apnsKey", - "category": "hidden", - "description": "apns key id" - }, - { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "token value" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "apnsKey" - }, - { - "type": "string", - "id": 2, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnregisterApplePush", - "header": 2632, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregistering Apple Push", - { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Token" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RegisterApplePushKit", - "header": 2576, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registration of a new Apple's PushKit tokens", - { - "type": "reference", - "argument": "apnsKey", - "category": "hidden", - "description": "APNS key id" - }, - { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "token value" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "apnsKey" - }, - { - "type": "string", - "id": 2, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnregisterApplePushKit", - "header": 2633, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregistering Apple Push Kit token", - { - "type": "reference", - "argument": "token", - "category": "hidden", - "description": "Token Value" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RegisterApplePushToken", - "header": 2593, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registering Apple Push Token", - { - "type": "reference", - "argument": "bundleId", - "category": "full", - "description": "Bundle Id of app" - }, - { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Push token" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "bundleId" - }, - { - "type": "string", - "id": 2, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnregisterApplePushToken", - "header": 2634, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregister Apple Push token", - { - "type": "reference", - "argument": "token", - "category": "hidden", - "description": "Token value" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RegisterActorPush", - "header": 2575, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Register Actor Push endpoint", - { - "type": "reference", - "argument": "endpoint", - "category": "full", - "description": "Endpoint for push sending" - }, - { - "type": "reference", - "argument": "encryptionKeys", - "category": "full", - "description": "Push Encryption keys" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "endpoint" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 2, - "name": "encryptionKeys" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnregisterActorPush", - "header": 2635, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregister Actor Push endpoint", - { - "type": "reference", - "argument": "endpoint", - "category": "full", - "description": "Endpoint for unregistering" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "endpoint" - } - ] - } - } - ] - }, - { - "title": "Encryption", - "package": "encryption", - "doc": [ - "Package that include encryption support", - "Key alg types:", - "* curve25519 - https://en.wikipedia.org/wiki/Curve25519", - "* rsa-2048", - "* rsa-4096", - "* aes-128", - "* kuznechik-128", - "", - "Signature alg types:", - "* Ed25519 - used curve25519 conveted to Ed255519 for signing and validataion" - ], - "items": [ - { - "type": "comment", - "content": "Public Keys" - }, - { - "type": "struct", - "content": { - "name": "EncryptionKeyGroup", - "doc": [ - "Encryption Key Group", - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, - { - "type": "reference", - "argument": "identityKey", - "category": "full", - "description": " Key that is used as identity and for validation of Key Group changes" - }, - { - "type": "reference", - "argument": "supportedEncryption", - "category": "full", - "description": " Supported encryption methods by this key group" - }, - { - "type": "reference", - "argument": "keys", - "category": "compact", - "description": " keys of Key Group" - }, - { - "type": "reference", - "argument": "signatures", - "category": "compact", - "description": " Signatures of keys" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 2, - "name": "supportedEncryption" - }, - { - "type": { - "type": "struct", - "childType": "EncryptionKey" - }, - "id": 3, - "name": "identityKey" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 4, - "name": "keys" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 5, - "name": "signatures" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EncryptionKeySignature", - "doc": [ - "Signed Key. Usually used for public keys.", - { - "type": "reference", - "argument": "keyId", - "category": "full", - "description": " Key Id used for signature" - }, - { - "type": "reference", - "argument": "signatureAlg", - "category": "full", - "description": " Signature algorithm" - }, - { - "type": "reference", - "argument": "signature", - "category": "full", - "description": " Signature value" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "keyId" - }, - { - "type": "string", - "id": 2, - "name": "signatureAlg" - }, - { - "type": "bytes", - "id": 3, - "name": "signature" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EncryptionKey", - "doc": [ - "Encryption Key", - { - "type": "reference", - "argument": "keyId", - "category": "full", - "description": " Key Id" - }, - { - "type": "reference", - "argument": "keyAlg", - "category": "full", - "description": " Key Algorithm" - }, - { - "type": "reference", - "argument": "keyMaterial", - "category": "compact", - "description": " Public key material. Can be null, but always not null for LoadPublicKey" - }, - { - "type": "reference", - "argument": "keyHash", - "category": "hidden", - "description": " If keyMaterial is null, pass keyHash - SHA256 of key" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "keyId" - }, - { - "type": "string", - "id": 2, - "name": "keyAlg" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 3, - "name": "keyMaterial" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 4, - "name": "keyHash" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "PublicKeys", - "header": 2602, - "doc": [ - "Public Keys response", - { - "type": "reference", - "argument": "publicKey", - "category": "full", - "description": " Public keys" - }, - { - "type": "reference", - "argument": "signatures", - "category": "full", - "description": " Signatures of public keys" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 1, - "name": "publicKey" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 2, - "name": "signatures" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "PublicKeyGroups", - "header": 2604, - "doc": [ - "Public key groups response" - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeyGroup" - } - }, - "id": 1, - "name": "publicKeyGroups" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadPublicKeyGroups", - "header": 2601, - "response": { - "type": "reference", - "name": "PublicKeyGroups" - }, - "doc": [ - "Loading Public key groups", - { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadPublicKey", - "header": 2605, - "response": { - "type": "reference", - "name": "PublicKeys" - }, - "doc": [ - "Loading public key explictly", - { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - }, - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key group's id" - }, - { - "type": "reference", - "argument": "keyIds", - "category": "full", - "description": "Key ids for loading" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userPeer" - }, - { - "type": "int32", - "id": 2, - "name": "keyGroupId" - }, - { - "type": { - "type": "list", - "childType": "int64" - }, - "id": 3, - "name": "keyIds" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadPrePublicKeys", - "header": 2603, - "response": { - "type": "reference", - "name": "PublicKeys" - }, - "doc": [ - "Loading SOME of ephermal public keys", - { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - }, - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "User's key group id" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userPeer" - }, - { - "type": "int32", - "id": 2, - "name": "keyGroupId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "PublicKeyGroupChanged", - "header": 103, - "doc": [ - "Update about public key group changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroup", - "category": "full", - "description": " Updated Key Group" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "struct", - "childType": "EncryptionKeyGroup" - }, - "id": 2, - "name": "keyGroup" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "KeysAdded", - "header": 112, - "doc": [ - "Update about keys added to Key Group", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, - { - "type": "reference", - "argument": "keys", - "category": "compact", - "description": " Added keys" - }, - { - "type": "reference", - "argument": "signatures", - "category": "compact", - "description": " Signatures of a public key" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 3, - "name": "keys" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 4, - "name": "signatures" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "KeysRemoved", - "header": 113, - "doc": [ - "Update about keys removed from Key Group", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, - { - "type": "reference", - "argument": "keyIds", - "category": "full", - "description": " Removed keys" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }, - { - "type": { - "type": "list", - "childType": "int64" - }, - "id": 3, - "name": "keyIds" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "PublicKeyGroupAdded", - "header": 104, - "doc": [ - "Update about public key group added", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroup", - "category": "full", - "description": " Added Key Group" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "struct", - "childType": "EncryptionKeyGroup" - }, - "id": 2, - "name": "keyGroup" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "PublicKeyGroupRemoved", - "header": 105, - "doc": [ - "Update about public key group removed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Removed Key Group Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - } - ] - } - }, - { - "type": "comment", - "content": "Device Side" - }, - { - "type": "rpc", - "content": { - "name": "CreateNewKeyGroup", - "header": 2609, - "response": { - "type": "anonymous", - "header": 2610, - "doc": [ - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Created Key Group id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - } - ] - }, - "doc": [ - "Creation of a new Key Group", - { - "type": "reference", - "argument": "identityKey", - "category": "full", - "description": "Identity Key of a new group" - }, - { - "type": "reference", - "argument": "supportedEncryptions", - "category": "full", - "description": "Supported encryption methods" - }, - { - "type": "reference", - "argument": "keys", - "category": "full", - "description": "keys of current group" - }, - { - "type": "reference", - "argument": "signatures", - "category": "full", - "description": "signatures of keys" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "EncryptionKey" - }, - "id": 1, - "name": "identityKey" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 2, - "name": "supportedEncryptions" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 3, - "name": "keys" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 4, - "name": "signatures" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DeleteKeyGroup", - "header": 2611, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Deletion of a Key Group", - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id for deletion" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DisconnectKeyGroup", - "header": 2613, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Disconnect Key Group from device", - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id for disconnection" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ConnectKeyGroup", - "header": 2614, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Connectiong Key Group to device", - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id for connection" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UploadPreKey", - "header": 2612, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Uploading Ephermal Keys", - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id" - }, - { - "type": "reference", - "argument": "keys", - "category": "compact", - "description": "Encryprion keys" - }, - { - "type": "reference", - "argument": "signatures", - "category": "compact", - "description": "Key signatures" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 2, - "name": "keys" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 3, - "name": "signatures" - } - ] - } - }, - { - "type": "comment", - "content": "Encrypted Packages" - }, - { - "type": "struct", - "content": { - "name": "EncryptedBox", - "doc": [ - "Encrypted package that is encrypted for multiple keys", - { - "type": "reference", - "argument": "keys", - "category": "full", - "description": " Encrypted encryption keys" - }, - { - "type": "reference", - "argument": "algType", - "category": "full", - "description": " Package encryption type" - }, - { - "type": "reference", - "argument": "encPackage", - "category": "full", - "description": " Encrypted package" - }, - { - "type": "reference", - "argument": "senderKeyGroupId", - "category": "full", - "description": " Sender key group" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 4, - "name": "senderKeyGroupId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncyptedBoxKey" - } - }, - "id": 1, - "name": "keys" - }, - { - "type": "string", - "id": 2, - "name": "algType" - }, - { - "type": "bytes", - "id": 3, - "name": "encPackage" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptedBoxSignature" - } - }, - "id": 5, - "name": "signatures" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EncryptedBoxSignature", - "doc": [ - "Signature for encrypted package", - { - "type": "reference", - "argument": "algType", - "category": "full", - "description": " Alg Type" - }, - { - "type": "reference", - "argument": "signature", - "category": "full", - "description": " Signature of encrypted package" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "algType" - }, - { - "type": "bytes", - "id": 2, - "name": "signature" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EncyptedBoxKey", - "doc": [ - "Encrypted package encryption key", - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, - { - "type": "reference", - "argument": "algType", - "category": "full", - "description": " Key encryption algorithm" - }, - { - "type": "reference", - "argument": "encryptedKey", - "category": "hidden", - "description": " Encrypted encryption key" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "usersId" - }, - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }, - { - "type": "string", - "id": 3, - "name": "algType" - }, - { - "type": "bytes", - "id": 4, - "name": "encryptedKey" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "KeyGroupId", - "doc": [ - "References to key groups", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "KeyGroupHolder", - "doc": [ - "Key Group Holder", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroup", - "category": "full", - "description": " Key Group" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "struct", - "childType": "EncryptionKeyGroup" - }, - "id": 2, - "name": "keyGroup" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SendEncryptedPackage", - "header": 2657, - "response": { - "type": "anonymous", - "header": 2664, - "doc": [ - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " date" - }, - { - "type": "reference", - "argument": "obsoleteKeyGroups", - "category": "full", - "description": " obsolete key group ids" - }, - { - "type": "reference", - "argument": "missedKeyGroups", - "category": "full", - "description": " missed key groups" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "date" - } - }, - "id": 1, - "name": "date" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "KeyGroupId" - } - }, - "id": 2, - "name": "obsoleteKeyGroups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "KeyGroupHolder" - } - }, - "id": 3, - "name": "missedKeyGroups" - } - ] - }, - "doc": [ - "Sending encrypted package", - { - "type": "reference", - "argument": "randomId", - "category": "hidden", - "description": "Random id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "randomId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 2, - "name": "destPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "KeyGroupId" - } - }, - "id": 3, - "name": "ignoredKeyGroups" - }, - { - "type": { - "type": "struct", - "childType": "EncryptedBox" - }, - "id": 4, - "name": "encryptedBox" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "EncryptedPackage", - "header": 177, - "doc": [ - "Update about encrypted package", - { - "type": "reference", - "argument": "randomId", - "category": "full", - "description": " Random Id of package" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Sending date of package" - }, - { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " Sender id of package" - }, - { - "type": "reference", - "argument": "encryptedBox", - "category": "full", - "description": " Encrypted box" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "randomId" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "date" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "senderId" - }, - { - "type": { - "type": "struct", - "childType": "EncryptedBox" - }, - "id": 4, - "name": "encryptedBox" - } - ] - } - } - ] - }, - { - "title": "Storage", - "package": "storage", - "items": [ - { - "type": "rpc", - "content": { - "name": "UploadSharedBlob", - "header": 2660, - "response": { - "type": "anonymous", - "header": 2661, - "doc": [ - { - "type": "reference", - "argument": "sharedObjectId", - "category": "full", - "description": " Id of shared object" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "sharedObjectId" - } - ] - }, - "doc": [ - "Upload shared blob with user", - { - "type": "reference", - "argument": "destPeer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "bucket", - "category": "full", - "description": "Bucked name" - }, - { - "type": "reference", - "argument": "blob", - "category": "full", - "description": "Blob data" - }, - { - "type": "reference", - "argument": "randomId", - "category": "full", - "description": "Random id for protecting from double upload" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "destPeer" - }, - { - "type": "string", - "id": 2, - "name": "bucket" - }, - { - "type": "bytes", - "id": 3, - "name": "blob" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "randomId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DownloadSharedBlob", - "header": 2662, - "response": { - "type": "anonymous", - "header": 2663, - "doc": [ - { - "type": "reference", - "argument": "blob", - "category": "full", - "description": " Blob contents" - } - ], - "attributes": [ - { - "type": "bytes", - "id": 1, - "name": "blob" - } - ] - }, - "doc": [ - "Download shared blob", - { - "type": "reference", - "argument": "destPeer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "bucket", - "category": "full", - "description": "Bucket name" - }, - { - "type": "reference", - "argument": "objectId", - "category": "full", - "description": "Object Id" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "destPeer" - }, - { - "type": "string", - "id": 2, - "name": "bucket" - }, - { - "type": "int32", - "id": 3, - "name": "objectId" - } - ] - } - } - ] - }, - { - "title": "Peers", - "package": "peers", - "doc": [ - "Peer is an identificator of specific conversation." - ], - "items": [ - { - "type": "enum", - "content": { - "name": "PeerType", - "values": [ - { - "name": "Private", - "id": 1 - }, - { - "name": "Group", - "id": 2 - }, - { - "name": "EncryptedPrivate", - "id": 3 - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Peer", - "doc": [ - "Peer", - { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Peer Type" - }, - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Peer Id" - } - ], - "attributes": [ - { - "type": { - "type": "enum", - "childType": "PeerType" - }, - "id": 1, - "name": "type" - }, - { - "type": "int32", - "id": 2, - "name": "id" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "OutPeer", - "doc": [ - "Out peer with access hash", - { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Peer Type" - }, - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Peer Id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Peer access hash" - } - ], - "attributes": [ - { - "type": { - "type": "enum", - "childType": "PeerType" - }, - "id": 1, - "name": "type" - }, - { - "type": "int32", - "id": 2, - "name": "id" - }, - { - "type": "int64", - "id": 3, - "name": "accessHash" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "UserOutPeer", - "doc": [ - "User's out peer", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " User's access hash" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" + "name": "Text", + "id": 2 }, { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "GroupOutPeer", - "doc": [ - "Group's out peer", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group's Id" + "name": "Links", + "id": 3 }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Group's access hash" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" + "name": "Documents", + "id": 4 }, { - "type": "int64", - "id": 2, - "name": "accessHash" + "name": "Photos", + "id": 5 } - ] - } + ] } - ] - }, - { - "title": "Sequence and Updates", - "package": "sequence", + },{"type":"trait","content":{ +"isContainer":"true","name":"SearchCondition","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"SearchPeerTypeCondition", +"doc":[ +"Search peer type condition",{"type":"reference","argument":"peerType","category":"full","description":" Peer type for searching"}],"trait":{"name":"SearchCondition","key":1},"attributes":[ +{"type":{"type":"enum","childType":"SearchPeerType"},"id":1,"name":"peerType"} +]}}, { + "type":"struct", + "content": { + "name":"SearchPieceText", +"doc":[ +"Search peer name condition",{"type":"reference","argument":"query","category":"full","description":" Search query"}],"trait":{"name":"SearchCondition","key":2},"attributes":[ +{"type":"string","id":1,"name":"query"} +]}}, { + "type":"struct", + "content": { + "name":"SearchAndCondition", +"doc":[ +"Search AND condion",{"type":"reference","argument":"andQuery","category":"full","description":" And Query"}],"trait":{"name":"SearchCondition","key":3},"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":1,"name":"andQuery"} +]}}, { + "type":"struct", + "content": { + "name":"SearchOrCondition", +"doc":[ +"Search OR condition",{"type":"reference","argument":"orQuery","category":"full","description":" Or Query"}],"trait":{"name":"SearchCondition","key":4},"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":2,"name":"orQuery"} +]}}, { + "type":"struct", + "content": { + "name":"SearchPeerCondition", +"doc":[ +"Serch Peer condition",{"type":"reference","argument":"peer","category":"full","description":" Peer condition"}],"trait":{"name":"SearchCondition","key":5},"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}}, { + "type":"struct", + "content": { + "name":"SearchPeerContentType", +"doc":[ +"Search content type condition",{"type":"reference","argument":"contentType","category":"full","description":" Content Type"}],"trait":{"name":"SearchCondition","key":6},"attributes":[ +{"type":{"type":"enum","childType":"SearchContentType"},"id":1,"name":"contentType"} +]}}, { + "type":"struct", + "content": { + "name":"SearchSenderIdConfition", +"doc":[ +"Searching sender uid condition",{"type":"reference","argument":"senderId","category":"full","description":" sender UID"}],"trait":{"name":"SearchCondition","key":7},"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"senderId"} +]}}, { + "type":"struct", + "content": { + "name":"PeerSearchResult", +"doc":[ +"Peer search result",{"type":"reference","argument":"peer","category":"full","description":" Peer information"},{"type":"reference","argument":"optMatchString","category":"full","description":" Description"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"optMatchString"} +]}},{"type":"rpc","content":{ +"name":"PeerSearch", +"header":233, +"response":{"type":"anonymous","header":234, "doc":[ +"Found peers",{"type":"reference","argument":"searchResults","category":"full","description":" Search Results"},{"type":"reference","argument":"users","category":"full","description":" Related users"},{"type":"reference","argument":"groups","category":"full","description":" Related groups"},{"type":"reference","argument":"userPeers","category":"full","description":" Related user peers"},{"type":"reference","argument":"groupPeers","category":"full","description":" Related group peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"PeerSearchResult"}},"id":1,"name":"searchResults"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":5,"name":"groupPeers"} +]}, +"doc":[ +"Performing peer search",{"type":"reference","argument":"query","category":"full","description":"Search query. Warring not all combinations can be processed by server. (acts as OR)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":1,"name":"query"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}}, { + "type":"struct", + "content": { + "name":"MessageSearchResult", +"doc":[ +"Message container",{"type":"reference","argument":"peer","category":"full","description":" Message Peer"},{"type":"reference","argument":"rid","category":"full","description":" Message Random Id"},{"type":"reference","argument":"date","category":"full","description":" Message Date"},{"type":"reference","argument":"senderId","category":"full","description":" Message sender UID"},{"type":"reference","argument":"content","category":"full","description":" Message content"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"alias","childType":"userId"},"id":4,"name":"senderId"} +,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"content"} +]}}, { + "type":"struct", + "content": { + "name":"MessageSearchItem", +"doc":[ +"Message Search result container"],"attributes":[ +{"type":{"type":"struct","childType":"MessageSearchResult"},"id":1,"name":"result"} +]}},{"type":"response","content":{ +"name":"MessageSearchResponse", +"header":218, +"doc":[ +"Search Result",{"type":"reference","argument":"searchResults","category":"full","description":" Search results"},{"type":"reference","argument":"users","category":"full","description":" Search users"},{"type":"reference","argument":"groups","category":"full","description":" Search groups"},{"type":"reference","argument":"loadMoreState","category":"hidden","description":" State for loading more results"},{"type":"reference","argument":"userOutPeers","category":"full","description":" Search user peers"},{"type":"reference","argument":"groupOutPeers","category":"full","description":" Search group peers"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"MessageSearchItem"}},"id":1,"name":"searchResults"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} +,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"loadMoreState"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userOutPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupOutPeers"} +]}},{"type":"rpc","content":{ +"name":"MessageSearch", +"header":217, +"response":{"type":"reference","name":"MessageSearchResponse"}, +"doc":[ +"Performing message search",{"type":"reference","argument":"query","category":"full","description":"Search query"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"trait","childType":"SearchCondition"},"id":1,"name":"query"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"MessageSearchMore", +"header":222, +"response":{"type":"reference","name":"MessageSearchResponse"}, +"doc":[ +"Performing message search paging",{"type":"reference","argument":"loadMoreState","category":"hidden","description":"State for loading more results"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":"bytes","id":1,"name":"loadMoreState"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}}]}, { + "title": "Public Groups", + "package": "pubgroups", "doc": [ - "Each device has it's own update sequence. At the begining application request initial sequence state by", - "calling GetState. On each application restart or NewSessionCreated application calls GetDifference for receiving", - "updates in update sequence.", - "GetState and GetDifference automatically subscribes session to receiving updates in session.", - "Each update has seq and state. Seq is sequental index of updated and used for detecting of holes in update sequence", - "(because of server failure or session die) on client side.", - "All updates needed to be processed in partucular order according to seq values.", - "In some updates there can be references to users that are not available at client yer. In this case application need", - "to ignore such update and init getting difference." + "Public group is easy way to find communities" ], + "items": [ + { + "type":"struct", + "content": { + "name":"PublicGroup", +"doc":[ +"Public Group description",{"type":"reference","argument":"id","category":"full","description":" Group id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Group Access hash"},{"type":"reference","argument":"title","category":"full","description":" Group title"},{"type":"reference","argument":"avatar","category":"full","description":" Group avatar"},{"type":"reference","argument":"membersCount","category":"full","description":" Members count in group"},{"type":"reference","argument":"friendsCount","category":"full","description":" Friends count int group"},{"type":"reference","argument":"description","category":"full","description":" Description of group"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":7,"name":"avatar"} +,{"type":"int32","id":4,"name":"membersCount"} +,{"type":"int32","id":5,"name":"friendsCount"} +,{"type":"string","id":6,"name":"description"} +]}},{"type":"rpc","content":{ +"name":"GetPublicGroups", +"header":201, +"response":{"type":"anonymous","header":202, "doc":[ +"Loaded public groups",{"type":"reference","argument":"groups","category":"full","description":" All available groups"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"PublicGroup"}},"id":1,"name":"groups"} +]}, +"doc":[ +"Getting public groups"],"attributes":[ +]}}]}, { + "title": "Invites", + "package": "invites", + "doc": [ + "Invite mechanizm" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"InviteState", +"doc":[ +"Invite state",{"type":"reference","argument":"email","category":"full","description":" Email of invite"},{"type":"reference","argument":"name","category":"full","description":" Name of invited user"},{"type":"reference","argument":"uid","category":"full","description":" Uid of registered user"},{"type":"reference","argument":"tid","category":"full","description":" Team id of invite"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +,{"type":{"type":"opt","childType":"int32"},"id":3,"name":"uid"} +,{"type":{"type":"opt","childType":"int32"},"id":4,"name":"tid"} +]}},{"type":"response","content":{ +"name":"InviteList", +"header":2564, +"doc":[ +"Intites list",{"type":"reference","argument":"invites","category":"full","description":" Intvites"},{"type":"reference","argument":"relatedUsers","category":"full","description":" Related users in invites"},{"type":"reference","argument":"relatedGroups","category":"full","description":" Related groups in invites"},{"type":"reference","argument":"relatedTeams","category":"full","description":" Related teams in invites"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"InviteState"}},"id":1,"name":"invites"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"relatedUsers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"relatedGroups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":4,"name":"relatedTeams"} +]}},{"type":"rpc","content":{ +"name":"LoadOwnSentInvites", +"header":2563, +"response":{"type":"reference","name":"InviteList"}, +"doc":[ +"Loading current invite states"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"SendInvite", +"header":2565, +"response":{"type":"reference","name":"InviteList"}, +"doc":[ +"Sending an email invite",{"type":"reference","argument":"email","category":"full","description":"Email for invite"},{"type":"reference","argument":"name","category":"full","description":"Optional name for invite"},{"type":"reference","argument":"destTeam","category":"full","description":"Optional team for invite"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"OutTeam"}},"id":3,"name":"destTeam"} +]}}]}, { + "title": "Teams", + "package": "teams", + "doc": [ + "Teams support for Actor" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Team", +"doc":[ +"Team entity",{"type":"reference","argument":"id","category":"full","description":" Team Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Team Access Hash"},{"type":"reference","argument":"name","category":"full","description":" Team name"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"name"} +]}}, { + "type":"struct", + "content": { + "name":"OutTeam", +"doc":[ +"Reference to a team",{"type":"reference","argument":"id","category":"full","description":" Team Id"},{"type":"reference","argument":"accessHash","category":"full","description":" Team access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"response","content":{ +"name":"TeamsList", +"header":2562, +"doc":[ +"Teams response",{"type":"reference","argument":"teams","category":"hidden","description":" Teams list"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":1,"name":"teams"} +]}},{"type":"rpc","content":{ +"name":"LoadOwnTeams", +"header":2561, +"response":{"type":"reference","name":"TeamsList"}, +"doc":[ +"Loading own teams"],"attributes":[ +]}},{"type":"update","content":{ +"name":"OwnTeamsChanged", +"header":165, +"doc":[ +"Update about own teams changed",{"type":"reference","argument":"ownTeams","category":"full","description":" Updated own teams list"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":1,"name":"ownTeams"} +]}},{"type":"rpc","content":{ +"name":"CreateTeam", +"header":2566, +"response":{"type":"anonymous","header":2567, "doc":[ +"Created team response",{"type":"reference","argument":"createdTeam","category":"full","description":" Created Team"}] ,"attributes":[{"type":{"type":"struct","childType":"Team"},"id":1,"name":"createdTeam"} +]}, +"doc":[ +"Creation of a Team",{"type":"reference","argument":"title","category":"full","description":"Title of a team"}],"attributes":[ +{"type":"string","id":1,"name":"title"} +]}},{"type":"rpc","content":{ +"name":"InviteToTeam", +"header":2568, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Inviting people to team",{"type":"reference","argument":"user","category":"full","description":"Dest user"},{"type":"reference","argument":"destTeam","category":"full","description":"Dest team"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"user"} +,{"type":{"type":"struct","childType":"OutTeam"},"id":3,"name":"destTeam"} +]}}]}, { + "title": "Integrations", + "package": "integrations", + "doc": [ + "Package contains methods for providing integration" + ], + "items": [ +{"type":"response","content":{ +"name":"IntegrationToken", +"header":183, +"doc":[ +"Group token response",{"type":"reference","argument":"token","category":"danger","description":" current group token"},{"type":"reference","argument":"url","category":"danger","description":" current group url"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +,{"type":"string","id":2,"name":"url"} +]}},{"type":"rpc","content":{ +"name":"GetIntegrationToken", +"header":182, +"response":{"type":"reference","name":"IntegrationToken"}, +"doc":[ +"Getting current group token",{"type":"reference","argument":"groupPeer","category":"full","description":"Peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"RevokeIntegrationToken", +"header":184, +"response":{"type":"reference","name":"IntegrationToken"}, +"doc":[ +"Revoke group token",{"type":"reference","argument":"groupPeer","category":"full","description":"Peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"groupPeer"} +]}}]}, { + "title": "Typing and Online", + "package": "weak", "items": [ { - "type": "update_box", - "content": { - "name": "SeqUpdate", - "header": 13, - "doc": [ - "Sequence update", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of update" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequece state of update" - }, - { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " header of update" - }, - { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The update" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": "int32", - "id": 3, - "name": "updateHeader" - }, - { - "type": "bytes", - "id": 4, - "name": "update" - } - ] - } - }, - { - "type": "update_box", - "content": { - "name": "FatSeqUpdate", - "header": 73, - "doc": [ - "Fat sequence update with additional data", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of update" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state of update" - }, - { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " header of update" - }, - { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The update" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Users that are referenced in update" - }, - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups that are referenced in update" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": "int32", - "id": 3, - "name": "updateHeader" - }, - { - "type": "bytes", - "id": 4, - "name": "update" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 5, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 6, - "name": "groups" - } - ] - } - }, - { - "type": "update_box", + "type": "enum", "content": { - "name": "WeakUpdate", - "header": 26, - "doc": [ - "Out of sequence update (for typing and online statuses)", - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of update" - }, - { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " Header of update" - }, - { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The update" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "date" - }, - { - "type": "int32", - "id": 2, - "name": "updateHeader" - }, + "name": "TypingType", + "values": [ { - "type": "bytes", - "id": 3, - "name": "update" + "name": "Text", + "id": 0 } - ] - } - }, - { - "type": "update_box", + ] + } + },{"type":"rpc","content":{ +"name":"Typing", +"header":27, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Sending typing notification",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"typingType","category":"full","description":"typing type."}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} +]}},{"type":"rpc","content":{ +"name":"StopTyping", +"header":30, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Stop typing",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"typingType","category":"full","description":"typing type"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"enum","childType":"TypingType"},"id":2,"name":"typingType"} +]}}, { + "type": "enum", "content": { - "name": "WeakFatUpdate", - "header": 2673, - "doc": [ - "Fat Weak Update", - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of update" - }, + "name": "DeviceType", + "values": [ { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " Header of update" + "name": "GENERIC", + "id": 1 }, { - "type": "reference", - "argument": "update", - "category": "full", - "description": " The update" + "name": "PC", + "id": 2 }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Users that are referenced in update" + "name": "MOBILE", + "id": 3 }, { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Groups that are referenced in update" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "date" + "name": "TABLET", + "id": 4 }, { - "type": "int32", - "id": 2, - "name": "updateHeader" + "name": "WATCH", + "id": 5 }, { - "type": "bytes", - "id": 3, - "name": "update" + "name": "MIRROR", + "id": 6 }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 4, - "name": "users" + "name": "CAR", + "id": 7 }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 5, - "name": "groups" + "name": "TABLE", + "id": 8 } - ] - } - }, - { - "type": "update_box", - "content": { - "name": "SeqUpdateTooLong", - "header": 25, - "doc": [ - "Notification about requiring performing manual GetDifference" - ], - "attributes": [] - } - }, - { - "type": "struct", + ] + } + },{"type":"rpc","content":{ +"name":"SetOnline", +"header":29, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Sending online state",{"type":"reference","argument":"isOnline","category":"full","description":"is user online"},{"type":"reference","argument":"timeout","category":"full","description":"timeout of online state in milliseconds"},{"type":"reference","argument":"deviceType","category":"full","description":"Optional device type"},{"type":"reference","argument":"deviceCategory","category":"full","description":"Optional device category, for example android or ios"}],"attributes":[ +{"type":"bool","id":1,"name":"isOnline"} +,{"type":{"type":"alias","childType":"msec"},"id":2,"name":"timeout"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":3,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"PauseNotifications", +"header":166, +"doc":[ +"Update about pausing notifications",{"type":"reference","argument":"timeout","category":"full","description":" Timeout for notifications resume"}],"attributes":[ +{"type":{"type":"alias","childType":"sec"},"id":1,"name":"timeout"} +]}},{"type":"update","content":{ +"name":"RestoreNotifications", +"header":167, +"doc":[ +"Update about restoring notifications"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"PauseNotifications", +"header":2641, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Pause notifications",{"type":"reference","argument":"timeout","category":"hidden","description":"Timeout of pause"}],"attributes":[ +{"type":{"type":"alias","childType":"sec"},"id":1,"name":"timeout"} +]}},{"type":"rpc","content":{ +"name":"RestoreNotifications", +"header":2642, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Restoring notifications"],"attributes":[ +]}},{"type":"empty"},{"type":"update","content":{ +"name":"Typing", +"header":6, +"doc":[ +"Update about user's typing",{"type":"reference","argument":"peer","category":"full","description":" Conversation peer"},{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"typingType","category":"full","description":" Type of typing"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} +]}},{"type":"update","content":{ +"name":"TypingStop", +"header":81, +"doc":[ +"Update about user's typing stop",{"type":"reference","argument":"peer","category":"full","description":" Conversation peer"},{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"typingType","category":"hidden","description":" Type of typing"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} +]}},{"type":"update","content":{ +"name":"UserOnline", +"header":7, +"doc":[ +"Update about user became online",{"type":"reference","argument":"uid","category":"full","description":" User's Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":2,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"UserOffline", +"header":8, +"doc":[ +"Update about user became offline",{"type":"reference","argument":"uid","category":"full","description":" User's id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":2,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"UserLastSeen", +"header":9, +"doc":[ +"Update about user's last seen state",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"date","category":"full","description":" Last seen time"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"date"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":3,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"GroupOnline", +"header":33, +"doc":[ +"Update about group online change",{"type":"reference","argument":"groupId","category":"full","description":" Group id"},{"type":"reference","argument":"count","category":"full","description":" current online user's count"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int32","id":2,"name":"count"} +]}}]}, { + "title": "Media and Files", + "package": "files", + "items": [ + { + "type":"struct", + "content": { + "name":"FileLocation", +"doc":[ +"Location of file on server",{"type":"reference","argument":"fileId","category":"full","description":" Unique Id of file"},{"type":"reference","argument":"accessHash","category":"danger","description":" Access hash of file"}],"expandable":"true","attributes":[ +{"type":"int64","id":1,"name":"fileId"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}, { + "type":"struct", + "content": { + "name":"ImageLocation", +"doc":[ +"Image location",{"type":"reference","argument":"fileLocation","category":"full","description":" Location of file"},{"type":"reference","argument":"width","category":"full","description":" Width of avatar image"},{"type":"reference","argument":"height","category":"full","description":" Height of avatar image"},{"type":"reference","argument":"fileSize","category":"full","description":" Size of file"}],"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} +,{"type":"int32","id":2,"name":"width"} +,{"type":"int32","id":3,"name":"height"} +,{"type":"int32","id":4,"name":"fileSize"} +]}}, { + "type":"struct", + "content": { + "name":"AvatarImage", +"doc":[ +"Avatar Image",{"type":"reference","argument":"fileLocation","category":"full","description":" Location of file"},{"type":"reference","argument":"width","category":"full","description":" Width of avatar image"},{"type":"reference","argument":"height","category":"full","description":" Height of avatar image"},{"type":"reference","argument":"fileSize","category":"full","description":" Size of file"}],"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} +,{"type":"int32","id":2,"name":"width"} +,{"type":"int32","id":3,"name":"height"} +,{"type":"int32","id":4,"name":"fileSize"} +]}}, { + "type":"struct", + "content": { + "name":"Avatar", +"doc":[ +"Avatar of User or Group",{"type":"reference","argument":"smallImage","category":"compact","description":" Optional small image of avatar box in 100x100"},{"type":"reference","argument":"largeImage","category":"compact","description":" Optional large image of avatar box in 200x200"},{"type":"reference","argument":"fullImage","category":"compact","description":" Optional full screen image of avatar"}],"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":1,"name":"smallImage"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":2,"name":"largeImage"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":3,"name":"fullImage"} +]}}, { + "type":"struct", + "content": { + "name":"FastThumb", +"doc":[ +"Fast thumb of media messages. Less than 90x90 and compressed by JPEG with low quality",{"type":"reference","argument":"w","category":"full","description":" Width of thumb"},{"type":"reference","argument":"h","category":"full","description":" Height of thump"},{"type":"reference","argument":"thumb","category":"compact","description":" compressed image data"}],"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"bytes","id":3,"name":"thumb"} +]}}, { + "type": "enum", "content": { - "name": "UpdateContainer", - "doc": [ - "Update container", + "name": "Colors", + "values": [ { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " Header of update" + "name": "red", + "id": 1 }, { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The updatre" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "updateHeader" + "name": "yellow", + "id": 2 }, { - "type": "bytes", - "id": 2, - "name": "update" + "name": "green", + "id": 3 } - ] - } - }, - { - "type": "update_box", + ] + } + },{"type":"trait","content":{ +"isContainer":"true","name":"Color","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"RgbColor", +"doc":[ +"RGB Color",{"type":"reference","argument":"rgb","category":"full","description":" RGB color value"}],"trait":{"name":"Color","key":1},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"rgb"} +]}}, { + "type":"struct", + "content": { + "name":"PredefinedColor", +"doc":[ +"Predefined color",{"type":"reference","argument":"color","category":"hidden","description":" Predefined color value"}],"trait":{"name":"Color","key":2},"expandable":"true","attributes":[ +{"type":{"type":"enum","childType":"Colors"},"id":1,"name":"color"} +]}},{"type":"empty"}, { + "type":"struct", + "content": { + "name":"HTTPHeader", +"doc":[ +"HTTP Header record",{"type":"reference","argument":"key","category":"full","description":" HTTP Header name"},{"type":"reference","argument":"value","category":"full","description":" HTTP Header value"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":"string","id":2,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"FileUrlDescription", +"doc":[ +"File url description",{"type":"reference","argument":"fileId","category":"full","description":" File id of url"},{"type":"reference","argument":"url","category":"full","description":" Url for downloading"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url"},{"type":"reference","argument":"unsignedUrl","category":"hidden","description":" Unsigned URL (used to honor web caches)"},{"type":"reference","argument":"unsignedUrlHeaders","category":"hidden","description":" Headers that is required to download files with unsigned url"}],"attributes":[ +{"type":"int64","id":1,"name":"fileId"} +,{"type":"string","id":2,"name":"url"} +,{"type":{"type":"alias","childType":"sec"},"id":3,"name":"timeout"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"unsignedUrl"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"HTTPHeader"}},"id":5,"name":"unsignedUrlHeaders"} +]}},{"type":"rpc","content":{ +"name":"GetFileUrl", +"header":77, +"response":{"type":"anonymous","header":78, "doc":[ +{"type":"reference","argument":"url","category":"full","description":" Url for downloading"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url"},{"type":"reference","argument":"unsignedUrl","category":"full","description":" Unsigned URL (used to honor web caches)"},{"type":"reference","argument":"unsignedUrlHeaders","category":"full","description":" Headers that is required to download files with unsigned url"}] ,"attributes":[{"type":"string","id":1,"name":"url"} +,{"type":{"type":"alias","childType":"sec"},"id":2,"name":"timeout"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"unsignedUrl"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"HTTPHeader"}},"id":4,"name":"unsignedUrlHeaders"} +]}, +"doc":[ +"Requesting file URL for downloading",{"type":"reference","argument":"file","category":"full","description":"file's location"}],"attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"file"} +]}},{"type":"rpc","content":{ +"name":"GetFileUrls", +"header":2573, +"response":{"type":"anonymous","header":2574, "doc":[ +{"type":"reference","argument":"fileUrls","category":"full","description":" File urls"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"FileUrlDescription"}},"id":1,"name":"fileUrls"} +]}, +"doc":[ +"Requesting multiple fle URL for downloading",{"type":"reference","argument":"files","category":"hidden","description":"File locations to load urls"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"FileLocation"}},"id":1,"name":"files"} +]}},{"type":"rpc","content":{ +"name":"GetFileUrlBuilder", +"header":2579, +"response":{"type":"anonymous","header":2580, "doc":[ +{"type":"reference","argument":"baseUrl","category":"full","description":" Base Url for files"},{"type":"reference","argument":"algo","category":"full","description":" Signature algorithm"},{"type":"reference","argument":"seed","category":"full","description":" Public-visible seed of signature"},{"type":"reference","argument":"signatureSecret","category":"full","description":" Signature Secret"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url builder"}] ,"attributes":[{"type":"string","id":1,"name":"baseUrl"} +,{"type":"string","id":2,"name":"algo"} +,{"type":"string","id":5,"name":"seed"} +,{"type":"bytes","id":3,"name":"signatureSecret"} +,{"type":{"type":"alias","childType":"sec"},"id":4,"name":"timeout"} +]}, +"doc":[ +"Get File URL Builder that allows to build file urls from client side",{"type":"reference","argument":"supportedSignatureAlgorithms","category":"hidden","description":"Supported signature algorithms by client"}],"attributes":[ +{"type":{"type":"list","childType":"string"},"id":1,"name":"supportedSignatureAlgorithms"} +]}},{"type":"rpc","content":{ +"name":"GetFileUploadUrl", +"header":97, +"response":{"type":"anonymous","header":121, "doc":[ +{"type":"reference","argument":"url","category":"full","description":" Url for uploading"},{"type":"reference","argument":"uploadKey","category":"compact","description":" Upload key for upload"}] ,"attributes":[{"type":"string","id":1,"name":"url"} +,{"type":"bytes","id":2,"name":"uploadKey"} +]}, +"doc":[ +"Requesting pload url",{"type":"reference","argument":"expectedSize","category":"full","description":"Expected size of uploading file. May be inaccurate. Used for size allocation optimizations."}],"attributes":[ +{"type":"int32","id":1,"name":"expectedSize"} +]}},{"type":"rpc","content":{ +"name":"CommitFileUpload", +"header":122, +"response":{"type":"anonymous","header":138, "doc":[ +{"type":"reference","argument":"uploadedFileLocation","category":"hidden","description":" Result file location"}] ,"attributes":[{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"uploadedFileLocation"} +]}, +"doc":[ +"Comminting uploaded file to storage"],"attributes":[ +{"type":"bytes","id":1,"name":"uploadKey"} +,{"type":"string","id":2,"name":"fileName"} +]}},{"type":"rpc","content":{ +"name":"GetFileUploadPartUrl", +"header":142, +"response":{"type":"anonymous","header":141, "doc":[ +{"type":"reference","argument":"url","category":"full","description":" Upload file part url"}] ,"attributes":[{"type":"string","id":1,"name":"url"} +]}, +"doc":[ +"Upload file part",{"type":"reference","argument":"uploadKey","category":"compact","description":"Upload Key from requestFileUploadUrl"}],"attributes":[ +{"type":"int32","id":1,"name":"partNumber"} +,{"type":"int32","id":2,"name":"partSize"} +,{"type":"bytes","id":3,"name":"uploadKey"} +]}}]}, { + "title": "Features", + "package": "features", + "doc": [ + "Enable feature discovery. Currently available features:", + "* \"call\" - private audio calls" + ], + "items": [ +{"type":"rpc","content":{ +"name":"EnableFeature", +"header":2588, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Enabling feature on the device",{"type":"reference","argument":"featureName","category":"full","description":"Feature name"},{"type":"reference","argument":"args","category":"danger","description":"Optional arguments to a feature"}],"attributes":[ +{"type":"string","id":1,"name":"featureName"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"args"} +]}},{"type":"rpc","content":{ +"name":"DisableFeature", +"header":2589, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Disabling feature on the device",{"type":"reference","argument":"featureName","category":"full","description":"Feature name"}],"attributes":[ +{"type":"string","id":1,"name":"featureName"} +]}},{"type":"rpc","content":{ +"name":"CheckFeatureEnabled", +"header":2590, +"response":{"type":"reference","name":"Bool"}, +"doc":[ +"Method for checking if feature is available to user"],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userOutPeer"} +,{"type":"string","id":2,"name":"featureName"} +]}}]}, { + "title": "EventBus", + "package": "eventbus", + "items": [ +{"type":"rpc","content":{ +"name":"CreateNewEventBus", +"header":2665, +"response":{"type":"anonymous","header":2666, "doc":[ +"Created new Event Bus",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Your Device Id"}] ,"attributes":[{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"deviceId"} +]}, +"doc":[ +"Create new Event Bus",{"type":"reference","argument":"timeout","category":"full","description":"Optional timeout of Event Bus"},{"type":"reference","argument":"isOwned","category":"full","description":"Is Event Bus owned by creator"}],"attributes":[ +{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":1,"name":"timeout"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isOwned"} +]}},{"type":"rpc","content":{ +"name":"JoinEventBus", +"header":2668, +"response":{"type":"anonymous","header":2669, "doc":[ +{"type":"reference","argument":"deviceId","category":"full","description":" Your Device Id"},{"type":"reference","argument":"rejoinToken","category":"full","description":" Token that can be used for rejoining event bus with same device id"}] ,"attributes":[{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"deviceId"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"rejoinToken"} +]}, +"doc":[ +"Joining Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"timeout","category":"full","description":"Join timeout"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} +]}},{"type":"rpc","content":{ +"name":"ReJoinEventBus", +"header":2675, +"response":{"type":"anonymous","header":2676, "doc":[ +{"type":"reference","argument":"deviceId","category":"hidden","description":" Your Device Id"}] ,"attributes":[{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"deviceId"} +]}, +"doc":[ +"Rejoining to event bus after session was disposed",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"rejoinToken","category":"full","description":"Rejoin Token"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":"bytes","id":2,"name":"rejoinToken"} +]}},{"type":"rpc","content":{ +"name":"KeepAliveEventBus", +"header":2670, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Keep Alive Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"timeout","category":"full","description":"Optional timeout for keep alive"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} +]}},{"type":"rpc","content":{ +"name":"DisposeEventBus", +"header":2667, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Dispose Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +]}},{"type":"rpc","content":{ +"name":"PostToEventBus", +"header":2671, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Event Bus Destination",{"type":"reference","argument":"id","category":"full","description":"Bus Id"},{"type":"reference","argument":"destinations","category":"full","description":"If Empty need to broadcase message to everyone"},{"type":"reference","argument":"message","category":"hidden","description":"Message"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"destinations"} +,{"type":"bytes","id":3,"name":"message"} +]}},{"type":"update","content":{ +"name":"EventBusDeviceConnected", +"header":2561, +"doc":[ +"Update about pubsub device connected",{"type":"reference","argument":"id","category":"full","description":" ID of Event Bus"},{"type":"reference","argument":"userId","category":"full","description":" Joined User Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Joined Device Unique Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"userId"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} +]}},{"type":"update","content":{ +"name":"EventBusDeviceDisconnected", +"header":2563, +"doc":[ +"Update about device disconnected",{"type":"reference","argument":"id","category":"full","description":" ID of Event Bus"},{"type":"reference","argument":"userId","category":"full","description":" Joined User Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Disconnected Device unique Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"userId"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} +]}},{"type":"update","content":{ +"name":"EventBusMessage", +"header":2562, +"doc":[ +"Event Bus Message",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"senderId","category":"full","description":" Sender of message"},{"type":"reference","argument":"senderDeviceId","category":"full","description":" Device Id of sender"},{"type":"reference","argument":"message","category":"hidden","description":" Message"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"senderId"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"randomId"}},"id":3,"name":"senderDeviceId"} +,{"type":"bytes","id":4,"name":"message"} +]}},{"type":"update","content":{ +"name":"EventBusDisposed", +"header":2564, +"doc":[ +"Event Bus dispose",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +]}}]}, { + "title": "Values", + "package": "values", + "doc": [ + "Synced Values" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"SyncedValue", +"doc":[ +"Synced Value container",{"type":"reference","argument":"id","category":"full","description":" Unique Id of a value. Unique in the scope of one named value."},{"type":"reference","argument":"value","category":"full","description":" Optional value"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"value"} +]}},{"type":"rpc","content":{ +"name":"LoadSyncedSet", +"header":2679, +"response":{"type":"anonymous","header":2680, "doc":[ +{"type":"reference","argument":"values","category":"full","description":" Current set values"},{"type":"reference","argument":"isStrong","category":"full","description":" Is this value strong and stored in sequence. By default is true."}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":1,"name":"values"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isStrong"} +]}, +"doc":[ +"Loading synced set",{"type":"reference","argument":"setName","category":"hidden","description":"readable name of the set"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +]}},{"type":"update","content":{ +"name":"SynedSetUpdated", +"header":72, +"doc":[ +"Update about synced set update",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"syncedValues","category":"full","description":" Current set values"},{"type":"reference","argument":"isStrong","category":"full","description":" Is this value strong and need to be stored on disk"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":2,"name":"syncedValues"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isStrong"} +]}},{"type":"update","content":{ +"name":"SyncedSetAddedOrUpdated", +"header":73, +"doc":[ +"Update about added or updated values in the synced set",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"addedOrUpdatedValues","category":"hidden","description":" Added or updated values"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":2,"name":"addedOrUpdatedValues"} +]}},{"type":"update","content":{ +"name":"SyncedSetRemoved", +"header":74, +"doc":[ +"Update about removed items from synced set",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"removedItems","category":"full","description":" Removed Items from the set"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"removedItems"} +]}}]}, { + "title": "WebRTC", + "package": "webrtc", + "doc": [ + "WebRTC package that enables support to audio and video calls" + ], + "items": [ +{"type":"update","content":{ +"name":"IncomingCall", +"header":52, +"doc":[ +"Update about incoming call (Sent every 10 seconds)",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"attemptIndex","category":"full","description":" Optional attempt Index"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"opt","childType":"int32"},"id":2,"name":"attemptIndex"} +]}},{"type":"update","content":{ +"name":"CallHandled", +"header":53, +"doc":[ +"Update about incoming call handled",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"attemptIndex","category":"full","description":" Optional attempt Index"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"opt","childType":"int32"},"id":2,"name":"attemptIndex"} +]}},{"type":"update","content":{ +"name":"CallUpgraded", +"header":56, +"doc":[ +"Update about call moved to other peer",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"groupId","category":"full","description":" Upgraded group id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupId"} +]}},{"type":"rpc","content":{ +"name":"GetCallInfo", +"header":2600, +"response":{"type":"anonymous","header":2606, "doc":[ +{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"groups","category":"compact","description":" Groups"},{"type":"reference","argument":"users","category":"compact","description":" Users"},{"type":"reference","argument":"eventBusId","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"isAudioOnlyCall","category":"full","description":" Is Audio Only Call. Default is true"},{"type":"reference","argument":"isVideoOnlyCall","category":"full","description":" Is Video Only Call. Default is false."},{"type":"reference","argument":"isVideoPreferred","category":"full","description":" Is Video preferred"}] ,"attributes":[{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":2,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} +,{"type":{"type":"alias","childType":"busId"},"id":4,"name":"eventBusId"} +,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"isAudioOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isVideoOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":7,"name":"isVideoPreferred"} +]}, +"doc":[ +"Getting Call Information",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +]}},{"type":"rpc","content":{ +"name":"DoCall", +"header":2597, +"response":{"type":"anonymous","header":2598, "doc":[ +{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"eventBusId","category":"full","description":" Call Event Bus Id"}] ,"attributes":[{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"alias","childType":"busId"},"id":2,"name":"eventBusId"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} +]}, +"doc":[ +"Do Call. Right after a call client need to start sending CallInProgress",{"type":"reference","argument":"peer","category":"full","description":"destination peer"},{"type":"reference","argument":"timeout","category":"full","description":"Initial timeout"},{"type":"reference","argument":"isAudioOnlyCall","category":"full","description":"Is Audio only call. Default is true."},{"type":"reference","argument":"isVideoOnlyCall","category":"full","description":"Is Video Only call. Default is false."},{"type":"reference","argument":"isVideoPreferred","category":"full","description":"Is Video preferred"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isAudioOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isVideoOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isVideoPreferred"} +]}},{"type":"rpc","content":{ +"name":"UpgradeCall", +"header":2677, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Method for upgrading a call from private call to group call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"},{"type":"reference","argument":"peer","category":"full","description":"Destination peer for upgrading"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"struct","childType":"GroupOutPeer"},"id":2,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"DoCallAgain", +"header":2678, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Call again to user",{"type":"reference","argument":"callId","category":"full","description":"Call Id"},{"type":"reference","argument":"user","category":"full","description":"User to call again"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"user"} +]}},{"type":"rpc","content":{ +"name":"JoinCall", +"header":2683, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Joining Call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +]}},{"type":"rpc","content":{ +"name":"RejectCall", +"header":2684, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Rejecting Call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +]}},{"type":"rpc","content":{ +"name":"OptimizeSDP", +"header":2685, +"response":{"type":"anonymous","header":2686, "doc":[ +{"type":"reference","argument":"optimizedSDP","category":"hidden","description":" Optimized version of SDP"}] ,"attributes":[{"type":"string","id":1,"name":"optimizedSDP"} +]}, +"doc":[ +"Optimizing SDP",{"type":"reference","argument":"type","category":"full","description":"Type of SDP (offer or answer)"},{"type":"reference","argument":"sdp","category":"full","description":"SDP value"},{"type":"reference","argument":"ownSettings","category":"full","description":"Own Settings"},{"type":"reference","argument":"theirSettings","category":"full","description":"Their Settings"}],"attributes":[ +{"type":"string","id":1,"name":"type"} +,{"type":"string","id":2,"name":"sdp"} +,{"type":{"type":"struct","childType":"PeerSettings"},"id":3,"name":"ownSettings"} +,{"type":{"type":"struct","childType":"PeerSettings"},"id":4,"name":"theirSettings"} +]}}, { + "type":"struct", + "content": { + "name":"ICEServer", +"doc":[ +"ICE Server description",{"type":"reference","argument":"url","category":"full","description":" Url to server"},{"type":"reference","argument":"username","category":"full","description":" Optional username"},{"type":"reference","argument":"credential","category":"danger","description":" Optional credential"}],"attributes":[ +{"type":"string","id":1,"name":"url"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"username"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"credential"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"WebRTCSignaling","attributes":[ +]}},{"type":"comment","content":"Advertising"}, { + "type":"struct", + "content": { + "name":"AdvertiseSelf", +"doc":[ +"Advertizing self to a master mode",{"type":"reference","argument":"peerSettings","category":"full","description":" Optional peer Settings"}],"trait":{"name":"WebRTCSignaling","key":21},"attributes":[ +{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":1,"name":"peerSettings"} +]}}, { + "type":"struct", + "content": { + "name":"AdvertiseMaster", +"doc":[ +"Sent by master"],"trait":{"name":"WebRTCSignaling","key":26},"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"ICEServer"}},"id":1,"name":"server"} +]}},{"type":"comment","content":"Web RTC signaling"}, { + "type":"struct", + "content": { + "name":"Candidate", +"doc":[ +"Candidate signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of candidate"},{"type":"reference","argument":"index","category":"full","description":" Index of candidate"},{"type":"reference","argument":"id","category":"full","description":" Id of candidate"},{"type":"reference","argument":"sdp","category":"full","description":" SDP of candidate"}],"trait":{"name":"WebRTCSignaling","key":3},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} +,{"type":"int32","id":2,"name":"index"} +,{"type":"string","id":3,"name":"id"} +,{"type":"string","id":4,"name":"sdp"} +]}}, { + "type":"struct", + "content": { + "name":"Offer", +"doc":[ +"Offer signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of offer"},{"type":"reference","argument":"sdp","category":"full","description":" Offer SDP"},{"type":"reference","argument":"ownPeerSettings","category":"full","description":" Optional Own Peer settings"}],"trait":{"name":"WebRTCSignaling","key":4},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} +,{"type":"string","id":2,"name":"sdp"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":3,"name":"ownPeerSettings"} +]}}, { + "type":"struct", + "content": { + "name":"Answer", +"doc":[ +"Answer signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of answer"},{"type":"reference","argument":"sdp","category":"full","description":" Answer SDP"}],"trait":{"name":"WebRTCSignaling","key":5},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} +,{"type":"string","id":2,"name":"sdp"} +]}}, { + "type":"struct", + "content": { + "name":"MediaStreamsUpdated", +"doc":[ +"Update about media stream settings updated. Can be sent before offer/answer.",{"type":"reference","argument":"isAudioEnabled","category":"full","description":" Is Audio Enabled in current connection. True by default."},{"type":"reference","argument":"isVideoEnabled","category":"full","description":" Is Video Enabled in current connection. False by default."}],"trait":{"name":"WebRTCSignaling","key":28},"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"isAudioEnabled"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isVideoEnabled"} +]}},{"type":"comment","content":"Call Controlling events"}, { + "type":"struct", + "content": { + "name":"NeedOffer", +"doc":[ +"Notification from master that offer is required",{"type":"reference","argument":"device","category":"full","description":" Destination Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"},{"type":"reference","argument":"peerSettings","category":"full","description":" Optional peer settings"}],"trait":{"name":"WebRTCSignaling","key":8},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":3,"name":"peerSettings"} +]}}, { + "type":"struct", + "content": { + "name":"NegotinationSuccessful", +"doc":[ +"Notification about on negotiation is successful",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":24},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"EnableConnection", +"doc":[ +"Notification about enabling connection to peer",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":22},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"OnRenegotiationNeeded", +"doc":[ +"Need renegotiate session. For example when streams are changed.",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":25},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"CloseSession", +"doc":[ +"Close this session and be ready to",{"type":"reference","argument":"device","category":"hidden","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id for renegotiation"}],"trait":{"name":"WebRTCSignaling","key":6},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"NeedDisconnect", +"doc":[ +"Notification about requirement about required disconnection from peer",{"type":"reference","argument":"device","category":"hidden","description":" Device Id"}],"trait":{"name":"WebRTCSignaling","key":20},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +]}}, { + "type":"struct", + "content": { + "name":"ActiveCall", +"doc":[ +"Active Calls. Used in broadcasting states of current calls.",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"peer","category":"full","description":" Call's peer"},{"type":"reference","argument":"callMembers","category":"full","description":" Call Members"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"struct","childType":"Peer"},"id":2,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"CallMember"}},"id":3,"name":"callMembers"} +]}}, { + "type": "enum", "content": { - "name": "CombinedUpdate", - "header": 2625, - "doc": [ - "Combined update", - { - "type": "reference", - "argument": "seqStart", - "category": "full", - "description": " Sequence number start" - }, - { - "type": "reference", - "argument": "seqEnd", - "category": "full", - "description": " Sequence number end" - }, + "name": "CallMemberState", + "values": [ { - "type": "reference", - "argument": "state", - "category": "full", - "description": " Sequence state" + "name": "RINGING", + "id": 1 }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Update's users" + "name": "RINGING_REACHED", + "id": 4 }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Update's groups" + "name": "CONNECTING", + "id": 2 }, { - "type": "reference", - "argument": "updates", - "category": "full", - "description": " Updates (can be empty)" + "name": "CONNECTED", + "id": 3 }, { - "type": "reference", - "argument": "messages", - "category": "full", - "description": " New messages" + "name": "ENDED", + "id": 5 } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seqStart" - }, - { - "type": "int32", - "id": 2, - "name": "seqEnd" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 4, - "name": "users" - }, + ] + } + }, { + "type":"struct", + "content": { + "name":"CallMemberStateHolder", +"doc":[ +"Call Member state holder",{"type":"reference","argument":"state","category":"full","description":" State Value"},{"type":"reference","argument":"fallbackIsRinging","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsConnected","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsConnecting","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsRingingReached","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsEnded","category":"full","description":" Fallback flag for future compatibility of state"}],"attributes":[ +{"type":{"type":"enum","childType":"CallMemberState"},"id":1,"name":"state"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"fallbackIsRinging"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"fallbackIsConnected"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"fallbackIsConnecting"} +,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"fallbackIsRingingReached"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"fallbackIsEnded"} +]}}, { + "type":"struct", + "content": { + "name":"CallMember", +"doc":[ +"Call Member",{"type":"reference","argument":"userId","category":"full","description":" Member User Id"},{"type":"reference","argument":"state","category":"full","description":" State of member"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"userId"} +,{"type":{"type":"struct","childType":"CallMemberStateHolder"},"id":3,"name":"state"} +]}}, { + "type":"struct", + "content": { + "name":"PeerSettings", +"doc":[ +"Peer Settings",{"type":"reference","argument":"is3DESSupported","category":"full","description":" Marking if 3DES supported. Default is false."},{"type":"reference","argument":"isMobile","category":"full","description":" Is Peer a mobile phone. Default is false."},{"type":"reference","argument":"canBeAudioRelay","category":"full","description":" If peer can audio relay. Default is false."},{"type":"reference","argument":"canPreConnect","category":"full","description":" If peer can preconnect before answer"}],"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"is3DESSupported"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isMobile"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"canBeAudioRelay"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"canPreConnect"} +]}}]}, { + "title": "Config sync", + "package": "configs", + "doc": [ + "Parameter Syncronization across devices. Can be used for simple sync", + "across devices without rewriting server side code." + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Parameter", +"doc":[ +"Syncing Parameter",{"type":"reference","argument":"key","category":"full","description":" Key of parameter"},{"type":"reference","argument":"value","category":"full","description":" Value of parameter"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":"string","id":2,"name":"value"} +]}},{"type":"rpc","content":{ +"name":"GetParameters", +"header":134, +"response":{"type":"anonymous","header":135, "doc":[ +{"type":"reference","argument":"parameters","category":"full","description":" Current parameters"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Parameter"}},"id":1,"name":"parameters"} +]}, +"doc":[ +"Getting Parameters"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"EditParameter", +"header":128, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Change parameter value",{"type":"reference","argument":"key","category":"full","description":"Key of parameter"},{"type":"reference","argument":"value","category":"full","description":"Value of parameter"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"value"} +]}},{"type":"update","content":{ +"name":"ParameterChanged", +"header":131, +"doc":[ +"Update about parameter change",{"type":"reference","argument":"key","category":"full","description":" Key of parameter"},{"type":"reference","argument":"value","category":"full","description":" Value of parameter"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"value"} +]}}]}, { + "title": "Stats", + "package": "stats", + "doc": [ + "Saving statistics information" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"EventRecord", +"doc":[ +"Record for stored event"],"attributes":[ +{"type":{"type":"alias","childType":"date"},"id":1,"name":"date"} +,{"type":{"type":"trait","childType":"Event"},"id":2,"name":"event"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"Event","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"UntypedEvent", +"doc":[ +"Untyped event",{"type":"reference","argument":"eventType","category":"full","description":" Event type"},{"type":"reference","argument":"params","category":"full","description":" optional params for event"}],"trait":{"name":"Event","key":1},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"eventType"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":2,"name":"params"} +]}}, { + "type":"struct", + "content": { + "name":"ContentViewChanged", +"doc":[ +"Content view event",{"type":"reference","argument":"contentType","category":"full","description":" unique content id"},{"type":"reference","argument":"visible","category":"full","description":" Is content visible"},{"type":"reference","argument":"params","category":"full","description":" optional params for content view"}],"trait":{"name":"Event","key":2},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"contentType"} +,{"type":"string","id":2,"name":"contentId"} +,{"type":"bool","id":3,"name":"visible"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":4,"name":"params"} +]}}, { + "type":"struct", + "content": { + "name":"AppVisibleChanged", +"doc":[ +"On App Visible event",{"type":"reference","argument":"visible","category":"full","description":" Is app visible"}],"trait":{"name":"Event","key":4},"expandable":"true","attributes":[ +{"type":"bool","id":1,"name":"visible"} +]}},{"type":"rpc","content":{ +"name":"StoreEvents", +"header":243, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Storing events on server",{"type":"reference","argument":"events","category":"full","description":"Events for storing"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"Event"}},"id":1,"name":"events"} +]}}]}, { + "title": "Raw API", + "package": "raw", + "doc": [ + "Schema-less API that is useful for external integrations" + ], + "items": [ +{"type":"rpc","content":{ +"name":"RawRequest", +"header":2569, +"response":{"type":"anonymous","header":2570, "doc":[ +"Response of a raw request",{"type":"reference","argument":"result","category":"full","description":" Result of request"}] ,"attributes":[{"type":{"type":"trait","childType":"RawValue"},"id":1,"name":"result"} +]}, +"doc":[ +"Making raw request to external service via shema-less RPC request",{"type":"reference","argument":"service","category":"full","description":"Service name for RPC request"},{"type":"reference","argument":"method","category":"full","description":"Method for execution"},{"type":"reference","argument":"params","category":"full","description":"Optional params for the method"}],"attributes":[ +{"type":"string","id":1,"name":"service"} +,{"type":"string","id":2,"name":"method"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":3,"name":"params"} +]}}]}, { + "title": "Wallpappers", + "package": "wallpappers", + "doc": [ + "Wallpappers support" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Wallpapper", +"doc":[ +"Wallpapper structure",{"type":"reference","argument":"id","category":"full","description":" Wallpapper id"},{"type":"reference","argument":"w","category":"full","description":" Image width"},{"type":"reference","argument":"h","category":"full","description":" Image height"},{"type":"reference","argument":"fileSize","category":"full","description":" Image file size"},{"type":"reference","argument":"file","category":"full","description":" Image file reference"},{"type":"reference","argument":"thumb","category":"full","description":" Image thumb"}],"attributes":[ +{"type":"int32","id":7,"name":"id"} +,{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"int32","id":3,"name":"fileSize"} +,{"type":{"type":"struct","childType":"FileLocation"},"id":5,"name":"file"} +,{"type":{"type":"struct","childType":"FastThumb"},"id":6,"name":"thumb"} +]}},{"type":"rpc","content":{ +"name":"LoadWallpappers", +"header":241, +"response":{"type":"anonymous","header":242, "doc":[ +"Loaded Wallpappers",{"type":"reference","argument":"wallpappers","category":"full","description":" Available wallpapper list"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Wallpapper"}},"id":1,"name":"wallpappers"} +]}, +"doc":[ +"Load available wallpappers",{"type":"reference","argument":"maxWidth","category":"full","description":"Maximum width of wallpapper"},{"type":"reference","argument":"maxHeight","category":"full","description":"Maximum height of wallpapper"}],"attributes":[ +{"type":"int32","id":1,"name":"maxWidth"} +,{"type":"int32","id":2,"name":"maxHeight"} +]}}]}, { + "title": "Push", + "package": "push", + "doc": [ + "Vendor's pushes for receiving push notifications.", + "Push notification contains current sequence number of main sequence." + ], + "items": [ +{"type":"rpc","content":{ +"name":"RegisterGooglePush", +"header":51, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registering push token on server",{"type":"reference","argument":"projectId","category":"hidden","description":"Project Id of token"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ +{"type":"int64","id":1,"name":"projectId"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterGooglePush", +"header":2631, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregistering Google Push",{"type":"reference","argument":"token","category":"danger","description":"Token value"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterApplePush", +"header":76, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registering apple push on server",{"type":"reference","argument":"apnsKey","category":"hidden","description":"apns key id"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ +{"type":"int32","id":1,"name":"apnsKey"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterApplePush", +"header":2632, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregistering Apple Push",{"type":"reference","argument":"token","category":"full","description":"Token"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterApplePushKit", +"header":2576, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registration of a new Apple's PushKit tokens",{"type":"reference","argument":"apnsKey","category":"hidden","description":"APNS key id"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ +{"type":"int32","id":1,"name":"apnsKey"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterApplePushKit", +"header":2633, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregistering Apple Push Kit token",{"type":"reference","argument":"token","category":"hidden","description":"Token Value"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterApplePushToken", +"header":2593, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registering Apple Push Token",{"type":"reference","argument":"bundleId","category":"full","description":"Bundle Id of app"},{"type":"reference","argument":"token","category":"full","description":"Push token"}],"attributes":[ +{"type":"string","id":1,"name":"bundleId"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterApplePushToken", +"header":2634, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregister Apple Push token",{"type":"reference","argument":"token","category":"hidden","description":"Token value"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterActorPush", +"header":2575, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Register Actor Push endpoint",{"type":"reference","argument":"endpoint","category":"full","description":"Endpoint for push sending"},{"type":"reference","argument":"encryptionKeys","category":"full","description":"Push Encryption keys"}],"attributes":[ +{"type":"string","id":1,"name":"endpoint"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":2,"name":"encryptionKeys"} +]}},{"type":"rpc","content":{ +"name":"UnregisterActorPush", +"header":2635, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregister Actor Push endpoint",{"type":"reference","argument":"endpoint","category":"full","description":"Endpoint for unregistering"}],"attributes":[ +{"type":"string","id":1,"name":"endpoint"} +]}}]}, { + "title": "Encryption", + "package": "encryption", + "doc": [ + "Package that include encryption support", + "Key alg types:", + "* curve25519 - https://en.wikipedia.org/wiki/Curve25519", + "* rsa-2048", + "* rsa-4096", + "* aes-128", + "* kuznechik-128", + "", + "Signature alg types:", + "* Ed25519 - used curve25519 conveted to Ed255519 for signing and validataion" + ], + "items": [ +{"type":"comment","content":"Public Keys"}, { + "type":"struct", + "content": { + "name":"EncryptionKeyGroup", +"doc":[ +"Encryption Key Group",{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"identityKey","category":"full","description":" Key that is used as identity and for validation of Key Group changes"},{"type":"reference","argument":"supportedEncryption","category":"full","description":" Supported encryption methods by this key group"},{"type":"reference","argument":"keys","category":"compact","description":" keys of Key Group"},{"type":"reference","argument":"signatures","category":"compact","description":" Signatures of keys"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +,{"type":{"type":"list","childType":"string"},"id":2,"name":"supportedEncryption"} +,{"type":{"type":"struct","childType":"EncryptionKey"},"id":3,"name":"identityKey"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":4,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":5,"name":"signatures"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptionKeySignature", +"doc":[ +"Signed Key. Usually used for public keys.",{"type":"reference","argument":"keyId","category":"full","description":" Key Id used for signature"},{"type":"reference","argument":"signatureAlg","category":"full","description":" Signature algorithm"},{"type":"reference","argument":"signature","category":"full","description":" Signature value"}],"attributes":[ +{"type":"int64","id":1,"name":"keyId"} +,{"type":"string","id":2,"name":"signatureAlg"} +,{"type":"bytes","id":3,"name":"signature"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptionKey", +"doc":[ +"Encryption Key",{"type":"reference","argument":"keyId","category":"full","description":" Key Id"},{"type":"reference","argument":"keyAlg","category":"full","description":" Key Algorithm"},{"type":"reference","argument":"keyMaterial","category":"compact","description":" Public key material. Can be null, but always not null for LoadPublicKey"},{"type":"reference","argument":"keyHash","category":"hidden","description":" If keyMaterial is null, pass keyHash - SHA256 of key"}],"expandable":"true","attributes":[ +{"type":"int64","id":1,"name":"keyId"} +,{"type":"string","id":2,"name":"keyAlg"} +,{"type":{"type":"opt","childType":"bytes"},"id":3,"name":"keyMaterial"} +,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"keyHash"} +]}},{"type":"response","content":{ +"name":"PublicKeys", +"header":2602, +"doc":[ +"Public Keys response",{"type":"reference","argument":"publicKey","category":"full","description":" Public keys"},{"type":"reference","argument":"signatures","category":"full","description":" Signatures of public keys"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":1,"name":"publicKey"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":2,"name":"signatures"} +]}},{"type":"response","content":{ +"name":"PublicKeyGroups", +"header":2604, +"doc":[ +"Public key groups response"],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeyGroup"}},"id":1,"name":"publicKeyGroups"} +]}},{"type":"rpc","content":{ +"name":"LoadPublicKeyGroups", +"header":2601, +"response":{"type":"reference","name":"PublicKeyGroups"}, +"doc":[ +"Loading Public key groups",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} +]}},{"type":"rpc","content":{ +"name":"LoadPublicKey", +"header":2605, +"response":{"type":"reference","name":"PublicKeys"}, +"doc":[ +"Loading public key explictly",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"},{"type":"reference","argument":"keyGroupId","category":"full","description":"Key group's id"},{"type":"reference","argument":"keyIds","category":"full","description":"Key ids for loading"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} +,{"type":"int32","id":2,"name":"keyGroupId"} +,{"type":{"type":"list","childType":"int64"},"id":3,"name":"keyIds"} +]}},{"type":"rpc","content":{ +"name":"LoadPrePublicKeys", +"header":2603, +"response":{"type":"reference","name":"PublicKeys"}, +"doc":[ +"Loading SOME of ephermal public keys",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"},{"type":"reference","argument":"keyGroupId","category":"full","description":"User's key group id"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} +,{"type":"int32","id":2,"name":"keyGroupId"} +]}},{"type":"update","content":{ +"name":"PublicKeyGroupChanged", +"header":103, +"doc":[ +"Update about public key group changed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Updated Key Group"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} +]}},{"type":"update","content":{ +"name":"KeysAdded", +"header":112, +"doc":[ +"Update about keys added to Key Group",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"keys","category":"compact","description":" Added keys"},{"type":"reference","argument":"signatures","category":"compact","description":" Signatures of a public key"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":3,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":4,"name":"signatures"} +]}},{"type":"update","content":{ +"name":"KeysRemoved", +"header":113, +"doc":[ +"Update about keys removed from Key Group",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"keyIds","category":"full","description":" Removed keys"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +,{"type":{"type":"list","childType":"int64"},"id":3,"name":"keyIds"} +]}},{"type":"update","content":{ +"name":"PublicKeyGroupAdded", +"header":104, +"doc":[ +"Update about public key group added",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Added Key Group"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} +]}},{"type":"update","content":{ +"name":"PublicKeyGroupRemoved", +"header":105, +"doc":[ +"Update about public key group removed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Removed Key Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +]}},{"type":"comment","content":"Device Side"},{"type":"rpc","content":{ +"name":"CreateNewKeyGroup", +"header":2609, +"response":{"type":"anonymous","header":2610, "doc":[ +{"type":"reference","argument":"keyGroupId","category":"full","description":" Created Key Group id"}] ,"attributes":[{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}, +"doc":[ +"Creation of a new Key Group",{"type":"reference","argument":"identityKey","category":"full","description":"Identity Key of a new group"},{"type":"reference","argument":"supportedEncryptions","category":"full","description":"Supported encryption methods"},{"type":"reference","argument":"keys","category":"full","description":"keys of current group"},{"type":"reference","argument":"signatures","category":"full","description":"signatures of keys"}],"attributes":[ +{"type":{"type":"struct","childType":"EncryptionKey"},"id":1,"name":"identityKey"} +,{"type":{"type":"list","childType":"string"},"id":2,"name":"supportedEncryptions"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":3,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":4,"name":"signatures"} +]}},{"type":"rpc","content":{ +"name":"DeleteKeyGroup", +"header":2611, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Deletion of a Key Group",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for deletion"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}},{"type":"rpc","content":{ +"name":"DisconnectKeyGroup", +"header":2613, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Disconnect Key Group from device",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for disconnection"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}},{"type":"rpc","content":{ +"name":"ConnectKeyGroup", +"header":2614, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Connectiong Key Group to device",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for connection"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}},{"type":"rpc","content":{ +"name":"UploadPreKey", +"header":2612, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Uploading Ephermal Keys",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id"},{"type":"reference","argument":"keys","category":"compact","description":"Encryprion keys"},{"type":"reference","argument":"signatures","category":"compact","description":"Key signatures"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":2,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":3,"name":"signatures"} +]}},{"type":"comment","content":"Encrypted Packages"}, { + "type":"struct", + "content": { + "name":"EncryptedBox", +"doc":[ +"Encrypted package that is encrypted for multiple keys",{"type":"reference","argument":"keys","category":"full","description":" Encrypted encryption keys"},{"type":"reference","argument":"algType","category":"full","description":" Package encryption type"},{"type":"reference","argument":"encPackage","category":"full","description":" Encrypted package"},{"type":"reference","argument":"senderKeyGroupId","category":"full","description":" Sender key group"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":4,"name":"senderKeyGroupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncyptedBoxKey"}},"id":1,"name":"keys"} +,{"type":"string","id":2,"name":"algType"} +,{"type":"bytes","id":3,"name":"encPackage"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptedBoxSignature"}},"id":5,"name":"signatures"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptedBoxSignature", +"doc":[ +"Signature for encrypted package",{"type":"reference","argument":"algType","category":"full","description":" Alg Type"},{"type":"reference","argument":"signature","category":"full","description":" Signature of encrypted package"}],"attributes":[ +{"type":"string","id":1,"name":"algType"} +,{"type":"bytes","id":2,"name":"signature"} +]}}, { + "type":"struct", + "content": { + "name":"EncyptedBoxKey", +"doc":[ +"Encrypted package encryption key",{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"algType","category":"full","description":" Key encryption algorithm"},{"type":"reference","argument":"encryptedKey","category":"hidden","description":" Encrypted encryption key"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"usersId"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +,{"type":"string","id":3,"name":"algType"} +,{"type":"bytes","id":4,"name":"encryptedKey"} +]}}, { + "type":"struct", + "content": { + "name":"KeyGroupId", +"doc":[ +"References to key groups",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +]}}, { + "type":"struct", + "content": { + "name":"KeyGroupHolder", +"doc":[ +"Key Group Holder",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Key Group"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} +]}},{"type":"rpc","content":{ +"name":"SendEncryptedPackage", +"header":2657, +"response":{"type":"anonymous","header":2664, "doc":[ +{"type":"reference","argument":"date","category":"full","description":" date"},{"type":"reference","argument":"obsoleteKeyGroups","category":"full","description":" obsolete key group ids"},{"type":"reference","argument":"missedKeyGroups","category":"full","description":" missed key groups"}] ,"attributes":[{"type":{"type":"opt","childType":{"type":"alias","childType":"date"}},"id":1,"name":"date"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupId"}},"id":2,"name":"obsoleteKeyGroups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupHolder"}},"id":3,"name":"missedKeyGroups"} +]}, +"doc":[ +"Sending encrypted package",{"type":"reference","argument":"randomId","category":"hidden","description":"Random id"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"randomId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":2,"name":"destPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupId"}},"id":3,"name":"ignoredKeyGroups"} +,{"type":{"type":"struct","childType":"EncryptedBox"},"id":4,"name":"encryptedBox"} +]}},{"type":"update","content":{ +"name":"EncryptedPackage", +"header":177, +"doc":[ +"Update about encrypted package",{"type":"reference","argument":"randomId","category":"full","description":" Random Id of package"},{"type":"reference","argument":"date","category":"full","description":" Sending date of package"},{"type":"reference","argument":"senderId","category":"full","description":" Sender id of package"},{"type":"reference","argument":"encryptedBox","category":"full","description":" Encrypted box"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"randomId"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"date"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"senderId"} +,{"type":{"type":"struct","childType":"EncryptedBox"},"id":4,"name":"encryptedBox"} +]}}]}, { + "title": "Storage", + "package": "storage", + "items": [ +{"type":"rpc","content":{ +"name":"UploadSharedBlob", +"header":2660, +"response":{"type":"anonymous","header":2661, "doc":[ +{"type":"reference","argument":"sharedObjectId","category":"full","description":" Id of shared object"}] ,"attributes":[{"type":"int32","id":1,"name":"sharedObjectId"} +]}, +"doc":[ +"Upload shared blob with user",{"type":"reference","argument":"destPeer","category":"full","description":"Destination peer"},{"type":"reference","argument":"bucket","category":"full","description":"Bucked name"},{"type":"reference","argument":"blob","category":"full","description":"Blob data"},{"type":"reference","argument":"randomId","category":"full","description":"Random id for protecting from double upload"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"destPeer"} +,{"type":"string","id":2,"name":"bucket"} +,{"type":"bytes","id":3,"name":"blob"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"randomId"} +]}},{"type":"rpc","content":{ +"name":"DownloadSharedBlob", +"header":2662, +"response":{"type":"anonymous","header":2663, "doc":[ +{"type":"reference","argument":"blob","category":"full","description":" Blob contents"}] ,"attributes":[{"type":"bytes","id":1,"name":"blob"} +]}, +"doc":[ +"Download shared blob",{"type":"reference","argument":"destPeer","category":"full","description":"Destination peer"},{"type":"reference","argument":"bucket","category":"full","description":"Bucket name"},{"type":"reference","argument":"objectId","category":"full","description":"Object Id"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"destPeer"} +,{"type":"string","id":2,"name":"bucket"} +,{"type":"int32","id":3,"name":"objectId"} +]}}]}, { + "title": "Peers", + "package": "peers", + "doc": [ + "Peer is an identificator of specific conversation." + ], + "items": [ + { + "type": "enum", + "content": { + "name": "PeerType", + "values": [ { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 5, - "name": "groups" + "name": "Private", + "id": 1 }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UpdateContainer" - } - }, - "id": 6, - "name": "updates" + "name": "Group", + "id": 2 }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageContainer" - } - }, - "id": 7, - "name": "messages" + "name": "EncryptedPrivate", + "id": 3 } - ] - } - }, - { + ] + } + }, { + "type":"struct", + "content": { + "name":"Peer", +"doc":[ +"Peer",{"type":"reference","argument":"type","category":"full","description":" Peer Type"},{"type":"reference","argument":"id","category":"full","description":" Peer Id"}],"attributes":[ +{"type":{"type":"enum","childType":"PeerType"},"id":1,"name":"type"} +,{"type":"int32","id":2,"name":"id"} +]}}, { + "type":"struct", + "content": { + "name":"OutPeer", +"doc":[ +"Out peer with access hash",{"type":"reference","argument":"type","category":"full","description":" Peer Type"},{"type":"reference","argument":"id","category":"full","description":" Peer Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Peer access hash"}],"attributes":[ +{"type":{"type":"enum","childType":"PeerType"},"id":1,"name":"type"} +,{"type":"int32","id":2,"name":"id"} +,{"type":"int64","id":3,"name":"accessHash"} +]}}, { + "type":"struct", + "content": { + "name":"UserOutPeer", +"doc":[ +"User's out peer",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"accessHash","category":"danger","description":" User's access hash"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}, { + "type":"struct", + "content": { + "name":"GroupOutPeer", +"doc":[ +"Group's out peer",{"type":"reference","argument":"groupId","category":"full","description":" Group's Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Group's access hash"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}]}, { + "title": "Sequence and Updates", + "package": "sequence", + "doc": [ + "Each device has it's own update sequence. At the begining application request initial sequence state by", + "calling GetState. On each application restart or NewSessionCreated application calls GetDifference for receiving", + "updates in update sequence.", + "GetState and GetDifference automatically subscribes session to receiving updates in session.", + "Each update has seq and state. Seq is sequental index of updated and used for detecting of holes in update sequence", + "(because of server failure or session die) on client side.", + "All updates needed to be processed in partucular order according to seq values.", + "In some updates there can be references to users that are not available at client yer. In this case application need", + "to ignore such update and init getting difference." + ], + "items": [ +{"type":"update_box","content":{ +"name":"SeqUpdate", +"header":13, +"doc":[ +"Sequence update",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of update"},{"type":"reference","argument":"state","category":"compact","description":" Sequece state of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":"int32","id":3,"name":"updateHeader"} +,{"type":"bytes","id":4,"name":"update"} +]}},{"type":"update_box","content":{ +"name":"FatSeqUpdate", +"header":73, +"doc":[ +"Fat sequence update with additional data",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of update"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"},{"type":"reference","argument":"users","category":"compact","description":" Users that are referenced in update"},{"type":"reference","argument":"groups","category":"compact","description":" Groups that are referenced in update"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":"int32","id":3,"name":"updateHeader"} +,{"type":"bytes","id":4,"name":"update"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":5,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":6,"name":"groups"} +]}},{"type":"update_box","content":{ +"name":"WeakUpdate", +"header":26, +"doc":[ +"Out of sequence update (for typing and online statuses)",{"type":"reference","argument":"date","category":"full","description":" Date of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"}],"attributes":[ +{"type":"int64","id":1,"name":"date"} +,{"type":"int32","id":2,"name":"updateHeader"} +,{"type":"bytes","id":3,"name":"update"} +]}},{"type":"update_box","content":{ +"name":"WeakFatUpdate", +"header":2673, +"doc":[ +"Fat Weak Update",{"type":"reference","argument":"date","category":"full","description":" Date of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"full","description":" The update"},{"type":"reference","argument":"users","category":"full","description":" Users that are referenced in update"},{"type":"reference","argument":"groups","category":"full","description":" Groups that are referenced in update"}],"attributes":[ +{"type":"int64","id":1,"name":"date"} +,{"type":"int32","id":2,"name":"updateHeader"} +,{"type":"bytes","id":3,"name":"update"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} +]}},{"type":"update_box","content":{ +"name":"SeqUpdateTooLong", +"header":25, +"doc":[ +"Notification about requiring performing manual GetDifference"],"attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"UpdateContainer", +"doc":[ +"Update container",{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"compact","description":" The updatre"}],"attributes":[ +{"type":"int32","id":1,"name":"updateHeader"} +,{"type":"bytes","id":2,"name":"update"} +]}},{"type":"update_box","content":{ +"name":"CombinedUpdate", +"header":2625, +"doc":[ +"Combined update",{"type":"reference","argument":"seqStart","category":"full","description":" Sequence number start"},{"type":"reference","argument":"seqEnd","category":"full","description":" Sequence number end"},{"type":"reference","argument":"state","category":"full","description":" Sequence state"},{"type":"reference","argument":"users","category":"compact","description":" Update's users"},{"type":"reference","argument":"groups","category":"compact","description":" Update's groups"},{"type":"reference","argument":"updates","category":"full","description":" Updates (can be empty)"},{"type":"reference","argument":"messages","category":"full","description":" New messages"}],"attributes":[ +{"type":"int32","id":1,"name":"seqStart"} +,{"type":"int32","id":2,"name":"seqEnd"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UpdateContainer"}},"id":6,"name":"updates"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":7,"name":"messages"} +]}}, { "type": "enum", "content": { "name": "UpdateOptimization", @@ -20644,780 +3984,157 @@ "name": "GROUPS_V2", "id": 7 } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetState", - "header": 9, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Get main sequence state", - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 1, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetDifference", - "header": 11, - "response": { - "type": "anonymous", - "header": 12, - "doc": [ - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Seq of LAST update in updates" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of LAST update in updates" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Users referenced in updates" - }, - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups referenced in updates" - }, - { - "type": "reference", - "argument": "updates", - "category": "compact", - "description": " Updates" - }, - { - "type": "reference", - "argument": "needMore", - "category": "full", - "description": " Need to perform other difference" - }, - { - "type": "reference", - "argument": "usersRefs", - "category": "full", - "description": " Direct references of users" - }, - { - "type": "reference", - "argument": "groupsRefs", - "category": "full", - "description": " Direct References of groups" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 3, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 6, - "name": "groups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UpdateContainer" - } - }, - "id": 4, - "name": "updates" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageContainer" - } - }, - "id": 7, - "name": "messages" - }, - { - "type": "bool", - "id": 5, - "name": "needMore" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 8, - "name": "usersRefs" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 9, - "name": "groupsRefs" - } - ] - }, - "doc": [ - "Getting difference of sequence", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": "Sequence number" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": "Sequence state" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetReferencedEntitites", - "header": 2628, - "response": { - "type": "anonymous", - "header": 2629, - "doc": [ - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - }, - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Loaded groups" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 1, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 2, - "name": "groups" - } - ] - }, - "doc": [ - "Loading referenced entities", - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Users to load" - }, - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups to load. Also returns all members of a group." - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 2, - "name": "groups" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "RawUpdate", - "header": 80, - "doc": [ - "Custom Raw Update", - { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Type of content" - }, - { - "type": "reference", - "argument": "bytes", - "category": "full", - "description": " Raw data" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "type" - }, - { - "type": "bytes", - "id": 2, - "name": "bytes" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "EmptyUpdate", - "header": 85, - "doc": [ - "Empty update" - ], - "attributes": [] - } - }, - { - "type": "empty" - }, - { - "type": "rpc", - "content": { - "name": "SubscribeToOnline", - "header": 32, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Subscribing for users online", - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Users for subscription" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SubscribeFromOnline", - "header": 33, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Removing subscription for users online", - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Users of subscriptions" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SubscribeToGroupOnline", - "header": 74, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Subscribing for groups online", - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups for subscription" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 1, - "name": "groups" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SubscribeFromGroupOnline", - "header": 75, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Removing subscription for groups online", - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups of subscriptions" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 1, - "name": "groups" - } - ] - } + ] } - ] - }, - { + },{"type":"rpc","content":{ +"name":"GetState", +"header":9, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Get main sequence state",{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":1,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"GetDifference", +"header":11, +"response":{"type":"anonymous","header":12, "doc":[ +{"type":"reference","argument":"seq","category":"full","description":" Seq of LAST update in updates"},{"type":"reference","argument":"state","category":"full","description":" State of LAST update in updates"},{"type":"reference","argument":"users","category":"compact","description":" Users referenced in updates"},{"type":"reference","argument":"groups","category":"compact","description":" Groups referenced in updates"},{"type":"reference","argument":"updates","category":"compact","description":" Updates"},{"type":"reference","argument":"needMore","category":"full","description":" Need to perform other difference"},{"type":"reference","argument":"usersRefs","category":"full","description":" Direct references of users"},{"type":"reference","argument":"groupsRefs","category":"full","description":" Direct References of groups"}] ,"attributes":[{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":3,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":6,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UpdateContainer"}},"id":4,"name":"updates"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":7,"name":"messages"} +,{"type":"bool","id":5,"name":"needMore"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":8,"name":"usersRefs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":9,"name":"groupsRefs"} +]}, +"doc":[ +"Getting difference of sequence",{"type":"reference","argument":"seq","category":"full","description":"Sequence number"},{"type":"reference","argument":"state","category":"compact","description":"Sequence state"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"GetReferencedEntitites", +"header":2628, +"response":{"type":"anonymous","header":2629, "doc":[ +{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"groups","category":"compact","description":" Loaded groups"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":2,"name":"groups"} +]}, +"doc":[ +"Loading referenced entities",{"type":"reference","argument":"users","category":"compact","description":"Users to load"},{"type":"reference","argument":"groups","category":"compact","description":"Groups to load. Also returns all members of a group."}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":2,"name":"groups"} +]}},{"type":"update","content":{ +"name":"RawUpdate", +"header":80, +"doc":[ +"Custom Raw Update",{"type":"reference","argument":"type","category":"full","description":" Type of content"},{"type":"reference","argument":"bytes","category":"full","description":" Raw data"}],"attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"type"} +,{"type":"bytes","id":2,"name":"bytes"} +]}},{"type":"update","content":{ +"name":"EmptyUpdate", +"header":85, +"doc":[ +"Empty update"],"attributes":[ +]}},{"type":"empty"},{"type":"rpc","content":{ +"name":"SubscribeToOnline", +"header":32, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Subscribing for users online",{"type":"reference","argument":"users","category":"compact","description":"Users for subscription"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +]}},{"type":"rpc","content":{ +"name":"SubscribeFromOnline", +"header":33, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Removing subscription for users online",{"type":"reference","argument":"users","category":"compact","description":"Users of subscriptions"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +]}},{"type":"rpc","content":{ +"name":"SubscribeToGroupOnline", +"header":74, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Subscribing for groups online",{"type":"reference","argument":"groups","category":"compact","description":"Groups for subscription"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} +]}},{"type":"rpc","content":{ +"name":"SubscribeFromGroupOnline", +"header":75, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Removing subscription for groups online",{"type":"reference","argument":"groups","category":"compact","description":"Groups of subscriptions"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} +]}}]}, { "title": "Counters", "package": "counters", "doc": [ "Application Counters, used to display various counters in application" ], "items": [ - { - "type": "struct", - "content": { - "name": "AppCounters", - "doc": [ - "Application counters", - { - "type": "reference", - "argument": "globalCounter", - "category": "full", - "description": " Global unread counter" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 1, - "name": "globalCounter" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "CountersChanged", - "header": 215, - "doc": [ - "Update about counters changed", - { - "type": "reference", - "argument": "counters", - "category": "full", - "description": " Current Application counters" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "AppCounters" - }, - "id": 1, - "name": "counters" - } - ] - } - } - ] - }, - { + { + "type":"struct", + "content": { + "name":"AppCounters", +"doc":[ +"Application counters",{"type":"reference","argument":"globalCounter","category":"full","description":" Global unread counter"}],"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"int32"},"id":1,"name":"globalCounter"} +]}},{"type":"update","content":{ +"name":"CountersChanged", +"header":215, +"doc":[ +"Update about counters changed",{"type":"reference","argument":"counters","category":"full","description":" Current Application counters"}],"attributes":[ +{"type":{"type":"struct","childType":"AppCounters"},"id":1,"name":"counters"} +]}}]}, { "title": "Miscellaneous", "package": "misc", "items": [ - { - "type": "response", - "content": { - "name": "Void", - "header": 50, - "doc": [ - "Empty response" - ], - "attributes": [] - } - }, - { - "type": "response", - "content": { - "name": "Seq", - "header": 72, - "doc": [ - "Sequence response. Methods that return this value must process response in particular order", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of response" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " Sequence state of response" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "SeqDate", - "header": 102, - "doc": [ - "Sequence response with date. Methods that return this value must process response in particular order", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of response" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " Sequence state of response" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of response" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "Bool", - "header": 209, - "doc": [ - "Boolean response", - { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Response value" - } - ], - "attributes": [ - { - "type": "bool", - "id": 1, - "name": "value" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Config", - "doc": [ - "Configuration of system", - { - "type": "reference", - "argument": "maxGroupSize", - "category": "full", - "description": " Current maximum group size" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "maxGroupSize" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Extension", - "doc": [ - "Extention", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Extension id" - }, - { - "type": "reference", - "argument": "data", - "category": "full", - "description": " Extension data" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "bytes", - "id": 2, - "name": "data" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "Config", - "header": 42, - "doc": [ - "Update about config change", - { - "type": "reference", - "argument": "config", - "category": "full", - "description": " new config" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Config" - }, - "id": 1, - "name": "config" - } - ] - } - } - ] - }, - { +{"type":"response","content":{ +"name":"Void", +"header":50, +"doc":[ +"Empty response"],"attributes":[ +]}},{"type":"response","content":{ +"name":"Seq", +"header":72, +"doc":[ +"Sequence response. Methods that return this value must process response in particular order",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of response"},{"type":"reference","argument":"state","category":"full","description":" Sequence state of response"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +]}},{"type":"response","content":{ +"name":"SeqDate", +"header":102, +"doc":[ +"Sequence response with date. Methods that return this value must process response in particular order",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of response"},{"type":"reference","argument":"state","category":"full","description":" Sequence state of response"},{"type":"reference","argument":"date","category":"full","description":" Date of response"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"response","content":{ +"name":"Bool", +"header":209, +"doc":[ +"Boolean response",{"type":"reference","argument":"value","category":"full","description":" Response value"}],"attributes":[ +{"type":"bool","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"Config", +"doc":[ +"Configuration of system",{"type":"reference","argument":"maxGroupSize","category":"full","description":" Current maximum group size"}],"attributes":[ +{"type":"int32","id":1,"name":"maxGroupSize"} +]}}, { + "type":"struct", + "content": { + "name":"Extension", +"doc":[ +"Extention",{"type":"reference","argument":"id","category":"full","description":" Extension id"},{"type":"reference","argument":"data","category":"full","description":" Extension data"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"bytes","id":2,"name":"data"} +]}},{"type":"update","content":{ +"name":"Config", +"header":42, +"doc":[ +"Update about config change",{"type":"reference","argument":"config","category":"full","description":" new config"}],"attributes":[ +{"type":{"type":"struct","childType":"Config"},"id":1,"name":"config"} +]}}]}, { "title": "Device Info", "package": "device", "doc": [ @@ -21425,53 +4142,15 @@ "For example, getting timezone or preffered languages" ], "items": [ - { - "type": "rpc", - "content": { - "name": "NotifyAboutDeviceInfo", - "header": 229, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Notifying about device information", - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - }, - { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "Device Time Zone" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 1, - "name": "preferredLanguages" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "timeZone" - } - ] - } - } - ] - }, - { +{"type":"rpc","content":{ +"name":"NotifyAboutDeviceInfo", +"header":229, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Notifying about device information",{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"},{"type":"reference","argument":"timeZone","category":"full","description":"Device Time Zone"}],"attributes":[ +{"type":{"type":"list","childType":"string"},"id":1,"name":"preferredLanguages"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"timeZone"} +]}}]}, { "title": "Webactions", "package": "webactions", "doc": [ @@ -21479,314 +4158,112 @@ "perform actions, and pass result on action completion" ], "items": [ - { - "type": "rpc", - "content": { - "name": "InitWebaction", - "header": 116, - "response": { - "type": "anonymous", - "header": 117, - "doc": [ - { - "type": "reference", - "argument": "uri", - "category": "full", - "description": " Web action uri" - }, - { - "type": "reference", - "argument": "regexp", - "category": "full", - "description": " Regular expression. Required to match completion of web action" - }, - { - "type": "reference", - "argument": "actionHash", - "category": "danger", - "description": " Identifier of current web action. Required to complete it" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "uri" - }, - { - "type": "string", - "id": 2, - "name": "regexp" - }, - { - "type": "string", - "id": 3, - "name": "actionHash" - } - ] - }, - "doc": [ - "Initialize start of web action", - { - "type": "reference", - "argument": "actionName", - "category": "full", - "description": "Name of web action" - }, - { - "type": "reference", - "argument": "params", - "category": "full", - "description": "Additional params required to make action's uri" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "actionName" - }, - { - "type": { - "type": "struct", - "childType": "MapValue" - }, - "id": 2, - "name": "params" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "CompleteWebaction", - "header": 123, - "response": { - "type": "anonymous", - "header": 124, - "doc": [ - { - "type": "reference", - "argument": "result", - "category": "full", - "description": " Reslut of web action completion" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "MapValue" - }, - "id": 1, - "name": "result" - } - ] - }, - "doc": [ - "Complete started web action", - { - "type": "reference", - "argument": "actionHash", - "category": "danger", - "description": "Identifier of given web action" - }, - { - "type": "reference", - "argument": "completeUri", - "category": "full", - "description": "Final uri of web action" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "actionHash" - }, - { - "type": "string", - "id": 2, - "name": "completeUri" - } - ] - } - } - ] - }, - { +{"type":"rpc","content":{ +"name":"InitWebaction", +"header":116, +"response":{"type":"anonymous","header":117, "doc":[ +{"type":"reference","argument":"uri","category":"full","description":" Web action uri"},{"type":"reference","argument":"regexp","category":"full","description":" Regular expression. Required to match completion of web action"},{"type":"reference","argument":"actionHash","category":"danger","description":" Identifier of current web action. Required to complete it"}] ,"attributes":[{"type":"string","id":1,"name":"uri"} +,{"type":"string","id":2,"name":"regexp"} +,{"type":"string","id":3,"name":"actionHash"} +]}, +"doc":[ +"Initialize start of web action",{"type":"reference","argument":"actionName","category":"full","description":"Name of web action"},{"type":"reference","argument":"params","category":"full","description":"Additional params required to make action's uri"}],"attributes":[ +{"type":"string","id":1,"name":"actionName"} +,{"type":{"type":"struct","childType":"MapValue"},"id":2,"name":"params"} +]}},{"type":"rpc","content":{ +"name":"CompleteWebaction", +"header":123, +"response":{"type":"anonymous","header":124, "doc":[ +{"type":"reference","argument":"result","category":"full","description":" Reslut of web action completion"}] ,"attributes":[{"type":{"type":"struct","childType":"MapValue"},"id":1,"name":"result"} +]}, +"doc":[ +"Complete started web action",{"type":"reference","argument":"actionHash","category":"danger","description":"Identifier of given web action"},{"type":"reference","argument":"completeUri","category":"full","description":"Final uri of web action"}],"attributes":[ +{"type":"string","id":1,"name":"actionHash"} +,{"type":"string","id":2,"name":"completeUri"} +]}}]}, { "title": "Collections", "package": "collections", "doc": [ "Flexible raw collections without structure" ], "items": [ - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "RawValue", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "StringValue", - "doc": [ - "Text value" - ], - "trait": { - "name": "RawValue", - "key": 1 - }, - "attributes": [ - { - "type": "string", - "id": 1, - "name": "text" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Int32Value", - "doc": [ - "Int32 value" - ], - "trait": { - "name": "RawValue", - "key": 2 - }, - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "value" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Int64Value", - "doc": [ - "Int64 value" - ], - "trait": { - "name": "RawValue", - "key": 3 - }, - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "value" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "DoubleValue", - "doc": [ - "Double value" - ], - "trait": { - "name": "RawValue", - "key": 4 - }, - "attributes": [ - { - "type": "double", - "id": 1, - "name": "value" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ArrayValue", - "doc": [ - "Array value" - ], - "trait": { - "name": "RawValue", - "key": 5 - }, - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 1, - "name": "array" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MapValueItem", - "doc": [ - "Item of Map" - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "key" - }, - { - "type": { - "type": "trait", - "childType": "RawValue" - }, - "id": 2, - "name": "value" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MapValue", - "doc": [ - "Map Value" - ], - "trait": { - "name": "RawValue", - "key": 6 - }, - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MapValueItem" - } - }, - "id": 1, - "name": "items" - } - ] - } - } - ] - } - ] -} \ No newline at end of file +{"type":"trait","content":{ +"isContainer":"true","name":"RawValue","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"StringValue", +"doc":[ +"Text value"],"trait":{"name":"RawValue","key":1},"attributes":[ +{"type":"string","id":1,"name":"text"} +]}}, { + "type":"struct", + "content": { + "name":"Int32Value", +"doc":[ +"Int32 value"],"trait":{"name":"RawValue","key":2},"attributes":[ +{"type":"int32","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"Int64Value", +"doc":[ +"Int64 value"],"trait":{"name":"RawValue","key":3},"attributes":[ +{"type":"int64","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"DoubleValue", +"doc":[ +"Double value"],"trait":{"name":"RawValue","key":4},"attributes":[ +{"type":"double","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"ArrayValue", +"doc":[ +"Array value"],"trait":{"name":"RawValue","key":5},"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"RawValue"}},"id":1,"name":"array"} +]}}, { + "type":"struct", + "content": { + "name":"MapValueItem", +"doc":[ +"Item of Map"],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":{"type":"trait","childType":"RawValue"},"id":2,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"MapValue", +"doc":[ +"Map Value"],"trait":{"name":"RawValue","key":6},"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"MapValueItem"}},"id":1,"name":"items"} +]}}]}, { + "title": "Surveys", + "package": "surveys", + "doc": [ + "Surveys implementation for messages" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Survey", +"doc":[ +"Main Survey Struct"],"attributes":[ +{"type":"int64","id":1,"name":"id"} +,{"type":"string","id":2,"name":"titulo"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"uf"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"creationTime"} +,{"type":{"type":"alias","childType":"date"},"id":5,"name":"endTime"} +,{"type":{"type":"alias","childType":"userId"},"id":6,"name":"ownerId"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"answers"} +]}},{"type":"rpc","content":{ +"name":"CreateSurvey", +"header":139, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Criar uma nova enquete"],"attributes":[ +{"type":{"type":"struct","childType":"Survey"},"id":1,"name":"survey"} +]}}]}]} \ No newline at end of file diff --git a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps index dc46e3760b..9515c48f1b 100644 --- a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps +++ b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps @@ -8977,6 +8977,29 @@
+ + + + + + + + + + + + + + + + + + + + + + + @@ -18498,6 +18521,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiSurvey.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiSurvey.java new file mode 100644 index 0000000000..95e0228c0e --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiSurvey.java @@ -0,0 +1,106 @@ +package im.actor.core.api; +/* + * Generated by the Actor API Scheme generator. DO NOT EDIT! + */ + +import im.actor.runtime.bser.*; +import im.actor.runtime.collections.*; +import static im.actor.runtime.bser.Utils.*; +import im.actor.core.network.parser.*; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; +import com.google.j2objc.annotations.ObjectiveCName; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; + +public class ApiSurvey extends BserObject { + + private long id; + private String titulo; + private String uf; + private long creationTime; + private long endTime; + private int ownerId; + private List answers; + + public ApiSurvey(long id, @NotNull String titulo, @Nullable String uf, long creationTime, long endTime, int ownerId, @NotNull List answers) { + this.id = id; + this.titulo = titulo; + this.uf = uf; + this.creationTime = creationTime; + this.endTime = endTime; + this.ownerId = ownerId; + this.answers = answers; + } + + public ApiSurvey() { + + } + + public long getId() { + return this.id; + } + + @NotNull + public String getTitulo() { + return this.titulo; + } + + @Nullable + public String getUf() { + return this.uf; + } + + public long getCreationTime() { + return this.creationTime; + } + + public long getEndTime() { + return this.endTime; + } + + public int getOwnerId() { + return this.ownerId; + } + + @NotNull + public List getAnswers() { + return this.answers; + } + + @Override + public void parse(BserValues values) throws IOException { + this.id = values.getLong(1); + this.titulo = values.getString(2); + this.uf = values.optString(3); + this.creationTime = values.getLong(4); + this.endTime = values.getLong(5); + this.ownerId = values.getInt(6); + this.answers = values.getRepeatedString(7); + } + + @Override + public void serialize(BserWriter writer) throws IOException { + writer.writeLong(1, this.id); + if (this.titulo == null) { + throw new IOException(); + } + writer.writeString(2, this.titulo); + if (this.uf != null) { + writer.writeString(3, this.uf); + } + writer.writeLong(4, this.creationTime); + writer.writeLong(5, this.endTime); + writer.writeInt(6, this.ownerId); + writer.writeRepeatedString(7, this.answers); + } + + @Override + public String toString() { + String res = "struct Survey{"; + res += "}"; + return res; + } + +} diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java index e628db24b1..4b498af149 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java @@ -90,6 +90,7 @@ public RpcScope read(int type, byte[] payload) throws IOException { case 2721: return RequestLeaveAndDelete.fromBytes(payload); case 71: return RequestKickUser.fromBytes(payload); case 2722: return RequestJoinGroupByPeer.fromBytes(payload); + case 44561: return RequestJoinGroupByPeer2.fromBytes(payload); case 2784: return RequestMakeUserAdmin.fromBytes(payload); case 2791: return RequestDismissUserAdmin.fromBytes(payload); case 2789: return RequestTransferOwnership.fromBytes(payload); @@ -182,6 +183,7 @@ public RpcScope read(int type, byte[] payload) throws IOException { case 229: return RequestNotifyAboutDeviceInfo.fromBytes(payload); case 116: return RequestInitWebaction.fromBytes(payload); case 123: return RequestCompleteWebaction.fromBytes(payload); + case 139: return RequestCreateSurvey.fromBytes(payload); case 193: return ResponseStartPhoneAuth.fromBytes(payload); case 186: return ResponseStartEmailAuth.fromBytes(payload); case 2572: return ResponseStartUsernameAuth.fromBytes(payload); diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestCreateSurvey.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestCreateSurvey.java new file mode 100644 index 0000000000..19d800ac69 --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestCreateSurvey.java @@ -0,0 +1,64 @@ +package im.actor.core.api.rpc; +/* + * Generated by the Actor API Scheme generator. DO NOT EDIT! + */ + +import im.actor.runtime.bser.*; +import im.actor.runtime.collections.*; +import static im.actor.runtime.bser.Utils.*; +import im.actor.core.network.parser.*; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; +import com.google.j2objc.annotations.ObjectiveCName; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import im.actor.core.api.*; + +public class RequestCreateSurvey extends Request { + + public static final int HEADER = 0x8b; + public static RequestCreateSurvey fromBytes(byte[] data) throws IOException { + return Bser.parse(new RequestCreateSurvey(), data); + } + + private ApiSurvey survey; + + public RequestCreateSurvey(@NotNull ApiSurvey survey) { + this.survey = survey; + } + + public RequestCreateSurvey() { + + } + + @NotNull + public ApiSurvey getSurvey() { + return this.survey; + } + + @Override + public void parse(BserValues values) throws IOException { + this.survey = values.getObj(1, new ApiSurvey()); + } + + @Override + public void serialize(BserWriter writer) throws IOException { + if (this.survey == null) { + throw new IOException(); + } + writer.writeObject(1, this.survey); + } + + @Override + public String toString() { + String res = "rpc CreateSurvey{"; + res += "}"; + return res; + } + + @Override + public int getHeaderKey() { + return HEADER; + } +} diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestJoinGroupByPeer2.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestJoinGroupByPeer2.java new file mode 100644 index 0000000000..66693ba68c --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestJoinGroupByPeer2.java @@ -0,0 +1,64 @@ +package im.actor.core.api.rpc; +/* + * Generated by the Actor API Scheme generator. DO NOT EDIT! + */ + +import im.actor.runtime.bser.*; +import im.actor.runtime.collections.*; +import static im.actor.runtime.bser.Utils.*; +import im.actor.core.network.parser.*; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; +import com.google.j2objc.annotations.ObjectiveCName; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import im.actor.core.api.*; + +public class RequestJoinGroupByPeer2 extends Request { + + public static final int HEADER = 0xae11; + public static RequestJoinGroupByPeer2 fromBytes(byte[] data) throws IOException { + return Bser.parse(new RequestJoinGroupByPeer2(), data); + } + + private ApiGroupOutPeer groupPeer; + + public RequestJoinGroupByPeer2(@NotNull ApiGroupOutPeer groupPeer) { + this.groupPeer = groupPeer; + } + + public RequestJoinGroupByPeer2() { + + } + + @NotNull + public ApiGroupOutPeer getGroupPeer() { + return this.groupPeer; + } + + @Override + public void parse(BserValues values) throws IOException { + this.groupPeer = values.getObj(1, new ApiGroupOutPeer()); + } + + @Override + public void serialize(BserWriter writer) throws IOException { + if (this.groupPeer == null) { + throw new IOException(); + } + writer.writeObject(1, this.groupPeer); + } + + @Override + public String toString() { + String res = "rpc JoinGroupByPeer2{"; + res += "}"; + return res; + } + + @Override + public int getHeaderKey() { + return HEADER; + } +} diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index 544ad17482..fe74653bd4 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -77,10 +77,9 @@ "name": "PASSWORD", "id": 2 } - ] - } - }, - { + ] + } + }, { "type": "enum", "content": { "name": "EmailActivationType", @@ -97,20521 +96,3862 @@ "name": "PASSWORD", "id": 3 } - ] - } - }, - { - "type": "rpc", + ] + } + },{"type":"rpc","content":{ +"name":"StartPhoneAuth", +"header":191, +"response":{"type":"anonymous","header":193, "doc":[ +"Phone Activation response",{"type":"reference","argument":"transactionHash","category":"danger","description":" Hash of transaction"},{"type":"reference","argument":"isRegistered","category":"full","description":" Is User registered"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"PhoneActivationType"}},"id":3,"name":"activationType"} +]}, +"doc":[ +"Start Phone Activation",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number"},{"type":"reference","argument":"appId","category":"hidden","description":"Appication Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages of device"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"SendCodeByPhoneCall", +"header":197, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Dial phone and dictate auth code",{"type":"reference","argument":"transactionHash","category":"danger","description":"Transaction hash"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +]}},{"type":"rpc","content":{ +"name":"StartEmailAuth", +"header":185, +"response":{"type":"anonymous","header":186, "doc":[ +"Email Activation response",{"type":"reference","argument":"transactionHash","category":"danger","description":" Hash of activation transaction"},{"type":"reference","argument":"isRegistered","category":"full","description":" true if user is registered"},{"type":"reference","argument":"activationType","category":"full","description":" Email Activation type"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +,{"type":{"type":"enum","childType":"EmailActivationType"},"id":3,"name":"activationType"} +]}, +"doc":[ +"Start EMail Activation",{"type":"reference","argument":"email","category":"full","description":"Email"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"StartAnonymousAuth", +"header":198, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Starting Anonymous login",{"type":"reference","argument":"name","category":"full","description":"Name of new user"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ +{"type":"string","id":1,"name":"name"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"StartTokenAuth", +"header":203, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Starting token-based login",{"type":"reference","argument":"token","category":"full","description":"Token for authentication"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"StartUsernameAuth", +"header":2571, +"response":{"type":"anonymous","header":2572, "doc":[ +"Result of login auth start. If is not registered move to signup.",{"type":"reference","argument":"transactionHash","category":"danger","description":" Authentication transaction hash"},{"type":"reference","argument":"isRegistered","category":"full","description":" If user is registered with this username"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +]}, +"doc":[ +"Starting Login Authentication",{"type":"reference","argument":"username","category":"full","description":"Username for signing in"},{"type":"reference","argument":"appId","category":"hidden","description":"Application id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"Time Zone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages of device"}],"attributes":[ +{"type":"string","id":1,"name":"username"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"ValidateCode", +"header":189, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Performing user sign in.",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"code","category":"hidden","description":"Activation code"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"code"} +]}},{"type":"rpc","content":{ +"name":"ValidatePassword", +"header":207, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Validation of account password",{"type":"reference","argument":"transactionHash","category":"full","description":"Hash of transaction"},{"type":"reference","argument":"password","category":"full","description":"Password for account"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"password"} +]}},{"type":"rpc","content":{ +"name":"GetOAuth2Params", +"header":194, +"response":{"type":"anonymous","header":195, "doc":[ +{"type":"reference","argument":"authUrl","category":"hidden","description":" Authentication url"}] ,"attributes":[{"type":"string","id":1,"name":"authUrl"} +]}, +"doc":[ +"Loading OAuth2 Parameters",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"redirectUrl","category":"full","description":"Redirect URL for Application"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"redirectUrl"} +]}},{"type":"rpc","content":{ +"name":"CompleteOAuth2", +"header":196, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Complete OAuth2 Authentication",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"code","category":"danger","description":"Authentication Code"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"code"} +]}},{"type":"rpc","content":{ +"name":"SignUp", +"header":190, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Perform user SignUp",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"name","category":"full","description":"User name"},{"type":"reference","argument":"sex","category":"full","description":"Optional user sex"},{"type":"reference","argument":"password","category":"full","description":"Password for password-based accounts"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"name"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"Sex"}},"id":3,"name":"sex"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"password"} +]}},{"type":"response","content":{ +"name":"Auth", +"header":5, +"doc":[ +"Authentication result",{"type":"reference","argument":"user","category":"compact","description":" The authenticated User"},{"type":"reference","argument":"config","category":"full","description":" Current config of server"}],"attributes":[ +{"type":{"type":"struct","childType":"User"},"id":2,"name":"user"} +,{"type":{"type":"struct","childType":"Config"},"id":3,"name":"config"} +]}}, { + "type":"struct", + "content": { + "name":"AuthSession", +"doc":[ +"Authentication session",{"type":"reference","argument":"id","category":"full","description":" Unuque ID of session"},{"type":"reference","argument":"authHolder","category":"full","description":" holder of session. 0 - this device, 1 - other."},{"type":"reference","argument":"appId","category":"full","description":" Application Id (user in SignIn/SignUp)"},{"type":"reference","argument":"appTitle","category":"full","description":" Title of application"},{"type":"reference","argument":"deviceTitle","category":"full","description":" Title of device"},{"type":"reference","argument":"authTime","category":"full","description":" Time of session creating"},{"type":"reference","argument":"authLocation","category":"hidden","description":" two-letter country code of session create"},{"type":"reference","argument":"latitude","category":"hidden","description":" optional latitude of auth if available"},{"type":"reference","argument":"longitude","category":"hidden","description":" optional longitude of auth if available"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":{"type":"enum","childType":"AuthHolder"},"id":2,"name":"authHolder"} +,{"type":"int32","id":3,"name":"appId"} +,{"type":"string","id":4,"name":"appTitle"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":"int32","id":6,"name":"authTime"} +,{"type":"string","id":7,"name":"authLocation"} +,{"type":{"type":"opt","childType":"double"},"id":8,"name":"latitude"} +,{"type":{"type":"opt","childType":"double"},"id":9,"name":"longitude"} +]}}, { + "type": "enum", "content": { - "name": "StartPhoneAuth", - "header": 191, - "response": { - "type": "anonymous", - "header": 193, - "doc": [ - "Phone Activation response", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": " Hash of transaction" - }, - { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " Is User registered" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "bool", - "id": 2, - "name": "isRegistered" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "PhoneActivationType" - } - }, - "id": 3, - "name": "activationType" - } - ] - }, - "doc": [ - "Start Phone Activation", - { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": "Phone number" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Appication Id" - }, + "name": "AuthHolder", + "values": [ { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" + "name": "ThisDevice", + "id": 1 }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, + "name": "OtherDevice", + "id": 2 + } + ] + } + },{"type":"rpc","content":{ +"name":"GetAuthSessions", +"header":80, +"response":{"type":"anonymous","header":81, "doc":[ +"Current Auth sessions",{"type":"reference","argument":"userAuths","category":"compact","description":" User authentications"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"AuthSession"}},"id":1,"name":"userAuths"} +]}, +"doc":[ +"Getting of all active user's authentication sessions"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"TerminateSession", +"header":82, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"SignOut on specified user's session",{"type":"reference","argument":"id","category":"full","description":"id from AuthItem"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +]}},{"type":"rpc","content":{ +"name":"TerminateAllSessions", +"header":83, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"SignOut on all exept current sessions"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"SignOut", +"header":84, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"SignOut current session"],"attributes":[ +]}},{"type":"comment","content":"OBSOLETE METHODS"},{"type":"rpc","content":{ +"name":"SignInObsolete", +"header":3, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Performing user signin",{"type":"reference","argument":"phoneNumber","category":"danger","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"smsCode","category":"danger","description":"Confirmation code from SMS"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device title like 'Steven's iPhone'"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"appKey","category":"hidden","description":"Application API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"string","id":2,"name":"smsHash"} +,{"type":"string","id":3,"name":"smsCode"} +,{"type":"bytes","id":5,"name":"deviceHash"} +,{"type":"string","id":6,"name":"deviceTitle"} +,{"type":"int32","id":7,"name":"appId"} +,{"type":"string","id":8,"name":"appKey"} +]}},{"type":"rpc","content":{ +"name":"SignUpObsolete", +"header":4, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Performing user signup. If user perform signup on already registered user it just override previous","profile information",{"type":"reference","argument":"phoneNumber","category":"danger","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"smsCode","category":"danger","description":"Confirmation code from SMS"},{"type":"reference","argument":"name","category":"full","description":"User name"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device title like 'Steven's iPhone'"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"appKey","category":"hidden","description":"pplication API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"string","id":2,"name":"smsHash"} +,{"type":"string","id":3,"name":"smsCode"} +,{"type":"string","id":4,"name":"name"} +,{"type":"bytes","id":7,"name":"deviceHash"} +,{"type":"string","id":8,"name":"deviceTitle"} +,{"type":"int32","id":9,"name":"appId"} +,{"type":"string","id":10,"name":"appKey"} +,{"type":"bool","id":11,"name":"isSilent"} +]}},{"type":"rpc","content":{ +"name":"SendAuthCodeObsolete", +"header":1, +"response":{"type":"anonymous","header":2, "doc":[ +"Sms Request response",{"type":"reference","argument":"smsHash","category":"danger","description":" Hash of SMS request"},{"type":"reference","argument":"isRegistered","category":"full","description":" true if user is registered"}] ,"attributes":[{"type":"string","id":1,"name":"smsHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +]}, +"doc":[ +"Sending SMS with activation code",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number in international format"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +]}},{"type":"rpc","content":{ +"name":"SendAuthCallObsolete", +"header":90, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Requesting Phone activation",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"string","id":2,"name":"smsHash"} +,{"type":"int32","id":3,"name":"appId"} +,{"type":"string","id":4,"name":"apiKey"} +]}}]}, { + "title": "Users", + "package": "users", + "doc": [ + "Users are objects that secured by accessHash. You can't load user profile by it's id.", + "You can't send message to user without finding it's object in Updates or by calling", + "method for user search, contacts import or some other methods.", + "", + "Applications need to keep all Users information forever.", + "", + "Each User have optional localName - name of user that was set by current user and can be changed", + "any time by calling EditUserLocalName method." + ], + "items": [ + { + "type": "enum", + "content": { + "name": "Sex", + "values": [ { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" + "name": "Unknown", + "id": 1 }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" + "name": "Male", + "id": 2 }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages of device" + "name": "Female", + "id": 3 } - ], - "attributes": [ + ] + } + }, { + "type": "enum", + "content": { + "name": "ContactType", + "values": [ { - "type": "int64", - "id": 1, - "name": "phoneNumber" + "name": "Phone", + "id": 1 }, { - "type": "int32", - "id": 2, - "name": "appId" + "name": "Email", + "id": 2 }, { - "type": "string", - "id": 3, - "name": "apiKey" + "name": "Web", + "id": 3 }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, + "name": "Social", + "id": 4 + } + ] + } + }, { + "type":"struct", + "content": { + "name":"ContactRecord", +"doc":[ +"Contact information record",{"type":"reference","argument":"type","category":"full","description":" Record type"},{"type":"reference","argument":"typeSpec","category":"hidden","description":" Value for specification type of contact, for example 'mobile/standalone/office' for phones or 'vk/fb/telegram' for extenrnal networks."},{"type":"reference","argument":"stringValue","category":"full","description":" String value of record"},{"type":"reference","argument":"longValue","category":"full","description":" Long value of record"},{"type":"reference","argument":"title","category":"full","description":" Title of record"},{"type":"reference","argument":"subtitle","category":"hidden","description":" Subtitle of record"}],"expandable":"true","attributes":[ +{"type":{"type":"enum","childType":"ContactType"},"id":1,"name":"type"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"typeSpec"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"stringValue"} +,{"type":{"type":"opt","childType":"int64"},"id":3,"name":"longValue"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"title"} +,{"type":{"type":"opt","childType":"string"},"id":5,"name":"subtitle"} +]}}, { + "type":"struct", + "content": { + "name":"User", +"doc":[ +"Main user object",{"type":"reference","argument":"id","category":"full","description":" uid"},{"type":"reference","argument":"accessHash","category":"danger","description":" user's access hash"},{"type":"reference","argument":"name","category":"full","description":" user's name"},{"type":"reference","argument":"localName","category":"full","description":" user's local name"},{"type":"reference","argument":"nick","category":"full","description":" User's nickname"},{"type":"reference","argument":"sex","category":"full","description":" optional sex of user"},{"type":"reference","argument":"avatar","category":"compact","description":" avatar of user"},{"type":"reference","argument":"isBot","category":"full","description":" Is user actually bot. By default is false."},{"type":"reference","argument":"ext","category":"full","description":" Extension values"},{"type":"reference","argument":"about","category":"full","description":" [DEPRECATED] User's about information"},{"type":"reference","argument":"contactInfo","category":"compact","description":" [DEPRECATED] Contact information of user"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" [DEPRECATED] Preferred user languages"},{"type":"reference","argument":"timeZone","category":"full","description":" [DEPRECATED] Time Zone of user in TZ format"},{"type":"reference","argument":"botCommands","category":"full","description":" [DEPRECATED] Available Bot Commands"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"name"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"localName"} +,{"type":{"type":"opt","childType":"string"},"id":13,"name":"nick"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"Sex"}},"id":5,"name":"sex"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":8,"name":"avatar"} +,{"type":{"type":"opt","childType":"bool"},"id":11,"name":"isBot"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":20,"name":"ext"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":12,"name":"contactInfo", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":14,"name":"about", "deprecated":"true"} +,{"type":{"type":"list","childType":"string"},"id":16,"name":"preferredLanguages", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":17,"name":"timeZone", "deprecated":"true"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":19,"name":"botCommands", "deprecated":"true"} +]}}, { + "type":"struct", + "content": { + "name":"FullUser", +"doc":[ +"Full User representation",{"type":"reference","argument":"id","category":"full","description":" User's Id"},{"type":"reference","argument":"contactInfo","category":"compact","description":" User's contact information"},{"type":"reference","argument":"about","category":"full","description":" User's about information"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" Preferred user languages"},{"type":"reference","argument":"timeZone","category":"full","description":" Time Zone of user in TZ format"},{"type":"reference","argument":"botCommands","category":"full","description":" Available Commands for Bot"},{"type":"reference","argument":"ext","category":"full","description":" Extension values. NOTE: This values are not related to ext field in User object."},{"type":"reference","argument":"isBlocked","category":"full","description":" Is user blocked. Default is false."}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"id"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":2,"name":"contactInfo"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} +,{"type":{"type":"list","childType":"string"},"id":4,"name":"preferredLanguages"} +,{"type":{"type":"opt","childType":"string"},"id":5,"name":"timeZone"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":6,"name":"botCommands"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":7,"name":"ext"} +,{"type":{"type":"opt","childType":"bool"},"id":8,"name":"isBlocked"} +]}}, { + "type":"struct", + "content": { + "name":"BotCommand", +"doc":[ +"Available bot commands",{"type":"reference","argument":"slashCommand","category":"full","description":" Slash command name (wihtout slash)"},{"type":"reference","argument":"description","category":"full","description":" Slash command description"},{"type":"reference","argument":"locKey","category":"full","description":" Optional Localization Key for i18n"}],"attributes":[ +{"type":"string","id":1,"name":"slashCommand"} +,{"type":"string","id":2,"name":"description"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"locKey"} +]}},{"type":"rpc","content":{ +"name":"EditUserLocalName", +"header":96, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Renaming of user's visible name",{"type":"reference","argument":"uid","category":"full","description":"target User's uid"},{"type":"reference","argument":"accessHash","category":"danger","description":"User's accessHash"},{"type":"reference","argument":"name","category":"full","description":"New user name"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"name"} +]}},{"type":"update","content":{ +"name":"UserAvatarChanged", +"header":16, +"doc":[ +"Update about avatar changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"avatar","category":"compact","description":" user's new avatar"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":2,"name":"avatar"} +]}},{"type":"update","content":{ +"name":"UserNameChanged", +"header":32, +"doc":[ +"Update about name changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"name","category":"full","description":" user's name"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"string","id":2,"name":"name"} +]}},{"type":"update","content":{ +"name":"UserLocalNameChanged", +"header":51, +"doc":[ +"Update about local name changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"localName","category":"full","description":" new user's local name"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"localName"} +]}},{"type":"update","content":{ +"name":"UserContactsChanged", +"header":134, +"doc":[ +"Update about contact information change",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"contactRecords","category":"compact","description":" new phones list"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":4,"name":"contactRecords"} +]}},{"type":"update","content":{ +"name":"UserNickChanged", +"header":209, +"doc":[ +"Update about nick changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"nickname","category":"full","description":" user's new nickname"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"nickname"} +]}},{"type":"update","content":{ +"name":"UserAboutChanged", +"header":210, +"doc":[ +"Update about user's about changed",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"about","category":"full","description":" User's about"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} +]}},{"type":"update","content":{ +"name":"UserPreferredLanguagesChanged", +"header":212, +"doc":[ +"Update about user's preferred languages",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" User's preferred languages. Can be empty."}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"list","childType":"string"},"id":2,"name":"preferredLanguages"} +]}},{"type":"update","content":{ +"name":"UserTimeZoneChanged", +"header":216, +"doc":[ +"User TimeZone changed",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"timeZone","category":"full","description":" User's new time zone in TZ format"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"timeZone"} +]}},{"type":"update","content":{ +"name":"UserBotCommandsChanged", +"header":217, +"doc":[ +"Update about bot commands changed",{"type":"reference","argument":"uid","category":"full","description":" User's Id"},{"type":"reference","argument":"commands","category":"full","description":" New List of commands"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":2,"name":"commands"} +]}},{"type":"update","content":{ +"name":"UserExtChanged", +"header":218, +"doc":[ +"Update about user ext changed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"ext","category":"full","description":" New Ext Value in User (NOT FullUser) object."}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} +]}},{"type":"update","content":{ +"name":"UserFullExtChanged", +"header":219, +"doc":[ +"Update about user ext changed",{"type":"reference","argument":"uid","category":"full","description":" User's Id"},{"type":"reference","argument":"ext","category":"full","description":" New Ext Value in FullUser (NOT User) object."}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":3,"name":"ext"} +]}},{"type":"rpc","content":{ +"name":"LoadFullUsers", +"header":2649, +"response":{"type":"anonymous","header":2650, "doc":[ +{"type":"reference","argument":"fullUsers","category":"compact","description":" Loaded users"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"FullUser"}},"id":1,"name":"fullUsers"} +]}, +"doc":[ +"Loading Full User information",{"type":"reference","argument":"userPeers","category":"compact","description":"User's peers to load. Should be non-empy"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"userPeers"} +]}}]}, { + "title": "Profile", + "package": "profile", + "items": [ +{"type":"rpc","content":{ +"name":"EditName", +"header":53, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing account's name",{"type":"reference","argument":"name","category":"full","description":"New name"}],"attributes":[ +{"type":"string","id":1,"name":"name"} +]}},{"type":"rpc","content":{ +"name":"EditNickName", +"header":205, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing account's nickname",{"type":"reference","argument":"nickname","category":"full","description":"New Nickname"}],"attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"nickname"} +]}},{"type":"rpc","content":{ +"name":"CheckNickName", +"header":206, +"response":{"type":"reference","name":"Bool"}, +"doc":[ +"Checking availability of nickname",{"type":"reference","argument":"nickname","category":"full","description":"Nickname for checking"}],"attributes":[ +{"type":"string","id":1,"name":"nickname"} +]}},{"type":"rpc","content":{ +"name":"EditAbout", +"header":212, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing about information",{"type":"reference","argument":"about","category":"full","description":"new about information"}],"attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"about"} +]}},{"type":"rpc","content":{ +"name":"EditAvatar", +"header":31, +"response":{"type":"anonymous","header":103, "doc":[ +"Response for change account avatar",{"type":"reference","argument":"avatar","category":"full","description":" New avatar"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"}] ,"attributes":[{"type":{"type":"struct","childType":"Avatar"},"id":1,"name":"avatar"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +]}, +"doc":[ +"Changing account's avatar",{"type":"reference","argument":"fileLocation","category":"compact","description":"File Location of uploaded unencrypted avatar"}],"attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} +]}},{"type":"rpc","content":{ +"name":"RemoveAvatar", +"header":91, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Removing account's avatar"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"EditMyTimeZone", +"header":144, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Updating user's time zone",{"type":"reference","argument":"tz","category":"full","description":"New Time Zone"}],"attributes":[ +{"type":"string","id":1,"name":"tz"} +]}},{"type":"rpc","content":{ +"name":"EditMyPreferredLanguages", +"header":145, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing preffered languages",{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preffered Languages"}],"attributes":[ +{"type":{"type":"list","childType":"string"},"id":1,"name":"preferredLanguages"} +]}}]}, { + "title": "Contacts", + "package": "contacts", + "doc": [ + "Before working with contact list is is useful to import contacts from phone first by calling", + "method ImportContacts#0x07.", + "", + "All phone numbers MUST be preprocessed before import by some library (like libphonenumber)", + "and build international phone number depending on current users phone and/or locale.", + "", + "For loading contact list from server use GetContacts#0x57.", + "If during this call there are some updates about contact list change", + "it is recommended to call it again. Also applications need to sync contacts on application start.", + "", + "For searching for users without adding to contacts list use method FindContacts#0x70.", + "", + "For adding/deleting contacts AddContact#0x72 and DeleteContact#0x59." + ], + "items": [ + { + "type":"struct", + "content": { + "name":"PhoneToImport", +"doc":[ +"Phone for import",{"type":"reference","argument":"phoneNumber","category":"full","description":" phone number for import in international format"},{"type":"reference","argument":"name","category":"full","description":" optional name for contact"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +]}}, { + "type":"struct", + "content": { + "name":"EmailToImport", +"doc":[ +"Email for import",{"type":"reference","argument":"email","category":"full","description":" email for importing"},{"type":"reference","argument":"name","category":"full","description":" optional name for contact"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +]}},{"type":"rpc","content":{ +"name":"ImportContacts", +"header":7, +"response":{"type":"anonymous","header":8, "doc":[ +"Imported contacts",{"type":"reference","argument":"users","category":"compact","description":" Imported users"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number if users are imported"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state if users are imported"},{"type":"reference","argument":"userPeers","category":"full","description":" Imported user peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +]}, +"doc":[ +"Importing phones and emails for building contact list","Maximum amount of items for import per method call equals to 100.",{"type":"reference","argument":"phones","category":"compact","description":"Phones for import"},{"type":"reference","argument":"emails","category":"compact","description":"Emails for import"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"PhoneToImport"}},"id":1,"name":"phones"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EmailToImport"}},"id":2,"name":"emails"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"empty"},{"type":"rpc","content":{ +"name":"GetContacts", +"header":87, +"response":{"type":"anonymous","header":88, "doc":[ +"Current contact list",{"type":"reference","argument":"users","category":"hidden","description":" User list if list is changed"},{"type":"reference","argument":"isNotChanged","category":"full","description":" is list changed"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":"bool","id":2,"name":"isNotChanged"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"userPeers"} +]}, +"doc":[ +"Getting current contact list","SHA256 hash of list of a comma-separated list of contact UIDs in ascending","order may be passed in contactsHash parameter.","If the contact list was not changed, isNotChanged will be true.",{"type":"reference","argument":"contactsHash","category":"full","description":"Hash of saved list in application"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":"string","id":1,"name":"contactsHash"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"RemoveContact", +"header":89, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Removing contact from contact list",{"type":"reference","argument":"uid","category":"full","description":"Contact's UID"},{"type":"reference","argument":"accessHash","category":"danger","description":"Contact's AccessHash"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"AddContact", +"header":114, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Adding contact to contact list",{"type":"reference","argument":"uid","category":"full","description":"Contact's UID"},{"type":"reference","argument":"accessHash","category":"danger","description":"Contact's AccessHash"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"SearchContacts", +"header":112, +"response":{"type":"anonymous","header":113, "doc":[ +"Founded users",{"type":"reference","argument":"users","category":"compact","description":" Founded users"},{"type":"reference","argument":"userPeers","category":"compact","description":" Founded users peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":2,"name":"userPeers"} +]}, +"doc":[ +"Searching contacts by user's query",{"type":"reference","argument":"request","category":"full","description":"Search query"}],"attributes":[ +{"type":"string","id":1,"name":"request"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"empty"},{"type":"update","content":{ +"name":"ContactRegistered", +"header":5, +"doc":[ +"Update about contact registration",{"type":"reference","argument":"uid","category":"full","description":" contact's uid"},{"type":"reference","argument":"isSilent","category":"full","description":" is registration silent. If this value is true then don't show notification about registration"},{"type":"reference","argument":"date","category":"full","description":" date of registration"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"bool","id":2,"name":"isSilent"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +]}},{"type":"update","content":{ +"name":"ContactsAdded", +"header":40, +"doc":[ +"Update about contacts added",{"type":"reference","argument":"uids","category":"compact","description":" added contacts"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"uids"} +]}},{"type":"update","content":{ +"name":"ContactsRemoved", +"header":41, +"doc":[ +"Update about contacts removed",{"type":"reference","argument":"uids","category":"compact","description":" removed contacts"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"uids"} +]}}]}, { + "title": "Privacy", + "package": "privacy", + "items": [ +{"type":"rpc","content":{ +"name":"BlockUser", +"header":2636, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Block User",{"type":"reference","argument":"peer","category":"full","description":"Peer for blocking"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"UnblockUser", +"header":2637, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Unblock User",{"type":"reference","argument":"peer","category":"full","description":"Peer for unblocking"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"LoadBlockedUsers", +"header":2638, +"response":{"type":"anonymous","header":2639, "doc":[ +{"type":"reference","argument":"userPeers","category":"full","description":" Blocked user peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"userPeers"} +]}, +"doc":[ +"Load Blocked Users"],"attributes":[ +]}},{"type":"update","content":{ +"name":"UserBlocked", +"header":2629, +"doc":[ +"Update about User Blocked",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +]}},{"type":"update","content":{ +"name":"UserUnblocked", +"header":2630, +"doc":[ +"Update about User Unblocked",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +]}}]}, { + "title": "Messaging", + "package": "messaging", + "doc": [ + "Actor can work with encrypted and plain messages in one conversation. For both types of messages API", + "contains a bit different methods. Also encrypted and plain messages have different schemes.", + "

Messages

", + "Message entity contains:", + "
    ", + "
  • PeerType - group chat or private
  • ", + "
  • PeerId - group or user id of conversation
  • ", + "
  • RandomId - unique id of message that generated by sender. In Encrypted messages random id is encrypted.
  • ", + "
  • Date - date of message (calculated on server)
  • ", + "
  • Content
  • ", + "
", + "

Message content

", + "Message can be one of three basic types of messages: Text Message, File Message and Service message.", + "All messages can contain extensions. For example we can send text message and add markdown extension with", + "formatted text in markdown and clients that support this extension will show markdown, and that clients that", + "not supported extension then show simple text. File messages can have photo, video or voice extensions.", + "Service message can have extensions extensions such as \"user added\", \"group created\", \"avatar changed\", etc.", + "

Send messages

", + "Sending messages looks same for encrypted and plain messages. Client MUST prepare all required data", + "before sending message (for example FastThumb for photo/video/documents) and call required methods.", + "Encrypted messages differs here only by a little different scheme and encryption.", + "

WRONG_KEYS and incorrect keys

", + "For sending encrypted messages client MUST send messages encrypted for all own and receivers keys.", + "If client send encryption with missing, old or incorrect keys it will receive WRONG_KEYS.", + "In WRONG_KEYS you need to deserialize relatedData from RpcError to WrongKeysErrorData", + "and get detailed information about keys. Sometimes there are some broken keys on server and client can't", + "encrypt messages with it than client MUST send empty encrypted key in request elsewhere API return WRONG_KEYS.", + "

Encrypted messages and New Devices

", + "When you send message to someone and when he registered with new device there are no way to receive old encrypted", + "messages on new device and because of this there are a problem about read/delivery statuses.", + "Alice send messages to Bob, but Bob lose his device and buy new iPhone and installed Actor.", + "Alice receive notification about new device and send another message. Bob open chat with Alice and", + "send read status with maximum message read date. Alice will mark all sent messages as read and one that", + "was not delivered. We can use status notifications per message, but in VERY heavy conversations it will be", + "a lot of unnecessary traffic. For resolving this small issue we have different ways of message statuses", + "for encrypted and plain messages. Also it is recomended to mark all undelivered messages on new device update as", + "not devered with warring sign.", + "

Message Read and Delivery

", + "There are two different ways for read and delivery statuses for encrypted and plain messages.", + "For encrypted messages used status change by RandomId and for plain messages used by maximum", + "date of read/delivered message." + ], + "items": [ + { + "type":"struct", + "content": { + "name":"MessageAttributes", +"doc":[ +"Message Attributes",{"type":"reference","argument":"isMentioned","category":"full","description":" Is mentioned. If set overrides built-in value."},{"type":"reference","argument":"isHighlighted","category":"full","description":" Is message highlighted. Default is false."},{"type":"reference","argument":"isNotified","category":"full","description":" Is notified. If set overrides built-in settings."},{"type":"reference","argument":"isOnlyForYou","category":"full","description":" If this message is only for you. Default is false"}],"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"isMentioned"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isHighlighted"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isNotified"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isOnlyForYou"} +]}}, { + "type":"struct", + "content": { + "name":"QuotedMessage", +"doc":[ +"Quoted Message",{"type":"reference","argument":"messageId","category":"full","description":" Message Id if present"},{"type":"reference","argument":"publicGroupId","category":"full","description":" Public Group id if present"},{"type":"reference","argument":"senderUserId","category":"full","description":" Sender of message"},{"type":"reference","argument":"messageDate","category":"full","description":" Date of message"},{"type":"reference","argument":"quotedMessageContent","category":"full","description":" Optional Quoted Message Content. Can be empty if messageId is present and message is in current peer."}],"attributes":[ +{"type":{"type":"opt","childType":{"type":"alias","childType":"randomId"}},"id":1,"name":"messageId"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"groupId"}},"id":2,"name":"publicGroupId"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"senderUserId"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"messageDate"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"Message"}},"id":5,"name":"quotedMessageContent"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"Message","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"TextMessage", +"doc":[ +"Text message",{"type":"reference","argument":"text","category":"danger","description":" the text"},{"type":"reference","argument":"mentions","category":"full","description":" User mentions in message"},{"type":"reference","argument":"ext","category":"full","description":" Optional bytes of extension"}],"trait":{"name":"Message","key":1},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"text"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"mentions"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"TextMessageEx"}},"id":3,"name":"ext"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"TextMessageEx","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"TextExMarkdown", +"doc":[ +"Markdown extension",{"type":"reference","argument":"markdown","category":"full","description":" Markdown text"}],"trait":{"name":"TextMessageEx","key":1},"expandable":"true","attributes":[ +{"type":"string","id":2,"name":"markdown"} +]}}, { + "type":"struct", + "content": { + "name":"TextModernMessage", +"doc":[ +"Modern text message",{"type":"reference","argument":"text","category":"full","description":" optional text of message"},{"type":"reference","argument":"senderNameOverride","category":"full","description":" optional overriding of sender"},{"type":"reference","argument":"senderPhotoOverride","category":"full","description":" optional overriding sender's photo"},{"type":"reference","argument":"style","category":"full","description":" optional paragraph style"},{"type":"reference","argument":"attaches","category":"full","description":" optional Attaches of message"}],"trait":{"name":"TextMessageEx","key":2},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"text"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"senderNameOverride"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":3,"name":"senderPhotoOverride"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ParagraphStyle"}},"id":4,"name":"style"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"TextModernAttach"}},"id":5,"name":"attaches"} +]}}, { + "type":"struct", + "content": { + "name":"ParagraphStyle", +"doc":[ +"Paragraph style",{"type":"reference","argument":"showParagraph","category":"full","description":" Show quote-like paragraph?"},{"type":"reference","argument":"paragraphColor","category":"full","description":" Override paragraph color"},{"type":"reference","argument":"bgColor","category":"full","description":" Override background color"}],"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"showParagraph"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"Color"}},"id":2,"name":"paragraphColor"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"Color"}},"id":3,"name":"bgColor"} +]}}, { + "type":"struct", + "content": { + "name":"TextModernAttach", +"doc":[ +"Attaches to message",{"type":"reference","argument":"title","category":"full","description":" Attach of message"},{"type":"reference","argument":"titleUrl","category":"full","description":" Attach title url"},{"type":"reference","argument":"titleIcon","category":"full","description":" Attach title icon"},{"type":"reference","argument":"text","category":"full","description":" Attach text"},{"type":"reference","argument":"style","category":"full","description":" Attach style"}],"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"title"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"titleUrl"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":3,"name":"titleIcon"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"text"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ParagraphStyle"}},"id":5,"name":"style"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"TextModernField"}},"id":6,"name":"fields"} +]}}, { + "type":"struct", + "content": { + "name":"TextModernField", +"doc":[ +"Modern message fields",{"type":"reference","argument":"title","category":"full","description":" Field title"},{"type":"reference","argument":"value","category":"full","description":" Field value"},{"type":"reference","argument":"isShort","category":"full","description":" Is field can be shown in compact way (default is TRUE)"}],"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"title"} +,{"type":"string","id":2,"name":"value"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isShort"} +]}}, { + "type":"struct", + "content": { + "name":"TextCommand", +"doc":[ +"Text Command Message for bots",{"type":"reference","argument":"command","category":"full","description":" Slash-Command For execution"},{"type":"reference","argument":"args","category":"full","description":" Arguments of slash command"}],"trait":{"name":"TextMessageEx","key":3},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"command"} +,{"type":"string","id":2,"name":"args"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceMessage", +"doc":[ +"Service message",{"type":"reference","argument":"text","category":"full","description":" service message text"},{"type":"reference","argument":"ext","category":"compact","description":" Extension"}],"trait":{"name":"Message","key":2},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"text"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"ServiceEx"}},"id":3,"name":"ext"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"ServiceEx","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserInvited", +"doc":[ +"Service message about adding user to group",{"type":"reference","argument":"invitedUid","category":"full","description":" added user id"}],"trait":{"name":"ServiceEx","key":1},"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"invitedUid"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserJoined", +"doc":[ +"Service message about user join to group"],"trait":{"name":"ServiceEx","key":17},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserKicked", +"doc":[ +"Service message about kicking user from group",{"type":"reference","argument":"kickedUid","category":"full","description":" kicked user id"}],"trait":{"name":"ServiceEx","key":2},"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"kickedUid"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserLeft", +"doc":[ +"Service message about user left group"],"trait":{"name":"ServiceEx","key":3},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExGroupCreated", +"doc":[ +"Service message about group creating"],"trait":{"name":"ServiceEx","key":4},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedTitle", +"doc":[ +"Service message about group title change",{"type":"reference","argument":"title","category":"full","description":" New group title"}],"trait":{"name":"ServiceEx","key":5},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"title"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedTopic", +"doc":[ +"Service message on group topic change",{"type":"reference","argument":"topic","category":"full","description":" New group topic"}],"trait":{"name":"ServiceEx","key":18},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"topic"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedAbout", +"doc":[ +"Service message on group about change",{"type":"reference","argument":"about","category":"full","description":" New group about"}],"trait":{"name":"ServiceEx","key":19},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"about"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedAvatar", +"doc":[ +"Service message about avatar change",{"type":"reference","argument":"avatar","category":"compact","description":" Updated avatar"}],"trait":{"name":"ServiceEx","key":6},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":1,"name":"avatar"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExContactRegistered", +"doc":[ +"Service message about user registration",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"trait":{"name":"ServiceEx","key":8},"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExPhoneMissed", +"doc":[ +"Update about missing phone call"],"trait":{"name":"ServiceEx","key":9},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExPhoneCall", +"doc":[ +"Update about phone call",{"type":"reference","argument":"duration","category":"full","description":" Duration of a phone call"}],"trait":{"name":"ServiceEx","key":16},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChatArchived", +"doc":[ +"Message about chat archived"],"trait":{"name":"ServiceEx","key":20},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChatRestored", +"doc":[ +"Message about chat restored"],"trait":{"name":"ServiceEx","key":21},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"DocumentMessage", +"doc":[ +"File message",{"type":"reference","argument":"fileId","category":"full","description":" file id"},{"type":"reference","argument":"accessHash","category":"danger","description":" file access hash"},{"type":"reference","argument":"fileSize","category":"full","description":" file size"},{"type":"reference","argument":"name","category":"full","description":" name of file"},{"type":"reference","argument":"mimeType","category":"full","description":" mimetype of file"},{"type":"reference","argument":"thumb","category":"compact","description":" optional thumb of file. JPEG less that 90x90 with 60-70 quality."},{"type":"reference","argument":"ext","category":"compact","description":" Extension"}],"trait":{"name":"Message","key":3},"expandable":"true","attributes":[ +{"type":"int64","id":1,"name":"fileId"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"int32","id":3,"name":"fileSize"} +,{"type":"string","id":4,"name":"name"} +,{"type":"string","id":5,"name":"mimeType"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"FastThumb"}},"id":6,"name":"thumb"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"DocumentEx"}},"id":8,"name":"ext"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"DocumentEx","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"DocumentExPhoto", +"doc":[ +"File photo extension. Can be set ONLY for JPEG.",{"type":"reference","argument":"w","category":"full","description":" image width"},{"type":"reference","argument":"h","category":"full","description":" image height"}],"trait":{"name":"DocumentEx","key":1},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExVideo", +"doc":[ +"File video extension",{"type":"reference","argument":"w","category":"full","description":" video width"},{"type":"reference","argument":"h","category":"full","description":" video height"},{"type":"reference","argument":"duration","category":"full","description":" video duration"}],"trait":{"name":"DocumentEx","key":2},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"int32","id":3,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExVoice", +"doc":[ +"File voice extension",{"type":"reference","argument":"duration","category":"full","description":" voice duration"}],"trait":{"name":"DocumentEx","key":3},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExAnimation", +"doc":[ +"Animation extension. Can be set ONLY for GIF.",{"type":"reference","argument":"w","category":"full","description":" Animation width"},{"type":"reference","argument":"h","category":"full","description":" Animation height"}],"trait":{"name":"DocumentEx","key":6},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExAnimationVid", +"doc":[ +"Animation video extension. More compact version of Animation with video codec instead of GIF.","Can be set ONLY for MP4.",{"type":"reference","argument":"w","category":"full","description":" Animation width"},{"type":"reference","argument":"h","category":"full","description":" Animation height"},{"type":"reference","argument":"duration","category":"full","description":" Animation duration"}],"trait":{"name":"DocumentEx","key":7},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"int32","id":3,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"JsonMessage", +"doc":[ +"Custom-data JsonMessage",{"type":"reference","argument":"rawJson","category":"danger","description":" JSON object"}],"trait":{"name":"Message","key":4},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"rawJson"} +]}}, { + "type":"struct", + "content": { + "name":"UnsupportedMessage", +"doc":[ +"Explicit type for unsupported message"],"trait":{"name":"Message","key":5},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"StickerMessage", +"doc":[ +"Sticker message",{"type":"reference","argument":"stickerId","category":"full","description":" Optional Unique ID of sticker"},{"type":"reference","argument":"fastPreview","category":"full","description":" Optional Fast preview of sticker in webp format"},{"type":"reference","argument":"image512","category":"full","description":" Optional 512x512 sticker image in webp format"},{"type":"reference","argument":"image256","category":"full","description":" Optional 256x256 sticker image in webp format"},{"type":"reference","argument":"stickerCollectionId","category":"full","description":" Optional Collection ID"},{"type":"reference","argument":"stickerCollectionAccessHash","category":"full","description":" Optional Collection Access Hash"}],"trait":{"name":"Message","key":6},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"int32"},"id":1,"name":"stickerId"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"fastPreview"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":3,"name":"image512"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":4,"name":"image256"} +,{"type":{"type":"opt","childType":"int32"},"id":5,"name":"stickerCollectionId"} +,{"type":{"type":"opt","childType":"int64"},"id":6,"name":"stickerCollectionAccessHash"} +]}}, { + "type":"struct", + "content": { + "name":"BinaryMessage", +"doc":[ +"Binary Message. Useful for implementing your own content types",{"type":"reference","argument":"contentTag","category":"full","description":" Content Tag"},{"type":"reference","argument":"msg","category":"compact","description":" Message contents"}],"trait":{"name":"Message","key":7},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"contentTag"} +,{"type":"bytes","id":2,"name":"msg"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptedMessage", +"doc":[ +"Encrypted Message",{"type":"reference","argument":"box","category":"full","description":" Encrypted box"}],"trait":{"name":"Message","key":8},"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"EncryptedBox"},"id":1,"name":"box"} +]}}, { + "type":"struct", + "content": { + "name":"EmptyMessage", +"doc":[ +"Empty Message"],"trait":{"name":"Message","key":9},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"DialogShort", +"doc":[ +"Short Dialog from grouped conversation list",{"type":"reference","argument":"peer","category":"full","description":" Peer of conversation"},{"type":"reference","argument":"counter","category":"full","description":" Conversation unread count"},{"type":"reference","argument":"date","category":"full","description":" Conversation top message date"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":"int32","id":2,"name":"counter"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}}, { + "type":"struct", + "content": { + "name":"DialogGroup", +"doc":[ +"Grouped dialog list",{"type":"reference","argument":"title","category":"full","description":" Title of group"},{"type":"reference","argument":"key","category":"full","description":" Key of group"},{"type":"reference","argument":"dialogs","category":"full","description":" Conversations in group"}],"attributes":[ +{"type":"string","id":1,"name":"title"} +,{"type":"string","id":2,"name":"key"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"DialogShort"}},"id":3,"name":"dialogs"} +]}}, { + "type":"struct", + "content": { + "name":"MessageReaction", +"doc":[ +"Reaction to message",{"type":"reference","argument":"users","category":"full","description":" User's reaction"},{"type":"reference","argument":"code","category":"full","description":" Reaction EMOJI code"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"users"} +,{"type":"string","id":2,"name":"code"} +]}}, { + "type":"struct", + "content": { + "name":"MessageOutReference", +"doc":[ +"Message Out Reference",{"type":"reference","argument":"peer","category":"full","description":" Out Peer of message"},{"type":"reference","argument":"rid","category":"full","description":" Message random id"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +]}},{"type":"rpc","content":{ +"name":"SendMessage", +"header":92, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Sending plain message",{"type":"reference","argument":"peer","category":"full","description":"Destination peer for message"},{"type":"reference","argument":"rid","category":"full","description":"Message random id (generated on client side)"},{"type":"reference","argument":"message","category":"full","description":"The message"},{"type":"reference","argument":"isOnlyForUser","category":"full","description":"If message is shown only for specific user"},{"type":"reference","argument":"quotedMessageReference","category":"full","description":"Quoted message if present"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":4,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":5,"name":"isOnlyForUser"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageOutReference"}},"id":6,"name":"quotedMessageReference"} +]}},{"type":"rpc","content":{ +"name":"UpdateMessage", +"header":2658, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Changing Message content",{"type":"reference","argument":"peer","category":"full","description":"Destination Peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"updatedMessage","category":"full","description":"Updated Message content"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":3,"name":"updatedMessage"} +]}},{"type":"rpc","content":{ +"name":"MessageReceived", +"header":55, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Confirmation of plain message receive by device",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"date","category":"full","description":"Maximum date of received messages"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"rpc","content":{ +"name":"MessageRead", +"header":57, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Marking plain messages as read",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"date","category":"full","description":"Maximum date of read messages"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"rpc","content":{ +"name":"DeleteMessage", +"header":98, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Deleting messages",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rids","category":"full","description":"Message random id"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":3,"name":"rids"} +]}},{"type":"rpc","content":{ +"name":"ClearChat", +"header":99, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Clearing of conversation (without removing dialog from dialogs list)",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"DeleteChat", +"header":100, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Deleting of conversation (also leave group for group conversations)",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"ArchiveChat", +"header":2654, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Archiving chat",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"MessageSetReaction", +"header":210, +"response":{"type":"reference","name":"ReactionsResponse"}, +"doc":[ +"Setting Message reaction",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"code","category":"full","description":"Reaction code"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":"string","id":3,"name":"code"} +]}},{"type":"rpc","content":{ +"name":"MessageRemoveReaction", +"header":220, +"response":{"type":"reference","name":"ReactionsResponse"}, +"doc":[ +"Removing Message reaction",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"code","category":"full","description":"Reaction code"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":"string","id":3,"name":"code"} +]}},{"type":"response","content":{ +"name":"ReactionsResponse", +"header":219, +"doc":[ +"Response for reactions change"],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":3,"name":"reactions"} +]}},{"type":"update","content":{ +"name":"Message", +"header":55, +"doc":[ +"Update about plain message",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"senderUid","category":"full","description":" Sender of message"},{"type":"reference","argument":"date","category":"full","description":" date of message"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"message","category":"full","description":" message content"},{"type":"reference","argument":"attributes","category":"full","description":" optional message attributes"},{"type":"reference","argument":"quotedMessage","category":"full","description":" optional quoted message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"senderUid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":6,"name":"attributes"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":7,"name":"quotedMessage"} +]}},{"type":"update","content":{ +"name":"MessageContentChanged", +"header":162, +"doc":[ +"Update about message change",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"message","category":"full","description":" Message content"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":3,"name":"message"} +]}},{"type":"update","content":{ +"name":"MessageQuotedChanged", +"header":169, +"doc":[ +"Update about quoted message changed",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"quotedMessage","category":"full","description":" Quoted Message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":3,"name":"quotedMessage"} +]}},{"type":"update","content":{ +"name":"MessageDateChanged", +"header":163, +"doc":[ +"Update about message date changed",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"update","content":{ +"name":"MessageSent", +"header":4, +"doc":[ +"Update about message sent",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"update","content":{ +"name":"MessageReceived", +"header":54, +"doc":[ +"Update about message received",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of received message"},{"type":"reference","argument":"receivedDate","category":"full","description":" Date of receive"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"receivedDate"} +]}},{"type":"update","content":{ +"name":"MessageRead", +"header":19, +"doc":[ +"Update about message read",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of read message"},{"type":"reference","argument":"readDate","category":"full","description":" Date of read"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"readDate"} +]}},{"type":"update","content":{ +"name":"MessageReadByMe", +"header":50, +"doc":[ +"Update about message read by me",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of read message"},{"type":"reference","argument":"unreadCounter","category":"full","description":" Optional unread counter in conversation"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} +,{"type":{"type":"opt","childType":"int32"},"id":3,"name":"unreadCounter"} +]}},{"type":"update","content":{ +"name":"MessageDelete", +"header":46, +"doc":[ +"Update about message delete",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rids","category":"full","description":" Deleted messages"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"rids"} +]}},{"type":"update","content":{ +"name":"ChatClear", +"header":47, +"doc":[ +"Update about chat clear",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatDelete", +"header":48, +"doc":[ +"Update about chat delete",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatArchive", +"header":94, +"doc":[ +"Update about chat archive",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatDropCache", +"header":2690, +"doc":[ +"Update about cache drop",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatGroupsChanged", +"header":1, +"doc":[ +"Update about chat groups changed. Called only when adding, removing and reordering of grouped dialog.",{"type":"reference","argument":"dialogs","category":"compact","description":" New dialgos list"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":1,"name":"dialogs"} +]}},{"type":"update","content":{ +"name":"ReactionsUpdate", +"header":222, +"doc":[ +"Update about reactions change",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Message random id"},{"type":"reference","argument":"reactions","category":"full","description":" New Reactions"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":3,"name":"reactions"} +]}}, { + "type": "enum", + "content": { + "name": "MessageState", + "values": [ { - "type": "string", - "id": 5, - "name": "deviceTitle" + "name": "Sent", + "id": 1 }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" + "name": "Received", + "id": 2 }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SendCodeByPhoneCall", - "header": 197, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Dial phone and dictate auth code", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Transaction hash" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" + "name": "Read", + "id": 3 } - ] - } - }, - { - "type": "rpc", + ] + } + }, { + "type":"struct", + "content": { + "name":"MessageContainer", +"doc":[ +"Message from history",{"type":"reference","argument":"senderUid","category":"full","description":" Sender of mesasge"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"},{"type":"reference","argument":"message","category":"full","description":" Content of message"},{"type":"reference","argument":"reactions","category":"full","description":" Message reactions"},{"type":"reference","argument":"attribute","category":"full","description":" Optional message attributes"},{"type":"reference","argument":"quotedMessage","category":"full","description":" Optional quoted Message"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"senderUid"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"MessageState"}},"id":6,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":7,"name":"reactions"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":8,"name":"attribute"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":9,"name":"quotedMessage"} +]}}, { + "type": "enum", "content": { - "name": "StartEmailAuth", - "header": 185, - "response": { - "type": "anonymous", - "header": 186, - "doc": [ - "Email Activation response", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": " Hash of activation transaction" - }, - { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " true if user is registered" - }, - { - "type": "reference", - "argument": "activationType", - "category": "full", - "description": " Email Activation type" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "bool", - "id": 2, - "name": "isRegistered" - }, - { - "type": { - "type": "enum", - "childType": "EmailActivationType" - }, - "id": 3, - "name": "activationType" - } - ] - }, - "doc": [ - "Start EMail Activation", - { - "type": "reference", - "argument": "email", - "category": "full", - "description": "Email" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application Id" - }, + "name": "ListLoadMode", + "values": [ { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" + "name": "Forward", + "id": 1 }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + "name": "Backward", + "id": 2 }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, + "name": "Both", + "id": 3 + } + ] + } + },{"type":"rpc","content":{ +"name":"LoadHistory", +"header":118, +"response":{"type":"anonymous","header":119, "doc":[ +"Loaded history",{"type":"reference","argument":"history","category":"compact","description":" Messages"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":1,"name":"history"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupPeers"} +]}, +"doc":[ +"Loading history of chat",{"type":"reference","argument":"peer","category":"full","description":"Peer of conversation"},{"type":"reference","argument":"date","category":"full","description":"start date of messages for loading or 0 for loading from start"},{"type":"reference","argument":"loadMode","category":"full","description":"Loading mode: Forward loading, backward or both ways"},{"type":"reference","argument":"limit","category":"full","description":"maximum amount of messages (max is 100)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"ListLoadMode"}},"id":5,"name":"loadMode"} +,{"type":"int32","id":4,"name":"limit"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":6,"name":"optimizations"} +]}}, { + "type":"struct", + "content": { + "name":"Dialog", +"doc":[ +"Conversation from history",{"type":"reference","argument":"peer","category":"full","description":" Peer of conversation"},{"type":"reference","argument":"unreadCount","category":"full","description":" plain messages unread messages count"},{"type":"reference","argument":"sortDate","category":"full","description":" date of conversation for sorting"},{"type":"reference","argument":"senderUid","category":"full","description":" Sender of top message (may be zero)"},{"type":"reference","argument":"rid","category":"full","description":" Random ID of top message (may be zero)"},{"type":"reference","argument":"date","category":"full","description":" Date of top message (can't be zero)"},{"type":"reference","argument":"message","category":"full","description":" Content of message"},{"type":"reference","argument":"firstUnreadDate","category":"full","description":" Date of first unread message"},{"type":"reference","argument":"attributes","category":"full","description":" Optional top message attributes"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":"int32","id":3,"name":"unreadCount"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"sortDate"} +,{"type":{"type":"alias","childType":"userId"},"id":5,"name":"senderUid"} +,{"type":{"type":"alias","childType":"randomId"},"id":6,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":7,"name":"date"} +,{"type":{"type":"trait","childType":"Message"},"id":8,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"MessageState"}},"id":9,"name":"state"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"date"}},"id":10,"name":"firstUnreadDate"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":11,"name":"attributes"} +]}},{"type":"rpc","content":{ +"name":"LoadDialogs", +"header":104, +"response":{"type":"anonymous","header":105, "doc":[ +"Loaded dialogs",{"type":"reference","argument":"groups","category":"compact","description":" Loaded groups"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"dialogs","category":"compact","description":" Loaded dialogs"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Dialog"}},"id":3,"name":"dialogs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":5,"name":"groupPeers"} +]}, +"doc":[ +"Loading conversation history",{"type":"reference","argument":"minDate","category":"full","description":"start date of conversation loading. Use 0 to load latest messages"},{"type":"reference","argument":"limit","category":"full","description":"limit maximum amount of messages (max is 100)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"alias","childType":"date"},"id":1,"name":"minDate"} +,{"type":"int32","id":2,"name":"limit"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LoadArchived", +"header":2651, +"response":{"type":"anonymous","header":2652, "doc":[ +"Archived dialogs",{"type":"reference","argument":"groups","category":"full","description":" Referenced groups"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"dialogs","category":"full","description":" Archived dialogs"},{"type":"reference","argument":"nextOffset","category":"compact","description":" Offset for next bunch"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Dialog"}},"id":3,"name":"dialogs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupPeers"} +,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"nextOffset"} +]}, +"doc":[ +"Loading archived messages",{"type":"reference","argument":"nextOffset","category":"compact","description":"Optional next offset"},{"type":"reference","argument":"limit","category":"full","description":"Maximum number of elements"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"opt","childType":"bytes"},"id":1,"name":"nextOffset"} +,{"type":"int32","id":2,"name":"limit"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LoadGroupedDialogs", +"header":225, +"response":{"type":"anonymous","header":226, "doc":[ +"Loaded grouped dialogs",{"type":"reference","argument":"dialogs","category":"compact","description":" Loaded groups of dialogs"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"groups","category":"full","description":" Loaded groups"},{"type":"reference","argument":"showArchived","category":"full","description":" Show archived section"},{"type":"reference","argument":"showInvite","category":"full","description":" Show invite message"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":1,"name":"dialogs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"showArchived"} +,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"showInvite"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":6,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":7,"name":"groupPeers"} +]}, +"doc":[ +"Load all dialogs from grouped list"],"attributes":[ +{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":1,"name":"optimizations"} +]}},{"type":"response","content":{ +"name":"DialogsOrder", +"header":235, +"doc":[ +"Dialogs order response",{"type":"reference","argument":"seq","category":"full","description":" update seq"},{"type":"reference","argument":"state","category":"full","description":" update state"},{"type":"reference","argument":"groups","category":"full","description":" Update groups"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":3,"name":"groups"} +]}},{"type":"rpc","content":{ +"name":"HideDialog", +"header":231, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Hide Dialog from grouped list",{"type":"reference","argument":"peer","category":"full","description":"Dialog peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"ShowDialog", +"header":232, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Show Dialog in grouped list"],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"FavouriteDialog", +"header":224, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Marking dialog as favourite",{"type":"reference","argument":"peer","category":"full","description":"Peer for favouriting"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"UnfavouriteDialog", +"header":227, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Making dialog as unfavourite",{"type":"reference","argument":"peer","category":"full","description":"Peer for favouriting"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"NotifyDialogOpened", +"header":2785, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Notifying about dialog open",{"type":"reference","argument":"peer","category":"full","description":"Peer that was opened"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}}]}, { + "title": "Groups", + "package": "groups", + "items": [ +{"type":"comment","content":"Entities"}, { + "type":"struct", + "content": { + "name":"Member", +"doc":[ +"Member information",{"type":"reference","argument":"uid","category":"full","description":" User id"},{"type":"reference","argument":"inviterUid","category":"full","description":" User inviter id"},{"type":"reference","argument":"date","category":"full","description":" Adding date"},{"type":"reference","argument":"isAdmin","category":"full","description":" is member admin of group"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"inviterUid"} +,{"type":"int64","id":3,"name":"date"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isAdmin"} +]}}, { + "type": "enum", + "content": { + "name": "GroupType", + "values": [ { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" + "name": "GROUP", + "id": 1 }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" + "name": "CHANNEL", + "id": 2 } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "email" - }, + ] + } + }, { + "type": "enum", + "content": { + "name": "GroupPermissions", + "values": [ { - "type": "int32", - "id": 2, - "name": "appId" + "name": "SEND_MESSAGE", + "id": 1 }, { - "type": "string", - "id": 3, - "name": "apiKey" + "name": "CLEAR", + "id": 2 }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" + "name": "LEAVE", + "id": 3 }, { - "type": "string", - "id": 5, - "name": "deviceTitle" + "name": "DELETE", + "id": 4 }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" + "name": "JOIN", + "id": 5 }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" + "name": "VIEW_INFO", + "id": 6 } - ] - } - }, - { - "type": "rpc", + ] + } + }, { + "type": "enum", "content": { - "name": "StartAnonymousAuth", - "header": 198, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Starting Anonymous login", - { - "type": "reference", - "argument": "name", - "category": "full", - "description": "Name of new user" - }, + "name": "GroupFullPermissions", + "values": [ { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application Id" + "name": "EDIT_INFO", + "id": 1 }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" + "name": "VIEW_MEMBERS", + "id": 2 }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + "name": "INVITE_MEMBERS", + "id": 3 }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" + "name": "INVITE_VIA_LINK", + "id": 4 }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" + "name": "CALL", + "id": 5 }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "name" + "name": "EDIT_ADMIN_SETTINGS", + "id": 6 }, { - "type": "int32", - "id": 2, - "name": "appId" + "name": "VIEW_ADMINS", + "id": 7 }, { - "type": "string", - "id": 3, - "name": "apiKey" + "name": "EDIT_ADMINS", + "id": 8 }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" + "name": "KICK_INVITED", + "id": 9 }, { - "type": "string", - "id": 5, - "name": "deviceTitle" + "name": "KICK_ANYONE", + "id": 10 }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" + "name": "EDIT_FOREIGN", + "id": 11 }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" + "name": "DELETE_FOREIGN", + "id": 12 } - ] - } - }, + ] + } + }, { + "type":"struct", + "content": { + "name":"Group", +"doc":[ +"Group information","","Permissions.","Permissions of this structure is about group messages operation, such as","ability to send messages, clear chat, leave group and so on. This operations","Can be held outside of the Group Info page.","","Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.","If default is TRUE then ONE == FALSE.","Bits:","0 - canSendMessage. Default is FALSE.","1 - canClear. Default is FALSE.","2 - canLeave. Default is FALSE.","3 - canDelete. Default is FALSE.","4 - canJoin. Default is FALSE.","5 - canViewInfo. Default is FALSE.","",{"type":"reference","argument":"id","category":"full","description":" group id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Access hash of group"},{"type":"reference","argument":"title","category":"full","description":" Title of group"},{"type":"reference","argument":"avatar","category":"compact","description":" Avatar of group"},{"type":"reference","argument":"membersCount","category":"full","description":" Number of members"},{"type":"reference","argument":"isHidden","category":"full","description":" Is group hidden (not showing it in recent list). Default is false."},{"type":"reference","argument":"isMember","category":"full","description":" Is current user a member of a group. Default is true."},{"type":"reference","argument":"groupType","category":"full","description":" Group Type. Used only for displaying information. Default is GROUP."},{"type":"reference","argument":"permissions","category":"full","description":" Permissions of group object"},{"type":"reference","argument":"isDeleted","category":"full","description":" Is this group deleted"},{"type":"reference","argument":"ext","category":"full","description":" Group extension Data"},{"type":"reference","argument":"isAdmin","category":"full","description":" [DEPRECATED] Is current user an admin of a group"},{"type":"reference","argument":"theme","category":"hidden","description":" [DEPRECATED] Theme of group"},{"type":"reference","argument":"about","category":"hidden","description":" [DEPRECATED] About of group"},{"type":"reference","argument":"creatorUid","category":"hidden","description":" [DEPRECATED] Group creator"},{"type":"reference","argument":"members","category":"compact","description":" [DEPRECATED] Members of group"},{"type":"reference","argument":"createDate","category":"full","description":" [DEPRECATED] Date of creation"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":4,"name":"avatar"} +,{"type":{"type":"opt","childType":"int32"},"id":24,"name":"membersCount"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isMember"} +,{"type":{"type":"opt","childType":"bool"},"id":20,"name":"isHidden"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"GroupType"}},"id":25,"name":"groupType"} +,{"type":{"type":"opt","childType":"int64"},"id":26,"name":"permissions"} +,{"type":{"type":"opt","childType":"bool"},"id":27,"name":"isDeleted"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":22,"name":"ext"} +,{"type":{"type":"opt","childType":"bool"},"id":16,"name":"isAdmin", "deprecated":"true"} +,{"type":{"type":"alias","childType":"userId"},"id":8,"name":"creatorUid", "deprecated":"true"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":9,"name":"members", "deprecated":"true"} +,{"type":{"type":"alias","childType":"date"},"id":10,"name":"createDate", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":17,"name":"theme", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":18,"name":"about", "deprecated":"true"} +]}}, { + "type":"struct", + "content": { + "name":"GroupFull", +"doc":[ +"Goup Full information","Permissions.","Idea of Group Full mermissions is about Group Info pages. This permissions","are usefull only when trying to view and update group settings and not related","to chat messages itself.","Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.","If default is TRUE then ONE == FALSE.","Bits:","0 - canEditInfo. Default is FALSE.","1 - canViewMembers. Default is FALSE.","2 - canInviteMembers. Default is FALSE.","3 - canInviteViaLink. Default is FALSE.","4 - canCall. Default is FALSE.","5 - canEditAdminSettings. Default is FALSE.","6 - canViewAdmins. Default is FALSE.","7 - canEditAdmins. Default is FALSE.","8 - canKickInvited. Default is FALSE.","9 - canKickAnyone. Default is FALSE.","10 - canEditForeign. Default is FALSE.","11 - canDeleteForeign. Default is FALSE.","",{"type":"reference","argument":"id","category":"full","description":" Group Id"},{"type":"reference","argument":"createDate","category":"full","description":" Date created"},{"type":"reference","argument":"ownerUid","category":"full","description":" Optional group owner"},{"type":"reference","argument":"members","category":"full","description":" Group members. Can be empty when isAsyncMembers enabled."},{"type":"reference","argument":"theme","category":"full","description":" Group Theme"},{"type":"reference","argument":"about","category":"full","description":" Group about"},{"type":"reference","argument":"isAsyncMembers","category":"full","description":" Is Members need to be loaded asynchronous. Default is false."},{"type":"reference","argument":"isSharedHistory","category":"full","description":" Is history shared among all users. Default is false."},{"type":"reference","argument":"shortName","category":"full","description":" Group's short name"},{"type":"reference","argument":"permissions","category":"full","description":" Group Permissions"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"id"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"createDate"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":5,"name":"ownerUid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":12,"name":"members"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"theme"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":7,"name":"ext"} +,{"type":{"type":"opt","childType":"bool"},"id":11,"name":"isAsyncMembers"} +,{"type":{"type":"opt","childType":"bool"},"id":10,"name":"isSharedHistory"} +,{"type":{"type":"opt","childType":"string"},"id":14,"name":"shortName"} +,{"type":{"type":"opt","childType":"int64"},"id":27,"name":"permissions"} +]}},{"type":"rpc","content":{ +"name":"LoadFullGroups", +"header":2782, +"response":{"type":"anonymous","header":2783, "doc":[ +{"type":"reference","argument":"groups","category":"compact","description":" Groups to load"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"GroupFull"}},"id":1,"name":"groups"} +]}, +"doc":[ +"Loading Full Groups",{"type":"reference","argument":"groups","category":"compact","description":"Groups to load"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} +]}},{"type":"rpc","content":{ +"name":"LoadMembers", +"header":2786, +"response":{"type":"anonymous","header":2787, "doc":[ +{"type":"reference","argument":"users","category":"full","description":" Group members"},{"type":"reference","argument":"next","category":"full","description":" Load more reference"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":3,"name":"members"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"next"} +]}, +"doc":[ +"Loading group members",{"type":"reference","argument":"group","category":"full","description":"Group peer"},{"type":"reference","argument":"limit","category":"full","description":"Limit members"},{"type":"reference","argument":"next","category":"full","description":"Load more reference"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"group"} +,{"type":"int32","id":2,"name":"limit"} +,{"type":{"type":"opt","childType":"bytes"},"id":3,"name":"next"} +]}},{"type":"comment","content":"Update"},{"type":"update","content":{ +"name":"GroupTitleChanged", +"header":2609, +"doc":[ +"Update about title changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"title","category":"full","description":" Group Title"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"string","id":2,"name":"title"} +]}},{"type":"update","content":{ +"name":"GroupAvatarChanged", +"header":2610, +"doc":[ +"Update about avatar changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"avatar","category":"full","description":" Group Avatar"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":2,"name":"avatar"} +]}},{"type":"update","content":{ +"name":"GroupTopicChanged", +"header":2616, +"doc":[ +"Update about topic changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"topic","category":"full","description":" Updated topic"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"topic"} +]}},{"type":"update","content":{ +"name":"GroupAboutChanged", +"header":2617, +"doc":[ +"Update about about changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"about","category":"full","description":" Updated about"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} +]}},{"type":"update","content":{ +"name":"GroupExtChanged", +"header":2613, +"doc":[ +"Update about ext changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"ext","category":"full","description":" Updated ext"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} +]}},{"type":"update","content":{ +"name":"GroupFullExtChanged", +"header":2618, +"doc":[ +"Update about full ext changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"ext","category":"full","description":" Updated ext"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} +]}},{"type":"update","content":{ +"name":"GroupShortNameChanged", +"header":2628, +"doc":[ +"Group's short name changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"shortName","category":"full","description":" Group short name"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"shortName"} +]}},{"type":"update","content":{ +"name":"GroupOwnerChanged", +"header":2619, +"doc":[ +"Update about owner changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"userId","category":"full","description":" New Owner"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"userId"} +]}},{"type":"update","content":{ +"name":"GroupHistoryShared", +"header":2620, +"doc":[ +"Update about history shared",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"update","content":{ +"name":"GroupDeleted", +"header":2658, +"doc":[ +"Update about group deleted",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"update","content":{ +"name":"GroupPermissionsChanged", +"header":2663, +"doc":[ +"Update about group permissions changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"permissions","category":"full","description":" New Permissions"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int64","id":2,"name":"permissions"} +]}},{"type":"update","content":{ +"name":"GroupFullPermissionsChanged", +"header":2664, +"doc":[ +"Update about Full Group permissions changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"permissions","category":"full","description":" New Permissions"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int64","id":2,"name":"permissions"} +]}},{"type":"comment","content":" "},{"type":"update","content":{ +"name":"GroupMemberChanged", +"header":2612, +"doc":[ +"Update about membership changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"isMember","category":"full","description":" Is current user a member"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"bool","id":2,"name":"isMember"} +]}},{"type":"update","content":{ +"name":"GroupMembersBecameAsync", +"header":2615, +"doc":[ +"Update about members became async",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"update","content":{ +"name":"GroupMembersUpdated", +"header":2614, +"doc":[ +"Update about members updated",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"members","category":"full","description":" Group Members"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":2,"name":"members"} +]}},{"type":"update","content":{ +"name":"GroupMemberDiff", +"header":2623, +"doc":[ +"Update about members changed",{"type":"reference","argument":"removedUsers","category":"full","description":" Removed Users"},{"type":"reference","argument":"addedMembers","category":"full","description":" Added members"},{"type":"reference","argument":"membersCount","category":"full","description":" Current Members count"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"removedUsers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":3,"name":"addedMembers"} +,{"type":"int32","id":4,"name":"membersCount"} +]}},{"type":"update","content":{ +"name":"GroupMembersCountChanged", +"header":2622, +"doc":[ +"Update about members count changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"membersCount","category":"full","description":" Members count"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int32","id":2,"name":"membersCount"} +]}},{"type":"update","content":{ +"name":"GroupMemberAdminChanged", +"header":2627, +"doc":[ +"Update about member admin changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"userId","category":"full","description":" User Id"},{"type":"reference","argument":"isAdmin","category":"full","description":" Is Admin flag"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"userId"} +,{"type":"bool","id":3,"name":"isAdmin"} +]}},{"type":"comment","content":"Actions"},{"type":"rpc","content":{ +"name":"CreateGroup", +"header":230, +"response":{"type":"anonymous","header":216, "doc":[ +"Created group",{"type":"reference","argument":"seq","category":"full","description":" Update Seq"},{"type":"reference","argument":"state","category":"compact","description":" Update state"},{"type":"reference","argument":"group","category":"full","description":" Created group"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"userPeers","category":"full","description":" Referenced users"},{"type":"reference","argument":"date","category":"full","description":" Group creation date"}] ,"attributes":[{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} +,{"type":{"type":"struct","childType":"Group"},"id":3,"name":"group"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userPeers"} +]}, +"doc":[ +"Creating group chat",{"type":"reference","argument":"rid","category":"full","description":"Random Id for avoiding double create"},{"type":"reference","argument":"title","category":"full","description":"Group Title"},{"type":"reference","argument":"users","category":"hidden","description":"Members of group"},{"type":"reference","argument":"groupType","category":"full","description":"Group Type"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"rid"} +,{"type":"string","id":2,"name":"title"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"GroupType"}},"id":6,"name":"groupType"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":7,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupTitle", +"header":85, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Changing group title",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"title","category":"full","description":"new group title"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupAvatar", +"header":86, +"response":{"type":"anonymous","header":115, "doc":[ +"Updated group avatar",{"type":"reference","argument":"avatar","category":"compact","description":" Changed avatar"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"},{"type":"reference","argument":"date","category":"full","description":" Avatar change date"}] ,"attributes":[{"type":{"type":"struct","childType":"Avatar"},"id":1,"name":"avatar"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}, +"doc":[ +"Changing group avatar",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"fileLocation","category":"compact","description":"uploaded file for avatar"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"struct","childType":"FileLocation"},"id":3,"name":"fileLocation"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"RemoveGroupAvatar", +"header":101, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Removing group avatar",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupShortName", +"header":2793, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Edit Group Short Name",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"shortName","category":"full","description":"New group's short name"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"shortName"} +]}},{"type":"rpc","content":{ +"name":"EditGroupTopic", +"header":211, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Edit group topic",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random id of operation"},{"type":"reference","argument":"topic","category":"full","description":"New Topic"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"topic"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":4,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupAbout", +"header":213, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Edit Group About",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random id of operation"},{"type":"reference","argument":"about","category":"full","description":"New About"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"InviteUser", +"header":69, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Inviting user to group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"user","category":"full","description":"Users for invitation"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":3,"name":"user"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LeaveGroup", +"header":70, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Leaving group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LeaveAndDelete", +"header":2721, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Leave group and Delete Chat",{"type":"reference","argument":"groupPeer","category":"full","description":"Group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"KickUser", +"header":71, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Kicking user from group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"user","category":"full","description":"users for removing"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":3,"name":"user"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"JoinGroupByPeer", +"header":2722, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Join group by peer",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"JoinGroupByPeer2", +"header":44561, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Join group by peer without a necessity of invite",{"type":"reference","argument":"groupPeer","category":"hidden","description":"Groups peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"comment","content":"Administration"},{"type":"rpc","content":{ +"name":"MakeUserAdmin", +"header":2784, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Make user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} +]}},{"type":"rpc","content":{ +"name":"DismissUserAdmin", +"header":2791, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Dismissing user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} +]}},{"type":"rpc","content":{ +"name":"TransferOwnership", +"header":2789, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Transfer ownership of group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"newOwner","category":"full","description":"New group's owner"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"newOwner"} +]}}, { + "type":"struct", + "content": { + "name":"AdminSettings", +"doc":[ +"Admin Settings",{"type":"reference","argument":"showAdminsToMembers","category":"full","description":" Show admins in member list"},{"type":"reference","argument":"canMembersInvite","category":"full","description":" Can members of a group invite people"},{"type":"reference","argument":"canMembersEditGroupInfo","category":"full","description":" Can members edit group info"},{"type":"reference","argument":"canAdminsEditGroupInfo","category":"full","description":" Can admins edit group info"},{"type":"reference","argument":"showJoinLeaveMessages","category":"full","description":" Should join and leave messages be visible to members"}],"expandable":"true","attributes":[ +{"type":"bool","id":1,"name":"showAdminsToMembers"} +,{"type":"bool","id":2,"name":"canMembersInvite"} +,{"type":"bool","id":3,"name":"canMembersEditGroupInfo"} +,{"type":"bool","id":4,"name":"canAdminsEditGroupInfo"} +,{"type":"bool","id":5,"name":"showJoinLeaveMessages"} +]}},{"type":"rpc","content":{ +"name":"LoadAdminSettings", +"header":2790, +"response":{"type":"anonymous","header":2794, "doc":[ +"Loaded settings",{"type":"reference","argument":"settings","category":"full","description":" Current group admin settings"}] ,"attributes":[{"type":{"type":"struct","childType":"AdminSettings"},"id":1,"name":"settings"} +]}, +"doc":[ +"Loading administration settings",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"SaveAdminSettings", +"header":2792, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Save administartion settings",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's Peer"},{"type":"reference","argument":"settings","category":"full","description":"Group's settings"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"AdminSettings"},"id":2,"name":"settings"} +]}},{"type":"rpc","content":{ +"name":"DeleteGroup", +"header":2795, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Delete Group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"ShareHistory", +"header":2796, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Share History",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"comment","content":"Invite"},{"type":"response","content":{ +"name":"InviteUrl", +"header":178, +"doc":[ +"Response for invite url methods"],"attributes":[ +{"type":"string","id":1,"name":"url"} +]}},{"type":"rpc","content":{ +"name":"GetGroupInviteUrl", +"header":177, +"response":{"type":"reference","name":"InviteUrl"}, +"doc":[ +"Building invite url",{"type":"reference","argument":"groupPeer","category":"full","description":"Destination group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"RevokeInviteUrl", +"header":179, +"response":{"type":"reference","name":"InviteUrl"}, +"doc":[ +"Revoking invite urls",{"type":"reference","argument":"groupPeer","category":"full","description":"Destination group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"JoinGroup", +"header":180, +"response":{"type":"anonymous","header":181, "doc":[ +{"type":"reference","argument":"group","category":"hidden","description":" Joined group"},{"type":"reference","argument":"users","category":"hidden","description":" Users from members"},{"type":"reference","argument":"userPeers","category":"hidden","description":" User Peers"},{"type":"reference","argument":"rid","category":"full","description":" Random id"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"hidden","description":" State"},{"type":"reference","argument":"date","category":"full","description":" Date of join"}] ,"attributes":[{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":5,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":7,"name":"userPeers"} +,{"type":{"type":"alias","childType":"randomId"},"id":6,"name":"rid"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}, +"doc":[ +"Join group method",{"type":"reference","argument":"token","category":"full","description":"Url or Token for joining to group"},{"type":"reference","argument":"optimizations","category":"hidden","description":"Enabled Optimizations"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"comment","content":"Obsolete Actions"},{"type":"rpc","content":{ +"name":"CreateGroupObsolete", +"header":65, +"response":{"type":"anonymous","header":66, "doc":[ +"Created group",{"type":"reference","argument":"groupPeer","category":"full","description":" Peer of created group"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"},{"type":"reference","argument":"users","category":"compact","description":" Members of created group"},{"type":"reference","argument":"date","category":"full","description":" Group creation date"}] ,"attributes":[{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":"int32","id":3,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":4,"name":"state"} +,{"type":{"type":"list","childType":"int32"},"id":5,"name":"users"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} +]}, +"doc":[ +"[OBSOLETE] Creating group chat",{"type":"reference","argument":"rid","category":"full","description":"Random Id for avoiding double create"},{"type":"reference","argument":"title","category":"full","description":"Title of new group"},{"type":"reference","argument":"users","category":"compact","description":"Members of new group"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"rid"} +,{"type":"string","id":2,"name":"title"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} +]}},{"type":"rpc","content":{ +"name":"EnterGroupObsolete", +"header":199, +"response":{"type":"anonymous","header":200, "doc":[ +"Joined group",{"type":"reference","argument":"group","category":"full","description":" Joined group"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"rid","category":"full","description":" Rid of join message"},{"type":"reference","argument":"seq","category":"full","description":" Seq of Update"},{"type":"reference","argument":"state","category":"full","description":" State of Update"},{"type":"reference","argument":"date","category":"full","description":" Date of update"}] ,"attributes":[{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"rid"} +,{"type":"int32","id":4,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":5,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} +]}, +"doc":[ +"[OBSOLETE] Join random group by peer id",{"type":"reference","argument":"peer","category":"full","description":"Public group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"MakeUserAdminObsolete", +"header":214, +"response":{"type":"anonymous","header":215, "doc":[ +{"type":"reference","argument":"members","category":"full","description":" new members"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":1,"name":"members"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +]}, +"doc":[ +"[OBSOLETE] Make user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} +]}},{"type":"comment","content":"Obsolete Updates"},{"type":"update","content":{ +"name":"GroupInviteObsolete", +"header":36, +"doc":[ +"Update about inviting current user to group",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"inviteUid","category":"full","description":" Inviter UID. If equals to current uid than group created by user."},{"type":"reference","argument":"date","category":"full","description":" Date of creating"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":9,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":5,"name":"inviteUid"} +,{"type":{"type":"alias","childType":"date"},"id":8,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupUserInvitedObsolete", +"header":21, +"doc":[ +"Update about inviting user to group",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Added user ID"},{"type":"reference","argument":"inviterUid","category":"full","description":" Inviter user ID"},{"type":"reference","argument":"date","category":"full","description":" Date of adding user to group"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"inviterUid"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupUserLeaveObsolete", +"header":23, +"doc":[ +"Update about leaving user",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" User's ID"},{"type":"reference","argument":"date","category":"full","description":" Date of user leave"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupUserKickObsolete", +"header":24, +"doc":[ +"Update about kicking user",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Kicked user's ID"},{"type":"reference","argument":"kickerUid","category":"full","description":" Kicker user's ID"},{"type":"reference","argument":"date","category":"full","description":" Date of user kick"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"kickerUid"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupMembersUpdateObsolete", +"header":44, +"doc":[ +"Silent group members update",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"members","category":"full","description":" New members list"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":2,"name":"members"} +]}},{"type":"update","content":{ +"name":"GroupTitleChangedObsolete", +"header":38, +"doc":[ +"Update about group title change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Changer UID"},{"type":"reference","argument":"title","category":"full","description":" New Title of group"},{"type":"reference","argument":"date","category":"full","description":" Date of title change"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupTopicChangedObsolete", +"header":213, +"doc":[ +"Update about group topic change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Changer UID"},{"type":"reference","argument":"topic","category":"full","description":" New topic of group"},{"type":"reference","argument":"date","category":"full","description":" Date of theme change"},{"type":"reference","argument":"rid","category":"full","description":" Randomd Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"topic"} +,{"type":{"type":"alias","childType":"date"},"id":5,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupAboutChangedObsolete", +"header":214, +"doc":[ +"Update about group about change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"about","category":"full","description":" Group about"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} +]}},{"type":"update","content":{ +"name":"GroupAvatarChangedObsolete", +"header":39, +"doc":[ +"Update about group avatar change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Avatar changer uid"},{"type":"reference","argument":"avatar","category":"compact","description":" New Avatar. If null then avatar is removed"},{"type":"reference","argument":"date","category":"full","description":" Date of avatar change"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":3,"name":"avatar"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}}]}, { + "title": "Stickers", + "package": "stickers", + "doc": [ + "Stickers support in Actor" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"StickerDescriptor", +"doc":[ +"Descriptor of a Sticker",{"type":"reference","argument":"id","category":"full","description":" Sticker unique id"},{"type":"reference","argument":"emoji","category":"full","description":" Emoji code for sticker"},{"type":"reference","argument":"image128","category":"full","description":" Image of sticker 128x128 in WebP format"},{"type":"reference","argument":"image512","category":"full","description":" Image of sticker 512x512 in WebP format"},{"type":"reference","argument":"image256","category":"full","description":" Image of sticker 256x256 in WebP format"}],"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"emoji"} +,{"type":{"type":"struct","childType":"ImageLocation"},"id":3,"name":"image128"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":4,"name":"image512"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":5,"name":"image256"} +]}}, { + "type":"struct", + "content": { + "name":"StickerCollection", +"doc":[ +"Sticker collection",{"type":"reference","argument":"id","category":"full","description":" Unique id of a collection"},{"type":"reference","argument":"accessHash","category":"full","description":" Access Hash of a collection"},{"type":"reference","argument":"stickers","category":"compact","description":" Sticker list"}],"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"StickerDescriptor"}},"id":3,"name":"stickers"} +]}},{"type":"response","content":{ +"name":"StickersReponse", +"header":240, +"doc":[ +"Stickers response",{"type":"reference","argument":"collections","category":"full","description":" Sticker collections"},{"type":"reference","argument":"seq","category":"full","description":" Seq of update"},{"type":"reference","argument":"state","category":"full","description":" State of update"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +]}},{"type":"rpc","content":{ +"name":"LoadOwnStickers", +"header":238, +"response":{"type":"anonymous","header":239, "doc":[ +"Own Stickers collections",{"type":"reference","argument":"ownStickers","category":"hidden","description":" Own sticker collections"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"ownStickers"} +]}, +"doc":[ +"Loading own stickers"],"attributes":[ +]}},{"type":"update","content":{ +"name":"OwnStickersChanged", +"header":161, +"doc":[ +"Own Stickers changed",{"type":"reference","argument":"collections","category":"compact","description":" New own sticker collections"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} +]}},{"type":"update","content":{ +"name":"StickerCollectionsChanged", +"header":164, +"doc":[ +"Sticker collection changed",{"type":"reference","argument":"collections","category":"full","description":" Updated sticker collections"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} +]}},{"type":"rpc","content":{ +"name":"AddStickerCollection", +"header":244, +"response":{"type":"reference","name":"StickersReponse"}, +"doc":[ +"Adding sticker collection",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"RemoveStickerCollection", +"header":245, +"response":{"type":"reference","name":"StickersReponse"}, +"doc":[ +"Removing sticker collection",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"LoadStickerCollection", +"header":246, +"response":{"type":"anonymous","header":247, "doc":[ +"Loaded collection",{"type":"reference","argument":"collection","category":"full","description":" Collection of stickers"}] ,"attributes":[{"type":{"type":"struct","childType":"StickerCollection"},"id":1,"name":"collection"} +]}, +"doc":[ +"Loading stickers",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}]}, { + "title": "Search", + "package": "search", + "doc": [ + "Searching API" + ], + "items": [ { - "type": "rpc", + "type": "enum", "content": { - "name": "StartTokenAuth", - "header": 203, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Starting token-based login", + "name": "SearchPeerType", + "values": [ { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Token for authentication" + "name": "Groups", + "id": 1 }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application Id" + "name": "Contacts", + "id": 2 }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, + "name": "Public", + "id": 3 + } + ] + } + }, { + "type": "enum", + "content": { + "name": "SearchContentType", + "values": [ { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + "name": "Any", + "id": 1 }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, - { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" - }, - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - }, - { - "type": "int32", - "id": 2, - "name": "appId" - }, - { - "type": "string", - "id": 3, - "name": "apiKey" - }, - { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, - { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "StartUsernameAuth", - "header": 2571, - "response": { - "type": "anonymous", - "header": 2572, - "doc": [ - "Result of login auth start. If is not registered move to signup.", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": " Authentication transaction hash" - }, - { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " If user is registered with this username" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "bool", - "id": 2, - "name": "isRegistered" - } - ] - }, - "doc": [ - "Starting Login Authentication", - { - "type": "reference", - "argument": "username", - "category": "full", - "description": "Username for signing in" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application id" - }, - { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, - { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, - { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, - { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "Time Zone of device" - }, - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages of device" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "username" - }, - { - "type": "int32", - "id": 2, - "name": "appId" - }, - { - "type": "string", - "id": 3, - "name": "apiKey" - }, - { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, - { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ValidateCode", - "header": 189, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Performing user sign in.", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, - { - "type": "reference", - "argument": "code", - "category": "hidden", - "description": "Activation code" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "string", - "id": 2, - "name": "code" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ValidatePassword", - "header": 207, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Validation of account password", - { - "type": "reference", - "argument": "transactionHash", - "category": "full", - "description": "Hash of transaction" - }, - { - "type": "reference", - "argument": "password", - "category": "full", - "description": "Password for account" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "string", - "id": 2, - "name": "password" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetOAuth2Params", - "header": 194, - "response": { - "type": "anonymous", - "header": 195, - "doc": [ - { - "type": "reference", - "argument": "authUrl", - "category": "hidden", - "description": " Authentication url" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "authUrl" - } - ] - }, - "doc": [ - "Loading OAuth2 Parameters", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, - { - "type": "reference", - "argument": "redirectUrl", - "category": "full", - "description": "Redirect URL for Application" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "string", - "id": 2, - "name": "redirectUrl" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "CompleteOAuth2", - "header": 196, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Complete OAuth2 Authentication", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, - { - "type": "reference", - "argument": "code", - "category": "danger", - "description": "Authentication Code" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "string", - "id": 2, - "name": "code" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SignUp", - "header": 190, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Perform user SignUp", - { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": "User name" - }, - { - "type": "reference", - "argument": "sex", - "category": "full", - "description": "Optional user sex" - }, - { - "type": "reference", - "argument": "password", - "category": "full", - "description": "Password for password-based accounts" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "transactionHash" - }, - { - "type": "string", - "id": 2, - "name": "name" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "Sex" - } - }, - "id": 3, - "name": "sex" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "password" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "Auth", - "header": 5, - "doc": [ - "Authentication result", - { - "type": "reference", - "argument": "user", - "category": "compact", - "description": " The authenticated User" - }, - { - "type": "reference", - "argument": "config", - "category": "full", - "description": " Current config of server" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "User" - }, - "id": 2, - "name": "user" - }, - { - "type": { - "type": "struct", - "childType": "Config" - }, - "id": 3, - "name": "config" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "AuthSession", - "doc": [ - "Authentication session", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Unuque ID of session" - }, - { - "type": "reference", - "argument": "authHolder", - "category": "full", - "description": " holder of session. 0 - this device, 1 - other." - }, - { - "type": "reference", - "argument": "appId", - "category": "full", - "description": " Application Id (user in SignIn/SignUp)" - }, - { - "type": "reference", - "argument": "appTitle", - "category": "full", - "description": " Title of application" - }, - { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": " Title of device" - }, - { - "type": "reference", - "argument": "authTime", - "category": "full", - "description": " Time of session creating" - }, - { - "type": "reference", - "argument": "authLocation", - "category": "hidden", - "description": " two-letter country code of session create" - }, - { - "type": "reference", - "argument": "latitude", - "category": "hidden", - "description": " optional latitude of auth if available" - }, - { - "type": "reference", - "argument": "longitude", - "category": "hidden", - "description": " optional longitude of auth if available" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": { - "type": "enum", - "childType": "AuthHolder" - }, - "id": 2, - "name": "authHolder" - }, - { - "type": "int32", - "id": 3, - "name": "appId" - }, - { - "type": "string", - "id": 4, - "name": "appTitle" - }, - { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, - { - "type": "int32", - "id": 6, - "name": "authTime" - }, - { - "type": "string", - "id": 7, - "name": "authLocation" - }, - { - "type": { - "type": "opt", - "childType": "double" - }, - "id": 8, - "name": "latitude" - }, - { - "type": { - "type": "opt", - "childType": "double" - }, - "id": 9, - "name": "longitude" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "AuthHolder", - "values": [ - { - "name": "ThisDevice", - "id": 1 - }, - { - "name": "OtherDevice", - "id": 2 - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetAuthSessions", - "header": 80, - "response": { - "type": "anonymous", - "header": 81, - "doc": [ - "Current Auth sessions", - { - "type": "reference", - "argument": "userAuths", - "category": "compact", - "description": " User authentications" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "AuthSession" - } - }, - "id": 1, - "name": "userAuths" - } - ] - }, - "doc": [ - "Getting of all active user's authentication sessions" - ], - "attributes": [] - } - }, - { - "type": "rpc", - "content": { - "name": "TerminateSession", - "header": 82, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "SignOut on specified user's session", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "id from AuthItem" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "TerminateAllSessions", - "header": 83, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "SignOut on all exept current sessions" - ], - "attributes": [] - } - }, - { - "type": "rpc", - "content": { - "name": "SignOut", - "header": 84, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "SignOut current session" - ], - "attributes": [] - } - }, - { - "type": "comment", - "content": "OBSOLETE METHODS" - }, - { - "type": "rpc", - "content": { - "name": "SignInObsolete", - "header": 3, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Performing user signin", - { - "type": "reference", - "argument": "phoneNumber", - "category": "danger", - "description": "Phone number in international format" - }, - { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": "Code request hash from RequestAuthCode" - }, - { - "type": "reference", - "argument": "smsCode", - "category": "danger", - "description": "Confirmation code from SMS" - }, - { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, - { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device title like 'Steven's iPhone'" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, - { - "type": "reference", - "argument": "appKey", - "category": "hidden", - "description": "Application API key" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, - { - "type": "string", - "id": 2, - "name": "smsHash" - }, - { - "type": "string", - "id": 3, - "name": "smsCode" - }, - { - "type": "bytes", - "id": 5, - "name": "deviceHash" - }, - { - "type": "string", - "id": 6, - "name": "deviceTitle" - }, - { - "type": "int32", - "id": 7, - "name": "appId" - }, - { - "type": "string", - "id": 8, - "name": "appKey" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SignUpObsolete", - "header": 4, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Performing user signup. If user perform signup on already registered user it just override previous", - "profile information", - { - "type": "reference", - "argument": "phoneNumber", - "category": "danger", - "description": "Phone number in international format" - }, - { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": "Code request hash from RequestAuthCode" - }, - { - "type": "reference", - "argument": "smsCode", - "category": "danger", - "description": "Confirmation code from SMS" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": "User name" - }, - { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, - { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device title like 'Steven's iPhone'" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, - { - "type": "reference", - "argument": "appKey", - "category": "hidden", - "description": "pplication API key" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, - { - "type": "string", - "id": 2, - "name": "smsHash" - }, - { - "type": "string", - "id": 3, - "name": "smsCode" - }, - { - "type": "string", - "id": 4, - "name": "name" - }, - { - "type": "bytes", - "id": 7, - "name": "deviceHash" - }, - { - "type": "string", - "id": 8, - "name": "deviceTitle" - }, - { - "type": "int32", - "id": 9, - "name": "appId" - }, - { - "type": "string", - "id": 10, - "name": "appKey" - }, - { - "type": "bool", - "id": 11, - "name": "isSilent" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SendAuthCodeObsolete", - "header": 1, - "response": { - "type": "anonymous", - "header": 2, - "doc": [ - "Sms Request response", - { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": " Hash of SMS request" - }, - { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " true if user is registered" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "smsHash" - }, - { - "type": "bool", - "id": 2, - "name": "isRegistered" - } - ] - }, - "doc": [ - "Sending SMS with activation code", - { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": "Phone number in international format" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, - { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, - { - "type": "int32", - "id": 2, - "name": "appId" - }, - { - "type": "string", - "id": 3, - "name": "apiKey" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SendAuthCallObsolete", - "header": 90, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Requesting Phone activation", - { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": "Phone number in international format" - }, - { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": "Code request hash from RequestAuthCode" - }, - { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, - { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, - { - "type": "string", - "id": 2, - "name": "smsHash" - }, - { - "type": "int32", - "id": 3, - "name": "appId" - }, - { - "type": "string", - "id": 4, - "name": "apiKey" - } - ] - } - } - ] - }, - { - "title": "Users", - "package": "users", - "doc": [ - "Users are objects that secured by accessHash. You can't load user profile by it's id.", - "You can't send message to user without finding it's object in Updates or by calling", - "method for user search, contacts import or some other methods.", - "", - "Applications need to keep all Users information forever.", - "", - "Each User have optional localName - name of user that was set by current user and can be changed", - "any time by calling EditUserLocalName method." - ], - "items": [ - { - "type": "enum", - "content": { - "name": "Sex", - "values": [ - { - "name": "Unknown", - "id": 1 - }, - { - "name": "Male", - "id": 2 - }, - { - "name": "Female", - "id": 3 - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "ContactType", - "values": [ - { - "name": "Phone", - "id": 1 - }, - { - "name": "Email", - "id": 2 - }, - { - "name": "Web", - "id": 3 - }, - { - "name": "Social", - "id": 4 - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ContactRecord", - "doc": [ - "Contact information record", - { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Record type" - }, - { - "type": "reference", - "argument": "typeSpec", - "category": "hidden", - "description": " Value for specification type of contact, for example 'mobile/standalone/office' for phones or 'vk/fb/telegram' for extenrnal networks." - }, - { - "type": "reference", - "argument": "stringValue", - "category": "full", - "description": " String value of record" - }, - { - "type": "reference", - "argument": "longValue", - "category": "full", - "description": " Long value of record" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Title of record" - }, - { - "type": "reference", - "argument": "subtitle", - "category": "hidden", - "description": " Subtitle of record" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "enum", - "childType": "ContactType" - }, - "id": 1, - "name": "type" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "typeSpec" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "stringValue" - }, - { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 3, - "name": "longValue" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "title" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 5, - "name": "subtitle" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "User", - "doc": [ - "Main user object", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " uid" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " user's access hash" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " user's name" - }, - { - "type": "reference", - "argument": "localName", - "category": "full", - "description": " user's local name" - }, - { - "type": "reference", - "argument": "nick", - "category": "full", - "description": " User's nickname" - }, - { - "type": "reference", - "argument": "sex", - "category": "full", - "description": " optional sex of user" - }, - { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " avatar of user" - }, - { - "type": "reference", - "argument": "isBot", - "category": "full", - "description": " Is user actually bot. By default is false." - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Extension values" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " [DEPRECATED] User's about information" - }, - { - "type": "reference", - "argument": "contactInfo", - "category": "compact", - "description": " [DEPRECATED] Contact information of user" - }, - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": " [DEPRECATED] Preferred user languages" - }, - { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": " [DEPRECATED] Time Zone of user in TZ format" - }, - { - "type": "reference", - "argument": "botCommands", - "category": "full", - "description": " [DEPRECATED] Available Bot Commands" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": "string", - "id": 3, - "name": "name" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "localName" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 13, - "name": "nick" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "Sex" - } - }, - "id": 5, - "name": "sex" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 8, - "name": "avatar" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 11, - "name": "isBot" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 20, - "name": "ext" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ContactRecord" - } - }, - "id": 12, - "name": "contactInfo", - "deprecated": "true" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 14, - "name": "about", - "deprecated": "true" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 16, - "name": "preferredLanguages", - "deprecated": "true" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 17, - "name": "timeZone", - "deprecated": "true" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "BotCommand" - } - }, - "id": 19, - "name": "botCommands", - "deprecated": "true" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "FullUser", - "doc": [ - "Full User representation", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " User's Id" - }, - { - "type": "reference", - "argument": "contactInfo", - "category": "compact", - "description": " User's contact information" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " User's about information" - }, - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": " Preferred user languages" - }, - { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": " Time Zone of user in TZ format" - }, - { - "type": "reference", - "argument": "botCommands", - "category": "full", - "description": " Available Commands for Bot" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Extension values. NOTE: This values are not related to ext field in User object." - }, - { - "type": "reference", - "argument": "isBlocked", - "category": "full", - "description": " Is user blocked. Default is false." - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ContactRecord" - } - }, - "id": 2, - "name": "contactInfo" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "about" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 4, - "name": "preferredLanguages" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 5, - "name": "timeZone" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "BotCommand" - } - }, - "id": 6, - "name": "botCommands" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 7, - "name": "ext" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 8, - "name": "isBlocked" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "BotCommand", - "doc": [ - "Available bot commands", - { - "type": "reference", - "argument": "slashCommand", - "category": "full", - "description": " Slash command name (wihtout slash)" - }, - { - "type": "reference", - "argument": "description", - "category": "full", - "description": " Slash command description" - }, - { - "type": "reference", - "argument": "locKey", - "category": "full", - "description": " Optional Localization Key for i18n" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "slashCommand" - }, - { - "type": "string", - "id": 2, - "name": "description" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "locKey" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditUserLocalName", - "header": 96, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Renaming of user's visible name", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": "target User's uid" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": "User's accessHash" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": "New user name" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": "string", - "id": 3, - "name": "name" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserAvatarChanged", - "header": 16, - "doc": [ - "Update about avatar changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, - { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " user's new avatar" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 2, - "name": "avatar" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserNameChanged", - "header": 32, - "doc": [ - "Update about name changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " user's name" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": "string", - "id": 2, - "name": "name" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserLocalNameChanged", - "header": 51, - "doc": [ - "Update about local name changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, - { - "type": "reference", - "argument": "localName", - "category": "full", - "description": " new user's local name" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "localName" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserContactsChanged", - "header": 134, - "doc": [ - "Update about contact information change", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, - { - "type": "reference", - "argument": "contactRecords", - "category": "compact", - "description": " new phones list" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ContactRecord" - } - }, - "id": 4, - "name": "contactRecords" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserNickChanged", - "header": 209, - "doc": [ - "Update about nick changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, - { - "type": "reference", - "argument": "nickname", - "category": "full", - "description": " user's new nickname" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "nickname" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserAboutChanged", - "header": 210, - "doc": [ - "Update about user's about changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's uid" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " User's about" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "about" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserPreferredLanguagesChanged", - "header": 212, - "doc": [ - "Update about user's preferred languages", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's uid" - }, - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": " User's preferred languages. Can be empty." - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 2, - "name": "preferredLanguages" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserTimeZoneChanged", - "header": 216, - "doc": [ - "User TimeZone changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's uid" - }, - { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": " User's new time zone in TZ format" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "timeZone" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserBotCommandsChanged", - "header": 217, - "doc": [ - "Update about bot commands changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's Id" - }, - { - "type": "reference", - "argument": "commands", - "category": "full", - "description": " New List of commands" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "BotCommand" - } - }, - "id": 2, - "name": "commands" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserExtChanged", - "header": 218, - "doc": [ - "Update about user ext changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " New Ext Value in User (NOT FullUser) object." - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 2, - "name": "ext" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserFullExtChanged", - "header": 219, - "doc": [ - "Update about user ext changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's Id" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " New Ext Value in FullUser (NOT User) object." - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 3, - "name": "ext" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadFullUsers", - "header": 2649, - "response": { - "type": "anonymous", - "header": 2650, - "doc": [ - { - "type": "reference", - "argument": "fullUsers", - "category": "compact", - "description": " Loaded users" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "FullUser" - } - }, - "id": 1, - "name": "fullUsers" - } - ] - }, - "doc": [ - "Loading Full User information", - { - "type": "reference", - "argument": "userPeers", - "category": "compact", - "description": "User's peers to load. Should be non-empy" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "userPeers" - } - ] - } - } - ] - }, - { - "title": "Profile", - "package": "profile", - "items": [ - { - "type": "rpc", - "content": { - "name": "EditName", - "header": 53, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing account's name", - { - "type": "reference", - "argument": "name", - "category": "full", - "description": "New name" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "name" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditNickName", - "header": 205, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing account's nickname", - { - "type": "reference", - "argument": "nickname", - "category": "full", - "description": "New Nickname" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "nickname" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "CheckNickName", - "header": 206, - "response": { - "type": "reference", - "name": "Bool" - }, - "doc": [ - "Checking availability of nickname", - { - "type": "reference", - "argument": "nickname", - "category": "full", - "description": "Nickname for checking" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "nickname" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditAbout", - "header": 212, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing about information", - { - "type": "reference", - "argument": "about", - "category": "full", - "description": "new about information" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "about" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditAvatar", - "header": 31, - "response": { - "type": "anonymous", - "header": 103, - "doc": [ - "Response for change account avatar", - { - "type": "reference", - "argument": "avatar", - "category": "full", - "description": " New avatar" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Avatar" - }, - "id": 1, - "name": "avatar" - }, - { - "type": "int32", - "id": 2, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - } - ] - }, - "doc": [ - "Changing account's avatar", - { - "type": "reference", - "argument": "fileLocation", - "category": "compact", - "description": "File Location of uploaded unencrypted avatar" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "fileLocation" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RemoveAvatar", - "header": 91, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Removing account's avatar" - ], - "attributes": [] - } - }, - { - "type": "rpc", - "content": { - "name": "EditMyTimeZone", - "header": 144, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Updating user's time zone", - { - "type": "reference", - "argument": "tz", - "category": "full", - "description": "New Time Zone" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "tz" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditMyPreferredLanguages", - "header": 145, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing preffered languages", - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preffered Languages" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 1, - "name": "preferredLanguages" - } - ] - } - } - ] - }, - { - "title": "Contacts", - "package": "contacts", - "doc": [ - "Before working with contact list is is useful to import contacts from phone first by calling", - "method ImportContacts#0x07.", - "", - "All phone numbers MUST be preprocessed before import by some library (like libphonenumber)", - "and build international phone number depending on current users phone and/or locale.", - "", - "For loading contact list from server use GetContacts#0x57.", - "If during this call there are some updates about contact list change", - "it is recommended to call it again. Also applications need to sync contacts on application start.", - "", - "For searching for users without adding to contacts list use method FindContacts#0x70.", - "", - "For adding/deleting contacts AddContact#0x72 and DeleteContact#0x59." - ], - "items": [ - { - "type": "struct", - "content": { - "name": "PhoneToImport", - "doc": [ - "Phone for import", - { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": " phone number for import in international format" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " optional name for contact" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EmailToImport", - "doc": [ - "Email for import", - { - "type": "reference", - "argument": "email", - "category": "full", - "description": " email for importing" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " optional name for contact" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "email" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ImportContacts", - "header": 7, - "response": { - "type": "anonymous", - "header": 8, - "doc": [ - "Imported contacts", - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Imported users" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number if users are imported" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state if users are imported" - }, - { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Imported user peers" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 1, - "name": "users" - }, - { - "type": "int32", - "id": 2, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 4, - "name": "userPeers" - } - ] - }, - "doc": [ - "Importing phones and emails for building contact list", - "Maximum amount of items for import per method call equals to 100.", - { - "type": "reference", - "argument": "phones", - "category": "compact", - "description": "Phones for import" - }, - { - "type": "reference", - "argument": "emails", - "category": "compact", - "description": "Emails for import" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "PhoneToImport" - } - }, - "id": 1, - "name": "phones" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EmailToImport" - } - }, - "id": 2, - "name": "emails" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - } - ] - } - }, - { - "type": "empty" - }, - { - "type": "rpc", - "content": { - "name": "GetContacts", - "header": 87, - "response": { - "type": "anonymous", - "header": 88, - "doc": [ - "Current contact list", - { - "type": "reference", - "argument": "users", - "category": "hidden", - "description": " User list if list is changed" - }, - { - "type": "reference", - "argument": "isNotChanged", - "category": "full", - "description": " is list changed" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 1, - "name": "users" - }, - { - "type": "bool", - "id": 2, - "name": "isNotChanged" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "userPeers" - } - ] - }, - "doc": [ - "Getting current contact list", - "SHA256 hash of list of a comma-separated list of contact UIDs in ascending", - "order may be passed in contactsHash parameter.", - "If the contact list was not changed, isNotChanged will be true.", - { - "type": "reference", - "argument": "contactsHash", - "category": "full", - "description": "Hash of saved list in application" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "contactsHash" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RemoveContact", - "header": 89, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Removing contact from contact list", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": "Contact's UID" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": "Contact's AccessHash" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "AddContact", - "header": 114, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Adding contact to contact list", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": "Contact's UID" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": "Contact's AccessHash" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SearchContacts", - "header": 112, - "response": { - "type": "anonymous", - "header": 113, - "doc": [ - "Founded users", - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Founded users" - }, - { - "type": "reference", - "argument": "userPeers", - "category": "compact", - "description": " Founded users peers" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 1, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 2, - "name": "userPeers" - } - ] - }, - "doc": [ - "Searching contacts by user's query", - { - "type": "reference", - "argument": "request", - "category": "full", - "description": "Search query" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "request" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - } - ] - } - }, - { - "type": "empty" - }, - { - "type": "update", - "content": { - "name": "ContactRegistered", - "header": 5, - "doc": [ - "Update about contact registration", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " contact's uid" - }, - { - "type": "reference", - "argument": "isSilent", - "category": "full", - "description": " is registration silent. If this value is true then don't show notification about registration" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " date of registration" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": "bool", - "id": 2, - "name": "isSilent" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ContactsAdded", - "header": 40, - "doc": [ - "Update about contacts added", - { - "type": "reference", - "argument": "uids", - "category": "compact", - "description": " added contacts" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 1, - "name": "uids" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ContactsRemoved", - "header": 41, - "doc": [ - "Update about contacts removed", - { - "type": "reference", - "argument": "uids", - "category": "compact", - "description": " removed contacts" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 1, - "name": "uids" - } - ] - } - } - ] - }, - { - "title": "Privacy", - "package": "privacy", - "items": [ - { - "type": "rpc", - "content": { - "name": "BlockUser", - "header": 2636, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Block User", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for blocking" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnblockUser", - "header": 2637, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Unblock User", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for unblocking" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadBlockedUsers", - "header": 2638, - "response": { - "type": "anonymous", - "header": 2639, - "doc": [ - { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Blocked user peers" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "userPeers" - } - ] - }, - "doc": [ - "Load Blocked Users" - ], - "attributes": [] - } - }, - { - "type": "update", - "content": { - "name": "UserBlocked", - "header": 2629, - "doc": [ - "Update about User Blocked", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserUnblocked", - "header": 2630, - "doc": [ - "Update about User Unblocked", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - } - ] - } - } - ] - }, - { - "title": "Messaging", - "package": "messaging", - "doc": [ - "Actor can work with encrypted and plain messages in one conversation. For both types of messages API", - "contains a bit different methods. Also encrypted and plain messages have different schemes.", - "

Messages

", - "Message entity contains:", - "
    ", - "
  • PeerType - group chat or private
  • ", - "
  • PeerId - group or user id of conversation
  • ", - "
  • RandomId - unique id of message that generated by sender. In Encrypted messages random id is encrypted.
  • ", - "
  • Date - date of message (calculated on server)
  • ", - "
  • Content
  • ", - "
", - "

Message content

", - "Message can be one of three basic types of messages: Text Message, File Message and Service message.", - "All messages can contain extensions. For example we can send text message and add markdown extension with", - "formatted text in markdown and clients that support this extension will show markdown, and that clients that", - "not supported extension then show simple text. File messages can have photo, video or voice extensions.", - "Service message can have extensions extensions such as \"user added\", \"group created\", \"avatar changed\", etc.", - "

Send messages

", - "Sending messages looks same for encrypted and plain messages. Client MUST prepare all required data", - "before sending message (for example FastThumb for photo/video/documents) and call required methods.", - "Encrypted messages differs here only by a little different scheme and encryption.", - "

WRONG_KEYS and incorrect keys

", - "For sending encrypted messages client MUST send messages encrypted for all own and receivers keys.", - "If client send encryption with missing, old or incorrect keys it will receive WRONG_KEYS.", - "In WRONG_KEYS you need to deserialize relatedData from RpcError to WrongKeysErrorData", - "and get detailed information about keys. Sometimes there are some broken keys on server and client can't", - "encrypt messages with it than client MUST send empty encrypted key in request elsewhere API return WRONG_KEYS.", - "

Encrypted messages and New Devices

", - "When you send message to someone and when he registered with new device there are no way to receive old encrypted", - "messages on new device and because of this there are a problem about read/delivery statuses.", - "Alice send messages to Bob, but Bob lose his device and buy new iPhone and installed Actor.", - "Alice receive notification about new device and send another message. Bob open chat with Alice and", - "send read status with maximum message read date. Alice will mark all sent messages as read and one that", - "was not delivered. We can use status notifications per message, but in VERY heavy conversations it will be", - "a lot of unnecessary traffic. For resolving this small issue we have different ways of message statuses", - "for encrypted and plain messages. Also it is recomended to mark all undelivered messages on new device update as", - "not devered with warring sign.", - "

Message Read and Delivery

", - "There are two different ways for read and delivery statuses for encrypted and plain messages.", - "For encrypted messages used status change by RandomId and for plain messages used by maximum", - "date of read/delivered message." - ], - "items": [ - { - "type": "struct", - "content": { - "name": "MessageAttributes", - "doc": [ - "Message Attributes", - { - "type": "reference", - "argument": "isMentioned", - "category": "full", - "description": " Is mentioned. If set overrides built-in value." - }, - { - "type": "reference", - "argument": "isHighlighted", - "category": "full", - "description": " Is message highlighted. Default is false." - }, - { - "type": "reference", - "argument": "isNotified", - "category": "full", - "description": " Is notified. If set overrides built-in settings." - }, - { - "type": "reference", - "argument": "isOnlyForYou", - "category": "full", - "description": " If this message is only for you. Default is false" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "isMentioned" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isHighlighted" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isNotified" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "isOnlyForYou" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "QuotedMessage", - "doc": [ - "Quoted Message", - { - "type": "reference", - "argument": "messageId", - "category": "full", - "description": " Message Id if present" - }, - { - "type": "reference", - "argument": "publicGroupId", - "category": "full", - "description": " Public Group id if present" - }, - { - "type": "reference", - "argument": "senderUserId", - "category": "full", - "description": " Sender of message" - }, - { - "type": "reference", - "argument": "messageDate", - "category": "full", - "description": " Date of message" - }, - { - "type": "reference", - "argument": "quotedMessageContent", - "category": "full", - "description": " Optional Quoted Message Content. Can be empty if messageId is present and message is in current peer." - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 1, - "name": "messageId" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "groupId" - } - }, - "id": 2, - "name": "publicGroupId" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "senderUserId" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "messageDate" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "Message" - } - }, - "id": 5, - "name": "quotedMessageContent" - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "Message", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "TextMessage", - "doc": [ - "Text message", - { - "type": "reference", - "argument": "text", - "category": "danger", - "description": " the text" - }, - { - "type": "reference", - "argument": "mentions", - "category": "full", - "description": " User mentions in message" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Optional bytes of extension" - } - ], - "trait": { - "name": "Message", - "key": 1 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "text" - }, - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "mentions" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "TextMessageEx" - } - }, - "id": 3, - "name": "ext" - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "TextMessageEx", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "TextExMarkdown", - "doc": [ - "Markdown extension", - { - "type": "reference", - "argument": "markdown", - "category": "full", - "description": " Markdown text" - } - ], - "trait": { - "name": "TextMessageEx", - "key": 1 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 2, - "name": "markdown" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "TextModernMessage", - "doc": [ - "Modern text message", - { - "type": "reference", - "argument": "text", - "category": "full", - "description": " optional text of message" - }, - { - "type": "reference", - "argument": "senderNameOverride", - "category": "full", - "description": " optional overriding of sender" - }, - { - "type": "reference", - "argument": "senderPhotoOverride", - "category": "full", - "description": " optional overriding sender's photo" - }, - { - "type": "reference", - "argument": "style", - "category": "full", - "description": " optional paragraph style" - }, - { - "type": "reference", - "argument": "attaches", - "category": "full", - "description": " optional Attaches of message" - } - ], - "trait": { - "name": "TextMessageEx", - "key": 2 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "text" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "senderNameOverride" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 3, - "name": "senderPhotoOverride" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ParagraphStyle" - } - }, - "id": 4, - "name": "style" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "TextModernAttach" - } - }, - "id": 5, - "name": "attaches" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ParagraphStyle", - "doc": [ - "Paragraph style", - { - "type": "reference", - "argument": "showParagraph", - "category": "full", - "description": " Show quote-like paragraph?" - }, - { - "type": "reference", - "argument": "paragraphColor", - "category": "full", - "description": " Override paragraph color" - }, - { - "type": "reference", - "argument": "bgColor", - "category": "full", - "description": " Override background color" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "showParagraph" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "Color" - } - }, - "id": 2, - "name": "paragraphColor" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "Color" - } - }, - "id": 3, - "name": "bgColor" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "TextModernAttach", - "doc": [ - "Attaches to message", - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Attach of message" - }, - { - "type": "reference", - "argument": "titleUrl", - "category": "full", - "description": " Attach title url" - }, - { - "type": "reference", - "argument": "titleIcon", - "category": "full", - "description": " Attach title icon" - }, - { - "type": "reference", - "argument": "text", - "category": "full", - "description": " Attach text" - }, - { - "type": "reference", - "argument": "style", - "category": "full", - "description": " Attach style" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "title" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "titleUrl" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 3, - "name": "titleIcon" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "text" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ParagraphStyle" - } - }, - "id": 5, - "name": "style" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "TextModernField" - } - }, - "id": 6, - "name": "fields" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "TextModernField", - "doc": [ - "Modern message fields", - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Field title" - }, - { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Field value" - }, - { - "type": "reference", - "argument": "isShort", - "category": "full", - "description": " Is field can be shown in compact way (default is TRUE)" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "title" - }, - { - "type": "string", - "id": 2, - "name": "value" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isShort" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "TextCommand", - "doc": [ - "Text Command Message for bots", - { - "type": "reference", - "argument": "command", - "category": "full", - "description": " Slash-Command For execution" - }, - { - "type": "reference", - "argument": "args", - "category": "full", - "description": " Arguments of slash command" - } - ], - "trait": { - "name": "TextMessageEx", - "key": 3 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "command" - }, - { - "type": "string", - "id": 2, - "name": "args" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceMessage", - "doc": [ - "Service message", - { - "type": "reference", - "argument": "text", - "category": "full", - "description": " service message text" - }, - { - "type": "reference", - "argument": "ext", - "category": "compact", - "description": " Extension" - } - ], - "trait": { - "name": "Message", - "key": 2 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "text" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "ServiceEx" - } - }, - "id": 3, - "name": "ext" - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "ServiceEx", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExUserInvited", - "doc": [ - "Service message about adding user to group", - { - "type": "reference", - "argument": "invitedUid", - "category": "full", - "description": " added user id" - } - ], - "trait": { - "name": "ServiceEx", - "key": 1 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "invitedUid" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExUserJoined", - "doc": [ - "Service message about user join to group" - ], - "trait": { - "name": "ServiceEx", - "key": 17 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExUserKicked", - "doc": [ - "Service message about kicking user from group", - { - "type": "reference", - "argument": "kickedUid", - "category": "full", - "description": " kicked user id" - } - ], - "trait": { - "name": "ServiceEx", - "key": 2 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "kickedUid" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExUserLeft", - "doc": [ - "Service message about user left group" - ], - "trait": { - "name": "ServiceEx", - "key": 3 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExGroupCreated", - "doc": [ - "Service message about group creating" - ], - "trait": { - "name": "ServiceEx", - "key": 4 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExChangedTitle", - "doc": [ - "Service message about group title change", - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " New group title" - } - ], - "trait": { - "name": "ServiceEx", - "key": 5 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "title" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExChangedTopic", - "doc": [ - "Service message on group topic change", - { - "type": "reference", - "argument": "topic", - "category": "full", - "description": " New group topic" - } - ], - "trait": { - "name": "ServiceEx", - "key": 18 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "topic" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExChangedAbout", - "doc": [ - "Service message on group about change", - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " New group about" - } - ], - "trait": { - "name": "ServiceEx", - "key": 19 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "about" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExChangedAvatar", - "doc": [ - "Service message about avatar change", - { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " Updated avatar" - } - ], - "trait": { - "name": "ServiceEx", - "key": 6 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 1, - "name": "avatar" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExContactRegistered", - "doc": [ - "Service message about user registration", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User Id" - } - ], - "trait": { - "name": "ServiceEx", - "key": 8 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExPhoneMissed", - "doc": [ - "Update about missing phone call" - ], - "trait": { - "name": "ServiceEx", - "key": 9 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExPhoneCall", - "doc": [ - "Update about phone call", - { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " Duration of a phone call" - } - ], - "trait": { - "name": "ServiceEx", - "key": 16 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "duration" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExChatArchived", - "doc": [ - "Message about chat archived" - ], - "trait": { - "name": "ServiceEx", - "key": 20 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "ServiceExChatRestored", - "doc": [ - "Message about chat restored" - ], - "trait": { - "name": "ServiceEx", - "key": 21 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "DocumentMessage", - "doc": [ - "File message", - { - "type": "reference", - "argument": "fileId", - "category": "full", - "description": " file id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " file access hash" - }, - { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " file size" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " name of file" - }, - { - "type": "reference", - "argument": "mimeType", - "category": "full", - "description": " mimetype of file" - }, - { - "type": "reference", - "argument": "thumb", - "category": "compact", - "description": " optional thumb of file. JPEG less that 90x90 with 60-70 quality." - }, - { - "type": "reference", - "argument": "ext", - "category": "compact", - "description": " Extension" - } - ], - "trait": { - "name": "Message", - "key": 3 - }, - "expandable": "true", - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "fileId" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": "int32", - "id": 3, - "name": "fileSize" - }, - { - "type": "string", - "id": 4, - "name": "name" - }, - { - "type": "string", - "id": 5, - "name": "mimeType" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "FastThumb" - } - }, - "id": 6, - "name": "thumb" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "DocumentEx" - } - }, - "id": 8, - "name": "ext" - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "DocumentEx", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "DocumentExPhoto", - "doc": [ - "File photo extension. Can be set ONLY for JPEG.", - { - "type": "reference", - "argument": "w", - "category": "full", - "description": " image width" - }, - { - "type": "reference", - "argument": "h", - "category": "full", - "description": " image height" - } - ], - "trait": { - "name": "DocumentEx", - "key": 1 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "w" - }, - { - "type": "int32", - "id": 2, - "name": "h" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "DocumentExVideo", - "doc": [ - "File video extension", - { - "type": "reference", - "argument": "w", - "category": "full", - "description": " video width" - }, - { - "type": "reference", - "argument": "h", - "category": "full", - "description": " video height" - }, - { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " video duration" - } - ], - "trait": { - "name": "DocumentEx", - "key": 2 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "w" - }, - { - "type": "int32", - "id": 2, - "name": "h" - }, - { - "type": "int32", - "id": 3, - "name": "duration" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "DocumentExVoice", - "doc": [ - "File voice extension", - { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " voice duration" - } - ], - "trait": { - "name": "DocumentEx", - "key": 3 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "duration" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "DocumentExAnimation", - "doc": [ - "Animation extension. Can be set ONLY for GIF.", - { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Animation width" - }, - { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Animation height" - } - ], - "trait": { - "name": "DocumentEx", - "key": 6 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "w" - }, - { - "type": "int32", - "id": 2, - "name": "h" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "DocumentExAnimationVid", - "doc": [ - "Animation video extension. More compact version of Animation with video codec instead of GIF.", - "Can be set ONLY for MP4.", - { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Animation width" - }, - { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Animation height" - }, - { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " Animation duration" - } - ], - "trait": { - "name": "DocumentEx", - "key": 7 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "w" - }, - { - "type": "int32", - "id": 2, - "name": "h" - }, - { - "type": "int32", - "id": 3, - "name": "duration" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "JsonMessage", - "doc": [ - "Custom-data JsonMessage", - { - "type": "reference", - "argument": "rawJson", - "category": "danger", - "description": " JSON object" - } - ], - "trait": { - "name": "Message", - "key": 4 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "rawJson" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "UnsupportedMessage", - "doc": [ - "Explicit type for unsupported message" - ], - "trait": { - "name": "Message", - "key": 5 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "StickerMessage", - "doc": [ - "Sticker message", - { - "type": "reference", - "argument": "stickerId", - "category": "full", - "description": " Optional Unique ID of sticker" - }, - { - "type": "reference", - "argument": "fastPreview", - "category": "full", - "description": " Optional Fast preview of sticker in webp format" - }, - { - "type": "reference", - "argument": "image512", - "category": "full", - "description": " Optional 512x512 sticker image in webp format" - }, - { - "type": "reference", - "argument": "image256", - "category": "full", - "description": " Optional 256x256 sticker image in webp format" - }, - { - "type": "reference", - "argument": "stickerCollectionId", - "category": "full", - "description": " Optional Collection ID" - }, - { - "type": "reference", - "argument": "stickerCollectionAccessHash", - "category": "full", - "description": " Optional Collection Access Hash" - } - ], - "trait": { - "name": "Message", - "key": 6 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 1, - "name": "stickerId" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "fastPreview" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 3, - "name": "image512" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 4, - "name": "image256" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 5, - "name": "stickerCollectionId" - }, - { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 6, - "name": "stickerCollectionAccessHash" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "BinaryMessage", - "doc": [ - "Binary Message. Useful for implementing your own content types", - { - "type": "reference", - "argument": "contentTag", - "category": "full", - "description": " Content Tag" - }, - { - "type": "reference", - "argument": "msg", - "category": "compact", - "description": " Message contents" - } - ], - "trait": { - "name": "Message", - "key": 7 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "contentTag" - }, - { - "type": "bytes", - "id": 2, - "name": "msg" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EncryptedMessage", - "doc": [ - "Encrypted Message", - { - "type": "reference", - "argument": "box", - "category": "full", - "description": " Encrypted box" - } - ], - "trait": { - "name": "Message", - "key": 8 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "struct", - "childType": "EncryptedBox" - }, - "id": 1, - "name": "box" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EmptyMessage", - "doc": [ - "Empty Message" - ], - "trait": { - "name": "Message", - "key": 9 - }, - "expandable": "true", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "DialogShort", - "doc": [ - "Short Dialog from grouped conversation list", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer of conversation" - }, - { - "type": "reference", - "argument": "counter", - "category": "full", - "description": " Conversation unread count" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Conversation top message date" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": "int32", - "id": 2, - "name": "counter" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "DialogGroup", - "doc": [ - "Grouped dialog list", - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Title of group" - }, - { - "type": "reference", - "argument": "key", - "category": "full", - "description": " Key of group" - }, - { - "type": "reference", - "argument": "dialogs", - "category": "full", - "description": " Conversations in group" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "title" - }, - { - "type": "string", - "id": 2, - "name": "key" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogShort" - } - }, - "id": 3, - "name": "dialogs" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MessageReaction", - "doc": [ - "Reaction to message", - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " User's reaction" - }, - { - "type": "reference", - "argument": "code", - "category": "full", - "description": " Reaction EMOJI code" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 1, - "name": "users" - }, - { - "type": "string", - "id": 2, - "name": "code" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MessageOutReference", - "doc": [ - "Message Out Reference", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Out Peer of message" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Message random id" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SendMessage", - "header": 92, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Sending plain message", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer for message" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id (generated on client side)" - }, - { - "type": "reference", - "argument": "message", - "category": "full", - "description": "The message" - }, - { - "type": "reference", - "argument": "isOnlyForUser", - "category": "full", - "description": "If message is shown only for specific user" - }, - { - "type": "reference", - "argument": "quotedMessageReference", - "category": "full", - "description": "Quoted message if present" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "rid" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 4, - "name": "message" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 5, - "name": "isOnlyForUser" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageOutReference" - } - }, - "id": 6, - "name": "quotedMessageReference" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UpdateMessage", - "header": 2658, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Changing Message content", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination Peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id" - }, - { - "type": "reference", - "argument": "updatedMessage", - "category": "full", - "description": "Updated Message content" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 3, - "name": "updatedMessage" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MessageReceived", - "header": 55, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Confirmation of plain message receive by device", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": "Maximum date of received messages" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MessageRead", - "header": 57, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Marking plain messages as read", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": "Maximum date of read messages" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DeleteMessage", - "header": 98, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Deleting messages", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "rids", - "category": "full", - "description": "Message random id" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 3, - "name": "rids" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ClearChat", - "header": 99, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Clearing of conversation (without removing dialog from dialogs list)", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Conversation peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DeleteChat", - "header": 100, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Deleting of conversation (also leave group for group conversations)", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Conversation peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ArchiveChat", - "header": 2654, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Archiving chat", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Conversation peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MessageSetReaction", - "header": 210, - "response": { - "type": "reference", - "name": "ReactionsResponse" - }, - "doc": [ - "Setting Message reaction", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id" - }, - { - "type": "reference", - "argument": "code", - "category": "full", - "description": "Reaction code" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": "string", - "id": 3, - "name": "code" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MessageRemoveReaction", - "header": 220, - "response": { - "type": "reference", - "name": "ReactionsResponse" - }, - "doc": [ - "Removing Message reaction", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id" - }, - { - "type": "reference", - "argument": "code", - "category": "full", - "description": "Reaction code" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": "string", - "id": 3, - "name": "code" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "ReactionsResponse", - "header": 219, - "doc": [ - "Response for reactions change" - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageReaction" - } - }, - "id": 3, - "name": "reactions" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "Message", - "header": 55, - "doc": [ - "Update about plain message", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "senderUid", - "category": "full", - "description": " Sender of message" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " date of message" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, - { - "type": "reference", - "argument": "message", - "category": "full", - "description": " message content" - }, - { - "type": "reference", - "argument": "attributes", - "category": "full", - "description": " optional message attributes" - }, - { - "type": "reference", - "argument": "quotedMessage", - "category": "full", - "description": " optional quoted message" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "senderUid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 5, - "name": "message" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageAttributes" - } - }, - "id": 6, - "name": "attributes" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "QuotedMessage" - } - }, - "id": 7, - "name": "quotedMessage" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageContentChanged", - "header": 162, - "doc": [ - "Update about message change", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, - { - "type": "reference", - "argument": "message", - "category": "full", - "description": " Message content" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 3, - "name": "message" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageQuotedChanged", - "header": 169, - "doc": [ - "Update about quoted message changed", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, - { - "type": "reference", - "argument": "quotedMessage", - "category": "full", - "description": " Quoted Message" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "QuotedMessage" - } - }, - "id": 3, - "name": "quotedMessage" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageDateChanged", - "header": 163, - "doc": [ - "Update about message date changed", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of message" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageSent", - "header": 4, - "doc": [ - "Update about message sent", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of message" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageReceived", - "header": 54, - "doc": [ - "Update about message received", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "startDate", - "category": "full", - "description": " Start date of received message" - }, - { - "type": "reference", - "argument": "receivedDate", - "category": "full", - "description": " Date of receive" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "startDate" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "receivedDate" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageRead", - "header": 19, - "doc": [ - "Update about message read", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "startDate", - "category": "full", - "description": " Start date of read message" - }, - { - "type": "reference", - "argument": "readDate", - "category": "full", - "description": " Date of read" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "startDate" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "readDate" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageReadByMe", - "header": 50, - "doc": [ - "Update about message read by me", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "startDate", - "category": "full", - "description": " Start date of read message" - }, - { - "type": "reference", - "argument": "unreadCounter", - "category": "full", - "description": " Optional unread counter in conversation" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "startDate" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 3, - "name": "unreadCounter" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "MessageDelete", - "header": 46, - "doc": [ - "Update about message delete", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "rids", - "category": "full", - "description": " Deleted messages" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 2, - "name": "rids" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ChatClear", - "header": 47, - "doc": [ - "Update about chat clear", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ChatDelete", - "header": 48, - "doc": [ - "Update about chat delete", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ChatArchive", - "header": 94, - "doc": [ - "Update about chat archive", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ChatDropCache", - "header": 2690, - "doc": [ - "Update about cache drop", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ChatGroupsChanged", - "header": 1, - "doc": [ - "Update about chat groups changed. Called only when adding, removing and reordering of grouped dialog.", - { - "type": "reference", - "argument": "dialogs", - "category": "compact", - "description": " New dialgos list" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogGroup" - } - }, - "id": 1, - "name": "dialogs" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ReactionsUpdate", - "header": 222, - "doc": [ - "Update about reactions change", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Message random id" - }, - { - "type": "reference", - "argument": "reactions", - "category": "full", - "description": " New Reactions" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageReaction" - } - }, - "id": 3, - "name": "reactions" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "MessageState", - "values": [ - { - "name": "Sent", - "id": 1 - }, - { - "name": "Received", - "id": 2 - }, - { - "name": "Read", - "id": 3 - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MessageContainer", - "doc": [ - "Message from history", - { - "type": "reference", - "argument": "senderUid", - "category": "full", - "description": " Sender of mesasge" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of message" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of message" - }, - { - "type": "reference", - "argument": "message", - "category": "full", - "description": " Content of message" - }, - { - "type": "reference", - "argument": "reactions", - "category": "full", - "description": " Message reactions" - }, - { - "type": "reference", - "argument": "attribute", - "category": "full", - "description": " Optional message attributes" - }, - { - "type": "reference", - "argument": "quotedMessage", - "category": "full", - "description": " Optional quoted Message" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "senderUid" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 5, - "name": "message" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "MessageState" - } - }, - "id": 6, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageReaction" - } - }, - "id": 7, - "name": "reactions" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageAttributes" - } - }, - "id": 8, - "name": "attribute" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "QuotedMessage" - } - }, - "id": 9, - "name": "quotedMessage" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "ListLoadMode", - "values": [ - { - "name": "Forward", - "id": 1 - }, - { - "name": "Backward", - "id": 2 - }, - { - "name": "Both", - "id": 3 - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadHistory", - "header": 118, - "response": { - "type": "anonymous", - "header": 119, - "doc": [ - "Loaded history", - { - "type": "reference", - "argument": "history", - "category": "compact", - "description": " Messages" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageContainer" - } - }, - "id": 1, - "name": "history" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 4, - "name": "userPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 5, - "name": "groups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 6, - "name": "groupPeers" - } - ] - }, - "doc": [ - "Loading history of chat", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer of conversation" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": "start date of messages for loading or 0 for loading from start" - }, - { - "type": "reference", - "argument": "loadMode", - "category": "full", - "description": "Loading mode: Forward loading, backward or both ways" - }, - { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "maximum amount of messages (max is 100)" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "ListLoadMode" - } - }, - "id": 5, - "name": "loadMode" - }, - { - "type": "int32", - "id": 4, - "name": "limit" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 6, - "name": "optimizations" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Dialog", - "doc": [ - "Conversation from history", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer of conversation" - }, - { - "type": "reference", - "argument": "unreadCount", - "category": "full", - "description": " plain messages unread messages count" - }, - { - "type": "reference", - "argument": "sortDate", - "category": "full", - "description": " date of conversation for sorting" - }, - { - "type": "reference", - "argument": "senderUid", - "category": "full", - "description": " Sender of top message (may be zero)" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random ID of top message (may be zero)" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of top message (can't be zero)" - }, - { - "type": "reference", - "argument": "message", - "category": "full", - "description": " Content of message" - }, - { - "type": "reference", - "argument": "firstUnreadDate", - "category": "full", - "description": " Date of first unread message" - }, - { - "type": "reference", - "argument": "attributes", - "category": "full", - "description": " Optional top message attributes" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": "int32", - "id": 3, - "name": "unreadCount" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "sortDate" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 5, - "name": "senderUid" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 6, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 7, - "name": "date" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 8, - "name": "message" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "MessageState" - } - }, - "id": 9, - "name": "state" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "date" - } - }, - "id": 10, - "name": "firstUnreadDate" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageAttributes" - } - }, - "id": 11, - "name": "attributes" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadDialogs", - "header": 104, - "response": { - "type": "anonymous", - "header": 105, - "doc": [ - "Loaded dialogs", - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Loaded groups" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - }, - { - "type": "reference", - "argument": "dialogs", - "category": "compact", - "description": " Loaded dialogs" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 1, - "name": "groups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Dialog" - } - }, - "id": 3, - "name": "dialogs" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 4, - "name": "userPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 5, - "name": "groupPeers" - } - ] - }, - "doc": [ - "Loading conversation history", - { - "type": "reference", - "argument": "minDate", - "category": "full", - "description": "start date of conversation loading. Use 0 to load latest messages" - }, - { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "limit maximum amount of messages (max is 100)" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 1, - "name": "minDate" - }, - { - "type": "int32", - "id": 2, - "name": "limit" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadArchived", - "header": 2651, - "response": { - "type": "anonymous", - "header": 2652, - "doc": [ - "Archived dialogs", - { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Referenced groups" - }, - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Referenced users" - }, - { - "type": "reference", - "argument": "dialogs", - "category": "full", - "description": " Archived dialogs" - }, - { - "type": "reference", - "argument": "nextOffset", - "category": "compact", - "description": " Offset for next bunch" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 1, - "name": "groups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Dialog" - } - }, - "id": 3, - "name": "dialogs" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 5, - "name": "userPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 6, - "name": "groupPeers" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 4, - "name": "nextOffset" - } - ] - }, - "doc": [ - "Loading archived messages", - { - "type": "reference", - "argument": "nextOffset", - "category": "compact", - "description": "Optional next offset" - }, - { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "Maximum number of elements" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 1, - "name": "nextOffset" - }, - { - "type": "int32", - "id": 2, - "name": "limit" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadGroupedDialogs", - "header": 225, - "response": { - "type": "anonymous", - "header": 226, - "doc": [ - "Loaded grouped dialogs", - { - "type": "reference", - "argument": "dialogs", - "category": "compact", - "description": " Loaded groups of dialogs" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - }, - { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Loaded groups" - }, - { - "type": "reference", - "argument": "showArchived", - "category": "full", - "description": " Show archived section" - }, - { - "type": "reference", - "argument": "showInvite", - "category": "full", - "description": " Show invite message" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogGroup" - } - }, - "id": 1, - "name": "dialogs" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "groups" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "showArchived" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 5, - "name": "showInvite" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 6, - "name": "userPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 7, - "name": "groupPeers" - } - ] - }, - "doc": [ - "Load all dialogs from grouped list" - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 1, - "name": "optimizations" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "DialogsOrder", - "header": 235, - "doc": [ - "Dialogs order response", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " update seq" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " update state" - }, - { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Update groups" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogGroup" - } - }, - "id": 3, - "name": "groups" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "HideDialog", - "header": 231, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Hide Dialog from grouped list", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Dialog peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ShowDialog", - "header": 232, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Show Dialog in grouped list" - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "FavouriteDialog", - "header": 224, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Marking dialog as favourite", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for favouriting" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnfavouriteDialog", - "header": 227, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Making dialog as unfavourite", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for favouriting" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "NotifyDialogOpened", - "header": 2785, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Notifying about dialog open", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer that was opened" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - } - ] - }, - { - "title": "Groups", - "package": "groups", - "items": [ - { - "type": "comment", - "content": "Entities" - }, - { - "type": "struct", - "content": { - "name": "Member", - "doc": [ - "Member information", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User id" - }, - { - "type": "reference", - "argument": "inviterUid", - "category": "full", - "description": " User inviter id" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Adding date" - }, - { - "type": "reference", - "argument": "isAdmin", - "category": "full", - "description": " is member admin of group" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "inviterUid" - }, - { - "type": "int64", - "id": 3, - "name": "date" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "isAdmin" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "GroupType", - "values": [ - { - "name": "GROUP", - "id": 1 - }, - { - "name": "CHANNEL", - "id": 2 - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "GroupPermissions", - "values": [ - { - "name": "SEND_MESSAGE", - "id": 1 - }, - { - "name": "CLEAR", - "id": 2 - }, - { - "name": "LEAVE", - "id": 3 - }, - { - "name": "DELETE", - "id": 4 - }, - { - "name": "JOIN", - "id": 5 - }, - { - "name": "VIEW_INFO", - "id": 6 - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "GroupFullPermissions", - "values": [ - { - "name": "EDIT_INFO", - "id": 1 - }, - { - "name": "VIEW_MEMBERS", - "id": 2 - }, - { - "name": "INVITE_MEMBERS", - "id": 3 - }, - { - "name": "INVITE_VIA_LINK", - "id": 4 - }, - { - "name": "CALL", - "id": 5 - }, - { - "name": "EDIT_ADMIN_SETTINGS", - "id": 6 - }, - { - "name": "VIEW_ADMINS", - "id": 7 - }, - { - "name": "EDIT_ADMINS", - "id": 8 - }, - { - "name": "KICK_INVITED", - "id": 9 - }, - { - "name": "KICK_ANYONE", - "id": 10 - }, - { - "name": "EDIT_FOREIGN", - "id": 11 - }, - { - "name": "DELETE_FOREIGN", - "id": 12 - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Group", - "doc": [ - "Group information", - "", - "Permissions.", - "Permissions of this structure is about group messages operation, such as", - "ability to send messages, clear chat, leave group and so on. This operations", - "Can be held outside of the Group Info page.", - "", - "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", - "If default is TRUE then ONE == FALSE.", - "Bits:", - "0 - canSendMessage. Default is FALSE.", - "1 - canClear. Default is FALSE.", - "2 - canLeave. Default is FALSE.", - "3 - canDelete. Default is FALSE.", - "4 - canJoin. Default is FALSE.", - "5 - canViewInfo. Default is FALSE.", - "", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " group id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Access hash of group" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Title of group" - }, - { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " Avatar of group" - }, - { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Number of members" - }, - { - "type": "reference", - "argument": "isHidden", - "category": "full", - "description": " Is group hidden (not showing it in recent list). Default is false." - }, - { - "type": "reference", - "argument": "isMember", - "category": "full", - "description": " Is current user a member of a group. Default is true." - }, - { - "type": "reference", - "argument": "groupType", - "category": "full", - "description": " Group Type. Used only for displaying information. Default is GROUP." - }, - { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " Permissions of group object" - }, - { - "type": "reference", - "argument": "isDeleted", - "category": "full", - "description": " Is this group deleted" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Group extension Data" - }, - { - "type": "reference", - "argument": "isAdmin", - "category": "full", - "description": " [DEPRECATED] Is current user an admin of a group" - }, - { - "type": "reference", - "argument": "theme", - "category": "hidden", - "description": " [DEPRECATED] Theme of group" - }, - { - "type": "reference", - "argument": "about", - "category": "hidden", - "description": " [DEPRECATED] About of group" - }, - { - "type": "reference", - "argument": "creatorUid", - "category": "hidden", - "description": " [DEPRECATED] Group creator" - }, - { - "type": "reference", - "argument": "members", - "category": "compact", - "description": " [DEPRECATED] Members of group" - }, - { - "type": "reference", - "argument": "createDate", - "category": "full", - "description": " [DEPRECATED] Date of creation" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": "string", - "id": 3, - "name": "title" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 4, - "name": "avatar" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 24, - "name": "membersCount" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "isMember" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 20, - "name": "isHidden" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "GroupType" - } - }, - "id": 25, - "name": "groupType" - }, - { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 26, - "name": "permissions" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 27, - "name": "isDeleted" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 22, - "name": "ext" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 16, - "name": "isAdmin", - "deprecated": "true" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 8, - "name": "creatorUid", - "deprecated": "true" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 9, - "name": "members", - "deprecated": "true" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 10, - "name": "createDate", - "deprecated": "true" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 17, - "name": "theme", - "deprecated": "true" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 18, - "name": "about", - "deprecated": "true" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "GroupFull", - "doc": [ - "Goup Full information", - "Permissions.", - "Idea of Group Full mermissions is about Group Info pages. This permissions", - "are usefull only when trying to view and update group settings and not related", - "to chat messages itself.", - "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", - "If default is TRUE then ONE == FALSE.", - "Bits:", - "0 - canEditInfo. Default is FALSE.", - "1 - canViewMembers. Default is FALSE.", - "2 - canInviteMembers. Default is FALSE.", - "3 - canInviteViaLink. Default is FALSE.", - "4 - canCall. Default is FALSE.", - "5 - canEditAdminSettings. Default is FALSE.", - "6 - canViewAdmins. Default is FALSE.", - "7 - canEditAdmins. Default is FALSE.", - "8 - canKickInvited. Default is FALSE.", - "9 - canKickAnyone. Default is FALSE.", - "10 - canEditForeign. Default is FALSE.", - "11 - canDeleteForeign. Default is FALSE.", - "", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "createDate", - "category": "full", - "description": " Date created" - }, - { - "type": "reference", - "argument": "ownerUid", - "category": "full", - "description": " Optional group owner" - }, - { - "type": "reference", - "argument": "members", - "category": "full", - "description": " Group members. Can be empty when isAsyncMembers enabled." - }, - { - "type": "reference", - "argument": "theme", - "category": "full", - "description": " Group Theme" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " Group about" - }, - { - "type": "reference", - "argument": "isAsyncMembers", - "category": "full", - "description": " Is Members need to be loaded asynchronous. Default is false." - }, - { - "type": "reference", - "argument": "isSharedHistory", - "category": "full", - "description": " Is history shared among all users. Default is false." - }, - { - "type": "reference", - "argument": "shortName", - "category": "full", - "description": " Group's short name" - }, - { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " Group Permissions" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "createDate" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 5, - "name": "ownerUid" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 12, - "name": "members" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "theme" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "about" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 7, - "name": "ext" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 11, - "name": "isAsyncMembers" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 10, - "name": "isSharedHistory" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 14, - "name": "shortName" - }, - { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 27, - "name": "permissions" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadFullGroups", - "header": 2782, - "response": { - "type": "anonymous", - "header": 2783, - "doc": [ - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups to load" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupFull" - } - }, - "id": 1, - "name": "groups" - } - ] - }, - "doc": [ - "Loading Full Groups", - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups to load" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 1, - "name": "groups" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadMembers", - "header": 2786, - "response": { - "type": "anonymous", - "header": 2787, - "doc": [ - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Group members" - }, - { - "type": "reference", - "argument": "next", - "category": "full", - "description": " Load more reference" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 3, - "name": "members" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "next" - } - ] - }, - "doc": [ - "Loading group members", - { - "type": "reference", - "argument": "group", - "category": "full", - "description": "Group peer" - }, - { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "Limit members" - }, - { - "type": "reference", - "argument": "next", - "category": "full", - "description": "Load more reference" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "group" - }, - { - "type": "int32", - "id": 2, - "name": "limit" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 3, - "name": "next" - } - ] - } - }, - { - "type": "comment", - "content": "Update" - }, - { - "type": "update", - "content": { - "name": "GroupTitleChanged", - "header": 2609, - "doc": [ - "Update about title changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Group Title" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "string", - "id": 2, - "name": "title" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupAvatarChanged", - "header": 2610, - "doc": [ - "Update about avatar changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "avatar", - "category": "full", - "description": " Group Avatar" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 2, - "name": "avatar" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupTopicChanged", - "header": 2616, - "doc": [ - "Update about topic changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "topic", - "category": "full", - "description": " Updated topic" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "topic" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupAboutChanged", - "header": 2617, - "doc": [ - "Update about about changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " Updated about" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "about" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupExtChanged", - "header": 2613, - "doc": [ - "Update about ext changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Updated ext" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 2, - "name": "ext" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupFullExtChanged", - "header": 2618, - "doc": [ - "Update about full ext changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Updated ext" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 2, - "name": "ext" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupShortNameChanged", - "header": 2628, - "doc": [ - "Group's short name changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "shortName", - "category": "full", - "description": " Group short name" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "shortName" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupOwnerChanged", - "header": 2619, - "doc": [ - "Update about owner changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " New Owner" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "userId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupHistoryShared", - "header": 2620, - "doc": [ - "Update about history shared", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupDeleted", - "header": 2658, - "doc": [ - "Update about group deleted", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupPermissionsChanged", - "header": 2663, - "doc": [ - "Update about group permissions changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " New Permissions" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "int64", - "id": 2, - "name": "permissions" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupFullPermissionsChanged", - "header": 2664, - "doc": [ - "Update about Full Group permissions changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " New Permissions" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "int64", - "id": 2, - "name": "permissions" - } - ] - } - }, - { - "type": "comment", - "content": " " - }, - { - "type": "update", - "content": { - "name": "GroupMemberChanged", - "header": 2612, - "doc": [ - "Update about membership changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "isMember", - "category": "full", - "description": " Is current user a member" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "bool", - "id": 2, - "name": "isMember" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupMembersBecameAsync", - "header": 2615, - "doc": [ - "Update about members became async", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupMembersUpdated", - "header": 2614, - "doc": [ - "Update about members updated", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "members", - "category": "full", - "description": " Group Members" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 2, - "name": "members" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupMemberDiff", - "header": 2623, - "doc": [ - "Update about members changed", - { - "type": "reference", - "argument": "removedUsers", - "category": "full", - "description": " Removed Users" - }, - { - "type": "reference", - "argument": "addedMembers", - "category": "full", - "description": " Added members" - }, - { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Current Members count" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "removedUsers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 3, - "name": "addedMembers" - }, - { - "type": "int32", - "id": 4, - "name": "membersCount" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupMembersCountChanged", - "header": 2622, - "doc": [ - "Update about members count changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Members count" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "int32", - "id": 2, - "name": "membersCount" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupMemberAdminChanged", - "header": 2627, - "doc": [ - "Update about member admin changed", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " User Id" - }, - { - "type": "reference", - "argument": "isAdmin", - "category": "full", - "description": " Is Admin flag" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "userId" - }, - { - "type": "bool", - "id": 3, - "name": "isAdmin" - } - ] - } - }, - { - "type": "comment", - "content": "Actions" - }, - { - "type": "rpc", - "content": { - "name": "CreateGroup", - "header": 230, - "response": { - "type": "anonymous", - "header": 216, - "doc": [ - "Created group", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Update Seq" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Update state" - }, - { - "type": "reference", - "argument": "group", - "category": "full", - "description": " Created group" - }, - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Referenced users" - }, - { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Referenced users" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Group creation date" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "date" - }, - { - "type": { - "type": "struct", - "childType": "Group" - }, - "id": 3, - "name": "group" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 4, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 5, - "name": "userPeers" - } - ] - }, - "doc": [ - "Creating group chat", - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id for avoiding double create" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": "Group Title" - }, - { - "type": "reference", - "argument": "users", - "category": "hidden", - "description": "Members of group" - }, - { - "type": "reference", - "argument": "groupType", - "category": "full", - "description": "Group Type" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "rid" - }, - { - "type": "string", - "id": 2, - "name": "title" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "users" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "GroupType" - } - }, - "id": 6, - "name": "groupType" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 7, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditGroupTitle", - "header": 85, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Changing group title", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": "new group title" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": "string", - "id": 3, - "name": "title" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditGroupAvatar", - "header": 86, - "response": { - "type": "anonymous", - "header": 115, - "doc": [ - "Updated group avatar", - { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " Changed avatar" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Avatar change date" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Avatar" - }, - "id": 1, - "name": "avatar" - }, - { - "type": "int32", - "id": 2, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - }, - "doc": [ - "Changing group avatar", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "fileLocation", - "category": "compact", - "description": "uploaded file for avatar" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 3, - "name": "fileLocation" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RemoveGroupAvatar", - "header": 101, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Removing group avatar", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditGroupShortName", - "header": 2793, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Edit Group Short Name", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "shortName", - "category": "full", - "description": "New group's short name" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "shortName" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditGroupTopic", - "header": 211, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Edit group topic", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random id of operation" - }, - { - "type": "reference", - "argument": "topic", - "category": "full", - "description": "New Topic" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "topic" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 4, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EditGroupAbout", - "header": 213, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Edit Group About", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random id of operation" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": "New About" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "about" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "InviteUser", - "header": 69, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Inviting user to group", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "user", - "category": "full", - "description": "Users for invitation" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 3, - "name": "user" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LeaveGroup", - "header": 70, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Leaving group", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LeaveAndDelete", - "header": 2721, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Leave group and Delete Chat", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "KickUser", - "header": 71, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Kicking user from group", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "user", - "category": "full", - "description": "users for removing" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 3, - "name": "user" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "JoinGroupByPeer", - "header": 2722, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Join group by peer", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "comment", - "content": "Administration" - }, - { - "type": "rpc", - "content": { - "name": "MakeUserAdmin", - "header": 2784, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Make user admin", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "userPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DismissUserAdmin", - "header": 2791, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Dismissing user admin", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "userPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "TransferOwnership", - "header": 2789, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Transfer ownership of group", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "newOwner", - "category": "full", - "description": "New group's owner" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "newOwner" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "AdminSettings", - "doc": [ - "Admin Settings", - { - "type": "reference", - "argument": "showAdminsToMembers", - "category": "full", - "description": " Show admins in member list" - }, - { - "type": "reference", - "argument": "canMembersInvite", - "category": "full", - "description": " Can members of a group invite people" - }, - { - "type": "reference", - "argument": "canMembersEditGroupInfo", - "category": "full", - "description": " Can members edit group info" - }, - { - "type": "reference", - "argument": "canAdminsEditGroupInfo", - "category": "full", - "description": " Can admins edit group info" - }, - { - "type": "reference", - "argument": "showJoinLeaveMessages", - "category": "full", - "description": " Should join and leave messages be visible to members" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "bool", - "id": 1, - "name": "showAdminsToMembers" - }, - { - "type": "bool", - "id": 2, - "name": "canMembersInvite" - }, - { - "type": "bool", - "id": 3, - "name": "canMembersEditGroupInfo" - }, - { - "type": "bool", - "id": 4, - "name": "canAdminsEditGroupInfo" - }, - { - "type": "bool", - "id": 5, - "name": "showJoinLeaveMessages" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadAdminSettings", - "header": 2790, - "response": { - "type": "anonymous", - "header": 2794, - "doc": [ - "Loaded settings", - { - "type": "reference", - "argument": "settings", - "category": "full", - "description": " Current group admin settings" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "AdminSettings" - }, - "id": 1, - "name": "settings" - } - ] - }, - "doc": [ - "Loading administration settings", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SaveAdminSettings", - "header": 2792, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Save administartion settings", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's Peer" - }, - { - "type": "reference", - "argument": "settings", - "category": "full", - "description": "Group's settings" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "struct", - "childType": "AdminSettings" - }, - "id": 2, - "name": "settings" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DeleteGroup", - "header": 2795, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Delete Group", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ShareHistory", - "header": 2796, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Share History", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "comment", - "content": "Invite" - }, - { - "type": "response", - "content": { - "name": "InviteUrl", - "header": 178, - "doc": [ - "Response for invite url methods" - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "url" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetGroupInviteUrl", - "header": 177, - "response": { - "type": "reference", - "name": "InviteUrl" - }, - "doc": [ - "Building invite url", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Destination group peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RevokeInviteUrl", - "header": 179, - "response": { - "type": "reference", - "name": "InviteUrl" - }, - "doc": [ - "Revoking invite urls", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Destination group peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "JoinGroup", - "header": 180, - "response": { - "type": "anonymous", - "header": 181, - "doc": [ - { - "type": "reference", - "argument": "group", - "category": "hidden", - "description": " Joined group" - }, - { - "type": "reference", - "argument": "users", - "category": "hidden", - "description": " Users from members" - }, - { - "type": "reference", - "argument": "userPeers", - "category": "hidden", - "description": " User Peers" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random id" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, - { - "type": "reference", - "argument": "state", - "category": "hidden", - "description": " State" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of join" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Group" - }, - "id": 1, - "name": "group" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 5, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 7, - "name": "userPeers" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 6, - "name": "rid" - }, - { - "type": "int32", - "id": 2, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - }, - "doc": [ - "Join group method", - { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Url or Token for joining to group" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "hidden", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - } - ] - } - }, - { - "type": "comment", - "content": "Obsolete Actions" - }, - { - "type": "rpc", - "content": { - "name": "CreateGroupObsolete", - "header": 65, - "response": { - "type": "anonymous", - "header": 66, - "doc": [ - "Created group", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": " Peer of created group" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Members of created group" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Group creation date" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": "int32", - "id": 3, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 4, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": "int32" - }, - "id": 5, - "name": "users" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "date" - } - ] - }, - "doc": [ - "[OBSOLETE] Creating group chat", - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id for avoiding double create" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": "Title of new group" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Members of new group" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "rid" - }, - { - "type": "string", - "id": 2, - "name": "title" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "users" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "EnterGroupObsolete", - "header": 199, - "response": { - "type": "anonymous", - "header": 200, - "doc": [ - "Joined group", - { - "type": "reference", - "argument": "group", - "category": "full", - "description": " Joined group" - }, - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Referenced users" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of join message" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Seq of Update" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of Update" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of update" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Group" - }, - "id": 1, - "name": "group" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "rid" - }, - { - "type": "int32", - "id": 4, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 5, - "name": "state" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "date" - } - ] - }, - "doc": [ - "[OBSOLETE] Join random group by peer id", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Public group peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MakeUserAdminObsolete", - "header": 214, - "response": { - "type": "anonymous", - "header": 215, - "doc": [ - { - "type": "reference", - "argument": "members", - "category": "full", - "description": " new members" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 1, - "name": "members" - }, - { - "type": "int32", - "id": 2, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - } - ] - }, - "doc": [ - "[OBSOLETE] Make user admin", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, - { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "userPeer" - } - ] - } - }, - { - "type": "comment", - "content": "Obsolete Updates" - }, - { - "type": "update", - "content": { - "name": "GroupInviteObsolete", - "header": 36, - "doc": [ - "Update about inviting current user to group", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "inviteUid", - "category": "full", - "description": " Inviter UID. If equals to current uid than group created by user." - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of creating" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 9, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 5, - "name": "inviteUid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 8, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupUserInvitedObsolete", - "header": 21, - "doc": [ - "Update about inviting user to group", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Added user ID" - }, - { - "type": "reference", - "argument": "inviterUid", - "category": "full", - "description": " Inviter user ID" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of adding user to group" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "inviterUid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupUserLeaveObsolete", - "header": 23, - "doc": [ - "Update about leaving user", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's ID" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of user leave" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupUserKickObsolete", - "header": 24, - "doc": [ - "Update about kicking user", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Kicked user's ID" - }, - { - "type": "reference", - "argument": "kickerUid", - "category": "full", - "description": " Kicker user's ID" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of user kick" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "kickerUid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupMembersUpdateObsolete", - "header": 44, - "doc": [ - "Silent group members update", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "members", - "category": "full", - "description": " New members list" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 2, - "name": "members" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupTitleChangedObsolete", - "header": 38, - "doc": [ - "Update about group title change", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Changer UID" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " New Title of group" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of title change" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": "string", - "id": 3, - "name": "title" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupTopicChangedObsolete", - "header": 213, - "doc": [ - "Update about group topic change", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Changer UID" - }, - { - "type": "reference", - "argument": "topic", - "category": "full", - "description": " New topic of group" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of theme change" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Randomd Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "topic" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 5, - "name": "date" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupAboutChangedObsolete", - "header": 214, - "doc": [ - "Update about group about change", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "about", - "category": "full", - "description": " Group about" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "about" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupAvatarChangedObsolete", - "header": 39, - "doc": [ - "Update about group avatar change", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Avatar changer uid" - }, - { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " New Avatar. If null then avatar is removed" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of avatar change" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 3, - "name": "avatar" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - } - ] - } - } - ] - }, - { - "title": "Stickers", - "package": "stickers", - "doc": [ - "Stickers support in Actor" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "StickerDescriptor", - "doc": [ - "Descriptor of a Sticker", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Sticker unique id" - }, - { - "type": "reference", - "argument": "emoji", - "category": "full", - "description": " Emoji code for sticker" - }, - { - "type": "reference", - "argument": "image128", - "category": "full", - "description": " Image of sticker 128x128 in WebP format" - }, - { - "type": "reference", - "argument": "image512", - "category": "full", - "description": " Image of sticker 512x512 in WebP format" - }, - { - "type": "reference", - "argument": "image256", - "category": "full", - "description": " Image of sticker 256x256 in WebP format" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "emoji" - }, - { - "type": { - "type": "struct", - "childType": "ImageLocation" - }, - "id": 3, - "name": "image128" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 4, - "name": "image512" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 5, - "name": "image256" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "StickerCollection", - "doc": [ - "Sticker collection", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Unique id of a collection" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": " Access Hash of a collection" - }, - { - "type": "reference", - "argument": "stickers", - "category": "compact", - "description": " Sticker list" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerDescriptor" - } - }, - "id": 3, - "name": "stickers" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "StickersReponse", - "header": 240, - "doc": [ - "Stickers response", - { - "type": "reference", - "argument": "collections", - "category": "full", - "description": " Sticker collections" - }, - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Seq of update" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of update" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "collections" - }, - { - "type": "int32", - "id": 2, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadOwnStickers", - "header": 238, - "response": { - "type": "anonymous", - "header": 239, - "doc": [ - "Own Stickers collections", - { - "type": "reference", - "argument": "ownStickers", - "category": "hidden", - "description": " Own sticker collections" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "ownStickers" - } - ] - }, - "doc": [ - "Loading own stickers" - ], - "attributes": [] - } - }, - { - "type": "update", - "content": { - "name": "OwnStickersChanged", - "header": 161, - "doc": [ - "Own Stickers changed", - { - "type": "reference", - "argument": "collections", - "category": "compact", - "description": " New own sticker collections" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "collections" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "StickerCollectionsChanged", - "header": 164, - "doc": [ - "Sticker collection changed", - { - "type": "reference", - "argument": "collections", - "category": "full", - "description": " Updated sticker collections" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "collections" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "AddStickerCollection", - "header": 244, - "response": { - "type": "reference", - "name": "StickersReponse" - }, - "doc": [ - "Adding sticker collection", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Collection id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": "Collection access hash" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RemoveStickerCollection", - "header": 245, - "response": { - "type": "reference", - "name": "StickersReponse" - }, - "doc": [ - "Removing sticker collection", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Collection id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": "Collection access hash" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadStickerCollection", - "header": 246, - "response": { - "type": "anonymous", - "header": 247, - "doc": [ - "Loaded collection", - { - "type": "reference", - "argument": "collection", - "category": "full", - "description": " Collection of stickers" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "StickerCollection" - }, - "id": 1, - "name": "collection" - } - ] - }, - "doc": [ - "Loading stickers", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Collection id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": "Collection access hash" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - } - ] - }, - { - "title": "Search", - "package": "search", - "doc": [ - "Searching API" - ], - "items": [ - { - "type": "enum", - "content": { - "name": "SearchPeerType", - "values": [ - { - "name": "Groups", - "id": 1 - }, - { - "name": "Contacts", - "id": 2 - }, - { - "name": "Public", - "id": 3 - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "SearchContentType", - "values": [ - { - "name": "Any", - "id": 1 - }, - { - "name": "Text", - "id": 2 - }, - { - "name": "Links", - "id": 3 - }, - { - "name": "Documents", - "id": 4 - }, - { - "name": "Photos", - "id": 5 - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "SearchCondition", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "SearchPeerTypeCondition", - "doc": [ - "Search peer type condition", - { - "type": "reference", - "argument": "peerType", - "category": "full", - "description": " Peer type for searching" - } - ], - "trait": { - "name": "SearchCondition", - "key": 1 - }, - "attributes": [ - { - "type": { - "type": "enum", - "childType": "SearchPeerType" - }, - "id": 1, - "name": "peerType" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "SearchPieceText", - "doc": [ - "Search peer name condition", - { - "type": "reference", - "argument": "query", - "category": "full", - "description": " Search query" - } - ], - "trait": { - "name": "SearchCondition", - "key": 2 - }, - "attributes": [ - { - "type": "string", - "id": 1, - "name": "query" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "SearchAndCondition", - "doc": [ - "Search AND condion", - { - "type": "reference", - "argument": "andQuery", - "category": "full", - "description": " And Query" - } - ], - "trait": { - "name": "SearchCondition", - "key": 3 - }, - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "SearchCondition" - } - }, - "id": 1, - "name": "andQuery" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "SearchOrCondition", - "doc": [ - "Search OR condition", - { - "type": "reference", - "argument": "orQuery", - "category": "full", - "description": " Or Query" - } - ], - "trait": { - "name": "SearchCondition", - "key": 4 - }, - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "SearchCondition" - } - }, - "id": 2, - "name": "orQuery" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "SearchPeerCondition", - "doc": [ - "Serch Peer condition", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer condition" - } - ], - "trait": { - "name": "SearchCondition", - "key": 5 - }, - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "SearchPeerContentType", - "doc": [ - "Search content type condition", - { - "type": "reference", - "argument": "contentType", - "category": "full", - "description": " Content Type" - } - ], - "trait": { - "name": "SearchCondition", - "key": 6 - }, - "attributes": [ - { - "type": { - "type": "enum", - "childType": "SearchContentType" - }, - "id": 1, - "name": "contentType" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "SearchSenderIdConfition", - "doc": [ - "Searching sender uid condition", - { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " sender UID" - } - ], - "trait": { - "name": "SearchCondition", - "key": 7 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "senderId" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "PeerSearchResult", - "doc": [ - "Peer search result", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer information" - }, - { - "type": "reference", - "argument": "optMatchString", - "category": "full", - "description": " Description" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "optMatchString" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "PeerSearch", - "header": 233, - "response": { - "type": "anonymous", - "header": 234, - "doc": [ - "Found peers", - { - "type": "reference", - "argument": "searchResults", - "category": "full", - "description": " Search Results" - }, - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Related users" - }, - { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Related groups" - }, - { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Related user peers" - }, - { - "type": "reference", - "argument": "groupPeers", - "category": "full", - "description": " Related group peers" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "PeerSearchResult" - } - }, - "id": 1, - "name": "searchResults" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "groups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 4, - "name": "userPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 5, - "name": "groupPeers" - } - ] - }, - "doc": [ - "Performing peer search", - { - "type": "reference", - "argument": "query", - "category": "full", - "description": "Search query. Warring not all combinations can be processed by server. (acts as OR)" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "SearchCondition" - } - }, - "id": 1, - "name": "query" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MessageSearchResult", - "doc": [ - "Message container", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Message Peer" - }, - { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Message Random Id" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Message Date" - }, - { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " Message sender UID" - }, - { - "type": "reference", - "argument": "content", - "category": "full", - "description": " Message content" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 4, - "name": "senderId" - }, - { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 5, - "name": "content" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MessageSearchItem", - "doc": [ - "Message Search result container" - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "MessageSearchResult" - }, - "id": 1, - "name": "result" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "MessageSearchResponse", - "header": 218, - "doc": [ - "Search Result", - { - "type": "reference", - "argument": "searchResults", - "category": "full", - "description": " Search results" - }, - { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Search users" - }, - { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Search groups" - }, - { - "type": "reference", - "argument": "loadMoreState", - "category": "hidden", - "description": " State for loading more results" - }, - { - "type": "reference", - "argument": "userOutPeers", - "category": "full", - "description": " Search user peers" - }, - { - "type": "reference", - "argument": "groupOutPeers", - "category": "full", - "description": " Search group peers" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageSearchItem" - } - }, - "id": 1, - "name": "searchResults" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "groups" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 4, - "name": "loadMoreState" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 5, - "name": "userOutPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 6, - "name": "groupOutPeers" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MessageSearch", - "header": 217, - "response": { - "type": "reference", - "name": "MessageSearchResponse" - }, - "doc": [ - "Performing message search", - { - "type": "reference", - "argument": "query", - "category": "full", - "description": "Search query" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "trait", - "childType": "SearchCondition" - }, - "id": 1, - "name": "query" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "MessageSearchMore", - "header": 222, - "response": { - "type": "reference", - "name": "MessageSearchResponse" - }, - "doc": [ - "Performing message search paging", - { - "type": "reference", - "argument": "loadMoreState", - "category": "hidden", - "description": "State for loading more results" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [ - { - "type": "bytes", - "id": 1, - "name": "loadMoreState" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - } - ] - } - } - ] - }, - { - "title": "Public Groups", - "package": "pubgroups", - "doc": [ - "Public group is easy way to find communities" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "PublicGroup", - "doc": [ - "Public Group description", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Group id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Group Access hash" - }, - { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Group title" - }, - { - "type": "reference", - "argument": "avatar", - "category": "full", - "description": " Group avatar" - }, - { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Members count in group" - }, - { - "type": "reference", - "argument": "friendsCount", - "category": "full", - "description": " Friends count int group" - }, - { - "type": "reference", - "argument": "description", - "category": "full", - "description": " Description of group" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": "string", - "id": 3, - "name": "title" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 7, - "name": "avatar" - }, - { - "type": "int32", - "id": 4, - "name": "membersCount" - }, - { - "type": "int32", - "id": 5, - "name": "friendsCount" - }, - { - "type": "string", - "id": 6, - "name": "description" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetPublicGroups", - "header": 201, - "response": { - "type": "anonymous", - "header": 202, - "doc": [ - "Loaded public groups", - { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " All available groups" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "PublicGroup" - } - }, - "id": 1, - "name": "groups" - } - ] - }, - "doc": [ - "Getting public groups" - ], - "attributes": [] - } - } - ] - }, - { - "title": "Invites", - "package": "invites", - "doc": [ - "Invite mechanizm" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "InviteState", - "doc": [ - "Invite state", - { - "type": "reference", - "argument": "email", - "category": "full", - "description": " Email of invite" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " Name of invited user" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Uid of registered user" - }, - { - "type": "reference", - "argument": "tid", - "category": "full", - "description": " Team id of invite" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "email" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 3, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 4, - "name": "tid" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "InviteList", - "header": 2564, - "doc": [ - "Intites list", - { - "type": "reference", - "argument": "invites", - "category": "full", - "description": " Intvites" - }, - { - "type": "reference", - "argument": "relatedUsers", - "category": "full", - "description": " Related users in invites" - }, - { - "type": "reference", - "argument": "relatedGroups", - "category": "full", - "description": " Related groups in invites" - }, - { - "type": "reference", - "argument": "relatedTeams", - "category": "full", - "description": " Related teams in invites" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "InviteState" - } - }, - "id": 1, - "name": "invites" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "relatedUsers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "relatedGroups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Team" - } - }, - "id": 4, - "name": "relatedTeams" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadOwnSentInvites", - "header": 2563, - "response": { - "type": "reference", - "name": "InviteList" - }, - "doc": [ - "Loading current invite states" - ], - "attributes": [] - } - }, - { - "type": "rpc", - "content": { - "name": "SendInvite", - "header": 2565, - "response": { - "type": "reference", - "name": "InviteList" - }, - "doc": [ - "Sending an email invite", - { - "type": "reference", - "argument": "email", - "category": "full", - "description": "Email for invite" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": "Optional name for invite" - }, - { - "type": "reference", - "argument": "destTeam", - "category": "full", - "description": "Optional team for invite" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "email" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "OutTeam" - } - }, - "id": 3, - "name": "destTeam" - } - ] - } - } - ] - }, - { - "title": "Teams", - "package": "teams", - "doc": [ - "Teams support for Actor" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "Team", - "doc": [ - "Team entity", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Team Id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Team Access Hash" - }, - { - "type": "reference", - "argument": "name", - "category": "full", - "description": " Team name" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - }, - { - "type": "string", - "id": 3, - "name": "name" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "OutTeam", - "doc": [ - "Reference to a team", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Team Id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": " Team access hash" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "TeamsList", - "header": 2562, - "doc": [ - "Teams response", - { - "type": "reference", - "argument": "teams", - "category": "hidden", - "description": " Teams list" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Team" - } - }, - "id": 1, - "name": "teams" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadOwnTeams", - "header": 2561, - "response": { - "type": "reference", - "name": "TeamsList" - }, - "doc": [ - "Loading own teams" - ], - "attributes": [] - } - }, - { - "type": "update", - "content": { - "name": "OwnTeamsChanged", - "header": 165, - "doc": [ - "Update about own teams changed", - { - "type": "reference", - "argument": "ownTeams", - "category": "full", - "description": " Updated own teams list" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Team" - } - }, - "id": 1, - "name": "ownTeams" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "CreateTeam", - "header": 2566, - "response": { - "type": "anonymous", - "header": 2567, - "doc": [ - "Created team response", - { - "type": "reference", - "argument": "createdTeam", - "category": "full", - "description": " Created Team" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Team" - }, - "id": 1, - "name": "createdTeam" - } - ] - }, - "doc": [ - "Creation of a Team", - { - "type": "reference", - "argument": "title", - "category": "full", - "description": "Title of a team" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "title" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "InviteToTeam", - "header": 2568, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Inviting people to team", - { - "type": "reference", - "argument": "user", - "category": "full", - "description": "Dest user" - }, - { - "type": "reference", - "argument": "destTeam", - "category": "full", - "description": "Dest team" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "user" - }, - { - "type": { - "type": "struct", - "childType": "OutTeam" - }, - "id": 3, - "name": "destTeam" - } - ] - } - } - ] - }, - { - "title": "Integrations", - "package": "integrations", - "doc": [ - "Package contains methods for providing integration" - ], - "items": [ - { - "type": "response", - "content": { - "name": "IntegrationToken", - "header": 183, - "doc": [ - "Group token response", - { - "type": "reference", - "argument": "token", - "category": "danger", - "description": " current group token" - }, - { - "type": "reference", - "argument": "url", - "category": "danger", - "description": " current group url" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - }, - { - "type": "string", - "id": 2, - "name": "url" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetIntegrationToken", - "header": 182, - "response": { - "type": "reference", - "name": "IntegrationToken" - }, - "doc": [ - "Getting current group token", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RevokeIntegrationToken", - "header": 184, - "response": { - "type": "reference", - "name": "IntegrationToken" - }, - "doc": [ - "Revoke group token", - { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "groupPeer" - } - ] - } - } - ] - }, - { - "title": "Typing and Online", - "package": "weak", - "items": [ - { - "type": "enum", - "content": { - "name": "TypingType", - "values": [ - { - "name": "Text", - "id": 0 - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "Typing", - "header": 27, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Sending typing notification", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "typingType", - "category": "full", - "description": "typing type." - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 3, - "name": "typingType" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "StopTyping", - "header": 30, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Stop typing", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "typingType", - "category": "full", - "description": "typing type" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 2, - "name": "typingType" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "DeviceType", - "values": [ - { - "name": "GENERIC", - "id": 1 - }, - { - "name": "PC", - "id": 2 - }, - { - "name": "MOBILE", - "id": 3 - }, - { - "name": "TABLET", - "id": 4 - }, - { - "name": "WATCH", - "id": 5 - }, - { - "name": "MIRROR", - "id": 6 - }, - { - "name": "CAR", - "id": 7 - }, - { - "name": "TABLE", - "id": 8 - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SetOnline", - "header": 29, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Sending online state", - { - "type": "reference", - "argument": "isOnline", - "category": "full", - "description": "is user online" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "timeout of online state in milliseconds" - }, - { - "type": "reference", - "argument": "deviceType", - "category": "full", - "description": "Optional device type" - }, - { - "type": "reference", - "argument": "deviceCategory", - "category": "full", - "description": "Optional device category, for example android or ios" - } - ], - "attributes": [ - { - "type": "bool", - "id": 1, - "name": "isOnline" - }, - { - "type": { - "type": "alias", - "childType": "msec" - }, - "id": 2, - "name": "timeout" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 3, - "name": "deviceType" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "deviceCategory" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "PauseNotifications", - "header": 166, - "doc": [ - "Update about pausing notifications", - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout for notifications resume" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 1, - "name": "timeout" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "RestoreNotifications", - "header": 167, - "doc": [ - "Update about restoring notifications" - ], - "attributes": [] - } - }, - { - "type": "rpc", - "content": { - "name": "PauseNotifications", - "header": 2641, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Pause notifications", - { - "type": "reference", - "argument": "timeout", - "category": "hidden", - "description": "Timeout of pause" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 1, - "name": "timeout" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RestoreNotifications", - "header": 2642, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Restoring notifications" - ], - "attributes": [] - } - }, - { - "type": "empty" - }, - { - "type": "update", - "content": { - "name": "Typing", - "header": 6, - "doc": [ - "Update about user's typing", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Conversation peer" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "typingType", - "category": "full", - "description": " Type of typing" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 3, - "name": "typingType" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "TypingStop", - "header": 81, - "doc": [ - "Update about user's typing stop", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Conversation peer" - }, - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "typingType", - "category": "hidden", - "description": " Type of typing" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, - { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 3, - "name": "typingType" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserOnline", - "header": 7, - "doc": [ - "Update about user became online", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 2, - "name": "deviceType" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "deviceCategory" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserOffline", - "header": 8, - "doc": [ - "Update about user became offline", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 2, - "name": "deviceType" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "deviceCategory" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "UserLastSeen", - "header": 9, - "doc": [ - "Update about user's last seen state", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Last seen time" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "date" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 3, - "name": "deviceType" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "deviceCategory" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "GroupOnline", - "header": 33, - "doc": [ - "Update about group online change", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group id" - }, - { - "type": "reference", - "argument": "count", - "category": "full", - "description": " current online user's count" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, - { - "type": "int32", - "id": 2, - "name": "count" - } - ] - } - } - ] - }, - { - "title": "Media and Files", - "package": "files", - "items": [ - { - "type": "struct", - "content": { - "name": "FileLocation", - "doc": [ - "Location of file on server", - { - "type": "reference", - "argument": "fileId", - "category": "full", - "description": " Unique Id of file" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Access hash of file" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "fileId" - }, - { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ImageLocation", - "doc": [ - "Image location", - { - "type": "reference", - "argument": "fileLocation", - "category": "full", - "description": " Location of file" - }, - { - "type": "reference", - "argument": "width", - "category": "full", - "description": " Width of avatar image" - }, - { - "type": "reference", - "argument": "height", - "category": "full", - "description": " Height of avatar image" - }, - { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " Size of file" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "fileLocation" - }, - { - "type": "int32", - "id": 2, - "name": "width" - }, - { - "type": "int32", - "id": 3, - "name": "height" - }, - { - "type": "int32", - "id": 4, - "name": "fileSize" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "AvatarImage", - "doc": [ - "Avatar Image", - { - "type": "reference", - "argument": "fileLocation", - "category": "full", - "description": " Location of file" - }, - { - "type": "reference", - "argument": "width", - "category": "full", - "description": " Width of avatar image" - }, - { - "type": "reference", - "argument": "height", - "category": "full", - "description": " Height of avatar image" - }, - { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " Size of file" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "fileLocation" - }, - { - "type": "int32", - "id": 2, - "name": "width" - }, - { - "type": "int32", - "id": 3, - "name": "height" - }, - { - "type": "int32", - "id": 4, - "name": "fileSize" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Avatar", - "doc": [ - "Avatar of User or Group", - { - "type": "reference", - "argument": "smallImage", - "category": "compact", - "description": " Optional small image of avatar box in 100x100" - }, - { - "type": "reference", - "argument": "largeImage", - "category": "compact", - "description": " Optional large image of avatar box in 200x200" - }, - { - "type": "reference", - "argument": "fullImage", - "category": "compact", - "description": " Optional full screen image of avatar" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "AvatarImage" - } - }, - "id": 1, - "name": "smallImage" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "AvatarImage" - } - }, - "id": 2, - "name": "largeImage" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "AvatarImage" - } - }, - "id": 3, - "name": "fullImage" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "FastThumb", - "doc": [ - "Fast thumb of media messages. Less than 90x90 and compressed by JPEG with low quality", - { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Width of thumb" - }, - { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Height of thump" - }, - { - "type": "reference", - "argument": "thumb", - "category": "compact", - "description": " compressed image data" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "w" - }, - { - "type": "int32", - "id": 2, - "name": "h" - }, - { - "type": "bytes", - "id": 3, - "name": "thumb" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "Colors", - "values": [ - { - "name": "red", - "id": 1 - }, - { - "name": "yellow", - "id": 2 - }, - { - "name": "green", - "id": 3 - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "Color", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "RgbColor", - "doc": [ - "RGB Color", - { - "type": "reference", - "argument": "rgb", - "category": "full", - "description": " RGB color value" - } - ], - "trait": { - "name": "Color", - "key": 1 - }, - "expandable": "true", - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "rgb" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "PredefinedColor", - "doc": [ - "Predefined color", - { - "type": "reference", - "argument": "color", - "category": "hidden", - "description": " Predefined color value" - } - ], - "trait": { - "name": "Color", - "key": 2 - }, - "expandable": "true", - "attributes": [ - { - "type": { - "type": "enum", - "childType": "Colors" - }, - "id": 1, - "name": "color" - } - ] - } - }, - { - "type": "empty" - }, - { - "type": "struct", - "content": { - "name": "HTTPHeader", - "doc": [ - "HTTP Header record", - { - "type": "reference", - "argument": "key", - "category": "full", - "description": " HTTP Header name" - }, - { - "type": "reference", - "argument": "value", - "category": "full", - "description": " HTTP Header value" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "key" - }, - { - "type": "string", - "id": 2, - "name": "value" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "FileUrlDescription", - "doc": [ - "File url description", - { - "type": "reference", - "argument": "fileId", - "category": "full", - "description": " File id of url" - }, - { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url for downloading" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout of url" - }, - { - "type": "reference", - "argument": "unsignedUrl", - "category": "hidden", - "description": " Unsigned URL (used to honor web caches)" - }, - { - "type": "reference", - "argument": "unsignedUrlHeaders", - "category": "hidden", - "description": " Headers that is required to download files with unsigned url" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "fileId" - }, - { - "type": "string", - "id": 2, - "name": "url" - }, - { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 3, - "name": "timeout" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "unsignedUrl" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "HTTPHeader" - } - }, - "id": 5, - "name": "unsignedUrlHeaders" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetFileUrl", - "header": 77, - "response": { - "type": "anonymous", - "header": 78, - "doc": [ - { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url for downloading" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout of url" - }, - { - "type": "reference", - "argument": "unsignedUrl", - "category": "full", - "description": " Unsigned URL (used to honor web caches)" - }, - { - "type": "reference", - "argument": "unsignedUrlHeaders", - "category": "full", - "description": " Headers that is required to download files with unsigned url" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "url" - }, - { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 2, - "name": "timeout" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "unsignedUrl" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "HTTPHeader" - } - }, - "id": 4, - "name": "unsignedUrlHeaders" - } - ] - }, - "doc": [ - "Requesting file URL for downloading", - { - "type": "reference", - "argument": "file", - "category": "full", - "description": "file's location" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "file" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetFileUrls", - "header": 2573, - "response": { - "type": "anonymous", - "header": 2574, - "doc": [ - { - "type": "reference", - "argument": "fileUrls", - "category": "full", - "description": " File urls" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "FileUrlDescription" - } - }, - "id": 1, - "name": "fileUrls" - } - ] - }, - "doc": [ - "Requesting multiple fle URL for downloading", - { - "type": "reference", - "argument": "files", - "category": "hidden", - "description": "File locations to load urls" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "FileLocation" - } - }, - "id": 1, - "name": "files" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetFileUrlBuilder", - "header": 2579, - "response": { - "type": "anonymous", - "header": 2580, - "doc": [ - { - "type": "reference", - "argument": "baseUrl", - "category": "full", - "description": " Base Url for files" - }, - { - "type": "reference", - "argument": "algo", - "category": "full", - "description": " Signature algorithm" - }, - { - "type": "reference", - "argument": "seed", - "category": "full", - "description": " Public-visible seed of signature" - }, - { - "type": "reference", - "argument": "signatureSecret", - "category": "full", - "description": " Signature Secret" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout of url builder" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "baseUrl" - }, - { - "type": "string", - "id": 2, - "name": "algo" - }, - { - "type": "string", - "id": 5, - "name": "seed" - }, - { - "type": "bytes", - "id": 3, - "name": "signatureSecret" - }, - { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 4, - "name": "timeout" - } - ] - }, - "doc": [ - "Get File URL Builder that allows to build file urls from client side", - { - "type": "reference", - "argument": "supportedSignatureAlgorithms", - "category": "hidden", - "description": "Supported signature algorithms by client" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 1, - "name": "supportedSignatureAlgorithms" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetFileUploadUrl", - "header": 97, - "response": { - "type": "anonymous", - "header": 121, - "doc": [ - { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url for uploading" - }, - { - "type": "reference", - "argument": "uploadKey", - "category": "compact", - "description": " Upload key for upload" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "url" - }, - { - "type": "bytes", - "id": 2, - "name": "uploadKey" - } - ] - }, - "doc": [ - "Requesting pload url", - { - "type": "reference", - "argument": "expectedSize", - "category": "full", - "description": "Expected size of uploading file. May be inaccurate. Used for size allocation optimizations." - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "expectedSize" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "CommitFileUpload", - "header": 122, - "response": { - "type": "anonymous", - "header": 138, - "doc": [ - { - "type": "reference", - "argument": "uploadedFileLocation", - "category": "hidden", - "description": " Result file location" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "uploadedFileLocation" - } - ] - }, - "doc": [ - "Comminting uploaded file to storage" - ], - "attributes": [ - { - "type": "bytes", - "id": 1, - "name": "uploadKey" - }, - { - "type": "string", - "id": 2, - "name": "fileName" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetFileUploadPartUrl", - "header": 142, - "response": { - "type": "anonymous", - "header": 141, - "doc": [ - { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Upload file part url" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "url" - } - ] - }, - "doc": [ - "Upload file part", - { - "type": "reference", - "argument": "uploadKey", - "category": "compact", - "description": "Upload Key from requestFileUploadUrl" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "partNumber" - }, - { - "type": "int32", - "id": 2, - "name": "partSize" - }, - { - "type": "bytes", - "id": 3, - "name": "uploadKey" - } - ] - } - } - ] - }, - { - "title": "Features", - "package": "features", - "doc": [ - "Enable feature discovery. Currently available features:", - "* \"call\" - private audio calls" - ], - "items": [ - { - "type": "rpc", - "content": { - "name": "EnableFeature", - "header": 2588, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Enabling feature on the device", - { - "type": "reference", - "argument": "featureName", - "category": "full", - "description": "Feature name" - }, - { - "type": "reference", - "argument": "args", - "category": "danger", - "description": "Optional arguments to a feature" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "featureName" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "args" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DisableFeature", - "header": 2589, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Disabling feature on the device", - { - "type": "reference", - "argument": "featureName", - "category": "full", - "description": "Feature name" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "featureName" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "CheckFeatureEnabled", - "header": 2590, - "response": { - "type": "reference", - "name": "Bool" - }, - "doc": [ - "Method for checking if feature is available to user" - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userOutPeer" - }, - { - "type": "string", - "id": 2, - "name": "featureName" - } - ] - } - } - ] - }, - { - "title": "EventBus", - "package": "eventbus", - "items": [ - { - "type": "rpc", - "content": { - "name": "CreateNewEventBus", - "header": 2665, - "response": { - "type": "anonymous", - "header": 2666, - "doc": [ - "Created new Event Bus", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Event Bus Id" - }, - { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Your Device Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "deviceId" - } - ] - }, - "doc": [ - "Create new Event Bus", - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Optional timeout of Event Bus" - }, - { - "type": "reference", - "argument": "isOwned", - "category": "full", - "description": "Is Event Bus owned by creator" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 1, - "name": "timeout" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isOwned" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "JoinEventBus", - "header": 2668, - "response": { - "type": "anonymous", - "header": 2669, - "doc": [ - { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Your Device Id" - }, - { - "type": "reference", - "argument": "rejoinToken", - "category": "full", - "description": " Token that can be used for rejoining event bus with same device id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "deviceId" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "rejoinToken" - } - ] - }, - "doc": [ - "Joining Event Bus", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Join timeout" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 2, - "name": "timeout" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ReJoinEventBus", - "header": 2675, - "response": { - "type": "anonymous", - "header": 2676, - "doc": [ - { - "type": "reference", - "argument": "deviceId", - "category": "hidden", - "description": " Your Device Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "deviceId" - } - ] - }, - "doc": [ - "Rejoining to event bus after session was disposed", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - }, - { - "type": "reference", - "argument": "rejoinToken", - "category": "full", - "description": "Rejoin Token" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": "bytes", - "id": 2, - "name": "rejoinToken" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "KeepAliveEventBus", - "header": 2670, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Keep Alive Event Bus", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Optional timeout for keep alive" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 2, - "name": "timeout" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DisposeEventBus", - "header": 2667, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Dispose Event Bus", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "PostToEventBus", - "header": 2671, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Event Bus Destination", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Bus Id" - }, - { - "type": "reference", - "argument": "destinations", - "category": "full", - "description": "If Empty need to broadcase message to everyone" - }, - { - "type": "reference", - "argument": "message", - "category": "hidden", - "description": "Message" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 2, - "name": "destinations" - }, - { - "type": "bytes", - "id": 3, - "name": "message" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "EventBusDeviceConnected", - "header": 2561, - "doc": [ - "Update about pubsub device connected", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " ID of Event Bus" - }, - { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " Joined User Id" - }, - { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Joined Device Unique Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "userId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "deviceId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "EventBusDeviceDisconnected", - "header": 2563, - "doc": [ - "Update about device disconnected", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " ID of Event Bus" - }, - { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " Joined User Id" - }, - { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Disconnected Device unique Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "userId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "deviceId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "EventBusMessage", - "header": 2562, - "doc": [ - "Event Bus Message", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Event Bus Id" - }, - { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " Sender of message" - }, - { - "type": "reference", - "argument": "senderDeviceId", - "category": "full", - "description": " Device Id of sender" - }, - { - "type": "reference", - "argument": "message", - "category": "hidden", - "description": " Message" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "senderId" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 3, - "name": "senderDeviceId" - }, - { - "type": "bytes", - "id": 4, - "name": "message" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "EventBusDisposed", - "header": 2564, - "doc": [ - "Event Bus dispose", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Event Bus Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - } - ] - } - } - ] - }, - { - "title": "Values", - "package": "values", - "doc": [ - "Synced Values" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "SyncedValue", - "doc": [ - "Synced Value container", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Unique Id of a value. Unique in the scope of one named value." - }, - { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Optional value" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "id" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "value" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadSyncedSet", - "header": 2679, - "response": { - "type": "anonymous", - "header": 2680, - "doc": [ - { - "type": "reference", - "argument": "values", - "category": "full", - "description": " Current set values" - }, - { - "type": "reference", - "argument": "isStrong", - "category": "full", - "description": " Is this value strong and stored in sequence. By default is true." - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "SyncedValue" - } - }, - "id": 1, - "name": "values" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isStrong" - } - ] - }, - "doc": [ - "Loading synced set", - { - "type": "reference", - "argument": "setName", - "category": "hidden", - "description": "readable name of the set" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "setName" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "SynedSetUpdated", - "header": 72, - "doc": [ - "Update about synced set update", - { - "type": "reference", - "argument": "setName", - "category": "full", - "description": " Set Name" - }, - { - "type": "reference", - "argument": "syncedValues", - "category": "full", - "description": " Current set values" - }, - { - "type": "reference", - "argument": "isStrong", - "category": "full", - "description": " Is this value strong and need to be stored on disk" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "setName" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "SyncedValue" - } - }, - "id": 2, - "name": "syncedValues" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isStrong" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "SyncedSetAddedOrUpdated", - "header": 73, - "doc": [ - "Update about added or updated values in the synced set", - { - "type": "reference", - "argument": "setName", - "category": "full", - "description": " Set Name" - }, - { - "type": "reference", - "argument": "addedOrUpdatedValues", - "category": "hidden", - "description": " Added or updated values" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "setName" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "SyncedValue" - } - }, - "id": 2, - "name": "addedOrUpdatedValues" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "SyncedSetRemoved", - "header": 74, - "doc": [ - "Update about removed items from synced set", - { - "type": "reference", - "argument": "setName", - "category": "full", - "description": " Set Name" - }, - { - "type": "reference", - "argument": "removedItems", - "category": "full", - "description": " Removed Items from the set" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "setName" - }, - { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 2, - "name": "removedItems" - } - ] - } - } - ] - }, - { - "title": "WebRTC", - "package": "webrtc", - "doc": [ - "WebRTC package that enables support to audio and video calls" - ], - "items": [ - { - "type": "update", - "content": { - "name": "IncomingCall", - "header": 52, - "doc": [ - "Update about incoming call (Sent every 10 seconds)", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, - { - "type": "reference", - "argument": "attemptIndex", - "category": "full", - "description": " Optional attempt Index" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 2, - "name": "attemptIndex" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "CallHandled", - "header": 53, - "doc": [ - "Update about incoming call handled", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, - { - "type": "reference", - "argument": "attemptIndex", - "category": "full", - "description": " Optional attempt Index" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 2, - "name": "attemptIndex" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "CallUpgraded", - "header": 56, - "doc": [ - "Update about call moved to other peer", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Upgraded group id" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 2, - "name": "groupId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetCallInfo", - "header": 2600, - "response": { - "type": "anonymous", - "header": 2606, - "doc": [ - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Users" - }, - { - "type": "reference", - "argument": "eventBusId", - "category": "full", - "description": " Event Bus Id" - }, - { - "type": "reference", - "argument": "isAudioOnlyCall", - "category": "full", - "description": " Is Audio Only Call. Default is true" - }, - { - "type": "reference", - "argument": "isVideoOnlyCall", - "category": "full", - "description": " Is Video Only Call. Default is false." - }, - { - "type": "reference", - "argument": "isVideoPreferred", - "category": "full", - "description": " Is Video preferred" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 2, - "name": "groups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "users" - }, - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 4, - "name": "eventBusId" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 5, - "name": "isAudioOnlyCall" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "isVideoOnlyCall" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 7, - "name": "isVideoPreferred" - } - ] - }, - "doc": [ - "Getting Call Information", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DoCall", - "header": 2597, - "response": { - "type": "anonymous", - "header": 2598, - "doc": [ - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, - { - "type": "reference", - "argument": "eventBusId", - "category": "full", - "description": " Call Event Bus Id" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 2, - "name": "eventBusId" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "deviceId" - } - ] - }, - "doc": [ - "Do Call. Right after a call client need to start sending CallInProgress", - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "destination peer" - }, - { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Initial timeout" - }, - { - "type": "reference", - "argument": "isAudioOnlyCall", - "category": "full", - "description": "Is Audio only call. Default is true." - }, - { - "type": "reference", - "argument": "isVideoOnlyCall", - "category": "full", - "description": "Is Video Only call. Default is false." - }, - { - "type": "reference", - "argument": "isVideoPreferred", - "category": "full", - "description": "Is Video preferred" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 2, - "name": "timeout" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isAudioOnlyCall" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "isVideoOnlyCall" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "isVideoPreferred" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UpgradeCall", - "header": 2677, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Method for upgrading a call from private call to group call", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - }, - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer for upgrading" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 2, - "name": "peer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DoCallAgain", - "header": 2678, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Call again to user", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - }, - { - "type": "reference", - "argument": "user", - "category": "full", - "description": "User to call again" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "user" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "JoinCall", - "header": 2683, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Joining Call", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RejectCall", - "header": 2684, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Rejecting Call", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "OptimizeSDP", - "header": 2685, - "response": { - "type": "anonymous", - "header": 2686, - "doc": [ - { - "type": "reference", - "argument": "optimizedSDP", - "category": "hidden", - "description": " Optimized version of SDP" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "optimizedSDP" - } - ] - }, - "doc": [ - "Optimizing SDP", - { - "type": "reference", - "argument": "type", - "category": "full", - "description": "Type of SDP (offer or answer)" - }, - { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": "SDP value" - }, - { - "type": "reference", - "argument": "ownSettings", - "category": "full", - "description": "Own Settings" - }, - { - "type": "reference", - "argument": "theirSettings", - "category": "full", - "description": "Their Settings" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "type" - }, - { - "type": "string", - "id": 2, - "name": "sdp" - }, - { - "type": { - "type": "struct", - "childType": "PeerSettings" - }, - "id": 3, - "name": "ownSettings" - }, - { - "type": { - "type": "struct", - "childType": "PeerSettings" - }, - "id": 4, - "name": "theirSettings" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ICEServer", - "doc": [ - "ICE Server description", - { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url to server" - }, - { - "type": "reference", - "argument": "username", - "category": "full", - "description": " Optional username" - }, - { - "type": "reference", - "argument": "credential", - "category": "danger", - "description": " Optional credential" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "url" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "username" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "credential" - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "WebRTCSignaling", - "attributes": [] - } - }, - { - "type": "comment", - "content": "Advertising" - }, - { - "type": "struct", - "content": { - "name": "AdvertiseSelf", - "doc": [ - "Advertizing self to a master mode", - { - "type": "reference", - "argument": "peerSettings", - "category": "full", - "description": " Optional peer Settings" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 21 - }, - "attributes": [ - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "PeerSettings" - } - }, - "id": 1, - "name": "peerSettings" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "AdvertiseMaster", - "doc": [ - "Sent by master" - ], - "trait": { - "name": "WebRTCSignaling", - "key": 26 - }, - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ICEServer" - } - }, - "id": 1, - "name": "server" - } - ] - } - }, - { - "type": "comment", - "content": "Web RTC signaling" - }, - { - "type": "struct", - "content": { - "name": "Candidate", - "doc": [ - "Candidate signal", - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id of candidate" - }, - { - "type": "reference", - "argument": "index", - "category": "full", - "description": " Index of candidate" - }, - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Id of candidate" - }, - { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": " SDP of candidate" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 3 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "sessionId" - }, - { - "type": "int32", - "id": 2, - "name": "index" - }, - { - "type": "string", - "id": 3, - "name": "id" - }, - { - "type": "string", - "id": 4, - "name": "sdp" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Offer", - "doc": [ - "Offer signal", - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id of offer" - }, - { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": " Offer SDP" - }, - { - "type": "reference", - "argument": "ownPeerSettings", - "category": "full", - "description": " Optional Own Peer settings" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 4 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "sessionId" - }, - { - "type": "string", - "id": 2, - "name": "sdp" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "PeerSettings" - } - }, - "id": 3, - "name": "ownPeerSettings" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Answer", - "doc": [ - "Answer signal", - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id of answer" - }, - { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": " Answer SDP" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 5 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "sessionId" - }, - { - "type": "string", - "id": 2, - "name": "sdp" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MediaStreamsUpdated", - "doc": [ - "Update about media stream settings updated. Can be sent before offer/answer.", - { - "type": "reference", - "argument": "isAudioEnabled", - "category": "full", - "description": " Is Audio Enabled in current connection. True by default." - }, - { - "type": "reference", - "argument": "isVideoEnabled", - "category": "full", - "description": " Is Video Enabled in current connection. False by default." - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 28 - }, - "attributes": [ - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "isAudioEnabled" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isVideoEnabled" - } - ] - } - }, - { - "type": "comment", - "content": "Call Controlling events" - }, - { - "type": "struct", - "content": { - "name": "NeedOffer", - "doc": [ - "Notification from master that offer is required", - { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Destination Device Id" - }, - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - }, - { - "type": "reference", - "argument": "peerSettings", - "category": "full", - "description": " Optional peer settings" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 8 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "PeerSettings" - } - }, - "id": 3, - "name": "peerSettings" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "NegotinationSuccessful", - "doc": [ - "Notification about on negotiation is successful", - { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Device Id" - }, - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 24 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EnableConnection", - "doc": [ - "Notification about enabling connection to peer", - { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Device Id" - }, - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 22 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "OnRenegotiationNeeded", - "doc": [ - "Need renegotiate session. For example when streams are changed.", - { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Device Id" - }, - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 25 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "CloseSession", - "doc": [ - "Close this session and be ready to", - { - "type": "reference", - "argument": "device", - "category": "hidden", - "description": " Device Id" - }, - { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id for renegotiation" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 6 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "NeedDisconnect", - "doc": [ - "Notification about requirement about required disconnection from peer", - { - "type": "reference", - "argument": "device", - "category": "hidden", - "description": " Device Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 20 - }, - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ActiveCall", - "doc": [ - "Active Calls. Used in broadcasting states of current calls.", - { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, - { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Call's peer" - }, - { - "type": "reference", - "argument": "callMembers", - "category": "full", - "description": " Call Members" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "callId" - }, - { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 2, - "name": "peer" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "CallMember" - } - }, - "id": 3, - "name": "callMembers" - } - ] - } - }, - { - "type": "enum", - "content": { - "name": "CallMemberState", - "values": [ - { - "name": "RINGING", - "id": 1 - }, - { - "name": "RINGING_REACHED", - "id": 4 - }, - { - "name": "CONNECTING", - "id": 2 - }, - { - "name": "CONNECTED", - "id": 3 - }, - { - "name": "ENDED", - "id": 5 - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "CallMemberStateHolder", - "doc": [ - "Call Member state holder", - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State Value" - }, - { - "type": "reference", - "argument": "fallbackIsRinging", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, - { - "type": "reference", - "argument": "fallbackIsConnected", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, - { - "type": "reference", - "argument": "fallbackIsConnecting", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, - { - "type": "reference", - "argument": "fallbackIsRingingReached", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, - { - "type": "reference", - "argument": "fallbackIsEnded", - "category": "full", - "description": " Fallback flag for future compatibility of state" - } - ], - "attributes": [ - { - "type": { - "type": "enum", - "childType": "CallMemberState" - }, - "id": 1, - "name": "state" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "fallbackIsRinging" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "fallbackIsConnected" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "fallbackIsConnecting" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 5, - "name": "fallbackIsRingingReached" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "fallbackIsEnded" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "CallMember", - "doc": [ - "Call Member", - { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " Member User Id" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of member" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "userId" - }, - { - "type": { - "type": "struct", - "childType": "CallMemberStateHolder" - }, - "id": 3, - "name": "state" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "PeerSettings", - "doc": [ - "Peer Settings", - { - "type": "reference", - "argument": "is3DESSupported", - "category": "full", - "description": " Marking if 3DES supported. Default is false." - }, - { - "type": "reference", - "argument": "isMobile", - "category": "full", - "description": " Is Peer a mobile phone. Default is false." - }, - { - "type": "reference", - "argument": "canBeAudioRelay", - "category": "full", - "description": " If peer can audio relay. Default is false." - }, - { - "type": "reference", - "argument": "canPreConnect", - "category": "full", - "description": " If peer can preconnect before answer" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "is3DESSupported" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isMobile" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "canBeAudioRelay" - }, - { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "canPreConnect" - } - ] - } - } - ] - }, - { - "title": "Config sync", - "package": "configs", - "doc": [ - "Parameter Syncronization across devices. Can be used for simple sync", - "across devices without rewriting server side code." - ], - "items": [ - { - "type": "struct", - "content": { - "name": "Parameter", - "doc": [ - "Syncing Parameter", - { - "type": "reference", - "argument": "key", - "category": "full", - "description": " Key of parameter" - }, - { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Value of parameter" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "key" - }, - { - "type": "string", - "id": 2, - "name": "value" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetParameters", - "header": 134, - "response": { - "type": "anonymous", - "header": 135, - "doc": [ - { - "type": "reference", - "argument": "parameters", - "category": "full", - "description": " Current parameters" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Parameter" - } - }, - "id": 1, - "name": "parameters" - } - ] - }, - "doc": [ - "Getting Parameters" - ], - "attributes": [] - } - }, - { - "type": "rpc", - "content": { - "name": "EditParameter", - "header": 128, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Change parameter value", - { - "type": "reference", - "argument": "key", - "category": "full", - "description": "Key of parameter" - }, - { - "type": "reference", - "argument": "value", - "category": "full", - "description": "Value of parameter" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "key" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "value" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "ParameterChanged", - "header": 131, - "doc": [ - "Update about parameter change", - { - "type": "reference", - "argument": "key", - "category": "full", - "description": " Key of parameter" - }, - { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Value of parameter" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "key" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "value" - } - ] - } - } - ] - }, - { - "title": "Stats", - "package": "stats", - "doc": [ - "Saving statistics information" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "EventRecord", - "doc": [ - "Record for stored event" - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 1, - "name": "date" - }, - { - "type": { - "type": "trait", - "childType": "Event" - }, - "id": 2, - "name": "event" - } - ] - } - }, - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "Event", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "UntypedEvent", - "doc": [ - "Untyped event", - { - "type": "reference", - "argument": "eventType", - "category": "full", - "description": " Event type" - }, - { - "type": "reference", - "argument": "params", - "category": "full", - "description": " optional params for event" - } - ], - "trait": { - "name": "Event", - "key": 1 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "eventType" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 2, - "name": "params" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ContentViewChanged", - "doc": [ - "Content view event", - { - "type": "reference", - "argument": "contentType", - "category": "full", - "description": " unique content id" - }, - { - "type": "reference", - "argument": "visible", - "category": "full", - "description": " Is content visible" - }, - { - "type": "reference", - "argument": "params", - "category": "full", - "description": " optional params for content view" - } - ], - "trait": { - "name": "Event", - "key": 2 - }, - "expandable": "true", - "attributes": [ - { - "type": "string", - "id": 1, - "name": "contentType" - }, - { - "type": "string", - "id": 2, - "name": "contentId" - }, - { - "type": "bool", - "id": 3, - "name": "visible" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 4, - "name": "params" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "AppVisibleChanged", - "doc": [ - "On App Visible event", - { - "type": "reference", - "argument": "visible", - "category": "full", - "description": " Is app visible" - } - ], - "trait": { - "name": "Event", - "key": 4 - }, - "expandable": "true", - "attributes": [ - { - "type": "bool", - "id": 1, - "name": "visible" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "StoreEvents", - "header": 243, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Storing events on server", - { - "type": "reference", - "argument": "events", - "category": "full", - "description": "Events for storing" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "Event" - } - }, - "id": 1, - "name": "events" - } - ] - } - } - ] - }, - { - "title": "Raw API", - "package": "raw", - "doc": [ - "Schema-less API that is useful for external integrations" - ], - "items": [ - { - "type": "rpc", - "content": { - "name": "RawRequest", - "header": 2569, - "response": { - "type": "anonymous", - "header": 2570, - "doc": [ - "Response of a raw request", - { - "type": "reference", - "argument": "result", - "category": "full", - "description": " Result of request" - } - ], - "attributes": [ - { - "type": { - "type": "trait", - "childType": "RawValue" - }, - "id": 1, - "name": "result" - } - ] - }, - "doc": [ - "Making raw request to external service via shema-less RPC request", - { - "type": "reference", - "argument": "service", - "category": "full", - "description": "Service name for RPC request" - }, - { - "type": "reference", - "argument": "method", - "category": "full", - "description": "Method for execution" - }, - { - "type": "reference", - "argument": "params", - "category": "full", - "description": "Optional params for the method" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "service" - }, - { - "type": "string", - "id": 2, - "name": "method" - }, - { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 3, - "name": "params" - } - ] - } - } - ] - }, - { - "title": "Wallpappers", - "package": "wallpappers", - "doc": [ - "Wallpappers support" - ], - "items": [ - { - "type": "struct", - "content": { - "name": "Wallpapper", - "doc": [ - "Wallpapper structure", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Wallpapper id" - }, - { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Image width" - }, - { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Image height" - }, - { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " Image file size" - }, - { - "type": "reference", - "argument": "file", - "category": "full", - "description": " Image file reference" - }, - { - "type": "reference", - "argument": "thumb", - "category": "full", - "description": " Image thumb" - } - ], - "attributes": [ - { - "type": "int32", - "id": 7, - "name": "id" - }, - { - "type": "int32", - "id": 1, - "name": "w" - }, - { - "type": "int32", - "id": 2, - "name": "h" - }, - { - "type": "int32", - "id": 3, - "name": "fileSize" - }, - { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 5, - "name": "file" - }, - { - "type": { - "type": "struct", - "childType": "FastThumb" - }, - "id": 6, - "name": "thumb" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadWallpappers", - "header": 241, - "response": { - "type": "anonymous", - "header": 242, - "doc": [ - "Loaded Wallpappers", - { - "type": "reference", - "argument": "wallpappers", - "category": "full", - "description": " Available wallpapper list" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Wallpapper" - } - }, - "id": 1, - "name": "wallpappers" - } - ] - }, - "doc": [ - "Load available wallpappers", - { - "type": "reference", - "argument": "maxWidth", - "category": "full", - "description": "Maximum width of wallpapper" - }, - { - "type": "reference", - "argument": "maxHeight", - "category": "full", - "description": "Maximum height of wallpapper" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "maxWidth" - }, - { - "type": "int32", - "id": 2, - "name": "maxHeight" - } - ] - } - } - ] - }, - { - "title": "Push", - "package": "push", - "doc": [ - "Vendor's pushes for receiving push notifications.", - "Push notification contains current sequence number of main sequence." - ], - "items": [ - { - "type": "rpc", - "content": { - "name": "RegisterGooglePush", - "header": 51, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registering push token on server", - { - "type": "reference", - "argument": "projectId", - "category": "hidden", - "description": "Project Id of token" - }, - { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "token value" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "projectId" - }, - { - "type": "string", - "id": 2, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnregisterGooglePush", - "header": 2631, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregistering Google Push", - { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "Token value" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RegisterApplePush", - "header": 76, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registering apple push on server", - { - "type": "reference", - "argument": "apnsKey", - "category": "hidden", - "description": "apns key id" - }, - { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "token value" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "apnsKey" - }, - { - "type": "string", - "id": 2, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnregisterApplePush", - "header": 2632, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregistering Apple Push", - { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Token" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RegisterApplePushKit", - "header": 2576, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registration of a new Apple's PushKit tokens", - { - "type": "reference", - "argument": "apnsKey", - "category": "hidden", - "description": "APNS key id" - }, - { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "token value" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "apnsKey" - }, - { - "type": "string", - "id": 2, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnregisterApplePushKit", - "header": 2633, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregistering Apple Push Kit token", - { - "type": "reference", - "argument": "token", - "category": "hidden", - "description": "Token Value" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RegisterApplePushToken", - "header": 2593, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registering Apple Push Token", - { - "type": "reference", - "argument": "bundleId", - "category": "full", - "description": "Bundle Id of app" - }, - { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Push token" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "bundleId" - }, - { - "type": "string", - "id": 2, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnregisterApplePushToken", - "header": 2634, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregister Apple Push token", - { - "type": "reference", - "argument": "token", - "category": "hidden", - "description": "Token value" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "token" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "RegisterActorPush", - "header": 2575, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Register Actor Push endpoint", - { - "type": "reference", - "argument": "endpoint", - "category": "full", - "description": "Endpoint for push sending" - }, - { - "type": "reference", - "argument": "encryptionKeys", - "category": "full", - "description": "Push Encryption keys" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "endpoint" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 2, - "name": "encryptionKeys" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UnregisterActorPush", - "header": 2635, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregister Actor Push endpoint", - { - "type": "reference", - "argument": "endpoint", - "category": "full", - "description": "Endpoint for unregistering" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "endpoint" - } - ] - } - } - ] - }, - { - "title": "Encryption", - "package": "encryption", - "doc": [ - "Package that include encryption support", - "Key alg types:", - "* curve25519 - https://en.wikipedia.org/wiki/Curve25519", - "* rsa-2048", - "* rsa-4096", - "* aes-128", - "* kuznechik-128", - "", - "Signature alg types:", - "* Ed25519 - used curve25519 conveted to Ed255519 for signing and validataion" - ], - "items": [ - { - "type": "comment", - "content": "Public Keys" - }, - { - "type": "struct", - "content": { - "name": "EncryptionKeyGroup", - "doc": [ - "Encryption Key Group", - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, - { - "type": "reference", - "argument": "identityKey", - "category": "full", - "description": " Key that is used as identity and for validation of Key Group changes" - }, - { - "type": "reference", - "argument": "supportedEncryption", - "category": "full", - "description": " Supported encryption methods by this key group" - }, - { - "type": "reference", - "argument": "keys", - "category": "compact", - "description": " keys of Key Group" - }, - { - "type": "reference", - "argument": "signatures", - "category": "compact", - "description": " Signatures of keys" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 2, - "name": "supportedEncryption" - }, - { - "type": { - "type": "struct", - "childType": "EncryptionKey" - }, - "id": 3, - "name": "identityKey" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 4, - "name": "keys" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 5, - "name": "signatures" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EncryptionKeySignature", - "doc": [ - "Signed Key. Usually used for public keys.", - { - "type": "reference", - "argument": "keyId", - "category": "full", - "description": " Key Id used for signature" - }, - { - "type": "reference", - "argument": "signatureAlg", - "category": "full", - "description": " Signature algorithm" - }, - { - "type": "reference", - "argument": "signature", - "category": "full", - "description": " Signature value" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "keyId" - }, - { - "type": "string", - "id": 2, - "name": "signatureAlg" - }, - { - "type": "bytes", - "id": 3, - "name": "signature" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EncryptionKey", - "doc": [ - "Encryption Key", - { - "type": "reference", - "argument": "keyId", - "category": "full", - "description": " Key Id" - }, - { - "type": "reference", - "argument": "keyAlg", - "category": "full", - "description": " Key Algorithm" - }, - { - "type": "reference", - "argument": "keyMaterial", - "category": "compact", - "description": " Public key material. Can be null, but always not null for LoadPublicKey" - }, - { - "type": "reference", - "argument": "keyHash", - "category": "hidden", - "description": " If keyMaterial is null, pass keyHash - SHA256 of key" - } - ], - "expandable": "true", - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "keyId" - }, - { - "type": "string", - "id": 2, - "name": "keyAlg" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 3, - "name": "keyMaterial" - }, - { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 4, - "name": "keyHash" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "PublicKeys", - "header": 2602, - "doc": [ - "Public Keys response", - { - "type": "reference", - "argument": "publicKey", - "category": "full", - "description": " Public keys" - }, - { - "type": "reference", - "argument": "signatures", - "category": "full", - "description": " Signatures of public keys" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 1, - "name": "publicKey" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 2, - "name": "signatures" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "PublicKeyGroups", - "header": 2604, - "doc": [ - "Public key groups response" - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeyGroup" - } - }, - "id": 1, - "name": "publicKeyGroups" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadPublicKeyGroups", - "header": 2601, - "response": { - "type": "reference", - "name": "PublicKeyGroups" - }, - "doc": [ - "Loading Public key groups", - { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userPeer" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadPublicKey", - "header": 2605, - "response": { - "type": "reference", - "name": "PublicKeys" - }, - "doc": [ - "Loading public key explictly", - { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - }, - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key group's id" - }, - { - "type": "reference", - "argument": "keyIds", - "category": "full", - "description": "Key ids for loading" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userPeer" - }, - { - "type": "int32", - "id": 2, - "name": "keyGroupId" - }, - { - "type": { - "type": "list", - "childType": "int64" - }, - "id": 3, - "name": "keyIds" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "LoadPrePublicKeys", - "header": 2603, - "response": { - "type": "reference", - "name": "PublicKeys" - }, - "doc": [ - "Loading SOME of ephermal public keys", - { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - }, - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "User's key group id" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userPeer" - }, - { - "type": "int32", - "id": 2, - "name": "keyGroupId" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "PublicKeyGroupChanged", - "header": 103, - "doc": [ - "Update about public key group changed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroup", - "category": "full", - "description": " Updated Key Group" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "struct", - "childType": "EncryptionKeyGroup" - }, - "id": 2, - "name": "keyGroup" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "KeysAdded", - "header": 112, - "doc": [ - "Update about keys added to Key Group", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, - { - "type": "reference", - "argument": "keys", - "category": "compact", - "description": " Added keys" - }, - { - "type": "reference", - "argument": "signatures", - "category": "compact", - "description": " Signatures of a public key" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 3, - "name": "keys" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 4, - "name": "signatures" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "KeysRemoved", - "header": 113, - "doc": [ - "Update about keys removed from Key Group", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, - { - "type": "reference", - "argument": "keyIds", - "category": "full", - "description": " Removed keys" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }, - { - "type": { - "type": "list", - "childType": "int64" - }, - "id": 3, - "name": "keyIds" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "PublicKeyGroupAdded", - "header": 104, - "doc": [ - "Update about public key group added", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroup", - "category": "full", - "description": " Added Key Group" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "struct", - "childType": "EncryptionKeyGroup" - }, - "id": 2, - "name": "keyGroup" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "PublicKeyGroupRemoved", - "header": 105, - "doc": [ - "Update about public key group removed", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Removed Key Group Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - } - ] - } - }, - { - "type": "comment", - "content": "Device Side" - }, - { - "type": "rpc", - "content": { - "name": "CreateNewKeyGroup", - "header": 2609, - "response": { - "type": "anonymous", - "header": 2610, - "doc": [ - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Created Key Group id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - } - ] - }, - "doc": [ - "Creation of a new Key Group", - { - "type": "reference", - "argument": "identityKey", - "category": "full", - "description": "Identity Key of a new group" - }, - { - "type": "reference", - "argument": "supportedEncryptions", - "category": "full", - "description": "Supported encryption methods" - }, - { - "type": "reference", - "argument": "keys", - "category": "full", - "description": "keys of current group" - }, - { - "type": "reference", - "argument": "signatures", - "category": "full", - "description": "signatures of keys" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "EncryptionKey" - }, - "id": 1, - "name": "identityKey" - }, - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 2, - "name": "supportedEncryptions" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 3, - "name": "keys" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 4, - "name": "signatures" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DeleteKeyGroup", - "header": 2611, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Deletion of a Key Group", - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id for deletion" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DisconnectKeyGroup", - "header": 2613, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Disconnect Key Group from device", - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id for disconnection" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "ConnectKeyGroup", - "header": 2614, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Connectiong Key Group to device", - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id for connection" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "UploadPreKey", - "header": 2612, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Uploading Ephermal Keys", - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id" - }, - { - "type": "reference", - "argument": "keys", - "category": "compact", - "description": "Encryprion keys" - }, - { - "type": "reference", - "argument": "signatures", - "category": "compact", - "description": "Key signatures" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 2, - "name": "keys" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 3, - "name": "signatures" - } - ] - } - }, - { - "type": "comment", - "content": "Encrypted Packages" - }, - { - "type": "struct", - "content": { - "name": "EncryptedBox", - "doc": [ - "Encrypted package that is encrypted for multiple keys", - { - "type": "reference", - "argument": "keys", - "category": "full", - "description": " Encrypted encryption keys" - }, - { - "type": "reference", - "argument": "algType", - "category": "full", - "description": " Package encryption type" - }, - { - "type": "reference", - "argument": "encPackage", - "category": "full", - "description": " Encrypted package" - }, - { - "type": "reference", - "argument": "senderKeyGroupId", - "category": "full", - "description": " Sender key group" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 4, - "name": "senderKeyGroupId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncyptedBoxKey" - } - }, - "id": 1, - "name": "keys" - }, - { - "type": "string", - "id": 2, - "name": "algType" - }, - { - "type": "bytes", - "id": 3, - "name": "encPackage" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptedBoxSignature" - } - }, - "id": 5, - "name": "signatures" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EncryptedBoxSignature", - "doc": [ - "Signature for encrypted package", - { - "type": "reference", - "argument": "algType", - "category": "full", - "description": " Alg Type" - }, - { - "type": "reference", - "argument": "signature", - "category": "full", - "description": " Signature of encrypted package" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "algType" - }, - { - "type": "bytes", - "id": 2, - "name": "signature" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "EncyptedBoxKey", - "doc": [ - "Encrypted package encryption key", - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, - { - "type": "reference", - "argument": "algType", - "category": "full", - "description": " Key encryption algorithm" - }, - { - "type": "reference", - "argument": "encryptedKey", - "category": "hidden", - "description": " Encrypted encryption key" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "usersId" - }, - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }, - { - "type": "string", - "id": 3, - "name": "algType" - }, - { - "type": "bytes", - "id": 4, - "name": "encryptedKey" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "KeyGroupId", - "doc": [ - "References to key groups", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "KeyGroupHolder", - "doc": [ - "Key Group Holder", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "keyGroup", - "category": "full", - "description": " Key Group" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, - { - "type": { - "type": "struct", - "childType": "EncryptionKeyGroup" - }, - "id": 2, - "name": "keyGroup" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SendEncryptedPackage", - "header": 2657, - "response": { - "type": "anonymous", - "header": 2664, - "doc": [ - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " date" - }, - { - "type": "reference", - "argument": "obsoleteKeyGroups", - "category": "full", - "description": " obsolete key group ids" - }, - { - "type": "reference", - "argument": "missedKeyGroups", - "category": "full", - "description": " missed key groups" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "date" - } - }, - "id": 1, - "name": "date" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "KeyGroupId" - } - }, - "id": 2, - "name": "obsoleteKeyGroups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "KeyGroupHolder" - } - }, - "id": 3, - "name": "missedKeyGroups" - } - ] - }, - "doc": [ - "Sending encrypted package", - { - "type": "reference", - "argument": "randomId", - "category": "hidden", - "description": "Random id" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "randomId" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 2, - "name": "destPeers" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "KeyGroupId" - } - }, - "id": 3, - "name": "ignoredKeyGroups" - }, - { - "type": { - "type": "struct", - "childType": "EncryptedBox" - }, - "id": 4, - "name": "encryptedBox" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "EncryptedPackage", - "header": 177, - "doc": [ - "Update about encrypted package", - { - "type": "reference", - "argument": "randomId", - "category": "full", - "description": " Random Id of package" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Sending date of package" - }, - { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " Sender id of package" - }, - { - "type": "reference", - "argument": "encryptedBox", - "category": "full", - "description": " Encrypted box" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "randomId" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "date" - }, - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "senderId" - }, - { - "type": { - "type": "struct", - "childType": "EncryptedBox" - }, - "id": 4, - "name": "encryptedBox" - } - ] - } - } - ] - }, - { - "title": "Storage", - "package": "storage", - "items": [ - { - "type": "rpc", - "content": { - "name": "UploadSharedBlob", - "header": 2660, - "response": { - "type": "anonymous", - "header": 2661, - "doc": [ - { - "type": "reference", - "argument": "sharedObjectId", - "category": "full", - "description": " Id of shared object" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "sharedObjectId" - } - ] - }, - "doc": [ - "Upload shared blob with user", - { - "type": "reference", - "argument": "destPeer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "bucket", - "category": "full", - "description": "Bucked name" - }, - { - "type": "reference", - "argument": "blob", - "category": "full", - "description": "Blob data" - }, - { - "type": "reference", - "argument": "randomId", - "category": "full", - "description": "Random id for protecting from double upload" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "destPeer" - }, - { - "type": "string", - "id": 2, - "name": "bucket" - }, - { - "type": "bytes", - "id": 3, - "name": "blob" - }, - { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "randomId" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "DownloadSharedBlob", - "header": 2662, - "response": { - "type": "anonymous", - "header": 2663, - "doc": [ - { - "type": "reference", - "argument": "blob", - "category": "full", - "description": " Blob contents" - } - ], - "attributes": [ - { - "type": "bytes", - "id": 1, - "name": "blob" - } - ] - }, - "doc": [ - "Download shared blob", - { - "type": "reference", - "argument": "destPeer", - "category": "full", - "description": "Destination peer" - }, - { - "type": "reference", - "argument": "bucket", - "category": "full", - "description": "Bucket name" - }, - { - "type": "reference", - "argument": "objectId", - "category": "full", - "description": "Object Id" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "destPeer" - }, - { - "type": "string", - "id": 2, - "name": "bucket" - }, - { - "type": "int32", - "id": 3, - "name": "objectId" - } - ] - } - } - ] - }, - { - "title": "Peers", - "package": "peers", - "doc": [ - "Peer is an identificator of specific conversation." - ], - "items": [ - { - "type": "enum", - "content": { - "name": "PeerType", - "values": [ - { - "name": "Private", - "id": 1 - }, - { - "name": "Group", - "id": 2 - }, - { - "name": "EncryptedPrivate", - "id": 3 - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Peer", - "doc": [ - "Peer", - { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Peer Type" - }, - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Peer Id" - } - ], - "attributes": [ - { - "type": { - "type": "enum", - "childType": "PeerType" - }, - "id": 1, - "name": "type" - }, - { - "type": "int32", - "id": 2, - "name": "id" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "OutPeer", - "doc": [ - "Out peer with access hash", - { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Peer Type" - }, - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Peer Id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Peer access hash" - } - ], - "attributes": [ - { - "type": { - "type": "enum", - "childType": "PeerType" - }, - "id": 1, - "name": "type" - }, - { - "type": "int32", - "id": 2, - "name": "id" - }, - { - "type": "int64", - "id": 3, - "name": "accessHash" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "UserOutPeer", - "doc": [ - "User's out peer", - { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, - { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " User's access hash" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" + "name": "Text", + "id": 2 }, { - "type": "int64", - "id": 2, - "name": "accessHash" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "GroupOutPeer", - "doc": [ - "Group's out peer", - { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group's Id" + "name": "Links", + "id": 3 }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Group's access hash" - } - ], - "attributes": [ - { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" + "name": "Documents", + "id": 4 }, { - "type": "int64", - "id": 2, - "name": "accessHash" + "name": "Photos", + "id": 5 } - ] - } + ] } - ] - }, - { - "title": "Sequence and Updates", - "package": "sequence", + },{"type":"trait","content":{ +"isContainer":"true","name":"SearchCondition","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"SearchPeerTypeCondition", +"doc":[ +"Search peer type condition",{"type":"reference","argument":"peerType","category":"full","description":" Peer type for searching"}],"trait":{"name":"SearchCondition","key":1},"attributes":[ +{"type":{"type":"enum","childType":"SearchPeerType"},"id":1,"name":"peerType"} +]}}, { + "type":"struct", + "content": { + "name":"SearchPieceText", +"doc":[ +"Search peer name condition",{"type":"reference","argument":"query","category":"full","description":" Search query"}],"trait":{"name":"SearchCondition","key":2},"attributes":[ +{"type":"string","id":1,"name":"query"} +]}}, { + "type":"struct", + "content": { + "name":"SearchAndCondition", +"doc":[ +"Search AND condion",{"type":"reference","argument":"andQuery","category":"full","description":" And Query"}],"trait":{"name":"SearchCondition","key":3},"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":1,"name":"andQuery"} +]}}, { + "type":"struct", + "content": { + "name":"SearchOrCondition", +"doc":[ +"Search OR condition",{"type":"reference","argument":"orQuery","category":"full","description":" Or Query"}],"trait":{"name":"SearchCondition","key":4},"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":2,"name":"orQuery"} +]}}, { + "type":"struct", + "content": { + "name":"SearchPeerCondition", +"doc":[ +"Serch Peer condition",{"type":"reference","argument":"peer","category":"full","description":" Peer condition"}],"trait":{"name":"SearchCondition","key":5},"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}}, { + "type":"struct", + "content": { + "name":"SearchPeerContentType", +"doc":[ +"Search content type condition",{"type":"reference","argument":"contentType","category":"full","description":" Content Type"}],"trait":{"name":"SearchCondition","key":6},"attributes":[ +{"type":{"type":"enum","childType":"SearchContentType"},"id":1,"name":"contentType"} +]}}, { + "type":"struct", + "content": { + "name":"SearchSenderIdConfition", +"doc":[ +"Searching sender uid condition",{"type":"reference","argument":"senderId","category":"full","description":" sender UID"}],"trait":{"name":"SearchCondition","key":7},"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"senderId"} +]}}, { + "type":"struct", + "content": { + "name":"PeerSearchResult", +"doc":[ +"Peer search result",{"type":"reference","argument":"peer","category":"full","description":" Peer information"},{"type":"reference","argument":"optMatchString","category":"full","description":" Description"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"optMatchString"} +]}},{"type":"rpc","content":{ +"name":"PeerSearch", +"header":233, +"response":{"type":"anonymous","header":234, "doc":[ +"Found peers",{"type":"reference","argument":"searchResults","category":"full","description":" Search Results"},{"type":"reference","argument":"users","category":"full","description":" Related users"},{"type":"reference","argument":"groups","category":"full","description":" Related groups"},{"type":"reference","argument":"userPeers","category":"full","description":" Related user peers"},{"type":"reference","argument":"groupPeers","category":"full","description":" Related group peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"PeerSearchResult"}},"id":1,"name":"searchResults"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":5,"name":"groupPeers"} +]}, +"doc":[ +"Performing peer search",{"type":"reference","argument":"query","category":"full","description":"Search query. Warring not all combinations can be processed by server. (acts as OR)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":1,"name":"query"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}}, { + "type":"struct", + "content": { + "name":"MessageSearchResult", +"doc":[ +"Message container",{"type":"reference","argument":"peer","category":"full","description":" Message Peer"},{"type":"reference","argument":"rid","category":"full","description":" Message Random Id"},{"type":"reference","argument":"date","category":"full","description":" Message Date"},{"type":"reference","argument":"senderId","category":"full","description":" Message sender UID"},{"type":"reference","argument":"content","category":"full","description":" Message content"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"alias","childType":"userId"},"id":4,"name":"senderId"} +,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"content"} +]}}, { + "type":"struct", + "content": { + "name":"MessageSearchItem", +"doc":[ +"Message Search result container"],"attributes":[ +{"type":{"type":"struct","childType":"MessageSearchResult"},"id":1,"name":"result"} +]}},{"type":"response","content":{ +"name":"MessageSearchResponse", +"header":218, +"doc":[ +"Search Result",{"type":"reference","argument":"searchResults","category":"full","description":" Search results"},{"type":"reference","argument":"users","category":"full","description":" Search users"},{"type":"reference","argument":"groups","category":"full","description":" Search groups"},{"type":"reference","argument":"loadMoreState","category":"hidden","description":" State for loading more results"},{"type":"reference","argument":"userOutPeers","category":"full","description":" Search user peers"},{"type":"reference","argument":"groupOutPeers","category":"full","description":" Search group peers"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"MessageSearchItem"}},"id":1,"name":"searchResults"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} +,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"loadMoreState"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userOutPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupOutPeers"} +]}},{"type":"rpc","content":{ +"name":"MessageSearch", +"header":217, +"response":{"type":"reference","name":"MessageSearchResponse"}, +"doc":[ +"Performing message search",{"type":"reference","argument":"query","category":"full","description":"Search query"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"trait","childType":"SearchCondition"},"id":1,"name":"query"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"MessageSearchMore", +"header":222, +"response":{"type":"reference","name":"MessageSearchResponse"}, +"doc":[ +"Performing message search paging",{"type":"reference","argument":"loadMoreState","category":"hidden","description":"State for loading more results"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":"bytes","id":1,"name":"loadMoreState"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}}]}, { + "title": "Public Groups", + "package": "pubgroups", "doc": [ - "Each device has it's own update sequence. At the begining application request initial sequence state by", - "calling GetState. On each application restart or NewSessionCreated application calls GetDifference for receiving", - "updates in update sequence.", - "GetState and GetDifference automatically subscribes session to receiving updates in session.", - "Each update has seq and state. Seq is sequental index of updated and used for detecting of holes in update sequence", - "(because of server failure or session die) on client side.", - "All updates needed to be processed in partucular order according to seq values.", - "In some updates there can be references to users that are not available at client yer. In this case application need", - "to ignore such update and init getting difference." + "Public group is easy way to find communities" ], + "items": [ + { + "type":"struct", + "content": { + "name":"PublicGroup", +"doc":[ +"Public Group description",{"type":"reference","argument":"id","category":"full","description":" Group id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Group Access hash"},{"type":"reference","argument":"title","category":"full","description":" Group title"},{"type":"reference","argument":"avatar","category":"full","description":" Group avatar"},{"type":"reference","argument":"membersCount","category":"full","description":" Members count in group"},{"type":"reference","argument":"friendsCount","category":"full","description":" Friends count int group"},{"type":"reference","argument":"description","category":"full","description":" Description of group"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":7,"name":"avatar"} +,{"type":"int32","id":4,"name":"membersCount"} +,{"type":"int32","id":5,"name":"friendsCount"} +,{"type":"string","id":6,"name":"description"} +]}},{"type":"rpc","content":{ +"name":"GetPublicGroups", +"header":201, +"response":{"type":"anonymous","header":202, "doc":[ +"Loaded public groups",{"type":"reference","argument":"groups","category":"full","description":" All available groups"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"PublicGroup"}},"id":1,"name":"groups"} +]}, +"doc":[ +"Getting public groups"],"attributes":[ +]}}]}, { + "title": "Invites", + "package": "invites", + "doc": [ + "Invite mechanizm" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"InviteState", +"doc":[ +"Invite state",{"type":"reference","argument":"email","category":"full","description":" Email of invite"},{"type":"reference","argument":"name","category":"full","description":" Name of invited user"},{"type":"reference","argument":"uid","category":"full","description":" Uid of registered user"},{"type":"reference","argument":"tid","category":"full","description":" Team id of invite"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +,{"type":{"type":"opt","childType":"int32"},"id":3,"name":"uid"} +,{"type":{"type":"opt","childType":"int32"},"id":4,"name":"tid"} +]}},{"type":"response","content":{ +"name":"InviteList", +"header":2564, +"doc":[ +"Intites list",{"type":"reference","argument":"invites","category":"full","description":" Intvites"},{"type":"reference","argument":"relatedUsers","category":"full","description":" Related users in invites"},{"type":"reference","argument":"relatedGroups","category":"full","description":" Related groups in invites"},{"type":"reference","argument":"relatedTeams","category":"full","description":" Related teams in invites"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"InviteState"}},"id":1,"name":"invites"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"relatedUsers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"relatedGroups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":4,"name":"relatedTeams"} +]}},{"type":"rpc","content":{ +"name":"LoadOwnSentInvites", +"header":2563, +"response":{"type":"reference","name":"InviteList"}, +"doc":[ +"Loading current invite states"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"SendInvite", +"header":2565, +"response":{"type":"reference","name":"InviteList"}, +"doc":[ +"Sending an email invite",{"type":"reference","argument":"email","category":"full","description":"Email for invite"},{"type":"reference","argument":"name","category":"full","description":"Optional name for invite"},{"type":"reference","argument":"destTeam","category":"full","description":"Optional team for invite"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"OutTeam"}},"id":3,"name":"destTeam"} +]}}]}, { + "title": "Teams", + "package": "teams", + "doc": [ + "Teams support for Actor" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Team", +"doc":[ +"Team entity",{"type":"reference","argument":"id","category":"full","description":" Team Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Team Access Hash"},{"type":"reference","argument":"name","category":"full","description":" Team name"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"name"} +]}}, { + "type":"struct", + "content": { + "name":"OutTeam", +"doc":[ +"Reference to a team",{"type":"reference","argument":"id","category":"full","description":" Team Id"},{"type":"reference","argument":"accessHash","category":"full","description":" Team access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"response","content":{ +"name":"TeamsList", +"header":2562, +"doc":[ +"Teams response",{"type":"reference","argument":"teams","category":"hidden","description":" Teams list"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":1,"name":"teams"} +]}},{"type":"rpc","content":{ +"name":"LoadOwnTeams", +"header":2561, +"response":{"type":"reference","name":"TeamsList"}, +"doc":[ +"Loading own teams"],"attributes":[ +]}},{"type":"update","content":{ +"name":"OwnTeamsChanged", +"header":165, +"doc":[ +"Update about own teams changed",{"type":"reference","argument":"ownTeams","category":"full","description":" Updated own teams list"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":1,"name":"ownTeams"} +]}},{"type":"rpc","content":{ +"name":"CreateTeam", +"header":2566, +"response":{"type":"anonymous","header":2567, "doc":[ +"Created team response",{"type":"reference","argument":"createdTeam","category":"full","description":" Created Team"}] ,"attributes":[{"type":{"type":"struct","childType":"Team"},"id":1,"name":"createdTeam"} +]}, +"doc":[ +"Creation of a Team",{"type":"reference","argument":"title","category":"full","description":"Title of a team"}],"attributes":[ +{"type":"string","id":1,"name":"title"} +]}},{"type":"rpc","content":{ +"name":"InviteToTeam", +"header":2568, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Inviting people to team",{"type":"reference","argument":"user","category":"full","description":"Dest user"},{"type":"reference","argument":"destTeam","category":"full","description":"Dest team"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"user"} +,{"type":{"type":"struct","childType":"OutTeam"},"id":3,"name":"destTeam"} +]}}]}, { + "title": "Integrations", + "package": "integrations", + "doc": [ + "Package contains methods for providing integration" + ], + "items": [ +{"type":"response","content":{ +"name":"IntegrationToken", +"header":183, +"doc":[ +"Group token response",{"type":"reference","argument":"token","category":"danger","description":" current group token"},{"type":"reference","argument":"url","category":"danger","description":" current group url"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +,{"type":"string","id":2,"name":"url"} +]}},{"type":"rpc","content":{ +"name":"GetIntegrationToken", +"header":182, +"response":{"type":"reference","name":"IntegrationToken"}, +"doc":[ +"Getting current group token",{"type":"reference","argument":"groupPeer","category":"full","description":"Peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"RevokeIntegrationToken", +"header":184, +"response":{"type":"reference","name":"IntegrationToken"}, +"doc":[ +"Revoke group token",{"type":"reference","argument":"groupPeer","category":"full","description":"Peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"groupPeer"} +]}}]}, { + "title": "Typing and Online", + "package": "weak", "items": [ { - "type": "update_box", - "content": { - "name": "SeqUpdate", - "header": 13, - "doc": [ - "Sequence update", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of update" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequece state of update" - }, - { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " header of update" - }, - { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The update" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": "int32", - "id": 3, - "name": "updateHeader" - }, - { - "type": "bytes", - "id": 4, - "name": "update" - } - ] - } - }, - { - "type": "update_box", - "content": { - "name": "FatSeqUpdate", - "header": 73, - "doc": [ - "Fat sequence update with additional data", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of update" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state of update" - }, - { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " header of update" - }, - { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The update" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Users that are referenced in update" - }, - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups that are referenced in update" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": "int32", - "id": 3, - "name": "updateHeader" - }, - { - "type": "bytes", - "id": 4, - "name": "update" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 5, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 6, - "name": "groups" - } - ] - } - }, - { - "type": "update_box", + "type": "enum", "content": { - "name": "WeakUpdate", - "header": 26, - "doc": [ - "Out of sequence update (for typing and online statuses)", - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of update" - }, - { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " Header of update" - }, - { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The update" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "date" - }, - { - "type": "int32", - "id": 2, - "name": "updateHeader" - }, + "name": "TypingType", + "values": [ { - "type": "bytes", - "id": 3, - "name": "update" + "name": "Text", + "id": 0 } - ] - } - }, - { - "type": "update_box", + ] + } + },{"type":"rpc","content":{ +"name":"Typing", +"header":27, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Sending typing notification",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"typingType","category":"full","description":"typing type."}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} +]}},{"type":"rpc","content":{ +"name":"StopTyping", +"header":30, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Stop typing",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"typingType","category":"full","description":"typing type"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"enum","childType":"TypingType"},"id":2,"name":"typingType"} +]}}, { + "type": "enum", "content": { - "name": "WeakFatUpdate", - "header": 2673, - "doc": [ - "Fat Weak Update", - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of update" - }, + "name": "DeviceType", + "values": [ { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " Header of update" + "name": "GENERIC", + "id": 1 }, { - "type": "reference", - "argument": "update", - "category": "full", - "description": " The update" + "name": "PC", + "id": 2 }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Users that are referenced in update" + "name": "MOBILE", + "id": 3 }, { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Groups that are referenced in update" - } - ], - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "date" + "name": "TABLET", + "id": 4 }, { - "type": "int32", - "id": 2, - "name": "updateHeader" + "name": "WATCH", + "id": 5 }, { - "type": "bytes", - "id": 3, - "name": "update" + "name": "MIRROR", + "id": 6 }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 4, - "name": "users" + "name": "CAR", + "id": 7 }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 5, - "name": "groups" + "name": "TABLE", + "id": 8 } - ] - } - }, - { - "type": "update_box", - "content": { - "name": "SeqUpdateTooLong", - "header": 25, - "doc": [ - "Notification about requiring performing manual GetDifference" - ], - "attributes": [] - } - }, - { - "type": "struct", + ] + } + },{"type":"rpc","content":{ +"name":"SetOnline", +"header":29, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Sending online state",{"type":"reference","argument":"isOnline","category":"full","description":"is user online"},{"type":"reference","argument":"timeout","category":"full","description":"timeout of online state in milliseconds"},{"type":"reference","argument":"deviceType","category":"full","description":"Optional device type"},{"type":"reference","argument":"deviceCategory","category":"full","description":"Optional device category, for example android or ios"}],"attributes":[ +{"type":"bool","id":1,"name":"isOnline"} +,{"type":{"type":"alias","childType":"msec"},"id":2,"name":"timeout"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":3,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"PauseNotifications", +"header":166, +"doc":[ +"Update about pausing notifications",{"type":"reference","argument":"timeout","category":"full","description":" Timeout for notifications resume"}],"attributes":[ +{"type":{"type":"alias","childType":"sec"},"id":1,"name":"timeout"} +]}},{"type":"update","content":{ +"name":"RestoreNotifications", +"header":167, +"doc":[ +"Update about restoring notifications"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"PauseNotifications", +"header":2641, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Pause notifications",{"type":"reference","argument":"timeout","category":"hidden","description":"Timeout of pause"}],"attributes":[ +{"type":{"type":"alias","childType":"sec"},"id":1,"name":"timeout"} +]}},{"type":"rpc","content":{ +"name":"RestoreNotifications", +"header":2642, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Restoring notifications"],"attributes":[ +]}},{"type":"empty"},{"type":"update","content":{ +"name":"Typing", +"header":6, +"doc":[ +"Update about user's typing",{"type":"reference","argument":"peer","category":"full","description":" Conversation peer"},{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"typingType","category":"full","description":" Type of typing"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} +]}},{"type":"update","content":{ +"name":"TypingStop", +"header":81, +"doc":[ +"Update about user's typing stop",{"type":"reference","argument":"peer","category":"full","description":" Conversation peer"},{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"typingType","category":"hidden","description":" Type of typing"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} +]}},{"type":"update","content":{ +"name":"UserOnline", +"header":7, +"doc":[ +"Update about user became online",{"type":"reference","argument":"uid","category":"full","description":" User's Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":2,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"UserOffline", +"header":8, +"doc":[ +"Update about user became offline",{"type":"reference","argument":"uid","category":"full","description":" User's id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":2,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"UserLastSeen", +"header":9, +"doc":[ +"Update about user's last seen state",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"date","category":"full","description":" Last seen time"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"date"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":3,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"GroupOnline", +"header":33, +"doc":[ +"Update about group online change",{"type":"reference","argument":"groupId","category":"full","description":" Group id"},{"type":"reference","argument":"count","category":"full","description":" current online user's count"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int32","id":2,"name":"count"} +]}}]}, { + "title": "Media and Files", + "package": "files", + "items": [ + { + "type":"struct", + "content": { + "name":"FileLocation", +"doc":[ +"Location of file on server",{"type":"reference","argument":"fileId","category":"full","description":" Unique Id of file"},{"type":"reference","argument":"accessHash","category":"danger","description":" Access hash of file"}],"expandable":"true","attributes":[ +{"type":"int64","id":1,"name":"fileId"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}, { + "type":"struct", + "content": { + "name":"ImageLocation", +"doc":[ +"Image location",{"type":"reference","argument":"fileLocation","category":"full","description":" Location of file"},{"type":"reference","argument":"width","category":"full","description":" Width of avatar image"},{"type":"reference","argument":"height","category":"full","description":" Height of avatar image"},{"type":"reference","argument":"fileSize","category":"full","description":" Size of file"}],"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} +,{"type":"int32","id":2,"name":"width"} +,{"type":"int32","id":3,"name":"height"} +,{"type":"int32","id":4,"name":"fileSize"} +]}}, { + "type":"struct", + "content": { + "name":"AvatarImage", +"doc":[ +"Avatar Image",{"type":"reference","argument":"fileLocation","category":"full","description":" Location of file"},{"type":"reference","argument":"width","category":"full","description":" Width of avatar image"},{"type":"reference","argument":"height","category":"full","description":" Height of avatar image"},{"type":"reference","argument":"fileSize","category":"full","description":" Size of file"}],"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} +,{"type":"int32","id":2,"name":"width"} +,{"type":"int32","id":3,"name":"height"} +,{"type":"int32","id":4,"name":"fileSize"} +]}}, { + "type":"struct", + "content": { + "name":"Avatar", +"doc":[ +"Avatar of User or Group",{"type":"reference","argument":"smallImage","category":"compact","description":" Optional small image of avatar box in 100x100"},{"type":"reference","argument":"largeImage","category":"compact","description":" Optional large image of avatar box in 200x200"},{"type":"reference","argument":"fullImage","category":"compact","description":" Optional full screen image of avatar"}],"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":1,"name":"smallImage"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":2,"name":"largeImage"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":3,"name":"fullImage"} +]}}, { + "type":"struct", + "content": { + "name":"FastThumb", +"doc":[ +"Fast thumb of media messages. Less than 90x90 and compressed by JPEG with low quality",{"type":"reference","argument":"w","category":"full","description":" Width of thumb"},{"type":"reference","argument":"h","category":"full","description":" Height of thump"},{"type":"reference","argument":"thumb","category":"compact","description":" compressed image data"}],"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"bytes","id":3,"name":"thumb"} +]}}, { + "type": "enum", "content": { - "name": "UpdateContainer", - "doc": [ - "Update container", + "name": "Colors", + "values": [ { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " Header of update" + "name": "red", + "id": 1 }, { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The updatre" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "updateHeader" + "name": "yellow", + "id": 2 }, { - "type": "bytes", - "id": 2, - "name": "update" + "name": "green", + "id": 3 } - ] - } - }, - { - "type": "update_box", + ] + } + },{"type":"trait","content":{ +"isContainer":"true","name":"Color","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"RgbColor", +"doc":[ +"RGB Color",{"type":"reference","argument":"rgb","category":"full","description":" RGB color value"}],"trait":{"name":"Color","key":1},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"rgb"} +]}}, { + "type":"struct", + "content": { + "name":"PredefinedColor", +"doc":[ +"Predefined color",{"type":"reference","argument":"color","category":"hidden","description":" Predefined color value"}],"trait":{"name":"Color","key":2},"expandable":"true","attributes":[ +{"type":{"type":"enum","childType":"Colors"},"id":1,"name":"color"} +]}},{"type":"empty"}, { + "type":"struct", + "content": { + "name":"HTTPHeader", +"doc":[ +"HTTP Header record",{"type":"reference","argument":"key","category":"full","description":" HTTP Header name"},{"type":"reference","argument":"value","category":"full","description":" HTTP Header value"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":"string","id":2,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"FileUrlDescription", +"doc":[ +"File url description",{"type":"reference","argument":"fileId","category":"full","description":" File id of url"},{"type":"reference","argument":"url","category":"full","description":" Url for downloading"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url"},{"type":"reference","argument":"unsignedUrl","category":"hidden","description":" Unsigned URL (used to honor web caches)"},{"type":"reference","argument":"unsignedUrlHeaders","category":"hidden","description":" Headers that is required to download files with unsigned url"}],"attributes":[ +{"type":"int64","id":1,"name":"fileId"} +,{"type":"string","id":2,"name":"url"} +,{"type":{"type":"alias","childType":"sec"},"id":3,"name":"timeout"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"unsignedUrl"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"HTTPHeader"}},"id":5,"name":"unsignedUrlHeaders"} +]}},{"type":"rpc","content":{ +"name":"GetFileUrl", +"header":77, +"response":{"type":"anonymous","header":78, "doc":[ +{"type":"reference","argument":"url","category":"full","description":" Url for downloading"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url"},{"type":"reference","argument":"unsignedUrl","category":"full","description":" Unsigned URL (used to honor web caches)"},{"type":"reference","argument":"unsignedUrlHeaders","category":"full","description":" Headers that is required to download files with unsigned url"}] ,"attributes":[{"type":"string","id":1,"name":"url"} +,{"type":{"type":"alias","childType":"sec"},"id":2,"name":"timeout"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"unsignedUrl"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"HTTPHeader"}},"id":4,"name":"unsignedUrlHeaders"} +]}, +"doc":[ +"Requesting file URL for downloading",{"type":"reference","argument":"file","category":"full","description":"file's location"}],"attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"file"} +]}},{"type":"rpc","content":{ +"name":"GetFileUrls", +"header":2573, +"response":{"type":"anonymous","header":2574, "doc":[ +{"type":"reference","argument":"fileUrls","category":"full","description":" File urls"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"FileUrlDescription"}},"id":1,"name":"fileUrls"} +]}, +"doc":[ +"Requesting multiple fle URL for downloading",{"type":"reference","argument":"files","category":"hidden","description":"File locations to load urls"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"FileLocation"}},"id":1,"name":"files"} +]}},{"type":"rpc","content":{ +"name":"GetFileUrlBuilder", +"header":2579, +"response":{"type":"anonymous","header":2580, "doc":[ +{"type":"reference","argument":"baseUrl","category":"full","description":" Base Url for files"},{"type":"reference","argument":"algo","category":"full","description":" Signature algorithm"},{"type":"reference","argument":"seed","category":"full","description":" Public-visible seed of signature"},{"type":"reference","argument":"signatureSecret","category":"full","description":" Signature Secret"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url builder"}] ,"attributes":[{"type":"string","id":1,"name":"baseUrl"} +,{"type":"string","id":2,"name":"algo"} +,{"type":"string","id":5,"name":"seed"} +,{"type":"bytes","id":3,"name":"signatureSecret"} +,{"type":{"type":"alias","childType":"sec"},"id":4,"name":"timeout"} +]}, +"doc":[ +"Get File URL Builder that allows to build file urls from client side",{"type":"reference","argument":"supportedSignatureAlgorithms","category":"hidden","description":"Supported signature algorithms by client"}],"attributes":[ +{"type":{"type":"list","childType":"string"},"id":1,"name":"supportedSignatureAlgorithms"} +]}},{"type":"rpc","content":{ +"name":"GetFileUploadUrl", +"header":97, +"response":{"type":"anonymous","header":121, "doc":[ +{"type":"reference","argument":"url","category":"full","description":" Url for uploading"},{"type":"reference","argument":"uploadKey","category":"compact","description":" Upload key for upload"}] ,"attributes":[{"type":"string","id":1,"name":"url"} +,{"type":"bytes","id":2,"name":"uploadKey"} +]}, +"doc":[ +"Requesting pload url",{"type":"reference","argument":"expectedSize","category":"full","description":"Expected size of uploading file. May be inaccurate. Used for size allocation optimizations."}],"attributes":[ +{"type":"int32","id":1,"name":"expectedSize"} +]}},{"type":"rpc","content":{ +"name":"CommitFileUpload", +"header":122, +"response":{"type":"anonymous","header":138, "doc":[ +{"type":"reference","argument":"uploadedFileLocation","category":"hidden","description":" Result file location"}] ,"attributes":[{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"uploadedFileLocation"} +]}, +"doc":[ +"Comminting uploaded file to storage"],"attributes":[ +{"type":"bytes","id":1,"name":"uploadKey"} +,{"type":"string","id":2,"name":"fileName"} +]}},{"type":"rpc","content":{ +"name":"GetFileUploadPartUrl", +"header":142, +"response":{"type":"anonymous","header":141, "doc":[ +{"type":"reference","argument":"url","category":"full","description":" Upload file part url"}] ,"attributes":[{"type":"string","id":1,"name":"url"} +]}, +"doc":[ +"Upload file part",{"type":"reference","argument":"uploadKey","category":"compact","description":"Upload Key from requestFileUploadUrl"}],"attributes":[ +{"type":"int32","id":1,"name":"partNumber"} +,{"type":"int32","id":2,"name":"partSize"} +,{"type":"bytes","id":3,"name":"uploadKey"} +]}}]}, { + "title": "Features", + "package": "features", + "doc": [ + "Enable feature discovery. Currently available features:", + "* \"call\" - private audio calls" + ], + "items": [ +{"type":"rpc","content":{ +"name":"EnableFeature", +"header":2588, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Enabling feature on the device",{"type":"reference","argument":"featureName","category":"full","description":"Feature name"},{"type":"reference","argument":"args","category":"danger","description":"Optional arguments to a feature"}],"attributes":[ +{"type":"string","id":1,"name":"featureName"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"args"} +]}},{"type":"rpc","content":{ +"name":"DisableFeature", +"header":2589, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Disabling feature on the device",{"type":"reference","argument":"featureName","category":"full","description":"Feature name"}],"attributes":[ +{"type":"string","id":1,"name":"featureName"} +]}},{"type":"rpc","content":{ +"name":"CheckFeatureEnabled", +"header":2590, +"response":{"type":"reference","name":"Bool"}, +"doc":[ +"Method for checking if feature is available to user"],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userOutPeer"} +,{"type":"string","id":2,"name":"featureName"} +]}}]}, { + "title": "EventBus", + "package": "eventbus", + "items": [ +{"type":"rpc","content":{ +"name":"CreateNewEventBus", +"header":2665, +"response":{"type":"anonymous","header":2666, "doc":[ +"Created new Event Bus",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Your Device Id"}] ,"attributes":[{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"deviceId"} +]}, +"doc":[ +"Create new Event Bus",{"type":"reference","argument":"timeout","category":"full","description":"Optional timeout of Event Bus"},{"type":"reference","argument":"isOwned","category":"full","description":"Is Event Bus owned by creator"}],"attributes":[ +{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":1,"name":"timeout"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isOwned"} +]}},{"type":"rpc","content":{ +"name":"JoinEventBus", +"header":2668, +"response":{"type":"anonymous","header":2669, "doc":[ +{"type":"reference","argument":"deviceId","category":"full","description":" Your Device Id"},{"type":"reference","argument":"rejoinToken","category":"full","description":" Token that can be used for rejoining event bus with same device id"}] ,"attributes":[{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"deviceId"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"rejoinToken"} +]}, +"doc":[ +"Joining Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"timeout","category":"full","description":"Join timeout"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} +]}},{"type":"rpc","content":{ +"name":"ReJoinEventBus", +"header":2675, +"response":{"type":"anonymous","header":2676, "doc":[ +{"type":"reference","argument":"deviceId","category":"hidden","description":" Your Device Id"}] ,"attributes":[{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"deviceId"} +]}, +"doc":[ +"Rejoining to event bus after session was disposed",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"rejoinToken","category":"full","description":"Rejoin Token"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":"bytes","id":2,"name":"rejoinToken"} +]}},{"type":"rpc","content":{ +"name":"KeepAliveEventBus", +"header":2670, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Keep Alive Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"timeout","category":"full","description":"Optional timeout for keep alive"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} +]}},{"type":"rpc","content":{ +"name":"DisposeEventBus", +"header":2667, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Dispose Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +]}},{"type":"rpc","content":{ +"name":"PostToEventBus", +"header":2671, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Event Bus Destination",{"type":"reference","argument":"id","category":"full","description":"Bus Id"},{"type":"reference","argument":"destinations","category":"full","description":"If Empty need to broadcase message to everyone"},{"type":"reference","argument":"message","category":"hidden","description":"Message"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"destinations"} +,{"type":"bytes","id":3,"name":"message"} +]}},{"type":"update","content":{ +"name":"EventBusDeviceConnected", +"header":2561, +"doc":[ +"Update about pubsub device connected",{"type":"reference","argument":"id","category":"full","description":" ID of Event Bus"},{"type":"reference","argument":"userId","category":"full","description":" Joined User Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Joined Device Unique Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"userId"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} +]}},{"type":"update","content":{ +"name":"EventBusDeviceDisconnected", +"header":2563, +"doc":[ +"Update about device disconnected",{"type":"reference","argument":"id","category":"full","description":" ID of Event Bus"},{"type":"reference","argument":"userId","category":"full","description":" Joined User Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Disconnected Device unique Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"userId"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} +]}},{"type":"update","content":{ +"name":"EventBusMessage", +"header":2562, +"doc":[ +"Event Bus Message",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"senderId","category":"full","description":" Sender of message"},{"type":"reference","argument":"senderDeviceId","category":"full","description":" Device Id of sender"},{"type":"reference","argument":"message","category":"hidden","description":" Message"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"senderId"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"randomId"}},"id":3,"name":"senderDeviceId"} +,{"type":"bytes","id":4,"name":"message"} +]}},{"type":"update","content":{ +"name":"EventBusDisposed", +"header":2564, +"doc":[ +"Event Bus dispose",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +]}}]}, { + "title": "Values", + "package": "values", + "doc": [ + "Synced Values" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"SyncedValue", +"doc":[ +"Synced Value container",{"type":"reference","argument":"id","category":"full","description":" Unique Id of a value. Unique in the scope of one named value."},{"type":"reference","argument":"value","category":"full","description":" Optional value"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"value"} +]}},{"type":"rpc","content":{ +"name":"LoadSyncedSet", +"header":2679, +"response":{"type":"anonymous","header":2680, "doc":[ +{"type":"reference","argument":"values","category":"full","description":" Current set values"},{"type":"reference","argument":"isStrong","category":"full","description":" Is this value strong and stored in sequence. By default is true."}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":1,"name":"values"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isStrong"} +]}, +"doc":[ +"Loading synced set",{"type":"reference","argument":"setName","category":"hidden","description":"readable name of the set"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +]}},{"type":"update","content":{ +"name":"SynedSetUpdated", +"header":72, +"doc":[ +"Update about synced set update",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"syncedValues","category":"full","description":" Current set values"},{"type":"reference","argument":"isStrong","category":"full","description":" Is this value strong and need to be stored on disk"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":2,"name":"syncedValues"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isStrong"} +]}},{"type":"update","content":{ +"name":"SyncedSetAddedOrUpdated", +"header":73, +"doc":[ +"Update about added or updated values in the synced set",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"addedOrUpdatedValues","category":"hidden","description":" Added or updated values"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":2,"name":"addedOrUpdatedValues"} +]}},{"type":"update","content":{ +"name":"SyncedSetRemoved", +"header":74, +"doc":[ +"Update about removed items from synced set",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"removedItems","category":"full","description":" Removed Items from the set"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"removedItems"} +]}}]}, { + "title": "WebRTC", + "package": "webrtc", + "doc": [ + "WebRTC package that enables support to audio and video calls" + ], + "items": [ +{"type":"update","content":{ +"name":"IncomingCall", +"header":52, +"doc":[ +"Update about incoming call (Sent every 10 seconds)",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"attemptIndex","category":"full","description":" Optional attempt Index"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"opt","childType":"int32"},"id":2,"name":"attemptIndex"} +]}},{"type":"update","content":{ +"name":"CallHandled", +"header":53, +"doc":[ +"Update about incoming call handled",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"attemptIndex","category":"full","description":" Optional attempt Index"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"opt","childType":"int32"},"id":2,"name":"attemptIndex"} +]}},{"type":"update","content":{ +"name":"CallUpgraded", +"header":56, +"doc":[ +"Update about call moved to other peer",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"groupId","category":"full","description":" Upgraded group id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupId"} +]}},{"type":"rpc","content":{ +"name":"GetCallInfo", +"header":2600, +"response":{"type":"anonymous","header":2606, "doc":[ +{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"groups","category":"compact","description":" Groups"},{"type":"reference","argument":"users","category":"compact","description":" Users"},{"type":"reference","argument":"eventBusId","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"isAudioOnlyCall","category":"full","description":" Is Audio Only Call. Default is true"},{"type":"reference","argument":"isVideoOnlyCall","category":"full","description":" Is Video Only Call. Default is false."},{"type":"reference","argument":"isVideoPreferred","category":"full","description":" Is Video preferred"}] ,"attributes":[{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":2,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} +,{"type":{"type":"alias","childType":"busId"},"id":4,"name":"eventBusId"} +,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"isAudioOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isVideoOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":7,"name":"isVideoPreferred"} +]}, +"doc":[ +"Getting Call Information",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +]}},{"type":"rpc","content":{ +"name":"DoCall", +"header":2597, +"response":{"type":"anonymous","header":2598, "doc":[ +{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"eventBusId","category":"full","description":" Call Event Bus Id"}] ,"attributes":[{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"alias","childType":"busId"},"id":2,"name":"eventBusId"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} +]}, +"doc":[ +"Do Call. Right after a call client need to start sending CallInProgress",{"type":"reference","argument":"peer","category":"full","description":"destination peer"},{"type":"reference","argument":"timeout","category":"full","description":"Initial timeout"},{"type":"reference","argument":"isAudioOnlyCall","category":"full","description":"Is Audio only call. Default is true."},{"type":"reference","argument":"isVideoOnlyCall","category":"full","description":"Is Video Only call. Default is false."},{"type":"reference","argument":"isVideoPreferred","category":"full","description":"Is Video preferred"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isAudioOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isVideoOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isVideoPreferred"} +]}},{"type":"rpc","content":{ +"name":"UpgradeCall", +"header":2677, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Method for upgrading a call from private call to group call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"},{"type":"reference","argument":"peer","category":"full","description":"Destination peer for upgrading"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"struct","childType":"GroupOutPeer"},"id":2,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"DoCallAgain", +"header":2678, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Call again to user",{"type":"reference","argument":"callId","category":"full","description":"Call Id"},{"type":"reference","argument":"user","category":"full","description":"User to call again"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"user"} +]}},{"type":"rpc","content":{ +"name":"JoinCall", +"header":2683, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Joining Call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +]}},{"type":"rpc","content":{ +"name":"RejectCall", +"header":2684, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Rejecting Call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +]}},{"type":"rpc","content":{ +"name":"OptimizeSDP", +"header":2685, +"response":{"type":"anonymous","header":2686, "doc":[ +{"type":"reference","argument":"optimizedSDP","category":"hidden","description":" Optimized version of SDP"}] ,"attributes":[{"type":"string","id":1,"name":"optimizedSDP"} +]}, +"doc":[ +"Optimizing SDP",{"type":"reference","argument":"type","category":"full","description":"Type of SDP (offer or answer)"},{"type":"reference","argument":"sdp","category":"full","description":"SDP value"},{"type":"reference","argument":"ownSettings","category":"full","description":"Own Settings"},{"type":"reference","argument":"theirSettings","category":"full","description":"Their Settings"}],"attributes":[ +{"type":"string","id":1,"name":"type"} +,{"type":"string","id":2,"name":"sdp"} +,{"type":{"type":"struct","childType":"PeerSettings"},"id":3,"name":"ownSettings"} +,{"type":{"type":"struct","childType":"PeerSettings"},"id":4,"name":"theirSettings"} +]}}, { + "type":"struct", + "content": { + "name":"ICEServer", +"doc":[ +"ICE Server description",{"type":"reference","argument":"url","category":"full","description":" Url to server"},{"type":"reference","argument":"username","category":"full","description":" Optional username"},{"type":"reference","argument":"credential","category":"danger","description":" Optional credential"}],"attributes":[ +{"type":"string","id":1,"name":"url"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"username"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"credential"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"WebRTCSignaling","attributes":[ +]}},{"type":"comment","content":"Advertising"}, { + "type":"struct", + "content": { + "name":"AdvertiseSelf", +"doc":[ +"Advertizing self to a master mode",{"type":"reference","argument":"peerSettings","category":"full","description":" Optional peer Settings"}],"trait":{"name":"WebRTCSignaling","key":21},"attributes":[ +{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":1,"name":"peerSettings"} +]}}, { + "type":"struct", + "content": { + "name":"AdvertiseMaster", +"doc":[ +"Sent by master"],"trait":{"name":"WebRTCSignaling","key":26},"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"ICEServer"}},"id":1,"name":"server"} +]}},{"type":"comment","content":"Web RTC signaling"}, { + "type":"struct", + "content": { + "name":"Candidate", +"doc":[ +"Candidate signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of candidate"},{"type":"reference","argument":"index","category":"full","description":" Index of candidate"},{"type":"reference","argument":"id","category":"full","description":" Id of candidate"},{"type":"reference","argument":"sdp","category":"full","description":" SDP of candidate"}],"trait":{"name":"WebRTCSignaling","key":3},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} +,{"type":"int32","id":2,"name":"index"} +,{"type":"string","id":3,"name":"id"} +,{"type":"string","id":4,"name":"sdp"} +]}}, { + "type":"struct", + "content": { + "name":"Offer", +"doc":[ +"Offer signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of offer"},{"type":"reference","argument":"sdp","category":"full","description":" Offer SDP"},{"type":"reference","argument":"ownPeerSettings","category":"full","description":" Optional Own Peer settings"}],"trait":{"name":"WebRTCSignaling","key":4},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} +,{"type":"string","id":2,"name":"sdp"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":3,"name":"ownPeerSettings"} +]}}, { + "type":"struct", + "content": { + "name":"Answer", +"doc":[ +"Answer signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of answer"},{"type":"reference","argument":"sdp","category":"full","description":" Answer SDP"}],"trait":{"name":"WebRTCSignaling","key":5},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} +,{"type":"string","id":2,"name":"sdp"} +]}}, { + "type":"struct", + "content": { + "name":"MediaStreamsUpdated", +"doc":[ +"Update about media stream settings updated. Can be sent before offer/answer.",{"type":"reference","argument":"isAudioEnabled","category":"full","description":" Is Audio Enabled in current connection. True by default."},{"type":"reference","argument":"isVideoEnabled","category":"full","description":" Is Video Enabled in current connection. False by default."}],"trait":{"name":"WebRTCSignaling","key":28},"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"isAudioEnabled"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isVideoEnabled"} +]}},{"type":"comment","content":"Call Controlling events"}, { + "type":"struct", + "content": { + "name":"NeedOffer", +"doc":[ +"Notification from master that offer is required",{"type":"reference","argument":"device","category":"full","description":" Destination Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"},{"type":"reference","argument":"peerSettings","category":"full","description":" Optional peer settings"}],"trait":{"name":"WebRTCSignaling","key":8},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":3,"name":"peerSettings"} +]}}, { + "type":"struct", + "content": { + "name":"NegotinationSuccessful", +"doc":[ +"Notification about on negotiation is successful",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":24},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"EnableConnection", +"doc":[ +"Notification about enabling connection to peer",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":22},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"OnRenegotiationNeeded", +"doc":[ +"Need renegotiate session. For example when streams are changed.",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":25},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"CloseSession", +"doc":[ +"Close this session and be ready to",{"type":"reference","argument":"device","category":"hidden","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id for renegotiation"}],"trait":{"name":"WebRTCSignaling","key":6},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"NeedDisconnect", +"doc":[ +"Notification about requirement about required disconnection from peer",{"type":"reference","argument":"device","category":"hidden","description":" Device Id"}],"trait":{"name":"WebRTCSignaling","key":20},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +]}}, { + "type":"struct", + "content": { + "name":"ActiveCall", +"doc":[ +"Active Calls. Used in broadcasting states of current calls.",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"peer","category":"full","description":" Call's peer"},{"type":"reference","argument":"callMembers","category":"full","description":" Call Members"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"struct","childType":"Peer"},"id":2,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"CallMember"}},"id":3,"name":"callMembers"} +]}}, { + "type": "enum", "content": { - "name": "CombinedUpdate", - "header": 2625, - "doc": [ - "Combined update", - { - "type": "reference", - "argument": "seqStart", - "category": "full", - "description": " Sequence number start" - }, - { - "type": "reference", - "argument": "seqEnd", - "category": "full", - "description": " Sequence number end" - }, + "name": "CallMemberState", + "values": [ { - "type": "reference", - "argument": "state", - "category": "full", - "description": " Sequence state" + "name": "RINGING", + "id": 1 }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Update's users" + "name": "RINGING_REACHED", + "id": 4 }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Update's groups" + "name": "CONNECTING", + "id": 2 }, { - "type": "reference", - "argument": "updates", - "category": "full", - "description": " Updates (can be empty)" + "name": "CONNECTED", + "id": 3 }, { - "type": "reference", - "argument": "messages", - "category": "full", - "description": " New messages" + "name": "ENDED", + "id": 5 } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seqStart" - }, - { - "type": "int32", - "id": 2, - "name": "seqEnd" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 4, - "name": "users" - }, + ] + } + }, { + "type":"struct", + "content": { + "name":"CallMemberStateHolder", +"doc":[ +"Call Member state holder",{"type":"reference","argument":"state","category":"full","description":" State Value"},{"type":"reference","argument":"fallbackIsRinging","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsConnected","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsConnecting","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsRingingReached","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsEnded","category":"full","description":" Fallback flag for future compatibility of state"}],"attributes":[ +{"type":{"type":"enum","childType":"CallMemberState"},"id":1,"name":"state"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"fallbackIsRinging"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"fallbackIsConnected"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"fallbackIsConnecting"} +,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"fallbackIsRingingReached"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"fallbackIsEnded"} +]}}, { + "type":"struct", + "content": { + "name":"CallMember", +"doc":[ +"Call Member",{"type":"reference","argument":"userId","category":"full","description":" Member User Id"},{"type":"reference","argument":"state","category":"full","description":" State of member"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"userId"} +,{"type":{"type":"struct","childType":"CallMemberStateHolder"},"id":3,"name":"state"} +]}}, { + "type":"struct", + "content": { + "name":"PeerSettings", +"doc":[ +"Peer Settings",{"type":"reference","argument":"is3DESSupported","category":"full","description":" Marking if 3DES supported. Default is false."},{"type":"reference","argument":"isMobile","category":"full","description":" Is Peer a mobile phone. Default is false."},{"type":"reference","argument":"canBeAudioRelay","category":"full","description":" If peer can audio relay. Default is false."},{"type":"reference","argument":"canPreConnect","category":"full","description":" If peer can preconnect before answer"}],"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"is3DESSupported"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isMobile"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"canBeAudioRelay"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"canPreConnect"} +]}}]}, { + "title": "Config sync", + "package": "configs", + "doc": [ + "Parameter Syncronization across devices. Can be used for simple sync", + "across devices without rewriting server side code." + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Parameter", +"doc":[ +"Syncing Parameter",{"type":"reference","argument":"key","category":"full","description":" Key of parameter"},{"type":"reference","argument":"value","category":"full","description":" Value of parameter"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":"string","id":2,"name":"value"} +]}},{"type":"rpc","content":{ +"name":"GetParameters", +"header":134, +"response":{"type":"anonymous","header":135, "doc":[ +{"type":"reference","argument":"parameters","category":"full","description":" Current parameters"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Parameter"}},"id":1,"name":"parameters"} +]}, +"doc":[ +"Getting Parameters"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"EditParameter", +"header":128, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Change parameter value",{"type":"reference","argument":"key","category":"full","description":"Key of parameter"},{"type":"reference","argument":"value","category":"full","description":"Value of parameter"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"value"} +]}},{"type":"update","content":{ +"name":"ParameterChanged", +"header":131, +"doc":[ +"Update about parameter change",{"type":"reference","argument":"key","category":"full","description":" Key of parameter"},{"type":"reference","argument":"value","category":"full","description":" Value of parameter"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"value"} +]}}]}, { + "title": "Stats", + "package": "stats", + "doc": [ + "Saving statistics information" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"EventRecord", +"doc":[ +"Record for stored event"],"attributes":[ +{"type":{"type":"alias","childType":"date"},"id":1,"name":"date"} +,{"type":{"type":"trait","childType":"Event"},"id":2,"name":"event"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"Event","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"UntypedEvent", +"doc":[ +"Untyped event",{"type":"reference","argument":"eventType","category":"full","description":" Event type"},{"type":"reference","argument":"params","category":"full","description":" optional params for event"}],"trait":{"name":"Event","key":1},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"eventType"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":2,"name":"params"} +]}}, { + "type":"struct", + "content": { + "name":"ContentViewChanged", +"doc":[ +"Content view event",{"type":"reference","argument":"contentType","category":"full","description":" unique content id"},{"type":"reference","argument":"visible","category":"full","description":" Is content visible"},{"type":"reference","argument":"params","category":"full","description":" optional params for content view"}],"trait":{"name":"Event","key":2},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"contentType"} +,{"type":"string","id":2,"name":"contentId"} +,{"type":"bool","id":3,"name":"visible"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":4,"name":"params"} +]}}, { + "type":"struct", + "content": { + "name":"AppVisibleChanged", +"doc":[ +"On App Visible event",{"type":"reference","argument":"visible","category":"full","description":" Is app visible"}],"trait":{"name":"Event","key":4},"expandable":"true","attributes":[ +{"type":"bool","id":1,"name":"visible"} +]}},{"type":"rpc","content":{ +"name":"StoreEvents", +"header":243, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Storing events on server",{"type":"reference","argument":"events","category":"full","description":"Events for storing"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"Event"}},"id":1,"name":"events"} +]}}]}, { + "title": "Raw API", + "package": "raw", + "doc": [ + "Schema-less API that is useful for external integrations" + ], + "items": [ +{"type":"rpc","content":{ +"name":"RawRequest", +"header":2569, +"response":{"type":"anonymous","header":2570, "doc":[ +"Response of a raw request",{"type":"reference","argument":"result","category":"full","description":" Result of request"}] ,"attributes":[{"type":{"type":"trait","childType":"RawValue"},"id":1,"name":"result"} +]}, +"doc":[ +"Making raw request to external service via shema-less RPC request",{"type":"reference","argument":"service","category":"full","description":"Service name for RPC request"},{"type":"reference","argument":"method","category":"full","description":"Method for execution"},{"type":"reference","argument":"params","category":"full","description":"Optional params for the method"}],"attributes":[ +{"type":"string","id":1,"name":"service"} +,{"type":"string","id":2,"name":"method"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":3,"name":"params"} +]}}]}, { + "title": "Wallpappers", + "package": "wallpappers", + "doc": [ + "Wallpappers support" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Wallpapper", +"doc":[ +"Wallpapper structure",{"type":"reference","argument":"id","category":"full","description":" Wallpapper id"},{"type":"reference","argument":"w","category":"full","description":" Image width"},{"type":"reference","argument":"h","category":"full","description":" Image height"},{"type":"reference","argument":"fileSize","category":"full","description":" Image file size"},{"type":"reference","argument":"file","category":"full","description":" Image file reference"},{"type":"reference","argument":"thumb","category":"full","description":" Image thumb"}],"attributes":[ +{"type":"int32","id":7,"name":"id"} +,{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"int32","id":3,"name":"fileSize"} +,{"type":{"type":"struct","childType":"FileLocation"},"id":5,"name":"file"} +,{"type":{"type":"struct","childType":"FastThumb"},"id":6,"name":"thumb"} +]}},{"type":"rpc","content":{ +"name":"LoadWallpappers", +"header":241, +"response":{"type":"anonymous","header":242, "doc":[ +"Loaded Wallpappers",{"type":"reference","argument":"wallpappers","category":"full","description":" Available wallpapper list"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Wallpapper"}},"id":1,"name":"wallpappers"} +]}, +"doc":[ +"Load available wallpappers",{"type":"reference","argument":"maxWidth","category":"full","description":"Maximum width of wallpapper"},{"type":"reference","argument":"maxHeight","category":"full","description":"Maximum height of wallpapper"}],"attributes":[ +{"type":"int32","id":1,"name":"maxWidth"} +,{"type":"int32","id":2,"name":"maxHeight"} +]}}]}, { + "title": "Push", + "package": "push", + "doc": [ + "Vendor's pushes for receiving push notifications.", + "Push notification contains current sequence number of main sequence." + ], + "items": [ +{"type":"rpc","content":{ +"name":"RegisterGooglePush", +"header":51, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registering push token on server",{"type":"reference","argument":"projectId","category":"hidden","description":"Project Id of token"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ +{"type":"int64","id":1,"name":"projectId"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterGooglePush", +"header":2631, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregistering Google Push",{"type":"reference","argument":"token","category":"danger","description":"Token value"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterApplePush", +"header":76, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registering apple push on server",{"type":"reference","argument":"apnsKey","category":"hidden","description":"apns key id"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ +{"type":"int32","id":1,"name":"apnsKey"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterApplePush", +"header":2632, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregistering Apple Push",{"type":"reference","argument":"token","category":"full","description":"Token"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterApplePushKit", +"header":2576, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registration of a new Apple's PushKit tokens",{"type":"reference","argument":"apnsKey","category":"hidden","description":"APNS key id"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ +{"type":"int32","id":1,"name":"apnsKey"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterApplePushKit", +"header":2633, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregistering Apple Push Kit token",{"type":"reference","argument":"token","category":"hidden","description":"Token Value"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterApplePushToken", +"header":2593, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registering Apple Push Token",{"type":"reference","argument":"bundleId","category":"full","description":"Bundle Id of app"},{"type":"reference","argument":"token","category":"full","description":"Push token"}],"attributes":[ +{"type":"string","id":1,"name":"bundleId"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterApplePushToken", +"header":2634, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregister Apple Push token",{"type":"reference","argument":"token","category":"hidden","description":"Token value"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterActorPush", +"header":2575, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Register Actor Push endpoint",{"type":"reference","argument":"endpoint","category":"full","description":"Endpoint for push sending"},{"type":"reference","argument":"encryptionKeys","category":"full","description":"Push Encryption keys"}],"attributes":[ +{"type":"string","id":1,"name":"endpoint"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":2,"name":"encryptionKeys"} +]}},{"type":"rpc","content":{ +"name":"UnregisterActorPush", +"header":2635, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregister Actor Push endpoint",{"type":"reference","argument":"endpoint","category":"full","description":"Endpoint for unregistering"}],"attributes":[ +{"type":"string","id":1,"name":"endpoint"} +]}}]}, { + "title": "Encryption", + "package": "encryption", + "doc": [ + "Package that include encryption support", + "Key alg types:", + "* curve25519 - https://en.wikipedia.org/wiki/Curve25519", + "* rsa-2048", + "* rsa-4096", + "* aes-128", + "* kuznechik-128", + "", + "Signature alg types:", + "* Ed25519 - used curve25519 conveted to Ed255519 for signing and validataion" + ], + "items": [ +{"type":"comment","content":"Public Keys"}, { + "type":"struct", + "content": { + "name":"EncryptionKeyGroup", +"doc":[ +"Encryption Key Group",{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"identityKey","category":"full","description":" Key that is used as identity and for validation of Key Group changes"},{"type":"reference","argument":"supportedEncryption","category":"full","description":" Supported encryption methods by this key group"},{"type":"reference","argument":"keys","category":"compact","description":" keys of Key Group"},{"type":"reference","argument":"signatures","category":"compact","description":" Signatures of keys"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +,{"type":{"type":"list","childType":"string"},"id":2,"name":"supportedEncryption"} +,{"type":{"type":"struct","childType":"EncryptionKey"},"id":3,"name":"identityKey"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":4,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":5,"name":"signatures"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptionKeySignature", +"doc":[ +"Signed Key. Usually used for public keys.",{"type":"reference","argument":"keyId","category":"full","description":" Key Id used for signature"},{"type":"reference","argument":"signatureAlg","category":"full","description":" Signature algorithm"},{"type":"reference","argument":"signature","category":"full","description":" Signature value"}],"attributes":[ +{"type":"int64","id":1,"name":"keyId"} +,{"type":"string","id":2,"name":"signatureAlg"} +,{"type":"bytes","id":3,"name":"signature"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptionKey", +"doc":[ +"Encryption Key",{"type":"reference","argument":"keyId","category":"full","description":" Key Id"},{"type":"reference","argument":"keyAlg","category":"full","description":" Key Algorithm"},{"type":"reference","argument":"keyMaterial","category":"compact","description":" Public key material. Can be null, but always not null for LoadPublicKey"},{"type":"reference","argument":"keyHash","category":"hidden","description":" If keyMaterial is null, pass keyHash - SHA256 of key"}],"expandable":"true","attributes":[ +{"type":"int64","id":1,"name":"keyId"} +,{"type":"string","id":2,"name":"keyAlg"} +,{"type":{"type":"opt","childType":"bytes"},"id":3,"name":"keyMaterial"} +,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"keyHash"} +]}},{"type":"response","content":{ +"name":"PublicKeys", +"header":2602, +"doc":[ +"Public Keys response",{"type":"reference","argument":"publicKey","category":"full","description":" Public keys"},{"type":"reference","argument":"signatures","category":"full","description":" Signatures of public keys"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":1,"name":"publicKey"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":2,"name":"signatures"} +]}},{"type":"response","content":{ +"name":"PublicKeyGroups", +"header":2604, +"doc":[ +"Public key groups response"],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeyGroup"}},"id":1,"name":"publicKeyGroups"} +]}},{"type":"rpc","content":{ +"name":"LoadPublicKeyGroups", +"header":2601, +"response":{"type":"reference","name":"PublicKeyGroups"}, +"doc":[ +"Loading Public key groups",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} +]}},{"type":"rpc","content":{ +"name":"LoadPublicKey", +"header":2605, +"response":{"type":"reference","name":"PublicKeys"}, +"doc":[ +"Loading public key explictly",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"},{"type":"reference","argument":"keyGroupId","category":"full","description":"Key group's id"},{"type":"reference","argument":"keyIds","category":"full","description":"Key ids for loading"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} +,{"type":"int32","id":2,"name":"keyGroupId"} +,{"type":{"type":"list","childType":"int64"},"id":3,"name":"keyIds"} +]}},{"type":"rpc","content":{ +"name":"LoadPrePublicKeys", +"header":2603, +"response":{"type":"reference","name":"PublicKeys"}, +"doc":[ +"Loading SOME of ephermal public keys",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"},{"type":"reference","argument":"keyGroupId","category":"full","description":"User's key group id"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} +,{"type":"int32","id":2,"name":"keyGroupId"} +]}},{"type":"update","content":{ +"name":"PublicKeyGroupChanged", +"header":103, +"doc":[ +"Update about public key group changed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Updated Key Group"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} +]}},{"type":"update","content":{ +"name":"KeysAdded", +"header":112, +"doc":[ +"Update about keys added to Key Group",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"keys","category":"compact","description":" Added keys"},{"type":"reference","argument":"signatures","category":"compact","description":" Signatures of a public key"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":3,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":4,"name":"signatures"} +]}},{"type":"update","content":{ +"name":"KeysRemoved", +"header":113, +"doc":[ +"Update about keys removed from Key Group",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"keyIds","category":"full","description":" Removed keys"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +,{"type":{"type":"list","childType":"int64"},"id":3,"name":"keyIds"} +]}},{"type":"update","content":{ +"name":"PublicKeyGroupAdded", +"header":104, +"doc":[ +"Update about public key group added",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Added Key Group"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} +]}},{"type":"update","content":{ +"name":"PublicKeyGroupRemoved", +"header":105, +"doc":[ +"Update about public key group removed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Removed Key Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +]}},{"type":"comment","content":"Device Side"},{"type":"rpc","content":{ +"name":"CreateNewKeyGroup", +"header":2609, +"response":{"type":"anonymous","header":2610, "doc":[ +{"type":"reference","argument":"keyGroupId","category":"full","description":" Created Key Group id"}] ,"attributes":[{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}, +"doc":[ +"Creation of a new Key Group",{"type":"reference","argument":"identityKey","category":"full","description":"Identity Key of a new group"},{"type":"reference","argument":"supportedEncryptions","category":"full","description":"Supported encryption methods"},{"type":"reference","argument":"keys","category":"full","description":"keys of current group"},{"type":"reference","argument":"signatures","category":"full","description":"signatures of keys"}],"attributes":[ +{"type":{"type":"struct","childType":"EncryptionKey"},"id":1,"name":"identityKey"} +,{"type":{"type":"list","childType":"string"},"id":2,"name":"supportedEncryptions"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":3,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":4,"name":"signatures"} +]}},{"type":"rpc","content":{ +"name":"DeleteKeyGroup", +"header":2611, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Deletion of a Key Group",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for deletion"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}},{"type":"rpc","content":{ +"name":"DisconnectKeyGroup", +"header":2613, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Disconnect Key Group from device",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for disconnection"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}},{"type":"rpc","content":{ +"name":"ConnectKeyGroup", +"header":2614, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Connectiong Key Group to device",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for connection"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}},{"type":"rpc","content":{ +"name":"UploadPreKey", +"header":2612, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Uploading Ephermal Keys",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id"},{"type":"reference","argument":"keys","category":"compact","description":"Encryprion keys"},{"type":"reference","argument":"signatures","category":"compact","description":"Key signatures"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":2,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":3,"name":"signatures"} +]}},{"type":"comment","content":"Encrypted Packages"}, { + "type":"struct", + "content": { + "name":"EncryptedBox", +"doc":[ +"Encrypted package that is encrypted for multiple keys",{"type":"reference","argument":"keys","category":"full","description":" Encrypted encryption keys"},{"type":"reference","argument":"algType","category":"full","description":" Package encryption type"},{"type":"reference","argument":"encPackage","category":"full","description":" Encrypted package"},{"type":"reference","argument":"senderKeyGroupId","category":"full","description":" Sender key group"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":4,"name":"senderKeyGroupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncyptedBoxKey"}},"id":1,"name":"keys"} +,{"type":"string","id":2,"name":"algType"} +,{"type":"bytes","id":3,"name":"encPackage"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptedBoxSignature"}},"id":5,"name":"signatures"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptedBoxSignature", +"doc":[ +"Signature for encrypted package",{"type":"reference","argument":"algType","category":"full","description":" Alg Type"},{"type":"reference","argument":"signature","category":"full","description":" Signature of encrypted package"}],"attributes":[ +{"type":"string","id":1,"name":"algType"} +,{"type":"bytes","id":2,"name":"signature"} +]}}, { + "type":"struct", + "content": { + "name":"EncyptedBoxKey", +"doc":[ +"Encrypted package encryption key",{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"algType","category":"full","description":" Key encryption algorithm"},{"type":"reference","argument":"encryptedKey","category":"hidden","description":" Encrypted encryption key"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"usersId"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +,{"type":"string","id":3,"name":"algType"} +,{"type":"bytes","id":4,"name":"encryptedKey"} +]}}, { + "type":"struct", + "content": { + "name":"KeyGroupId", +"doc":[ +"References to key groups",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +]}}, { + "type":"struct", + "content": { + "name":"KeyGroupHolder", +"doc":[ +"Key Group Holder",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Key Group"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} +]}},{"type":"rpc","content":{ +"name":"SendEncryptedPackage", +"header":2657, +"response":{"type":"anonymous","header":2664, "doc":[ +{"type":"reference","argument":"date","category":"full","description":" date"},{"type":"reference","argument":"obsoleteKeyGroups","category":"full","description":" obsolete key group ids"},{"type":"reference","argument":"missedKeyGroups","category":"full","description":" missed key groups"}] ,"attributes":[{"type":{"type":"opt","childType":{"type":"alias","childType":"date"}},"id":1,"name":"date"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupId"}},"id":2,"name":"obsoleteKeyGroups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupHolder"}},"id":3,"name":"missedKeyGroups"} +]}, +"doc":[ +"Sending encrypted package",{"type":"reference","argument":"randomId","category":"hidden","description":"Random id"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"randomId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":2,"name":"destPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupId"}},"id":3,"name":"ignoredKeyGroups"} +,{"type":{"type":"struct","childType":"EncryptedBox"},"id":4,"name":"encryptedBox"} +]}},{"type":"update","content":{ +"name":"EncryptedPackage", +"header":177, +"doc":[ +"Update about encrypted package",{"type":"reference","argument":"randomId","category":"full","description":" Random Id of package"},{"type":"reference","argument":"date","category":"full","description":" Sending date of package"},{"type":"reference","argument":"senderId","category":"full","description":" Sender id of package"},{"type":"reference","argument":"encryptedBox","category":"full","description":" Encrypted box"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"randomId"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"date"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"senderId"} +,{"type":{"type":"struct","childType":"EncryptedBox"},"id":4,"name":"encryptedBox"} +]}}]}, { + "title": "Storage", + "package": "storage", + "items": [ +{"type":"rpc","content":{ +"name":"UploadSharedBlob", +"header":2660, +"response":{"type":"anonymous","header":2661, "doc":[ +{"type":"reference","argument":"sharedObjectId","category":"full","description":" Id of shared object"}] ,"attributes":[{"type":"int32","id":1,"name":"sharedObjectId"} +]}, +"doc":[ +"Upload shared blob with user",{"type":"reference","argument":"destPeer","category":"full","description":"Destination peer"},{"type":"reference","argument":"bucket","category":"full","description":"Bucked name"},{"type":"reference","argument":"blob","category":"full","description":"Blob data"},{"type":"reference","argument":"randomId","category":"full","description":"Random id for protecting from double upload"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"destPeer"} +,{"type":"string","id":2,"name":"bucket"} +,{"type":"bytes","id":3,"name":"blob"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"randomId"} +]}},{"type":"rpc","content":{ +"name":"DownloadSharedBlob", +"header":2662, +"response":{"type":"anonymous","header":2663, "doc":[ +{"type":"reference","argument":"blob","category":"full","description":" Blob contents"}] ,"attributes":[{"type":"bytes","id":1,"name":"blob"} +]}, +"doc":[ +"Download shared blob",{"type":"reference","argument":"destPeer","category":"full","description":"Destination peer"},{"type":"reference","argument":"bucket","category":"full","description":"Bucket name"},{"type":"reference","argument":"objectId","category":"full","description":"Object Id"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"destPeer"} +,{"type":"string","id":2,"name":"bucket"} +,{"type":"int32","id":3,"name":"objectId"} +]}}]}, { + "title": "Peers", + "package": "peers", + "doc": [ + "Peer is an identificator of specific conversation." + ], + "items": [ + { + "type": "enum", + "content": { + "name": "PeerType", + "values": [ { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 5, - "name": "groups" + "name": "Private", + "id": 1 }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UpdateContainer" - } - }, - "id": 6, - "name": "updates" + "name": "Group", + "id": 2 }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageContainer" - } - }, - "id": 7, - "name": "messages" + "name": "EncryptedPrivate", + "id": 3 } - ] - } - }, - { + ] + } + }, { + "type":"struct", + "content": { + "name":"Peer", +"doc":[ +"Peer",{"type":"reference","argument":"type","category":"full","description":" Peer Type"},{"type":"reference","argument":"id","category":"full","description":" Peer Id"}],"attributes":[ +{"type":{"type":"enum","childType":"PeerType"},"id":1,"name":"type"} +,{"type":"int32","id":2,"name":"id"} +]}}, { + "type":"struct", + "content": { + "name":"OutPeer", +"doc":[ +"Out peer with access hash",{"type":"reference","argument":"type","category":"full","description":" Peer Type"},{"type":"reference","argument":"id","category":"full","description":" Peer Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Peer access hash"}],"attributes":[ +{"type":{"type":"enum","childType":"PeerType"},"id":1,"name":"type"} +,{"type":"int32","id":2,"name":"id"} +,{"type":"int64","id":3,"name":"accessHash"} +]}}, { + "type":"struct", + "content": { + "name":"UserOutPeer", +"doc":[ +"User's out peer",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"accessHash","category":"danger","description":" User's access hash"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}, { + "type":"struct", + "content": { + "name":"GroupOutPeer", +"doc":[ +"Group's out peer",{"type":"reference","argument":"groupId","category":"full","description":" Group's Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Group's access hash"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}]}, { + "title": "Sequence and Updates", + "package": "sequence", + "doc": [ + "Each device has it's own update sequence. At the begining application request initial sequence state by", + "calling GetState. On each application restart or NewSessionCreated application calls GetDifference for receiving", + "updates in update sequence.", + "GetState and GetDifference automatically subscribes session to receiving updates in session.", + "Each update has seq and state. Seq is sequental index of updated and used for detecting of holes in update sequence", + "(because of server failure or session die) on client side.", + "All updates needed to be processed in partucular order according to seq values.", + "In some updates there can be references to users that are not available at client yer. In this case application need", + "to ignore such update and init getting difference." + ], + "items": [ +{"type":"update_box","content":{ +"name":"SeqUpdate", +"header":13, +"doc":[ +"Sequence update",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of update"},{"type":"reference","argument":"state","category":"compact","description":" Sequece state of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":"int32","id":3,"name":"updateHeader"} +,{"type":"bytes","id":4,"name":"update"} +]}},{"type":"update_box","content":{ +"name":"FatSeqUpdate", +"header":73, +"doc":[ +"Fat sequence update with additional data",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of update"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"},{"type":"reference","argument":"users","category":"compact","description":" Users that are referenced in update"},{"type":"reference","argument":"groups","category":"compact","description":" Groups that are referenced in update"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":"int32","id":3,"name":"updateHeader"} +,{"type":"bytes","id":4,"name":"update"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":5,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":6,"name":"groups"} +]}},{"type":"update_box","content":{ +"name":"WeakUpdate", +"header":26, +"doc":[ +"Out of sequence update (for typing and online statuses)",{"type":"reference","argument":"date","category":"full","description":" Date of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"}],"attributes":[ +{"type":"int64","id":1,"name":"date"} +,{"type":"int32","id":2,"name":"updateHeader"} +,{"type":"bytes","id":3,"name":"update"} +]}},{"type":"update_box","content":{ +"name":"WeakFatUpdate", +"header":2673, +"doc":[ +"Fat Weak Update",{"type":"reference","argument":"date","category":"full","description":" Date of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"full","description":" The update"},{"type":"reference","argument":"users","category":"full","description":" Users that are referenced in update"},{"type":"reference","argument":"groups","category":"full","description":" Groups that are referenced in update"}],"attributes":[ +{"type":"int64","id":1,"name":"date"} +,{"type":"int32","id":2,"name":"updateHeader"} +,{"type":"bytes","id":3,"name":"update"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} +]}},{"type":"update_box","content":{ +"name":"SeqUpdateTooLong", +"header":25, +"doc":[ +"Notification about requiring performing manual GetDifference"],"attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"UpdateContainer", +"doc":[ +"Update container",{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"compact","description":" The updatre"}],"attributes":[ +{"type":"int32","id":1,"name":"updateHeader"} +,{"type":"bytes","id":2,"name":"update"} +]}},{"type":"update_box","content":{ +"name":"CombinedUpdate", +"header":2625, +"doc":[ +"Combined update",{"type":"reference","argument":"seqStart","category":"full","description":" Sequence number start"},{"type":"reference","argument":"seqEnd","category":"full","description":" Sequence number end"},{"type":"reference","argument":"state","category":"full","description":" Sequence state"},{"type":"reference","argument":"users","category":"compact","description":" Update's users"},{"type":"reference","argument":"groups","category":"compact","description":" Update's groups"},{"type":"reference","argument":"updates","category":"full","description":" Updates (can be empty)"},{"type":"reference","argument":"messages","category":"full","description":" New messages"}],"attributes":[ +{"type":"int32","id":1,"name":"seqStart"} +,{"type":"int32","id":2,"name":"seqEnd"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UpdateContainer"}},"id":6,"name":"updates"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":7,"name":"messages"} +]}}, { "type": "enum", "content": { "name": "UpdateOptimization", @@ -20644,780 +3984,157 @@ "name": "GROUPS_V2", "id": 7 } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetState", - "header": 9, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Get main sequence state", - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 1, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetDifference", - "header": 11, - "response": { - "type": "anonymous", - "header": 12, - "doc": [ - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Seq of LAST update in updates" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of LAST update in updates" - }, - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Users referenced in updates" - }, - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups referenced in updates" - }, - { - "type": "reference", - "argument": "updates", - "category": "compact", - "description": " Updates" - }, - { - "type": "reference", - "argument": "needMore", - "category": "full", - "description": " Need to perform other difference" - }, - { - "type": "reference", - "argument": "usersRefs", - "category": "full", - "description": " Direct references of users" - }, - { - "type": "reference", - "argument": "groupsRefs", - "category": "full", - "description": " Direct References of groups" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 3, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 6, - "name": "groups" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UpdateContainer" - } - }, - "id": 4, - "name": "updates" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageContainer" - } - }, - "id": 7, - "name": "messages" - }, - { - "type": "bool", - "id": 5, - "name": "needMore" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 8, - "name": "usersRefs" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 9, - "name": "groupsRefs" - } - ] - }, - "doc": [ - "Getting difference of sequence", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": "Sequence number" - }, - { - "type": "reference", - "argument": "state", - "category": "compact", - "description": "Sequence state" - }, - { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "GetReferencedEntitites", - "header": 2628, - "response": { - "type": "anonymous", - "header": 2629, - "doc": [ - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - }, - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Loaded groups" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 1, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 2, - "name": "groups" - } - ] - }, - "doc": [ - "Loading referenced entities", - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Users to load" - }, - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups to load. Also returns all members of a group." - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - }, - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 2, - "name": "groups" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "RawUpdate", - "header": 80, - "doc": [ - "Custom Raw Update", - { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Type of content" - }, - { - "type": "reference", - "argument": "bytes", - "category": "full", - "description": " Raw data" - } - ], - "attributes": [ - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "type" - }, - { - "type": "bytes", - "id": 2, - "name": "bytes" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "EmptyUpdate", - "header": 85, - "doc": [ - "Empty update" - ], - "attributes": [] - } - }, - { - "type": "empty" - }, - { - "type": "rpc", - "content": { - "name": "SubscribeToOnline", - "header": 32, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Subscribing for users online", - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Users for subscription" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SubscribeFromOnline", - "header": 33, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Removing subscription for users online", - { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Users of subscriptions" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SubscribeToGroupOnline", - "header": 74, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Subscribing for groups online", - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups for subscription" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 1, - "name": "groups" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "SubscribeFromGroupOnline", - "header": 75, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Removing subscription for groups online", - { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups of subscriptions" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 1, - "name": "groups" - } - ] - } + ] } - ] - }, - { + },{"type":"rpc","content":{ +"name":"GetState", +"header":9, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Get main sequence state",{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":1,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"GetDifference", +"header":11, +"response":{"type":"anonymous","header":12, "doc":[ +{"type":"reference","argument":"seq","category":"full","description":" Seq of LAST update in updates"},{"type":"reference","argument":"state","category":"full","description":" State of LAST update in updates"},{"type":"reference","argument":"users","category":"compact","description":" Users referenced in updates"},{"type":"reference","argument":"groups","category":"compact","description":" Groups referenced in updates"},{"type":"reference","argument":"updates","category":"compact","description":" Updates"},{"type":"reference","argument":"needMore","category":"full","description":" Need to perform other difference"},{"type":"reference","argument":"usersRefs","category":"full","description":" Direct references of users"},{"type":"reference","argument":"groupsRefs","category":"full","description":" Direct References of groups"}] ,"attributes":[{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":3,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":6,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UpdateContainer"}},"id":4,"name":"updates"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":7,"name":"messages"} +,{"type":"bool","id":5,"name":"needMore"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":8,"name":"usersRefs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":9,"name":"groupsRefs"} +]}, +"doc":[ +"Getting difference of sequence",{"type":"reference","argument":"seq","category":"full","description":"Sequence number"},{"type":"reference","argument":"state","category":"compact","description":"Sequence state"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"GetReferencedEntitites", +"header":2628, +"response":{"type":"anonymous","header":2629, "doc":[ +{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"groups","category":"compact","description":" Loaded groups"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":2,"name":"groups"} +]}, +"doc":[ +"Loading referenced entities",{"type":"reference","argument":"users","category":"compact","description":"Users to load"},{"type":"reference","argument":"groups","category":"compact","description":"Groups to load. Also returns all members of a group."}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":2,"name":"groups"} +]}},{"type":"update","content":{ +"name":"RawUpdate", +"header":80, +"doc":[ +"Custom Raw Update",{"type":"reference","argument":"type","category":"full","description":" Type of content"},{"type":"reference","argument":"bytes","category":"full","description":" Raw data"}],"attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"type"} +,{"type":"bytes","id":2,"name":"bytes"} +]}},{"type":"update","content":{ +"name":"EmptyUpdate", +"header":85, +"doc":[ +"Empty update"],"attributes":[ +]}},{"type":"empty"},{"type":"rpc","content":{ +"name":"SubscribeToOnline", +"header":32, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Subscribing for users online",{"type":"reference","argument":"users","category":"compact","description":"Users for subscription"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +]}},{"type":"rpc","content":{ +"name":"SubscribeFromOnline", +"header":33, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Removing subscription for users online",{"type":"reference","argument":"users","category":"compact","description":"Users of subscriptions"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +]}},{"type":"rpc","content":{ +"name":"SubscribeToGroupOnline", +"header":74, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Subscribing for groups online",{"type":"reference","argument":"groups","category":"compact","description":"Groups for subscription"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} +]}},{"type":"rpc","content":{ +"name":"SubscribeFromGroupOnline", +"header":75, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Removing subscription for groups online",{"type":"reference","argument":"groups","category":"compact","description":"Groups of subscriptions"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} +]}}]}, { "title": "Counters", "package": "counters", "doc": [ "Application Counters, used to display various counters in application" ], "items": [ - { - "type": "struct", - "content": { - "name": "AppCounters", - "doc": [ - "Application counters", - { - "type": "reference", - "argument": "globalCounter", - "category": "full", - "description": " Global unread counter" - } - ], - "expandable": "true", - "attributes": [ - { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 1, - "name": "globalCounter" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "CountersChanged", - "header": 215, - "doc": [ - "Update about counters changed", - { - "type": "reference", - "argument": "counters", - "category": "full", - "description": " Current Application counters" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "AppCounters" - }, - "id": 1, - "name": "counters" - } - ] - } - } - ] - }, - { + { + "type":"struct", + "content": { + "name":"AppCounters", +"doc":[ +"Application counters",{"type":"reference","argument":"globalCounter","category":"full","description":" Global unread counter"}],"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"int32"},"id":1,"name":"globalCounter"} +]}},{"type":"update","content":{ +"name":"CountersChanged", +"header":215, +"doc":[ +"Update about counters changed",{"type":"reference","argument":"counters","category":"full","description":" Current Application counters"}],"attributes":[ +{"type":{"type":"struct","childType":"AppCounters"},"id":1,"name":"counters"} +]}}]}, { "title": "Miscellaneous", "package": "misc", "items": [ - { - "type": "response", - "content": { - "name": "Void", - "header": 50, - "doc": [ - "Empty response" - ], - "attributes": [] - } - }, - { - "type": "response", - "content": { - "name": "Seq", - "header": 72, - "doc": [ - "Sequence response. Methods that return this value must process response in particular order", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of response" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " Sequence state of response" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "SeqDate", - "header": 102, - "doc": [ - "Sequence response with date. Methods that return this value must process response in particular order", - { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of response" - }, - { - "type": "reference", - "argument": "state", - "category": "full", - "description": " Sequence state of response" - }, - { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of response" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "seq" - }, - { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, - { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - } - ] - } - }, - { - "type": "response", - "content": { - "name": "Bool", - "header": 209, - "doc": [ - "Boolean response", - { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Response value" - } - ], - "attributes": [ - { - "type": "bool", - "id": 1, - "name": "value" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Config", - "doc": [ - "Configuration of system", - { - "type": "reference", - "argument": "maxGroupSize", - "category": "full", - "description": " Current maximum group size" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "maxGroupSize" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Extension", - "doc": [ - "Extention", - { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Extension id" - }, - { - "type": "reference", - "argument": "data", - "category": "full", - "description": " Extension data" - } - ], - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "id" - }, - { - "type": "bytes", - "id": 2, - "name": "data" - } - ] - } - }, - { - "type": "update", - "content": { - "name": "Config", - "header": 42, - "doc": [ - "Update about config change", - { - "type": "reference", - "argument": "config", - "category": "full", - "description": " new config" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "Config" - }, - "id": 1, - "name": "config" - } - ] - } - } - ] - }, - { +{"type":"response","content":{ +"name":"Void", +"header":50, +"doc":[ +"Empty response"],"attributes":[ +]}},{"type":"response","content":{ +"name":"Seq", +"header":72, +"doc":[ +"Sequence response. Methods that return this value must process response in particular order",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of response"},{"type":"reference","argument":"state","category":"full","description":" Sequence state of response"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +]}},{"type":"response","content":{ +"name":"SeqDate", +"header":102, +"doc":[ +"Sequence response with date. Methods that return this value must process response in particular order",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of response"},{"type":"reference","argument":"state","category":"full","description":" Sequence state of response"},{"type":"reference","argument":"date","category":"full","description":" Date of response"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"response","content":{ +"name":"Bool", +"header":209, +"doc":[ +"Boolean response",{"type":"reference","argument":"value","category":"full","description":" Response value"}],"attributes":[ +{"type":"bool","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"Config", +"doc":[ +"Configuration of system",{"type":"reference","argument":"maxGroupSize","category":"full","description":" Current maximum group size"}],"attributes":[ +{"type":"int32","id":1,"name":"maxGroupSize"} +]}}, { + "type":"struct", + "content": { + "name":"Extension", +"doc":[ +"Extention",{"type":"reference","argument":"id","category":"full","description":" Extension id"},{"type":"reference","argument":"data","category":"full","description":" Extension data"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"bytes","id":2,"name":"data"} +]}},{"type":"update","content":{ +"name":"Config", +"header":42, +"doc":[ +"Update about config change",{"type":"reference","argument":"config","category":"full","description":" new config"}],"attributes":[ +{"type":{"type":"struct","childType":"Config"},"id":1,"name":"config"} +]}}]}, { "title": "Device Info", "package": "device", "doc": [ @@ -21425,53 +4142,15 @@ "For example, getting timezone or preffered languages" ], "items": [ - { - "type": "rpc", - "content": { - "name": "NotifyAboutDeviceInfo", - "header": 229, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Notifying about device information", - { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - }, - { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "Device Time Zone" - } - ], - "attributes": [ - { - "type": { - "type": "list", - "childType": "string" - }, - "id": 1, - "name": "preferredLanguages" - }, - { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "timeZone" - } - ] - } - } - ] - }, - { +{"type":"rpc","content":{ +"name":"NotifyAboutDeviceInfo", +"header":229, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Notifying about device information",{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"},{"type":"reference","argument":"timeZone","category":"full","description":"Device Time Zone"}],"attributes":[ +{"type":{"type":"list","childType":"string"},"id":1,"name":"preferredLanguages"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"timeZone"} +]}}]}, { "title": "Webactions", "package": "webactions", "doc": [ @@ -21479,314 +4158,112 @@ "perform actions, and pass result on action completion" ], "items": [ - { - "type": "rpc", - "content": { - "name": "InitWebaction", - "header": 116, - "response": { - "type": "anonymous", - "header": 117, - "doc": [ - { - "type": "reference", - "argument": "uri", - "category": "full", - "description": " Web action uri" - }, - { - "type": "reference", - "argument": "regexp", - "category": "full", - "description": " Regular expression. Required to match completion of web action" - }, - { - "type": "reference", - "argument": "actionHash", - "category": "danger", - "description": " Identifier of current web action. Required to complete it" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "uri" - }, - { - "type": "string", - "id": 2, - "name": "regexp" - }, - { - "type": "string", - "id": 3, - "name": "actionHash" - } - ] - }, - "doc": [ - "Initialize start of web action", - { - "type": "reference", - "argument": "actionName", - "category": "full", - "description": "Name of web action" - }, - { - "type": "reference", - "argument": "params", - "category": "full", - "description": "Additional params required to make action's uri" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "actionName" - }, - { - "type": { - "type": "struct", - "childType": "MapValue" - }, - "id": 2, - "name": "params" - } - ] - } - }, - { - "type": "rpc", - "content": { - "name": "CompleteWebaction", - "header": 123, - "response": { - "type": "anonymous", - "header": 124, - "doc": [ - { - "type": "reference", - "argument": "result", - "category": "full", - "description": " Reslut of web action completion" - } - ], - "attributes": [ - { - "type": { - "type": "struct", - "childType": "MapValue" - }, - "id": 1, - "name": "result" - } - ] - }, - "doc": [ - "Complete started web action", - { - "type": "reference", - "argument": "actionHash", - "category": "danger", - "description": "Identifier of given web action" - }, - { - "type": "reference", - "argument": "completeUri", - "category": "full", - "description": "Final uri of web action" - } - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "actionHash" - }, - { - "type": "string", - "id": 2, - "name": "completeUri" - } - ] - } - } - ] - }, - { +{"type":"rpc","content":{ +"name":"InitWebaction", +"header":116, +"response":{"type":"anonymous","header":117, "doc":[ +{"type":"reference","argument":"uri","category":"full","description":" Web action uri"},{"type":"reference","argument":"regexp","category":"full","description":" Regular expression. Required to match completion of web action"},{"type":"reference","argument":"actionHash","category":"danger","description":" Identifier of current web action. Required to complete it"}] ,"attributes":[{"type":"string","id":1,"name":"uri"} +,{"type":"string","id":2,"name":"regexp"} +,{"type":"string","id":3,"name":"actionHash"} +]}, +"doc":[ +"Initialize start of web action",{"type":"reference","argument":"actionName","category":"full","description":"Name of web action"},{"type":"reference","argument":"params","category":"full","description":"Additional params required to make action's uri"}],"attributes":[ +{"type":"string","id":1,"name":"actionName"} +,{"type":{"type":"struct","childType":"MapValue"},"id":2,"name":"params"} +]}},{"type":"rpc","content":{ +"name":"CompleteWebaction", +"header":123, +"response":{"type":"anonymous","header":124, "doc":[ +{"type":"reference","argument":"result","category":"full","description":" Reslut of web action completion"}] ,"attributes":[{"type":{"type":"struct","childType":"MapValue"},"id":1,"name":"result"} +]}, +"doc":[ +"Complete started web action",{"type":"reference","argument":"actionHash","category":"danger","description":"Identifier of given web action"},{"type":"reference","argument":"completeUri","category":"full","description":"Final uri of web action"}],"attributes":[ +{"type":"string","id":1,"name":"actionHash"} +,{"type":"string","id":2,"name":"completeUri"} +]}}]}, { "title": "Collections", "package": "collections", "doc": [ "Flexible raw collections without structure" ], "items": [ - { - "type": "trait", - "content": { - "isContainer": "true", - "name": "RawValue", - "attributes": [] - } - }, - { - "type": "struct", - "content": { - "name": "StringValue", - "doc": [ - "Text value" - ], - "trait": { - "name": "RawValue", - "key": 1 - }, - "attributes": [ - { - "type": "string", - "id": 1, - "name": "text" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Int32Value", - "doc": [ - "Int32 value" - ], - "trait": { - "name": "RawValue", - "key": 2 - }, - "attributes": [ - { - "type": "int32", - "id": 1, - "name": "value" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "Int64Value", - "doc": [ - "Int64 value" - ], - "trait": { - "name": "RawValue", - "key": 3 - }, - "attributes": [ - { - "type": "int64", - "id": 1, - "name": "value" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "DoubleValue", - "doc": [ - "Double value" - ], - "trait": { - "name": "RawValue", - "key": 4 - }, - "attributes": [ - { - "type": "double", - "id": 1, - "name": "value" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "ArrayValue", - "doc": [ - "Array value" - ], - "trait": { - "name": "RawValue", - "key": 5 - }, - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 1, - "name": "array" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MapValueItem", - "doc": [ - "Item of Map" - ], - "attributes": [ - { - "type": "string", - "id": 1, - "name": "key" - }, - { - "type": { - "type": "trait", - "childType": "RawValue" - }, - "id": 2, - "name": "value" - } - ] - } - }, - { - "type": "struct", - "content": { - "name": "MapValue", - "doc": [ - "Map Value" - ], - "trait": { - "name": "RawValue", - "key": 6 - }, - "attributes": [ - { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MapValueItem" - } - }, - "id": 1, - "name": "items" - } - ] - } - } - ] - } - ] -} +{"type":"trait","content":{ +"isContainer":"true","name":"RawValue","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"StringValue", +"doc":[ +"Text value"],"trait":{"name":"RawValue","key":1},"attributes":[ +{"type":"string","id":1,"name":"text"} +]}}, { + "type":"struct", + "content": { + "name":"Int32Value", +"doc":[ +"Int32 value"],"trait":{"name":"RawValue","key":2},"attributes":[ +{"type":"int32","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"Int64Value", +"doc":[ +"Int64 value"],"trait":{"name":"RawValue","key":3},"attributes":[ +{"type":"int64","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"DoubleValue", +"doc":[ +"Double value"],"trait":{"name":"RawValue","key":4},"attributes":[ +{"type":"double","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"ArrayValue", +"doc":[ +"Array value"],"trait":{"name":"RawValue","key":5},"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"RawValue"}},"id":1,"name":"array"} +]}}, { + "type":"struct", + "content": { + "name":"MapValueItem", +"doc":[ +"Item of Map"],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":{"type":"trait","childType":"RawValue"},"id":2,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"MapValue", +"doc":[ +"Map Value"],"trait":{"name":"RawValue","key":6},"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"MapValueItem"}},"id":1,"name":"items"} +]}}]}, { + "title": "Surveys", + "package": "surveys", + "doc": [ + "Surveys implementation for messages" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Survey", +"doc":[ +"Main Survey Struct"],"attributes":[ +{"type":"int64","id":1,"name":"id"} +,{"type":"string","id":2,"name":"titulo"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"uf"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"creationTime"} +,{"type":{"type":"alias","childType":"date"},"id":5,"name":"endTime"} +,{"type":{"type":"alias","childType":"userId"},"id":6,"name":"ownerId"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"answers"} +]}},{"type":"rpc","content":{ +"name":"CreateSurvey", +"header":139, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Criar uma nova enquete"],"attributes":[ +{"type":{"type":"struct","childType":"Survey"},"id":1,"name":"survey"} +]}}]}]} \ No newline at end of file diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index 8a568a5356..37b15265c7 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -7,31 +7,32 @@ import akka.http.scaladsl.util.FastFuture import cats.data.Xor import com.github.ghik.silencer.silent import im.actor.api.rpc.PeerHelpers._ +import im.actor.api.rpc.Refs.{ApiGroupOutPeer, ResponseSeq} import im.actor.api.rpc._ import im.actor.api.rpc.files.ApiFileLocation import im.actor.api.rpc.groups._ -import im.actor.api.rpc.misc.{ ResponseSeq, ResponseSeqDate, ResponseVoid } -import im.actor.api.rpc.peers.{ ApiGroupOutPeer, ApiUserOutPeer } +import im.actor.api.rpc.misc.{ResponseSeq, ResponseSeqDate, ResponseVoid} +import im.actor.api.rpc.peers.{ApiGroupOutPeer, ApiUserOutPeer} import im.actor.api.rpc.sequence.ApiUpdateOptimization import im.actor.api.rpc.users.ApiUser import im.actor.concurrent.FutureExt import im.actor.server.acl.ACLUtils import im.actor.server.db.DbExtension import im.actor.server.dialog.DialogExtension -import im.actor.server.file.{ FileErrors, ImageUtils } +import im.actor.server.file.{FileErrors, ImageUtils} import im.actor.server.group._ import im.actor.server.model.GroupInviteToken import im.actor.server.names.GlobalNamesStorageKeyValueStorage -import im.actor.server.persist.{ GroupInviteTokenRepo, GroupUserRepo } +import im.actor.server.persist.{GroupInviteTokenRepo, GroupUserRepo} import im.actor.server.presences.GroupPresenceExtension -import im.actor.server.sequence.{ SeqState, SeqStateDate, SeqUpdatesExtension } +import im.actor.server.sequence.{SeqState, SeqStateDate, SeqUpdatesExtension} import im.actor.server.user.UserExtension import im.actor.util.ThreadLocalSecureRandom -import im.actor.util.misc.{ IdUtils, StringUtils } +import im.actor.util.misc.{IdUtils, StringUtils} import slick.dbio.DBIO import slick.driver.PostgresDriver.api._ -import scala.concurrent.{ ExecutionContext, Future } +import scala.concurrent.{ExecutionContext, Future} final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit actorSystem: ActorSystem) extends GroupsService { @@ -648,4 +649,27 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act case GroupErrors.UserIsBanned ⇒ GroupRpcErrors.UserIsBanned } + /** + * Join group by peer without a necessity of invite + * + * @param groupPeer Groups peer + */ + override protected def doHandleJoinGroupByPeer2(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = { + authorized(clientData) { implicit client ⇒ + withGroupOutPeer(groupPeer) { + val action = for { + apiGroup ← fromFuture(groupExt.getApiStruct(groupPeer.groupId, client.userId)) + _ ← fromBoolean(GroupRpcErrors.CantJoinGroup)(canJoin(apiGroup.permissions)) + joinResp ← fromFuture(groupExt.joinGroup( + groupId = groupPeer.groupId, + joiningUserId = client.userId, + joiningUserAuthId = client.authId, + invitingUserId = None + )) + SeqStateDate(seq, state, _) = joinResp._1 + } yield ResponseSeq(seq, state.toByteArray) + + action.value + } + } } diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala new file mode 100644 index 0000000000..2baafef52e --- /dev/null +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala @@ -0,0 +1,48 @@ +package im.actor.server.api.rpc.service.survey + +import java.time.Instant + +import akka.actor.ActorSystem +import akka.http.scaladsl.util.FastFuture +import cats.data.Xor +import com.github.ghik.silencer.silent +import im.actor.api.rpc.PeerHelpers._ +import im.actor.api.rpc.Refs.{ ApiSurvey } +import im.actor.api.rpc._ +import im.actor.api.rpc.files.ApiFileLocation +import im.actor.api.rpc.groups._ +import im.actor.api.rpc.misc.{ ResponseSeq, ResponseSeqDate, ResponseVoid } +import im.actor.api.rpc.peers.{ ApiGroupOutPeer, ApiUserOutPeer } +import im.actor.api.rpc.sequence.ApiUpdateOptimization +import im.actor.api.rpc.surveys.SurveysService +import im.actor.api.rpc.users.ApiUser +import im.actor.concurrent.FutureExt +import im.actor.server.acl.ACLUtils +import im.actor.server.db.DbExtension +import im.actor.server.dialog.DialogExtension +import im.actor.server.file.{ FileErrors, ImageUtils } +import im.actor.server.group._ +import im.actor.server.model.GroupInviteToken +import im.actor.server.names.GlobalNamesStorageKeyValueStorage +import im.actor.server.persist.{ GroupInviteTokenRepo, GroupUserRepo } +import im.actor.server.presences.GroupPresenceExtension +import im.actor.server.sequence.{ SeqState, SeqStateDate, SeqUpdatesExtension } +import im.actor.server.user.UserExtension +import im.actor.util.ThreadLocalSecureRandom +import im.actor.util.misc.{ IdUtils, StringUtils } +import slick.dbio.DBIO +import slick.driver.PostgresDriver.api._ + +import scala.concurrent.{ ExecutionContext, Future } +/** + * Created by 98379720172 on 16/11/16. + */ +class SurveyServiceImpl()(implicit actorSystem: ActorSystem) extends SurveysService { + + override implicit val ec: ExecutionContext = actorSystem.dispatcher + + /** Criar uma nova enquete */ + override protected def doHandleCreateSurvey(survey: ApiSurvey, clientData: ClientData): Future[HandlerResult[ResponseVoid]] = { + FastFuture.successful(Ok(ResponseVoid)) + } +} From 451ffc79e9ce9bb2812b5ca5146c2fe568041864 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 16 Nov 2016 15:47:18 -0200 Subject: [PATCH 149/253] alteracoes' --- .../src/main/java/im/actor/core/Messenger.java | 12 ++++++++++++ .../im/actor/core/modules/groups/GroupsModule.java | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/Messenger.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/Messenger.java index dcf2003780..f6e9a36dab 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/Messenger.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/Messenger.java @@ -1768,6 +1768,18 @@ public Promise joinGroup(int gid) { return modules.getGroupsModule().joinGroup(gid); } + /** + * Join group + * + * @param gid group's id + * @return Promise of Void + */ + @NotNull + @ObjectiveCName("joinGroupWithGid2:") + public Promise joinGroup2(int gid) { + return modules.getGroupsModule().joinGroup2(gid); + } + /** * Request integration token for group * diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/groups/GroupsModule.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/groups/GroupsModule.java index 3f4e982237..404ee789ac 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/groups/GroupsModule.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/groups/GroupsModule.java @@ -27,6 +27,7 @@ import im.actor.core.api.rpc.RequestInviteUser; import im.actor.core.api.rpc.RequestJoinGroup; import im.actor.core.api.rpc.RequestJoinGroupByPeer; +import im.actor.core.api.rpc.RequestJoinGroupByPeer2; import im.actor.core.api.rpc.RequestKickUser; import im.actor.core.api.rpc.RequestLeaveAndDelete; import im.actor.core.api.rpc.RequestLeaveGroup; @@ -362,6 +363,13 @@ public Promise joinGroup(int gid) { .map(r -> null); } + public Promise joinGroup2(int gid) { + return api(new RequestJoinGroupByPeer2( + new ApiGroupOutPeer(gid, 0L))) + .chain(r -> updates().waitForUpdate(r.getSeq())) + .map(r -> null); + } + // // Integration Token // From 6d902d5589613963ded71013201f8c30ad6274f6 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 16 Nov 2016 16:10:58 -0200 Subject: [PATCH 150/253] alteracoes --- actor-sdk/.DS_Store | Bin 10244 -> 10244 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 10244 -> 10244 bytes actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 14 +- actor-sdk/sdk-core-ios/ActorSDK/.DS_Store | Bin 6148 -> 8196 bytes .../sdk-core-ios/ActorSDK/Resources/.DS_Store | Bin 0 -> 8196 bytes .../Resources/pt.lproj/Localizable.strings | 2 +- .../Resources/pt_br.lproj/Localizable.strings | 726 ++++++++++++++++++ .../sdk-core-ios/ActorSDK/Sources/.DS_Store | Bin 0 -> 6148 bytes .../ConversationViewController.swift | 2 +- .../ActorSDK/Sources/Libs/.DS_Store | Bin 0 -> 6148 bytes .../Sources/SwiftExtensions/Promises.swift | 2 +- .../service/groups/GroupsServiceImpl.scala | 25 +- actor-server/sbt | 4 +- 13 files changed, 751 insertions(+), 24 deletions(-) create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/.DS_Store create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/pt_br.lproj/Localizable.strings create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Sources/.DS_Store create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Sources/Libs/.DS_Store diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index 2e56c7f803c069787bf0c706117b7dcaf644010c..6e1c73bb1d289db374d770f60702342c940cfef7 100644 GIT binary patch delta 602 zcma*lPe_wt9KiA4*UI*`H+|H(_U=`-j0~ecV@|3=wMetf&{{>1G*|BM5^m-q&HmFM zqCCA6X5A{JEE076p`b$q5mAsvbf`lYJJlty2%;C)p-bR%d3gBp9DW~u+1709$dq?( zU1(V_QWvs+d$Z+nReHoq_Ox^zw$iE0?qqkyx$QRpQTHC}Kspt(`jU##DqomWi=rXP zAD2{0Sn8!&+NE2LNxuxpu#Cxlc_7c^mAsdaGAZBWyG+Rs`AGq8=2Jv5J`7AMs3A-( z5u$9NiDtI3gT1t|k2oE4lA?=4^l+LpoF&UeE>&@vD-3d-JKW_SBRu5=Zy9HTcYI=! zFZNd>ZZ>Xi^y*Fjoy-5vT-t}CVpURF<|+3s2rjO%El;H#Fnbg3>VU3tE^WeR_|2u& zfq*J-xuzd0Ryt*tO8jlL5j~*hs17Y(SFh1^HCtu0{Li)PoLZ>1I@L7%K7FI!pp}r* zl-N?o5&_6ej3Gf z(M_Q(wRQHqk=5F*u5?e*I+wD4l}7B5KzvQ7^7dJ&{{5$Vt#nVOEpWlny}y!=7X@KQ!O20=osrIIKO zG_sA|Bsf5lRt|EME>d)Jl3vcx&solMnJZl78aB7M%^mJyJ|M>=k9opN-Y~-~ANj;r z^8B##{?3xvo|vJB|C_D4@NC-5iW0TbTUu6bRD{-Th-|IjzH`_d>Ihc_b%lE5(cb&~ z0dr$jFsO<=9`~_1>a<1b$iG%os|VE*bxd2R4UM|47ORZ5@Uv-$QJqljXbJBR@Xa6J)fXrhG}arUy0HrhGFVLBYX<5-+<3Hw~aK`wBS tOAh1^!`$E|BaAwX_ZZ_o<5W!W&;^}hnx{PDIWKt4huqkzQ9NQwdAUsbdLC zHP8AxqH#-o(28jft4B>EV~rZA?1~=OmJGd^Ta>&xP0dfGEzQu)d)167M$TWa+7;Z> z+}hQ<|E{r(>Y7@~EWJqQ=>ok?@6jjpIekfA(bsgDex#r27rI8j(;xIFD#36Q zcAy@+u?Hb^q8|ge6N8B05GF8*BZ%P`j$;w`;{*((QOLl=BUr@~IE|-p7HfD3FXI(l zz&m&!AK*iLgfH+7esGTHf-}4w(Wm;9~18wEKKdCrK^u)Z4M1_J+W^`v=6$)!n 'MIT', :file => 'LICENSE' } - s.author = { "Actor LLC" => "steve@actor.im" } - s.source = { :http => "https://github.com/actorapp/ActorSDK-iOS/releases/download/v#{s.version}/ActorSDK.zip"} + s.author = { "Actor LLC" => "steve@actor.im" } + s.source = { :http => "file:///Users/diego/Documents/projetos/actor-platform/actor-sdk/sdk-core-ios/build/ActorSDK.zip"} - s.platform = :ios, "8.0" - s.requires_arc = true + s.platform = :ios, "8.0" + s.requires_arc = true # Core s.dependency 'RegexKitLite' diff --git a/actor-sdk/sdk-core-ios/ActorSDK/.DS_Store b/actor-sdk/sdk-core-ios/ActorSDK/.DS_Store index 9262881e327578972671afb3f3bb776f0ee32f76..ac506e682c4adaf8387e8ebfaa7d0a4b843be35e 100644 GIT binary patch literal 8196 zcmeHMYfKzf6h3ExGFJ)=wdLWuvMtgerScF;sff#?SW2-?7s{iw%k0h+CJr-nXLh$O zV%Ee)P1G14F=>s)^q-pk(is1k_>8IX5rfgjG$#J@m+_A=Mvdproh1nDKcgg_o7{Wu zJ&$|uIrp2ndu9Ou`%-EvKs5kJR5_JPsM(-!Ij`$Vz~dAVMY0D-K@t+6fgR7R)AkvD z1pEm25%446N5GH3W{3dY*}O=3?tLNkTR#GR1a8U*@b^QQDyI>TW(9R$9n`of0MSBX zyM_9c2e>w2k48M271TAQIYst>o+)}M1`2bMhq*e@h)1)63UfeV4(P3nUWS71>SPyo z)d3@d`mG-UKLYC`z;ky7$9c{U*6RG-UWgl3oTS&{3x;kxEiK<-prEj5OR*$LB~qz$ zDmrInqK@LE>^>!V(jDol7Wew2mSwE;mG}u=%f#gE{g&w{x~U~ssZWpVrfOyStdyzR z?mWj7XO3(cV-kzWHH(WKoh?n_wyyT2rto5GYkO-`c;CLZr6nd+)wkX^G&6tx!s5eA zk6aS&q4$b_@-^;W-q=^ePWKC6125%#{VwM#Vv3dRiM$9Lw(Ci6EJLmA;lx-!QephiqCtJ>o z$=kU7(FI4hO#6hEw23nI#?~F7UAytV7(-rMuHu?~qtT1h3 z?UJmrF++)KhG2EFE=e9{<7wfpV0N<}sREnWM8cY%CqHe$?hW=!@~6^izV;Etc8)G+ zCN0msJ6IbGPI7*)s%k2Mvo6vg4&DtzU8F^fWPZieKoj)9AWYF`DibpB6g&;jz$Lf> zSK%#q4?cm<;0yQ?zJlxU1N;QP!0+$}{0Vm|JF}#RR;FI_qUdEU46?_%1;yd_0et;k1NBB8@jo*tM z26Dh15#wBoH>kJ4LrTE)9@4<+jer{(eBe;u{{r0WTLoHg-M-_Fx`w@No!z}F2fF4A zSHsCgkbsB_og6gWgZw8R1*}#zzz5jeum!&dxcnrm4v(?-i{&MjSbj{d$0*Ru#+%&fKWJq zgLnvs2#HY~!*QIzNsOaPIGn{fJWDuCVHz`-#YbH{K90{49-qe-@I^x8l{NSq${|ls zd~;*`rK3sHu*_MKa^x06boCXY+6g00mw=eVZ#Q2A3dEMGdH#Pe|M&mRw{d?*egymo z{A&@w!hz^OA5EA0{jqjto@tzLXO{j6xaiVTIPIToDL+Xb~mD@x-niZ5d WRQ~f10sj3@zeoN1-v!@I-24sJ#rDPk delta 131 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{MGqg=C6q~50D9Q+A12Ir6nIV;-IHfo_Cn>*@gygkU-JuA*xNa*IVNW$lB!7T4;J^gr!Gou7vyM6< z1R?|?1R?|?1R@0f4+zknEs9oV-&fkGju40txGxb9--kF|LZ(7Fqon+FP$g3Ul2z0# z3$-Z^kUsHHrb0QRq;#ccs_X$nR}51ORPLmY3v-gGP|hf++yRw4U^p^{84AkL$uBO= z0aHpwb%a2K!0iZ#-2DOQ0Rw!nX6NtOqCb&!ye#RjWhWfl58B(m$BN3TdDS(Vrqyb7 z+EbY^ub2sppy2ly`NQ(gHmz*f9`rotR@=x9*;a9sH}-mNVA!sepJjez*mg~?*y9yk z)0fZLX9Q#9%NWzxDA%W^I=b2u@#MzGrxWq1WO7|H5%28mn4V_Z;+Eu={$t~(&rCf# z{oHvKAch|asGk$?g>un4{$#I;w&KlFv_F)hWvo{3-?e+sDCY&=+HW~VU{6|UBe48Y zUhfkK{W;Iwm$xP<#NnLh6vkcBG~^5?S0H1n+i^1X8Ot9DtW$w#9rC?=&?^l`Z1NR- zqkMtzAD9Si&-I6_yiby`cjhl#x?<&H?dzY|mcCy1U_EbGz}O*z*$wRDwv|6nw9R1b zpyB5%*R!PoE&+<>3p7x)c+hdX-uci{j& ziTg2wM=*;fT6i2iEaGWAgHw1G&*3ZhD!zsn@Dg6eckv2-fFI&j{1`vMFY#OaQO&TT zMBTmWzEtB)YTfZgCF+JRYQ@nzQ8%`uZ)f_RQ1`}s#n*=#7cOgF)z-0LbN8)vowJg& zDJ6NNh$0D8B8Xhd|FBZ5y&hY_mX>4o0pg!^N)sgFHOe|3TcHtexFn7qYl*dLL~dRo zwQO~aEDeoUD&w^*sS#QEJf&U7IvLTKS1D~5+oTa|d9~7RWho|JI1cK*C6;Cy$8uaO z%fz?g5?qB(;TkdUJGcoy!>{l+0#+lJ?2F+NT#75P6(7abn85YeNj&VrO_;{**oQlb ziy0imAsoho#KoNC;uxO9JO)@GPR`)-#K;%$#gLP);~V%EUYx_g{u1|;#LMLvIGM@2 zj^~~rytkNy-L4 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/pt.lproj/Localizable.strings b/actor-sdk/sdk-core-ios/ActorSDK/Resources/pt.lproj/Localizable.strings index ffac995e18..a8880a3d35 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Resources/pt.lproj/Localizable.strings +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/pt.lproj/Localizable.strings @@ -580,7 +580,7 @@ * Common Elements */ -"CurrentLocale" = "Pt"; +"CurrentLocale" = "pt-BR"; "InviteText" = "Olá! Vamos mudar para o {appname}! {link}"; diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/pt_br.lproj/Localizable.strings b/actor-sdk/sdk-core-ios/ActorSDK/Resources/pt_br.lproj/Localizable.strings new file mode 100644 index 0000000000..a8880a3d35 --- /dev/null +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/pt_br.lproj/Localizable.strings @@ -0,0 +1,726 @@ +// +// Copyright (c) 2014-2016 Actor LLC. +// + +/* + * Main Screen + */ + +"TabMessages" = "Mensagens"; + +"TabPeople" = "Contatos"; + +"TabSettings" = "Configurações"; + +"TabDiscover" = "Descobrir"; + +/* + * Contacts + */ + +"ContactsAddHeader" = "Adicionar Contato"; + +"ContactsAddHint" = "Por favor, insira o número de telefone"; + +"ContactsActionInvite" = "Avise seus amigos sobre o {appname}"; + +"ContactsActionAdd" = "Adicionar Amigo(a)"; + +"ContactsBack" = "Contatos"; + +/* + * Dialogs + */ + +"DialogsHint" = "Deslise para mais opções"; + +"DialogsBack" = "Chats"; + +/* + * Settings + */ + +"SettingsEdit" = "Editar"; + +"SettingsSetPhoto" = "Definir Foto do Perfil"; + +"SettingsChangeName" = "Alterar Seu Nome"; + + +"SettingsEditHeader" = "Your name"; + +"SettingsEditHint" = "Please, enter your real name to help people better understand who you are."; + +"SettingsEditFieldHint" = "Enter your name"; + + +"SettingsAboutNotSet" = "Set about me"; + +"SettingsChangeAboutTitle" = "About me"; + +"SettingsChangeAboutHint" = "Tell people anything you want about yourself"; + + +"SettingsUsernameNotSet" = "Set username"; + +"SettingsUsernameTitle" = "Username"; + +"SettingsUsernameHintField" = "Enter your Username"; + +"SettingsUsernameHint" = "You can choose a username in {appname}. If you do, other people will be able to find you by this username and contact you without sharing your phone number.\n\nYou can use a-z, 0-9 and underscores. Minumum length is 5 characters."; + + +"SettingsSecurity" = "Privacy and Security"; + +"SettingsWallpapers" = "Wallpapers"; + +"SettingsMedia" = "Media Settings"; + +"SettingsNotifications" = "Alertas e Sons"; + +"SettingsAskQuestion" = "Fazer uma pergunta"; + +"SettingsTwitter" = "App Twitter"; + +"SettingsAbout" = "App Homepage"; + +"SettingsVersion" = "Versão {version}"; + +"SettingsMobilePhone" = "Telefone Móvel"; + +"SettingsGroupChats" = "Groups"; + +"SettingsPrivateChats" = "Private Chats"; + +/* + * Notifications + */ + +"NotificationsTitle" = "Alertas e Sons"; + +"NotificationsEffectsTitle" = "Efeitos"; + +"NotificationsMobileTitle" = "Notificações do Aparelho"; + +"NotificationsInAppTitle" = "Notificações do Aplicativo"; + +"NotificationsNotificationHint" = "Você pode desativar as notificações para usuários e grupos nas suas páginas específicas de informação."; + +"NotificationsPrivacyTitle" = "Privacidade"; + +"NotificationsSoundEffects" = "Efeitos Sonoros"; + +"NotificationsEnable" = "Ativar"; + +"NotificationsSound" = "Som"; + +"NotificationsVibration" = "vibrar"; + +"NotificationsPreview" = "Visualizar Mensagem"; + +"NotificationsPreviewHint" = "Remover texto da mensagem da notificação."; + +"NotificationSecretMessage" = "Nova Mensagem"; + +"NotificationsGroups" = "Group Notifications"; + +"NotificationsOnlyMentions" = "Only Mentions"; + +"NotificationsOnlyMentionsHint" = "You can enable notifications only for messages that contains your mention"; + +/* + * Media + */ + +"MediaTitle" = "Media Settings"; + +"MediaPhotoDownloadHeader"= "Automatic Photo Download"; + +"MediaAudioDownloadHeader"= "Automatic Audio Download"; + +"MediaOtherHeader"= "Other"; + +"MediaAutoplayGif"= "Autoplay GIFs"; + +/* + * Privacy + */ + +"PrivacyTitle" = "Privacy and Security"; + + +"PrivacyHeader" = "Privacy"; + +"PrivacyLastSeen" = "Visto pela ultima vez"; + +"PrivacyLastSeenHint" = "Alterar quem pode ver o seu tempo Última atividade."; + +"PrivacyLastSeenEverybody" = "Todo mundo"; + +"PrivacyLastSeenContacts" = "Meus contatos"; + +"PrivacyLastSeenNone" = "Ninguém"; + + +"PrivacySecurityHeader" = "Security"; + +"PrivacyAllSessions" = "Active Sessions"; + +"PrivacyTerminate" = "Encerrar todas as sessões"; + +"PrivacyTerminateAlert" = "Terminate all sessions"; + +"PrivacyTerminateAlertSingle" = "Terminate session"; + +"PrivacyTerminateHint" = "Descredencia todos os demais dispositivos menos este."; + +/* + * Calls + */ + +"CallsStartAudio" = "Audio Call"; + +"CallsStartGroupAudio" = "Group Audio Call"; + +"CallsAnswer" = "answer"; + +"CallsDecline" = "decline"; + +"CallsMute" = "mute"; + +"CallsSpeaker" = "speaker"; + +"CallsVideo" = "video"; + +"CallStateRinging" = "Ringing..."; + +"CallStateConnecting" = "Connecting..."; + +"CallStateIncoming" = "Incoming call..."; + +"CallPrivateTitle" = "Private Call"; + +"CallPrivateText" = "Call from {name}"; + +"CallGroupTitle" = "Group Call"; + +"CallGroupText" = "Group call {name}"; + +/* + * Profile + */ + +"ProfileEditHeader" = "Alterar name"; + +"ProfileSendMessage" = "Enviar Mensagem"; + +"ProfileNotifications" = "Alertas"; + +"ProfileNotificationsWarring" = "Você tem certeza que quer desativar os alertas para esse contato? Talvez isso cause problemas no relacionamento."; + +"ProfileNotificationsWarringAction" = "Desativar"; + +"ProfileAddToContacts" = "Adicionar aos contatos"; + +"ProfileRemoveFromContacts" = "Remover dos contatos"; + +"ProfileRename" = "Renomear Contato"; + +"ProfileRenameMessage" = "Você pode renomear conttos para organizar sua lista. As alterações serão vistas somente por você."; + +"ProfileRenameAction" = "Renomear"; + +"ProfileAbout" = "about"; + +"ProfilePhone" = "phone"; + +"ProfileUsername" = "username"; + +"ProfileTitle" = "Info"; + +"ProfileBlockContact" = "Block User"; + +"ProfileUnblockContact" = "Unblock User"; + +"CallNumber" = "Chamar número"; + +"CopyNumber" = "Copiar número"; + +"NumberCopied" = "Número de telefone copiadio para a área de transferência"; + +/* + * Publics + */ + +"JoinAlertMessage" = "Você quer fazer parte deste grupo?"; + +/* + * Group + */ + +"GroupEditHeader" = "Theme"; + +"GroupEditHint" = "Enter group theme"; + +"GroupSetPhoto" = "Definir Foto do Grupo"; + +"GroupSetTitle" = "Definir Nome do Grupo"; + +"GroupEditConfirm" = "Você tem certeza que quer mudar o nome do grupo?"; + +"GroupEditConfirmAction" = "Alterar Tema"; + +"GroupNotifications" = "Alertas"; + +"GroupSettings" = "CONFIGURAÇÕES"; + +"GroupIntegrations" = "Integrações"; + +"GroupDescription" = "Description"; + + + +"GroupAdministration" = "Administration"; + +"GroupTypeTitle" = "Group Type"; + +"GroupTypeTitleChannel" = "Channel Type"; + +"GroupTypePublic" = "Public"; + +"GroupTypePrivate" = "Private"; + +"ChannelTypePublic" = "Public"; + +"ChannelTypePrivate" = "Private"; + +"GroupTypePublicFull" = "Public Group"; + +"GroupTypePrivateFull" = "Private Group"; + +"ChannelTypePublicFull" = "Public Channel"; + +"ChannelTypePrivateFull" = "Private Channel"; + +"GroupPermissionsHint" = "Control what is possible in this group"; + +"GroupPermissionsHintChannel" = "Control what is possible in this channel"; + +"GroupTypeHintPublic" = "Public groups can be found in search and anyone can join"; + +"GroupTypeHintPrivate" = "Private groups can be joined only via personal invitation"; + +"GroupTypeHintPublicChannel" = "Public channels can be found in search and anyone can join"; + +"GroupTypeHintPrivateChannel" = "Private channels can be joined only via personal invitation"; + +"GroupTypeLinkHint" = "People can share this link with others and find your group using search"; + +"GroupTypeLinkHintChannel" = "People can share this link with others and find your channel using search"; + +"GroupDeleteHint" = "You will lose all messages in this group"; + +"GroupDeleteHintChannel" = "You will lose all messages in this channel"; + + +"GroupShareTitle" = "Shared History"; + +"GroupShareEnabled" = "Shared"; + +"GroupShareHint" = "All members will see all messages"; + +"GroupShareMessage" = "Are you sure want to share all messages to all members? This action is irreversible."; + +"GroupShareAction" = "Share"; + + +"GroupEditTitle" = "Edit Group"; + +"GroupEditTitleChannel" = "Edit Channel"; + +"GroupEditName" = "Group Name"; + +"GroupEditNameChannel" = "Channel Name"; + +"GroupEditDescription" = "Description"; + + + +"GroupViewMembers" = "Membros"; + +"GroupMemberAdmin" = "admin"; + +"GroupMemberInfo" = "Perfil"; + +"GroupMemberMakeAdmin" = "Make Group admin"; + +"GroupMemberMakeMessage" = "Are you sure want to make {name} admin of this group?"; + +"GroupMemberMakeAction" = "Yes"; + +"GroupMemberKick" = "Remover do Grupo"; + +"GroupMemberKickMessage" = "Você tem certeza que quer remover {name} do grupo?"; + +"GroupMemberKickAction" = "Remover"; + +"GroupMemberWrite" = "Escrever Mensagem"; + +"GroupMemberCall" = "Chamada Telefônica"; + +"GroupMemberCallNoPhones" = "O usuário não tem número de telefone."; + +"GroupAddParticipant" = "Adicionar Participante..."; + +"GroupAddParticipantTitle" = "Contatos"; + +"GroupAddParticipantUrl" = "COnvidar para o grupo via Link"; + + + +"GroupInviteLinkPageTitle" = "Link de Convite"; + +"GroupInviteLinkTitle" = "LINK"; + +"GroupInviteLinkHint" = "Você pode convidar pessoas para este grupo enviando este link."; + +"GroupInviteLinkRevokeMessage" = "Você tem certeza que quer remover este link? Uma vez removido, mais ninguém sera capaz de entrar no grupo usando este link."; + +"GroupInviteLinkRevokeAction" = "Remover"; + +/* + * Compose + */ + +"ComposeTitle" = "Nova Mensagem"; + + +"CreateGroup" = "Criar Grupo"; + +"CreateChannel" = "Create Channel"; + + +"CreateGroupTitle" = "Criar Grupo"; + +"CreateGroupNamePlaceholder" = "Inserir nome do grupo"; + +"CreateGroupHint" = "Please provide group subject and optional group icon"; + + +"CreateChannelTitle" = "Create Channel"; + +"CreateChannelHint" = "Please provide the channel name and an optional channel icon"; + +"CreateChannelNamePlaceholder" = "Channel Name"; + + +"CreateGroupMembersTitle" = "Invite members"; + +"CreateGroupMembersPlaceholders" = "Enter Names"; + +"ChatDeleted" = "This chat was deleted by owner."; + +/* + * Location + */ + +"LocationTitle" = "Localização"; + + + +/* + * Wallpapers + */ + +"WallpapersTitle" = "Wallpapers"; + +"WallpapersPhoto" = "Photo Library"; + +/* + * Chat + */ + +"ChatPlaceholder" = "Insira texto..."; + +"ChatSend" = "Enviar"; + +"ChatNoGroupAccess" = "Você não é membro"; + +"ChatDeleted" = "This chat was deleted by owner."; + +"ChatJoin" = "Join"; + +/* + * Find + */ + +"FindTitle" = "Find People"; + +"FindFieldHint" = "phone number, email or nickname"; + +"FindHint" = "Enter phone number, email or nickname and press search"; + +"FindNotFound" = "Sorry, but we are unable to find person for this search query"; + +/* + * Placeholders + */ + +"Placeholder_Empty_Title" = "COnvide seus amigos"; + +"Placeholder_Empty_Message" = "Nenhum dos seus contatos usa {appname}. Use o botão abaixo para convidá-los."; + +"Placeholder_Empty_Action" = "AVISE UM(A) AMIGO(A)"; + +"Placeholder_Empty_Message2" = "ou adicione um contato manualmente"; + +"Placeholder_Empty_Action2" = "ADICIONAR CONTATO"; + +"Placeholder_Loading_Title" = "Sincronizando"; + +"Placeholder_Loading_Message" = "Por favor, espero um pouco enquanto habilitamos seu aplicativo."; + +"Placeholder_Contacts_Title" = "Convide seus amigos(as)"; + +"Placeholder_Contacts_Message" = "Nenhum dos seus contatos usa {appname}. Use o botão abaixo para convidá-los."; + +"Placeholder_Contacts_Action" = "AVISE UM(A) AMIGO(A)"; + +"Placeholder_Contacts_Message2" = "ou adicione um contato manualmente usando o botão de mais no canto superior direito"; + +"Placeholder_Dialogs_Title" = "Começar a conversar"; + +"Placeholder_Dialogs_Message" = "Escolha um contato da sua lista ou pessione o botão de escrita no canto superior direito para começar a conversas imediatamente."; + +"Placeholder_Group_Title" = "Não é membro"; + +"Placeholder_Group_Message" = "Infelizmente você não é menro desse grupo."; + +"Placeholder_Location_Title" = "Ativar localização"; + +"Placeholder_Location_Message" = "Ative os Serviços de Localização em configurações do dispositivo para partilhar a sua localização."; + + +/* + * Welcome + */ + +"WelcomeTitle" = "Bem vindo ao {app_name}!"; + +"WelcomeTagline" = "Mensageiro rápido e gratuido"; + +"WelcomeSignUp" = "Entrar"; + +"WelcomeLogIn" = "Entrar"; + + +/* + * Auth + */ + +"AuthUnsupported" = "Essa conta não é suportada nesta versão do {app_name}. Favor atualizar para logar nessa conta."; + +"AuthLoginTitle" = "Login no {app_name}"; + +"AuthLoginPhone" = "Fone"; + +"AuthLoginEmail" = "E-mail"; + +"AuthLoginPhoneEmail" = "Fone ou E-mail"; + +"AuthNameTitle" = "Olá! Qual o seu nome?"; + +"AuthNamePlaceholder" = "Nome completo"; + +"AuthPhoneTitle" = "Qual é o seu número de telefone?"; + +"AuthPhoneUseEmail" = "Use e-mail"; + +"AuthPhoneHint" = "Nós precisamos do seu número de telefone para garantir a segurança de seus dados pessoais."; + +"AuthPhonePlaceholder" = "Número do Telefone"; + +"AuthCountryTitle" = "Código do País"; + +"AuthEmailTitle" = "Qual é o seu e-mail?"; + +"AuthEmailHint" = "Nós não vamos te enviar spam."; + +"AuthEmailPlaceholder" = "Seu e-mail"; + +"AuthEmailUsePhone" = "Use o telefone"; + +"AuthDisclaimer" = "Ao registrar-se, você concorda com os Termos de Serviço e a Política de Privacidade."; + +"AuthDisclaimerTosOnly" = "Ao registrar-se, você concorda com os Termos de Serviço."; + +"AuthDisclaimerPrivacyOnly" = "Ao registrar-se, você concorda com a Política de Privacidade."; + +"AuthDisclaimerToS" = "Termos de Serviço"; + +"AuthDisclaimerPrivacy" = "Política de Privacidade"; + +"AuthOTPEmailTitle" = "Confirme seu e-mail"; + +"AuthOTPPhoneTitle" = "Confirme seu telefone"; + +"AuthOTPEmailHint" = "Nós lhe enviamos um código de confirmação.\nDigite ele abaixo."; + +"AuthOTPPhoneHint" = "Nós lhe enviamos um código de confirmação.\nDigite ele abaixo."; + +"AuthOTPPlaceholder" = "Código de Confirmação"; + +"AuthOTPNoCode" = "Não recebeu o código?"; + +"AuthOTPCallHint" = "{app_name} irá ligar para você em {time}"; + + + +/* + * Common Elements + */ + +"CurrentLocale" = "pt-BR"; + +"InviteText" = "Olá! Vamos mudar para o {appname}! {link}"; + +"PhotoRemove" = "Remover Foto"; + +"PhotoRemoveGroupMessage" = "Você tem certeza que quer to remover a foto do grupo? Alguns membros poderão não gostar."; + +"PhotoCamera" = "Tirar Foto ou Vídeo"; + +"PhotoLibrary" = "Biblioteca de Midias"; + +"ShareLocation" = "Localização"; + +"ShareContact" = "Compartilhar contato"; + +"SendDocument" = "Documento"; + +/* + * Navigation + */ + +"NavigationEdit" = "Editar"; + +"NavigationDone" = "Feito"; + +"NavigationCancel" = "Cancelar"; + +"NavigationBack" = ""; + +"NavigationNext" = "Próximo"; + +"NavigationSave" = "Salvar"; + +"NavigationFind" = "Find"; + +/* + * Alerts + */ + +"AlertCancel" = "Cancelar"; + +"AlertNext" = "Próximo"; + +"AlertSave" = "Salvar"; + +"AlertOk" = "OK"; + +"AlertSet" = "Set"; + +"AlertYes" = "Sim"; + +"AlertNo" = "Não"; + +"AlertError" = "Error"; + +"AlertTryAgain" = "Try Again"; + +"AlertInvite" = "Invite"; + +"UnsupportedContent" = "Mensagem não suportada nesta versão. Por favor espere por uma atualização para ver esta mensagem."; + +/* + * Actions + */ + +"ActionCopyLink" = "Copiar Link"; + +"ActionRevokeLink" = "Remover Link"; + +"ActionShareLink" = "Compartilhar Link"; + +"AlertLinkCopied" = "Link copiado para a área de transferência."; + +"ActionOpenLink" = "Link Aberto"; + +"ActionCancel" = "Cancelar"; + +"ActionAddPhoto1" = "adicionar"; + +"ActionAddPhoto2" = "foto"; + +"ActionOpenCode" = "View Code"; + +"ActionMute" = "Mute"; + +"ActionUnmute" = "Unmute"; + + +"ActionDelete" = "Delete"; + +"ActionDeleteMessage" = "Are you sure want to delete chat?"; + + +"ActionDeleteChannel" = "Delete Channel"; + +"ActionDeleteChannelMessage" = "Wait! Deleting this channel will remove all members and all messages will be lost. Delete the channel anyway?"; + +"ActionDeleteGroup" = "Delete Group"; + +"ActionDeleteGroupMessage" = "Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?"; + + +"ActionLeaveChannel" = "Leave Channel"; + +"ActionLeaveChannelMessage" = "Are you sure want to leave channel?"; + +"ActionLeaveChannelAction" = "Leave"; + + + +"ActionDeleteAndExit" = "Delete and Exit"; + +"ActionDeleteAndExitMessage" = "Are you sure want to exit group and delete all messages?"; + +"ActionDeleteAndExitAction" = "Exit"; + + + +"ActionClearHistory" = "Clear History"; + +"ActionClearHistoryMessage" = "Are you sure want to clear history?"; + +"ActionClearHistoryAction" = "Clear"; + +/* + * Network + */ + +"StatusConnecting" = "Conectar..."; + +"StatusSyncing" = "Sincronizando..."; + +/* + * Errors + */ + +"ErrorPhoneIncorrect" = "Número de telefone inválido. Por favor tente de novo."; + +"ErrorCodeExpired" = "Código expirou. Por favor reinicie a autenticação."; + +"ErrorUnableToJoin" = "Unable to join to group"; + +"ErrorUnableToCall" = "Unable to call this number"; diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/.DS_Store b/actor-sdk/sdk-core-ios/ActorSDK/Sources/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b982f812ccad4723d887fe8c285e383ea727883e GIT binary patch literal 6148 zcmeH~F^)nK zk%7+FOW6aI$5DvP7ju? z7GsFlqn#{yT}`&m-VV#*!}8ANQw+^|JFGCFSq&&i0Vyz1VA=E0&;KL+ulaw{qEre< zfq$le4Ttk#&zH)x_1Eip{gPE*H#!-YGrau-F!7^!Ll5JA@da6vt&-s{B0-Uoa=*Y2Rv}cBRCEZ^AO#kMP|#h+w;9_Dy6BRY0*z1h-1yHD(-XB;i|Xn4gnw)n)`r225exfkR#yzmgP(p4Tm&u^Xok@2ad6kOERb3P=Gda7+RAY`6J&qM{U#0#e{t0slS}x?}A) zB*v$MAw~e=jOj4m$1FiCo*>qaLn1RYODZv`)<+CWI`gI1)s91A(qVBj_vt5FpHM7L zXTC%^tR^Z-0V%Mrz-cZQ-v4jtN9O;1l2%ec3j8YtY__^vE%{2lw@zNpdu^dV(0`1z oQO*#pm>8{?3vb1jqq^evd|o>ai9u&R=tTVpxGpj&@D~bv1DIYK#Q*>R literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Promises.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Promises.swift index f24a2d91b3..053a6ba4a7 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Promises.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Promises.swift @@ -5,7 +5,7 @@ import Foundation import MBProgressHUD -extension ARPromise { +public extension ARPromise { func startUserAction(_ ignore: [String] = []) -> ARPromise { diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index 37b15265c7..454f358bba 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -7,32 +7,32 @@ import akka.http.scaladsl.util.FastFuture import cats.data.Xor import com.github.ghik.silencer.silent import im.actor.api.rpc.PeerHelpers._ -import im.actor.api.rpc.Refs.{ApiGroupOutPeer, ResponseSeq} +import im.actor.api.rpc.Refs.{ ApiGroupOutPeer, ResponseSeq } import im.actor.api.rpc._ import im.actor.api.rpc.files.ApiFileLocation import im.actor.api.rpc.groups._ -import im.actor.api.rpc.misc.{ResponseSeq, ResponseSeqDate, ResponseVoid} -import im.actor.api.rpc.peers.{ApiGroupOutPeer, ApiUserOutPeer} +import im.actor.api.rpc.misc.{ ResponseSeq, ResponseSeqDate, ResponseVoid } +import im.actor.api.rpc.peers.{ ApiGroupOutPeer, ApiUserOutPeer } import im.actor.api.rpc.sequence.ApiUpdateOptimization import im.actor.api.rpc.users.ApiUser import im.actor.concurrent.FutureExt import im.actor.server.acl.ACLUtils import im.actor.server.db.DbExtension import im.actor.server.dialog.DialogExtension -import im.actor.server.file.{FileErrors, ImageUtils} +import im.actor.server.file.{ FileErrors, ImageUtils } import im.actor.server.group._ import im.actor.server.model.GroupInviteToken import im.actor.server.names.GlobalNamesStorageKeyValueStorage -import im.actor.server.persist.{GroupInviteTokenRepo, GroupUserRepo} +import im.actor.server.persist.{ GroupInviteTokenRepo, GroupUserRepo } import im.actor.server.presences.GroupPresenceExtension -import im.actor.server.sequence.{SeqState, SeqStateDate, SeqUpdatesExtension} +import im.actor.server.sequence.{ SeqState, SeqStateDate, SeqUpdatesExtension } import im.actor.server.user.UserExtension import im.actor.util.ThreadLocalSecureRandom -import im.actor.util.misc.{IdUtils, StringUtils} +import im.actor.util.misc.{ IdUtils, StringUtils } import slick.dbio.DBIO import slick.driver.PostgresDriver.api._ -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.{ ExecutionContext, Future } final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit actorSystem: ActorSystem) extends GroupsService { @@ -650,10 +650,10 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act } /** - * Join group by peer without a necessity of invite - * - * @param groupPeer Groups peer - */ + * Join group by peer without a necessity of invite + * + * @param groupPeer Groups peer + */ override protected def doHandleJoinGroupByPeer2(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = { authorized(clientData) { implicit client ⇒ withGroupOutPeer(groupPeer) { @@ -671,5 +671,6 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act action.value } + } } } diff --git a/actor-server/sbt b/actor-server/sbt index 3214e85315..bf6a032af9 100755 --- a/actor-server/sbt +++ b/actor-server/sbt @@ -1,3 +1,3 @@ #!/bin/bash -SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M" -java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@" \ No newline at end of file +SBT_OPTS="-Xms512M -Xmx2G -Xss2M -XX:+CMSClassUnloadingEnabled" +java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@" From 772147a1d616c68590548df3c61c6e4636e001b1 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 16 Nov 2016 16:29:06 -0200 Subject: [PATCH 151/253] alteracoes --- .../server/api/rpc/service/groups/GroupsServiceImpl.scala | 1 - .../server/api/rpc/service/survey/SurveyServiceImpl.scala | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index 454f358bba..38fe7c9e4f 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -7,7 +7,6 @@ import akka.http.scaladsl.util.FastFuture import cats.data.Xor import com.github.ghik.silencer.silent import im.actor.api.rpc.PeerHelpers._ -import im.actor.api.rpc.Refs.{ ApiGroupOutPeer, ResponseSeq } import im.actor.api.rpc._ import im.actor.api.rpc.files.ApiFileLocation import im.actor.api.rpc.groups._ diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala index 2baafef52e..3b39a33a8f 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala @@ -7,14 +7,13 @@ import akka.http.scaladsl.util.FastFuture import cats.data.Xor import com.github.ghik.silencer.silent import im.actor.api.rpc.PeerHelpers._ -import im.actor.api.rpc.Refs.{ ApiSurvey } import im.actor.api.rpc._ import im.actor.api.rpc.files.ApiFileLocation import im.actor.api.rpc.groups._ import im.actor.api.rpc.misc.{ ResponseSeq, ResponseSeqDate, ResponseVoid } import im.actor.api.rpc.peers.{ ApiGroupOutPeer, ApiUserOutPeer } import im.actor.api.rpc.sequence.ApiUpdateOptimization -import im.actor.api.rpc.surveys.SurveysService +import im.actor.api.rpc.surveys.{ ApiSurvey, SurveysService } import im.actor.api.rpc.users.ApiUser import im.actor.concurrent.FutureExt import im.actor.server.acl.ACLUtils @@ -37,7 +36,7 @@ import scala.concurrent.{ ExecutionContext, Future } /** * Created by 98379720172 on 16/11/16. */ -class SurveyServiceImpl()(implicit actorSystem: ActorSystem) extends SurveysService { +final class SurveyServiceImpl()(implicit actorSystem: ActorSystem) extends SurveysService { override implicit val ec: ExecutionContext = actorSystem.dispatcher From b380221631617e6df41034cd20b02cef3777e634 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 17 Nov 2016 15:34:42 -0200 Subject: [PATCH 152/253] alteracoes --- .../server/api/rpc/service/groups/GroupsServiceImpl.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index 38fe7c9e4f..82375b06c6 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -655,7 +655,7 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act */ override protected def doHandleJoinGroupByPeer2(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = { authorized(clientData) { implicit client ⇒ - withGroupOutPeer(groupPeer) { + // withGroupOutPeer(groupPeer) { val action = for { apiGroup ← fromFuture(groupExt.getApiStruct(groupPeer.groupId, client.userId)) _ ← fromBoolean(GroupRpcErrors.CantJoinGroup)(canJoin(apiGroup.permissions)) @@ -669,7 +669,7 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act } yield ResponseSeq(seq, state.toByteArray) action.value - } + // } } } } From 64cf262f787aa8098217d4331b3ce675c5dff7bf Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 17 Nov 2016 16:06:53 -0200 Subject: [PATCH 153/253] alteracoes --- actor-sdk/sdk-api/actor.json | 6 +- .../models/im/actor/api/scheme.mps | 10 ++-- .../im/actor/core/api/parser/RpcParser.java | 2 +- .../api/rpc/RequestJoinGroupByGroupId.java | 60 +++++++++++++++++++ .../actor-core/src/main/actor-api/actor.json | 6 +- 5 files changed, 72 insertions(+), 12 deletions(-) create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestJoinGroupByGroupId.java diff --git a/actor-sdk/sdk-api/actor.json b/actor-sdk/sdk-api/actor.json index fe74653bd4..49d5695dab 100644 --- a/actor-sdk/sdk-api/actor.json +++ b/actor-sdk/sdk-api/actor.json @@ -1935,12 +1935,12 @@ "Join group by peer",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ {"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} ]}},{"type":"rpc","content":{ -"name":"JoinGroupByPeer2", +"name":"JoinGroupByGroupId", "header":44561, "response":{"type":"reference","name":"Seq"}, "doc":[ -"Join group by peer without a necessity of invite",{"type":"reference","argument":"groupPeer","category":"hidden","description":"Groups peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +"Join group by peer without a necessity of invite",{"type":"reference","argument":"groupId","category":"hidden","description":"Groups peer"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} ]}},{"type":"comment","content":"Administration"},{"type":"rpc","content":{ "name":"MakeUserAdmin", "header":2784, diff --git a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps index 9515c48f1b..59c90f9d6d 100644 --- a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps +++ b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps @@ -8978,12 +8978,12 @@
- + - - - + + + @@ -8997,7 +8997,7 @@ - + diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java index 4b498af149..923a3004e9 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java @@ -90,7 +90,7 @@ public RpcScope read(int type, byte[] payload) throws IOException { case 2721: return RequestLeaveAndDelete.fromBytes(payload); case 71: return RequestKickUser.fromBytes(payload); case 2722: return RequestJoinGroupByPeer.fromBytes(payload); - case 44561: return RequestJoinGroupByPeer2.fromBytes(payload); + case 44561: return RequestJoinGroupByGroupId.fromBytes(payload); case 2784: return RequestMakeUserAdmin.fromBytes(payload); case 2791: return RequestDismissUserAdmin.fromBytes(payload); case 2789: return RequestTransferOwnership.fromBytes(payload); diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestJoinGroupByGroupId.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestJoinGroupByGroupId.java new file mode 100644 index 0000000000..130fd93a31 --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestJoinGroupByGroupId.java @@ -0,0 +1,60 @@ +package im.actor.core.api.rpc; +/* + * Generated by the Actor API Scheme generator. DO NOT EDIT! + */ + +import im.actor.runtime.bser.*; +import im.actor.runtime.collections.*; +import static im.actor.runtime.bser.Utils.*; +import im.actor.core.network.parser.*; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; +import com.google.j2objc.annotations.ObjectiveCName; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import im.actor.core.api.*; + +public class RequestJoinGroupByGroupId extends Request { + + public static final int HEADER = 0xae11; + public static RequestJoinGroupByGroupId fromBytes(byte[] data) throws IOException { + return Bser.parse(new RequestJoinGroupByGroupId(), data); + } + + private int groupId; + + public RequestJoinGroupByGroupId(int groupId) { + this.groupId = groupId; + } + + public RequestJoinGroupByGroupId() { + + } + + public int getGroupId() { + return this.groupId; + } + + @Override + public void parse(BserValues values) throws IOException { + this.groupId = values.getInt(1); + } + + @Override + public void serialize(BserWriter writer) throws IOException { + writer.writeInt(1, this.groupId); + } + + @Override + public String toString() { + String res = "rpc JoinGroupByGroupId{"; + res += "}"; + return res; + } + + @Override + public int getHeaderKey() { + return HEADER; + } +} diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index fe74653bd4..49d5695dab 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -1935,12 +1935,12 @@ "Join group by peer",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ {"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} ]}},{"type":"rpc","content":{ -"name":"JoinGroupByPeer2", +"name":"JoinGroupByGroupId", "header":44561, "response":{"type":"reference","name":"Seq"}, "doc":[ -"Join group by peer without a necessity of invite",{"type":"reference","argument":"groupPeer","category":"hidden","description":"Groups peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +"Join group by peer without a necessity of invite",{"type":"reference","argument":"groupId","category":"hidden","description":"Groups peer"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} ]}},{"type":"comment","content":"Administration"},{"type":"rpc","content":{ "name":"MakeUserAdmin", "header":2784, From 84bc325bee60db2ebd9aeb56ca0a4af5d2a0ddf7 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 17 Nov 2016 16:23:32 -0200 Subject: [PATCH 154/253] alteracoes --- .../main/java/im/actor/core/Messenger.java | 8 +-- .../core/api/rpc/RequestJoinGroupByPeer2.java | 64 ------------------- .../core/modules/groups/GroupsModule.java | 8 +-- .../service/groups/GroupsServiceImpl.scala | 32 +++++----- 4 files changed, 22 insertions(+), 90 deletions(-) delete mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestJoinGroupByPeer2.java diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/Messenger.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/Messenger.java index f6e9a36dab..92a3b602d5 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/Messenger.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/Messenger.java @@ -1769,15 +1769,15 @@ public Promise joinGroup(int gid) { } /** - * Join group + * Join group by Id * * @param gid group's id * @return Promise of Void */ @NotNull - @ObjectiveCName("joinGroupWithGid2:") - public Promise joinGroup2(int gid) { - return modules.getGroupsModule().joinGroup2(gid); + @ObjectiveCName("joinGroupByGid:") + public Promise joinGroupById(int gid) { + return modules.getGroupsModule().joinGroupById(gid); } /** diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestJoinGroupByPeer2.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestJoinGroupByPeer2.java deleted file mode 100644 index 66693ba68c..0000000000 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestJoinGroupByPeer2.java +++ /dev/null @@ -1,64 +0,0 @@ -package im.actor.core.api.rpc; -/* - * Generated by the Actor API Scheme generator. DO NOT EDIT! - */ - -import im.actor.runtime.bser.*; -import im.actor.runtime.collections.*; -import static im.actor.runtime.bser.Utils.*; -import im.actor.core.network.parser.*; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.NotNull; -import com.google.j2objc.annotations.ObjectiveCName; -import java.io.IOException; -import java.util.List; -import java.util.ArrayList; -import im.actor.core.api.*; - -public class RequestJoinGroupByPeer2 extends Request { - - public static final int HEADER = 0xae11; - public static RequestJoinGroupByPeer2 fromBytes(byte[] data) throws IOException { - return Bser.parse(new RequestJoinGroupByPeer2(), data); - } - - private ApiGroupOutPeer groupPeer; - - public RequestJoinGroupByPeer2(@NotNull ApiGroupOutPeer groupPeer) { - this.groupPeer = groupPeer; - } - - public RequestJoinGroupByPeer2() { - - } - - @NotNull - public ApiGroupOutPeer getGroupPeer() { - return this.groupPeer; - } - - @Override - public void parse(BserValues values) throws IOException { - this.groupPeer = values.getObj(1, new ApiGroupOutPeer()); - } - - @Override - public void serialize(BserWriter writer) throws IOException { - if (this.groupPeer == null) { - throw new IOException(); - } - writer.writeObject(1, this.groupPeer); - } - - @Override - public String toString() { - String res = "rpc JoinGroupByPeer2{"; - res += "}"; - return res; - } - - @Override - public int getHeaderKey() { - return HEADER; - } -} diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/groups/GroupsModule.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/groups/GroupsModule.java index 404ee789ac..f04089ce16 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/groups/GroupsModule.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/groups/GroupsModule.java @@ -8,7 +8,6 @@ import java.util.HashMap; import java.util.List; -import im.actor.core.api.ApiAdminSettings; import im.actor.core.api.ApiGroupOutPeer; import im.actor.core.api.ApiGroupType; import im.actor.core.api.ApiMember; @@ -26,8 +25,8 @@ import im.actor.core.api.rpc.RequestGetIntegrationToken; import im.actor.core.api.rpc.RequestInviteUser; import im.actor.core.api.rpc.RequestJoinGroup; +import im.actor.core.api.rpc.RequestJoinGroupByGroupId; import im.actor.core.api.rpc.RequestJoinGroupByPeer; -import im.actor.core.api.rpc.RequestJoinGroupByPeer2; import im.actor.core.api.rpc.RequestKickUser; import im.actor.core.api.rpc.RequestLeaveAndDelete; import im.actor.core.api.rpc.RequestLeaveGroup; @@ -363,9 +362,8 @@ public Promise joinGroup(int gid) { .map(r -> null); } - public Promise joinGroup2(int gid) { - return api(new RequestJoinGroupByPeer2( - new ApiGroupOutPeer(gid, 0L))) + public Promise joinGroupById(int gid) { + return api(new RequestJoinGroupByGroupId(gid)) .chain(r -> updates().waitForUpdate(r.getSeq())) .map(r -> null); } diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala index 82375b06c6..77d2c470a7 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groups/GroupsServiceImpl.scala @@ -649,27 +649,25 @@ final class GroupsServiceImpl(groupInviteConfig: GroupInviteConfig)(implicit act } /** - * Join group by peer without a necessity of invite + * Join group by groupid without a necessity of invite * - * @param groupPeer Groups peer + * @param groupId Groups peer */ - override protected def doHandleJoinGroupByPeer2(groupPeer: ApiGroupOutPeer, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = { + override protected def doHandleJoinGroupByGroupId(groupId: Int, clientData: ClientData): Future[HandlerResult[ResponseSeq]] = { authorized(clientData) { implicit client ⇒ - // withGroupOutPeer(groupPeer) { - val action = for { - apiGroup ← fromFuture(groupExt.getApiStruct(groupPeer.groupId, client.userId)) - _ ← fromBoolean(GroupRpcErrors.CantJoinGroup)(canJoin(apiGroup.permissions)) - joinResp ← fromFuture(groupExt.joinGroup( - groupId = groupPeer.groupId, - joiningUserId = client.userId, - joiningUserAuthId = client.authId, - invitingUserId = None - )) - SeqStateDate(seq, state, _) = joinResp._1 - } yield ResponseSeq(seq, state.toByteArray) + val action = for { + apiGroup ← fromFuture(groupExt.getApiStruct(groupId, client.userId)) + _ ← fromBoolean(GroupRpcErrors.CantJoinGroup)(canJoin(apiGroup.permissions)) + joinResp ← fromFuture(groupExt.joinGroup( + groupId = groupId, + joiningUserId = client.userId, + joiningUserAuthId = client.authId, + invitingUserId = None + )) + SeqStateDate(seq, state, _) = joinResp._1 + } yield ResponseSeq(seq, state.toByteArray) - action.value - // } + action.value } } } From 65196775f70e8fa411fcd5f2b3c5eb0d1aea6621 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 17 Nov 2016 23:22:13 -0200 Subject: [PATCH 155/253] alteracoes --- actor-server/version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/version.sbt b/actor-server/version.sbt index f124c4c934..949efeff7a 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.8-SNAPSHOT" +version in ThisBuild := "3.0.9-SNAPSHOT" From 717c059945e202a3abd72d657192511f622e7acc Mon Sep 17 00:00:00 2001 From: diego Date: Sat, 19 Nov 2016 13:49:34 -0200 Subject: [PATCH 156/253] showFragment with animatnio --- .../activity/BaseFragmentActivity.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseFragmentActivity.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseFragmentActivity.java index 655ac60332..f901078c97 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseFragmentActivity.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseFragmentActivity.java @@ -17,6 +17,20 @@ public class BaseFragmentActivity extends BaseActivity { + public class CompleteCustonAnimation{ + int enter; + int exit; + int popEnter; + int popExit; + + public CompleteCustonAnimation(int enter, int exit, int popEnter, int popExit) { + this.enter = enter; + this.exit = exit; + this.popEnter = popEnter; + this.popExit = popExit; + } + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -77,11 +91,24 @@ public void showNextFragment(Fragment fragment, boolean addToBackStack) { transaction.commit(); } + public void showNextFragment(Fragment fragment, boolean addToBackStack, CompleteCustonAnimation cca) { + FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + transaction.replace(R.id.content_frame, fragment); + if (addToBackStack) { + transaction.addToBackStack(null); + } + + if(cca != null) + transaction.setCustomAnimations(cca.enter, cca.exit, cca.popEnter, cca.popExit); + + transaction.commit(); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: - finish(); + onBackPressed(); return true; } return false; From f8247e6c426d6d864a9972cbe7cd88b332333a17 Mon Sep 17 00:00:00 2001 From: diego Date: Sat, 19 Nov 2016 14:34:56 -0200 Subject: [PATCH 157/253] alteracoes --- .../sdk/controllers/activity/BaseFragmentActivity.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseFragmentActivity.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseFragmentActivity.java index f901078c97..c318bb791b 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseFragmentActivity.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/activity/BaseFragmentActivity.java @@ -17,7 +17,7 @@ public class BaseFragmentActivity extends BaseActivity { - public class CompleteCustonAnimation{ + public static class CompleteCustonAnimation{ int enter; int exit; int popEnter; @@ -93,14 +93,14 @@ public void showNextFragment(Fragment fragment, boolean addToBackStack) { public void showNextFragment(Fragment fragment, boolean addToBackStack, CompleteCustonAnimation cca) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + if(cca != null) + transaction.setCustomAnimations(cca.enter, cca.exit, cca.popEnter, cca.popExit); + transaction.replace(R.id.content_frame, fragment); if (addToBackStack) { transaction.addToBackStack(null); } - if(cca != null) - transaction.setCustomAnimations(cca.enter, cca.exit, cca.popEnter, cca.popExit); - transaction.commit(); } From e36146cf6a3a968450154db78f378560114464e8 Mon Sep 17 00:00:00 2001 From: Gleb Putintsev Date: Sat, 19 Nov 2016 21:29:00 +0300 Subject: [PATCH 158/253] chore(iOS): public renderer methods --- .../Sources/Views/Cells/AABackgroundCellRenderer.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Views/Cells/AABackgroundCellRenderer.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Views/Cells/AABackgroundCellRenderer.swift index 2349f4e431..fff955d1fd 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Views/Cells/AABackgroundCellRenderer.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Views/Cells/AABackgroundCellRenderer.swift @@ -18,7 +18,7 @@ open class AABackgroundCellRenderer where T: AnyObject, P: AnyObject, P: E self.receiver = receiver } - func requestRender(_ config: P) -> Bool { + public func requestRender(_ config: P) -> Bool { // Ignore if not resized if requestedConfig == config { return false @@ -72,7 +72,7 @@ open class AABackgroundCellRenderer where T: AnyObject, P: AnyObject, P: E receiver(renderer(config)) } - func cancelRender(_ wasPresented: Bool = false) { + public func cancelRender(_ wasPresented: Bool = false) { generation += 1 let oldConfig = requestedConfig requestedConfig = nil From 54252ce32ffe964434a8e52cf08f3af5ff1f73d0 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 23 Nov 2016 09:53:05 -0200 Subject: [PATCH 159/253] alteracoes --- .../models/im/actor/api/scheme.mps | 56 +++++++++++++++---- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps index 59c90f9d6d..417db3f790 100644 --- a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps +++ b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps @@ -18533,12 +18533,12 @@ - + - + @@ -18558,23 +18558,50 @@ - + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -18584,6 +18611,15 @@ + + + + + + + + + From e09294f5948bbe906e2b6b1b215af37e39e92189 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 23 Nov 2016 16:48:35 -0200 Subject: [PATCH 160/253] alteracoes --- actor-sdk/.DS_Store | Bin 10244 -> 10244 bytes actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../ActorSDK/Sources/ActorSDKDelegate.swift | 8 +++++++- .../Recent/AARecentViewController.swift | 18 ++++++++++++++---- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index 6e1c73bb1d289db374d770f60702342c940cfef7..7ff794b8f99193b3b38a15152bd88472caaa991d 100644 GIT binary patch delta 956 zcmb`GNla5g7{})?i|_fQycTTX6=(^YKm%QnMZzLr!lDKR0s^9K-&0@cf)r4w1)>~` z+rg(O0b|0!7%^&sXoAbZgG)FGy?F3oOguu=i}9k|GC-Pbym(1xqN92I) z@<<&gWpU{EL1(}%`9#@wtXmc(-;jJ%mIhfZ=Gb#{UGj-xd1#c+ zVi>hohG1s-C8k$&4oQ3cVq~WnB|?Uf%`iRU1O@ej5}nmLmnY=2ypw4U$YYY)!@?D@ ze1L85mwmtY+BgTpi)@F->5@EZyHc*4;ak|w5os_W`+aJ$lB;60u&`Zjzt>9-9#G4* zLLI}uVfrG6QkHdGY~%t;ernc4R;`sp2M@xKbYdlSq?z=Q0WwN1kZE#@JR(cvF?mT= z$QpT1K9O~@LB5i2Z*op*bU_c547_l8T*x^788qtIn?7@C?qX&o32RA(M!jA!r zU;>jkgR{7hjjOnZ8<@d77H|*u@c=LI8t<@*HH7g2pRu8=r}ok;P0=iK|H?8`r-|g3 zl)O!EFy|B$Im)Z*t{6KQ&eTE8NvD(zZHh8%G`e&1OdJmy3mc}f84L4FCVmr5EV3xJ zQWir4P+7?i&cw%2*D9^p$#Hxv4MU~XHI&9v?JBKrpp-=31*?29CjGJbPnU1WD)~q~ z{vbaQM;+>@KQnS+K`E+Hi+VI*H};_w2hfIgYVR;2w5&zJKYFGpQsC8|NPsK?_I5^1DVSydTBYdV-=SdmBS`vZ#4>pvRZ7;%rpBB`G;Q+gVs#8jNOoLrg5C z>asq4d{GoP3r3S9wGMSD14ByS6tfFL(7^Q3G*PmNY*A?U@Q!spk8)CxJ)4P?DD4u2 zwvBq}pv>=DnWjoq8|eo!FgQ3MNHrt>{Gabo4AD;Jj5eB#vESa4L)E6L43qltm3=6 zW@_h{){4rCI9k0ersE%&pQALvopJHD77ySgkCCvu-T1vUw89nY1j|Nv&)L7tzv!LP}W}C)3iRVxH=_jSw`OBqJ@Q z<)R*oA|rx*Yv{!8+O56*B{9Ao#apsMzHx@%AkcAw7(V_aq#_gfIEX_iLpctk9!JoG zX0-6(cfyS>^lSq7Fp4pp!C9QcWn95kjxfm$rn$jw+`(Pk!~Ix1z$_N9h-X;FbG*Q7 Wyq}-3ctYoOwqD(T{&C@3NPhsKQtzDr diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index 50c03672fd..6ca667da2f 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.2" + s.version = "3.0.457.3" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift index fa6e48d793..db158111d3 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDKDelegate.swift @@ -28,6 +28,9 @@ public protocol ActorSDKDelegate { /// Contacts controller func actorControllerForContacts() -> UIViewController? + //Compose controller + func actiorControllerForCompose() -> UIViewController? + /// Dialogs controller func actorControllerForDialogs() -> UIViewController? @@ -40,7 +43,6 @@ public protocol ActorSDKDelegate { /// Root Intial controller func actorRootInitialControllerIndex() -> Int? - /// Configuration of bubble cells func actorConfigureBubbleLayouters(_ builtIn: [AABubbleLayouter]) -> [AABubbleLayouter] @@ -98,6 +100,10 @@ open class ActorSDKDelegateDefault: NSObject, ActorSDKDelegate { return nil } + open func actiorControllerForCompose() -> UIViewController? { + return nil + } + open func actorControllerForSettings() -> UIViewController? { return nil } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Recent/AARecentViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Recent/AARecentViewController.swift index 2138b077d4..fc28120718 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Recent/AARecentViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Recent/AARecentViewController.swift @@ -65,11 +65,21 @@ open class AARecentViewController: AADialogsListContentController, AADialogsList } open func compose() { - if AADevice.isiPad { - self.presentElegantViewController(AANavigationController(rootViewController: AAComposeController())) - } else { - navigateNext(AAComposeController()) + if let composeController = ActorSDK.sharedActor().delegate.actiorControllerForCompose() { + if AADevice.isiPad { + self.presentElegantViewController(AANavigationController(rootViewController: composeController)) + } else { + navigateNext(composeController) + } + }else{ + if AADevice.isiPad { + self.presentElegantViewController(AANavigationController(rootViewController: AAComposeController())) + } else { + navigateNext(AAComposeController()) + } } + + } // Tracking app state From 18483d39cd83f4439fb7547f538d4e12f3b46556 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 24 Nov 2016 14:31:44 -0200 Subject: [PATCH 161/253] alteracoes --- actor-server/project/Build.scala | 4 ++-- actor-server/sbt_debug | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100755 actor-server/sbt_debug diff --git a/actor-server/project/Build.scala b/actor-server/project/Build.scala index 7d27bc16d5..2daec442fa 100644 --- a/actor-server/project/Build.scala +++ b/actor-server/project/Build.scala @@ -171,8 +171,8 @@ object Build extends sbt.Build with Versioning with Releasing with Packaging { base = file("actor-cli"), settings = defaultSettingsServer ++ Revolver.settings ++ Seq( libraryDependencies ++= Dependencies.cli, - mainClass in Revolver.reStart := Some("im.actor.server.cli.ActorCliApp"), - mainClass in Compile := Some("im.actor.server.cli.ActorCliApp") + mainClass in Revolver.reStart := Some("im.actor.server.cli.ActorCli"), + mainClass in Compile := Some("im.actor.server.cli.ActorCli") ) ) .dependsOn(actorCore, actorFrontend) diff --git a/actor-server/sbt_debug b/actor-server/sbt_debug new file mode 100755 index 0000000000..29cfda6de6 --- /dev/null +++ b/actor-server/sbt_debug @@ -0,0 +1,3 @@ +#!/bin/bash +SBT_OPTS="-Xms512M -Xmx2048M -Xss1M -XX:+CMSClassUnloadingEnabled -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" +java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@" From df9bd92e947c554929bc0aadaa37b12ef11207b5 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 24 Nov 2016 15:47:53 -0200 Subject: [PATCH 162/253] alteracoes --- .../src/main/scala/im/actor/bots/BotMessages.scala | 5 +++++ .../actor/server/bot/services/BotsBotService.scala | 12 ++++++++++++ actor-server/project/Build.scala | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/actor-server/actor-bots-shared/src/main/scala/im/actor/bots/BotMessages.scala b/actor-server/actor-bots-shared/src/main/scala/im/actor/bots/BotMessages.scala index 294e3a7d95..f67c5bf691 100644 --- a/actor-server/actor-bots-shared/src/main/scala/im/actor/bots/BotMessages.scala +++ b/actor-server/actor-bots-shared/src/main/scala/im/actor/bots/BotMessages.scala @@ -374,6 +374,11 @@ object BotMessages { @beanGetter userId: Int ) extends ResponseBody + @key("BotToken") + final case class BotToken( + @beanGetter token: String + ) extends ResponseBody + @key("RegisterHook") final case class RegisterHook(@beanGetter name: String) extends RequestBody { override type Response = Container[String] diff --git a/actor-server/actor-bots/src/main/scala/im/actor/server/bot/services/BotsBotService.scala b/actor-server/actor-bots/src/main/scala/im/actor/server/bot/services/BotsBotService.scala index 98825e1ba9..e315b0b957 100644 --- a/actor-server/actor-bots/src/main/scala/im/actor/server/bot/services/BotsBotService.scala +++ b/actor-server/actor-bots/src/main/scala/im/actor/server/bot/services/BotsBotService.scala @@ -24,6 +24,18 @@ private[bot] final class BotsBotService(system: ActorSystem) extends BotServiceB } ) + // private def getToken(userId:Int, nickname: String) = RequestHandler[CreateBot, CreateBot#Response]( + // (botUserId: BotUserId, botAuthId: BotAuthId, botAuthSid: BotAuthSid) ⇒ + // ifIsAdmin(botUserId) { + // (for { + // token ← botExt.findToken(userId, nickname) + // } yield Right(BotToken(token))) recover { + // case UserErrors.NicknameTaken ⇒ + // Left(BotError(400, "USERNAME_TAKEN", Js.Obj(), None)) + // } + // } + // ) + override def handlers: PartialFunction[RequestBody, WeakRequestHandler] = { case CreateBot(nickname, name) ⇒ createBot(nickname, name).toWeak } diff --git a/actor-server/project/Build.scala b/actor-server/project/Build.scala index 2daec442fa..fa9dbe99fe 100644 --- a/actor-server/project/Build.scala +++ b/actor-server/project/Build.scala @@ -141,7 +141,7 @@ object Build extends sbt.Build with Versioning with Releasing with Packaging { settings = defaultSettingsServer ++ Seq(libraryDependencies ++= Dependencies.bots) ) - .dependsOn(actorCore, actorHttpApi, actorTestkit % "test") + .dependsOn(actorCore, actorHttpApi, actorBotsShared, actorTestkit % "test") lazy val actorBotsShared = Project( id = "actor-bots-shared", From e4a5651a2a18a2b4b2ee2afb4c7ed1d397e026c3 Mon Sep 17 00:00:00 2001 From: diego Date: Thu, 24 Nov 2016 19:14:51 -0200 Subject: [PATCH 163/253] alteracoes --- .../scala/im/actor/bots/BotMessages.scala | 11 +++++++++ .../server/bot/services/BotsBotService.scala | 23 ++++++++++--------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/actor-server/actor-bots-shared/src/main/scala/im/actor/bots/BotMessages.scala b/actor-server/actor-bots-shared/src/main/scala/im/actor/bots/BotMessages.scala index f67c5bf691..2e089a911d 100644 --- a/actor-server/actor-bots-shared/src/main/scala/im/actor/bots/BotMessages.scala +++ b/actor-server/actor-bots-shared/src/main/scala/im/actor/bots/BotMessages.scala @@ -379,6 +379,17 @@ object BotMessages { @beanGetter token: String ) extends ResponseBody + @key("GetBotToken") + final case class GetBotToken( + @beanGetter botUserId: Int, + @beanGetter nickName: String + ) extends RequestBody { + override type Response = BotToken + override val service = Services.Bots + + override def readResponse(obj: Js.Obj) = readJs[Response](obj) + } + @key("RegisterHook") final case class RegisterHook(@beanGetter name: String) extends RequestBody { override type Response = Container[String] diff --git a/actor-server/actor-bots/src/main/scala/im/actor/server/bot/services/BotsBotService.scala b/actor-server/actor-bots/src/main/scala/im/actor/server/bot/services/BotsBotService.scala index e315b0b957..f72bc1a9ee 100644 --- a/actor-server/actor-bots/src/main/scala/im/actor/server/bot/services/BotsBotService.scala +++ b/actor-server/actor-bots/src/main/scala/im/actor/server/bot/services/BotsBotService.scala @@ -24,19 +24,20 @@ private[bot] final class BotsBotService(system: ActorSystem) extends BotServiceB } ) - // private def getToken(userId:Int, nickname: String) = RequestHandler[CreateBot, CreateBot#Response]( - // (botUserId: BotUserId, botAuthId: BotAuthId, botAuthSid: BotAuthSid) ⇒ - // ifIsAdmin(botUserId) { - // (for { - // token ← botExt.findToken(userId, nickname) - // } yield Right(BotToken(token))) recover { - // case UserErrors.NicknameTaken ⇒ - // Left(BotError(400, "USERNAME_TAKEN", Js.Obj(), None)) - // } - // } - // ) + private def getToken(botUserId: BotUserId, nickname: String) = RequestHandler[GetBotToken, GetBotToken#Response]( + (botUserId: BotUserId, botAuthId: BotAuthId, botAuthSid: BotAuthSid) ⇒ + ifIsAdmin(botUserId) { + (for { + token ← botExt.findToken(botUserId, nickname) + } yield Right(BotToken(token.getOrElse("")))) recover { + case _ ⇒ + Left(BotError(400, "ERROR_GET_TOKEN", Js.Obj(), None)) + } + } + ) override def handlers: PartialFunction[RequestBody, WeakRequestHandler] = { case CreateBot(nickname, name) ⇒ createBot(nickname, name).toWeak + case GetBotToken(botUserId, nickName) ⇒ getToken(botUserId, nickName).toWeak } } From 605e28d5a84fc6a6103585858eeedfa2a08c3639 Mon Sep 17 00:00:00 2001 From: diego Date: Thu, 24 Nov 2016 20:01:33 -0200 Subject: [PATCH 164/253] alteracoes --- .../scala/im/actor/server/cli/ActorCli.scala | 33 +++++++++++++++++++ .../im/actor/server/cli/BotHandlers.scala | 5 +++ 2 files changed, 38 insertions(+) diff --git a/actor-server/actor-cli/src/main/scala/im/actor/server/cli/ActorCli.scala b/actor-server/actor-cli/src/main/scala/im/actor/server/cli/ActorCli.scala index 65b99fabb9..848cf5b485 100644 --- a/actor-server/actor-cli/src/main/scala/im/actor/server/cli/ActorCli.scala +++ b/actor-server/actor-cli/src/main/scala/im/actor/server/cli/ActorCli.scala @@ -1,5 +1,6 @@ package im.actor.server.cli +import java.lang.Throwable import java.net.InetAddress import akka.actor.{ ActorPath, ActorSystem } @@ -17,6 +18,7 @@ import scala.reflect.ClassTag private case class Config( command: String = "help", createBot: CreateBot = CreateBot(), + getBotToken: GetBotToken = GetBotToken(), updateIsAdmin: UpdateIsAdmin = UpdateIsAdmin(), httpToken: HttpToken = HttpToken(), key: Key = Key(), @@ -37,8 +39,17 @@ private[cli] case class CreateBot( override type Response = CreateBotResponse } +private[cli] case class GetBotToken( + botUserId: Int = 0, + nickName: String = "" +) extends Request { + override type Response = BotToken +} + private[cli] case class CreateBotResponse(token: String) +private[cli] case class BotToken(token: String) + private[cli] case class UpdateIsAdmin( userId: Int = 0, isAdmin: Boolean = false @@ -61,6 +72,7 @@ private case class HttpTokenCreateResponse(token: String) private object Commands { val Help = "help" val CreateBot = "create-bot" + val GetBotToken = "get-bot-token" val AdminGrant = "admin-grant" val AdminRevoke = "admin-revoke" val MigrateUserSequence = "migrate-user-sequence" @@ -89,6 +101,21 @@ object ActorCli extends App { c.copy(createBot = c.createBot.copy(isAdmin = true)) } ) + + cmd(Commands.GetBotToken) action { (_, c) ⇒ + c.copy(command = Commands.GetBotToken) + } children ( + opt[String]("host") abbr "h" optional () action { (x, c) ⇒ + c.copy(host = Some(x)) + }, + opt[Int]("botUserId") abbr "u" required () action { (x, c) ⇒ + c.copy(getBotToken = c.getBotToken.copy(botUserId = x)) + }, + opt[String]("nickName") abbr "n" required () action { (x, c) ⇒ + c.copy(getBotToken = c.getBotToken.copy(nickName = x)) + } + ) + cmd(Commands.AdminGrant) action { (_, c) ⇒ c.copy(command = Commands.AdminGrant) } children ( @@ -155,6 +182,8 @@ object ActorCli extends App { cmd(FastFuture.successful(parser.showUsage)) case Commands.CreateBot ⇒ cmd(handlers.createBot(config.createBot)) + case Commands.GetBotToken ⇒ + cmd(handlers.getBotToken(config.getBotToken)) case Commands.AdminGrant | Commands.AdminRevoke ⇒ cmd(handlers.updateIsAdmin(config.updateIsAdmin)) case Commands.MigrateUserSequence ⇒ @@ -170,6 +199,10 @@ object ActorCli extends App { def cmd(f: Future[Unit], timeout: Duration = 10.seconds): Unit = { try { Await.result(f, timeout) + } catch { + case e: Exception ⇒ { + e.printStackTrace() + } } finally { handlers.shutdown() } diff --git a/actor-server/actor-cli/src/main/scala/im/actor/server/cli/BotHandlers.scala b/actor-server/actor-cli/src/main/scala/im/actor/server/cli/BotHandlers.scala index 2038c984b4..975628cc87 100644 --- a/actor-server/actor-cli/src/main/scala/im/actor/server/cli/BotHandlers.scala +++ b/actor-server/actor-cli/src/main/scala/im/actor/server/cli/BotHandlers.scala @@ -9,4 +9,9 @@ private[cli] trait BotHandlers { for (resp ← request(BotService, rq)) yield println(s"Bot user created, token: ${resp.token}") } + + def getBotToken(rq: GetBotToken): Future[Unit] = { + for (resp ← request(BotService, rq)) + yield println(s"Bot token: ${resp.token}") + } } From f1635ed3642c53ea7a9d2476f708550eaf4bdf22 Mon Sep 17 00:00:00 2001 From: diego Date: Fri, 25 Nov 2016 00:10:56 -0200 Subject: [PATCH 165/253] alteracoes --- .../src/main/scala/im/actor/server/cli/ActorCli.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actor-server/actor-cli/src/main/scala/im/actor/server/cli/ActorCli.scala b/actor-server/actor-cli/src/main/scala/im/actor/server/cli/ActorCli.scala index 848cf5b485..18ed7a50a2 100644 --- a/actor-server/actor-cli/src/main/scala/im/actor/server/cli/ActorCli.scala +++ b/actor-server/actor-cli/src/main/scala/im/actor/server/cli/ActorCli.scala @@ -196,7 +196,7 @@ object ActorCli extends App { } } - def cmd(f: Future[Unit], timeout: Duration = 10.seconds): Unit = { + def cmd(f: Future[Unit], timeout: Duration = 60.seconds): Unit = { try { Await.result(f, timeout) } catch { @@ -230,7 +230,7 @@ final class CliHandlers(host: Option[String]) extends BotHandlers with UsersHand protected implicit lazy val ec: ExecutionContext = system.dispatcher - protected implicit val timeout: Timeout = Timeout(10.seconds) + protected implicit val timeout: Timeout = Timeout(60.seconds) def shutdown(): Unit = { system.terminate() From 49c36744b9a24c1013323aeea2e5352af6e8d228 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Fri, 25 Nov 2016 23:52:28 -0200 Subject: [PATCH 166/253] adicao do metodo para recuperacao do token do bot --- .../src/main/scala/im/actor/bots/BotMessages.scala | 3 +-- .../main/scala/im/actor/server/bot/BotExtension.scala | 11 +++-------- .../im/actor/server/bot/services/BotsBotService.scala | 10 +++++----- .../src/main/scala/im/actor/server/cli/ActorCli.scala | 6 +----- .../scala/im/actor/server/cli/BotsCliService.scala | 2 +- actor-server/version.sbt | 2 +- 6 files changed, 12 insertions(+), 22 deletions(-) diff --git a/actor-server/actor-bots-shared/src/main/scala/im/actor/bots/BotMessages.scala b/actor-server/actor-bots-shared/src/main/scala/im/actor/bots/BotMessages.scala index cd69fe429a..8698f47854 100644 --- a/actor-server/actor-bots-shared/src/main/scala/im/actor/bots/BotMessages.scala +++ b/actor-server/actor-bots-shared/src/main/scala/im/actor/bots/BotMessages.scala @@ -381,8 +381,7 @@ object BotMessages { @key("GetBotToken") final case class GetBotToken( - @beanGetter botUserId: Int, - @beanGetter nickName: String + @beanGetter botUserId: Int ) extends RequestBody { override type Response = BotToken override val service = Services.Bots diff --git a/actor-server/actor-bots/src/main/scala/im/actor/server/bot/BotExtension.scala b/actor-server/actor-bots/src/main/scala/im/actor/server/bot/BotExtension.scala index 7edaaf832e..eaa4e9b3db 100644 --- a/actor-server/actor-bots/src/main/scala/im/actor/server/bot/BotExtension.scala +++ b/actor-server/actor-bots/src/main/scala/im/actor/server/bot/BotExtension.scala @@ -23,10 +23,9 @@ import shardakka.keyvalue.SimpleKeyValue import shardakka.{ Codec, IntCodec, ShardakkaExtension } import slick.dbio.DBIO -import scala.concurrent.Future +import scala.concurrent.{ Await, Future } import scala.concurrent.forkjoin.ThreadLocalRandom import scala.util.{ Failure, Success, Try } - import scala.concurrent.duration._ object BotExtension extends ExtensionId[BotExtension] with ExtensionIdProvider { @@ -158,12 +157,8 @@ private[bot] final class BotExtension(_system: ActorSystem) extends Extension { for { keys ← tokensKV.getKeys() - keysTokens = keys.map(k ⇒ (tokensKV.get(k).value.map { - case value ⇒ { - value.getOrElse(-1) - } - }, k)).toMap - } yield (keysTokens.get(Some(userId)).getOrElse("")) + keysTokens = keys.map(k ⇒ (Await.result(tokensKV.get(k), Duration.Inf).get, k)).toMap + } yield (keysTokens.get(userId).getOrElse("")) } /** diff --git a/actor-server/actor-bots/src/main/scala/im/actor/server/bot/services/BotsBotService.scala b/actor-server/actor-bots/src/main/scala/im/actor/server/bot/services/BotsBotService.scala index 4758a54c08..56ab56ce25 100644 --- a/actor-server/actor-bots/src/main/scala/im/actor/server/bot/services/BotsBotService.scala +++ b/actor-server/actor-bots/src/main/scala/im/actor/server/bot/services/BotsBotService.scala @@ -24,12 +24,12 @@ private[bot] final class BotsBotService(system: ActorSystem) extends BotServiceB } ) - private def getToken(botUserId: BotUserId, nickname: String) = RequestHandler[GetBotToken, GetBotToken#Response]( + private def getToken(botUserId: BotUserId) = RequestHandler[GetBotToken, GetBotToken#Response]( (botUserId: BotUserId, botAuthId: BotAuthId, botAuthSid: BotAuthSid) ⇒ ifIsAdmin(botUserId) { (for { - token ← botExt.findToken(botUserId, nickname) - } yield Right(BotToken(token.getOrElse("")))) recover { + token ← botExt.findBotToken(botUserId) + } yield Right(BotToken(token))) recover { case _ ⇒ Left(BotError(400, "ERROR_GET_TOKEN", Js.Obj(), None)) } @@ -37,7 +37,7 @@ private[bot] final class BotsBotService(system: ActorSystem) extends BotServiceB ) override def handlers: PartialFunction[RequestBody, WeakRequestHandler] = { - case CreateBot(nickname, name) ⇒ createBot(nickname, name).toWeak - case GetBotToken(botUserId, nickName) ⇒ getToken(botUserId, nickName).toWeak + case CreateBot(nickname, name) ⇒ createBot(nickname, name).toWeak + case GetBotToken(botUserId) ⇒ getToken(botUserId).toWeak } } diff --git a/actor-server/actor-cli/src/main/scala/im/actor/server/cli/ActorCli.scala b/actor-server/actor-cli/src/main/scala/im/actor/server/cli/ActorCli.scala index 18ed7a50a2..018e27133d 100644 --- a/actor-server/actor-cli/src/main/scala/im/actor/server/cli/ActorCli.scala +++ b/actor-server/actor-cli/src/main/scala/im/actor/server/cli/ActorCli.scala @@ -40,8 +40,7 @@ private[cli] case class CreateBot( } private[cli] case class GetBotToken( - botUserId: Int = 0, - nickName: String = "" + botUserId: Int = 0 ) extends Request { override type Response = BotToken } @@ -110,9 +109,6 @@ object ActorCli extends App { }, opt[Int]("botUserId") abbr "u" required () action { (x, c) ⇒ c.copy(getBotToken = c.getBotToken.copy(botUserId = x)) - }, - opt[String]("nickName") abbr "n" required () action { (x, c) ⇒ - c.copy(getBotToken = c.getBotToken.copy(nickName = x)) } ) diff --git a/actor-server/actor-server-sdk/src/main/scala/im/actor/server/cli/BotsCliService.scala b/actor-server/actor-server-sdk/src/main/scala/im/actor/server/cli/BotsCliService.scala index 525b1bf717..0297f2d4cc 100644 --- a/actor-server/actor-server-sdk/src/main/scala/im/actor/server/cli/BotsCliService.scala +++ b/actor-server/actor-server-sdk/src/main/scala/im/actor/server/cli/BotsCliService.scala @@ -22,7 +22,7 @@ private final class BotsCliService extends Actor with ActorLogging { (token, _) ← botExt.create(username, name, isAdmin) } yield CreateBotResponse(token)) pipeTo sender() - case GetBotToken(botUserId, nickName) ⇒ + case GetBotToken(botUserId) ⇒ (for { token ← botExt.findBotToken(botUserId) } yield BotToken(token)) pipeTo sender() diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 949efeff7a..720b8f8dc9 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.9-SNAPSHOT" +version in ThisBuild := "3.0.10-SNAPSHOT" From 70300a7bf54c24a17737fae9118c4cca3b4d479b Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sat, 26 Nov 2016 08:43:37 -0200 Subject: [PATCH 167/253] alteracoes --- actor-server/version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 720b8f8dc9..941012bbf9 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.10-SNAPSHOT" +version in ThisBuild := "3.0.11-SNAPSHOT" From fb5fd40987c0b5824cd4fafe544a63c76dc88ba7 Mon Sep 17 00:00:00 2001 From: diego Date: Sat, 26 Nov 2016 13:59:26 -0200 Subject: [PATCH 168/253] alteracoes --- actor-server/docker.sh | 2 +- actor-server/project/Build.scala | 2 +- actor-server/project/Dependencies.scala | 2 +- actor-server/project/Releasing.scala | 2 +- actor-server/sbt | 1 + actor-server/version.sbt | 2 +- 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/actor-server/docker.sh b/actor-server/docker.sh index bd8e3c6edf..04ad8227fc 100755 --- a/actor-server/docker.sh +++ b/actor-server/docker.sh @@ -1,3 +1,3 @@ #! /bin/bash - +export BUILD_NUMBER=108 ./sbt docker:stage && docker build --no-cache=true -f Dockerfile -t actor/server . diff --git a/actor-server/project/Build.scala b/actor-server/project/Build.scala index fa9dbe99fe..2daec442fa 100644 --- a/actor-server/project/Build.scala +++ b/actor-server/project/Build.scala @@ -141,7 +141,7 @@ object Build extends sbt.Build with Versioning with Releasing with Packaging { settings = defaultSettingsServer ++ Seq(libraryDependencies ++= Dependencies.bots) ) - .dependsOn(actorCore, actorHttpApi, actorBotsShared, actorTestkit % "test") + .dependsOn(actorCore, actorHttpApi, actorTestkit % "test") lazy val actorBotsShared = Project( id = "actor-bots-shared", diff --git a/actor-server/project/Dependencies.scala b/actor-server/project/Dependencies.scala index d237fc0ae0..93bfb61b77 100644 --- a/actor-server/project/Dependencies.scala +++ b/actor-server/project/Dependencies.scala @@ -5,7 +5,7 @@ import sbt._ object Dependencies { object V { val actorCommons = "0.0.20" - val actorBotkit = "1.0.113" + val actorBotkit = "1.0.108" val akka = "2.4.10" val akkaHttpJson = "1.10.0" val cats = "0.7.2" diff --git a/actor-server/project/Releasing.scala b/actor-server/project/Releasing.scala index af1c24d11d..26af6f9c77 100644 --- a/actor-server/project/Releasing.scala +++ b/actor-server/project/Releasing.scala @@ -32,7 +32,7 @@ trait Releasing { val releaseSettings = Seq( taskSetting, releaseCommitMessage := s"chore(server): setting version to ${(version in ThisBuild).value}", - GithubRelease.repo := "actorapp/actor-platform", + GithubRelease.repo := "dfsilva/actor-platform", GithubRelease.releaseName := "Actor Server", GithubRelease.draft := false, GithubRelease.tag := s"server/v${(version in ThisBuild).value}", diff --git a/actor-server/sbt b/actor-server/sbt index bf6a032af9..e9241692ca 100755 --- a/actor-server/sbt +++ b/actor-server/sbt @@ -1,3 +1,4 @@ #!/bin/bash +export BUILD_NUMBER=108 SBT_OPTS="-Xms512M -Xmx2G -Xss2M -XX:+CMSClassUnloadingEnabled" java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@" diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 941012bbf9..7788936bdc 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.11-SNAPSHOT" +version in ThisBuild := "3.0.13-SNAPSHOT" From 8d2489676a90f177ba91d4a12c0ed5ede5fd914e Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Mon, 28 Nov 2016 23:09:22 -0200 Subject: [PATCH 169/253] alteracoes --- .DS_Store | Bin 10244 -> 10244 bytes actor-sdk/.DS_Store | Bin 10244 -> 12292 bytes actor-sdk/sdk-core-android/.DS_Store | Bin 6148 -> 8196 bytes .../sdk-core-android/android-sdk/.DS_Store | Bin 6148 -> 8196 bytes .../android-sdk/src/.DS_Store | Bin 6148 -> 8196 bytes .../android-sdk/src/main/.DS_Store | Bin 6148 -> 8196 bytes .../android-sdk/src/main/res/.DS_Store | Bin 8196 -> 8196 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 10244 -> 14340 bytes actor-sdk/sdk-core-ios/Podfile | 2 ++ 9 files changed, 2 insertions(+) diff --git a/.DS_Store b/.DS_Store index 47f944fc84647ba07ce890ee2f689b196d203448..efc4004712164b59c9a496c577dcb57542d7f9be 100644 GIT binary patch delta 54 zcmZn(XbIS$D=>M6SgVMoiJ6XqnL(|NLbaiRIgo8`ZZO$U+;s9KVd2fZf=<|gWVP>O8kK$qC$%W6`OQdT$>-0O_Vl9 zD@4JQ$ebd0^6Dil5$a9w(t8mEy%ldNA}HRRH6H3IHy^w=Z@&57$K%awUuZ9@0Dy80 zBLgrYQY_p(nGZl30Z{2vHM!s8l7tHoM9u(KVG>rL0yQwZ)fXO~PDm-2Aqi(-gRz?- zxOpfGtR^ZfF!+f49`&3Zc?%6;%=6)>^DPiWuDYus4AX8kA~{Llj%R#W+y_cJZ-P${ z>hX)=j|T^m`SHD3ewekxQ+j$H(9L3BZkoFI7f@*uC{W4YnUfdekwv2PWMm4f)W zEv~VRRJ7Tg%IcarqyIDNR*T@scxG;XxwN+4yxY3h;iHiQ=oxRxN&Z>s#D#!YxUdN- g!s*?M*{y!{aDQUnU0HW;Fu#%LIKM)R=>IkN8)7`bl>h($ delta 577 zcmZokXbF&DU|?W$DortDU{C-uIe-{M3-C-V6q~3gIoUvmMH0vdOE3b(85oio@)?R4 zQj^My3pN)@&SKlxz{$u7lme^b1`3I@Y*y!a!aPxrZL^?)E!*U?LMn`>C+jFQXiHUB z8(A0|=qMN(nb+zlR2v!^8|o;S8yVEra&m~P8rpg$H zIEOPNFEKauijaUHzl5ZeR77b~W?^Y&Nu_`?2genD0YM>dIVlBBfvp@dDTyVizWFI2 zohe|M$%3N7*iAkwB zU`0}9+!h=H-kjlOsYS(^`FRjQYi?T(K}H?Uh~)g-T%b#fA;Jz)PLnq(iLihiI(fOM zKksFRn+%T`-Z8vq_{8veGqYGc6UYP7&Mw^C0t_IJaZWCjSjxJcaTnw6&C-%t%!162 tuvg#)(ypMW+bqcOoq009j^|{59u5vBNaSfuPSBaTnNii3k!lgr3;@~2ll%Yx diff --git a/actor-sdk/sdk-core-android/.DS_Store b/actor-sdk/sdk-core-android/.DS_Store index 37a3f8a1329b922a3b25512c08cd788fcc85fb66..7691feb75f1a8dbbe54f309563c6b611f8619b73 100644 GIT binary patch literal 8196 zcmeI1YfKzf6oAhGTINbALv3MkUD+0Ckb*33%w>a#H}3JOywI zwJ8s9ZNi?6c``4gYf5X1>;XMf^im8I<}@GX>Lg>H%nK>Z0fjlBcW3l66m;)Sc41c? zFeap5`w{RXaBT$m>r(*=n3S=nSLN@gk~w=JX;?|p_$;|#=(ZDye2*oiWg9k@OOjL} zRZ7R>b5<_yC{D)iQ_{!Wo~~+1uRUs6#!6dB9@Vv6Lf+bMnU12HTKX#W>2cjutz4g# zF;&}L=ZNCWku76PVhK60xY)5f+7j-JF13Ug+auAtTEfw2WNC>>wTl_%MrPimnd+2cq%x$e^%_Q8Kd0Ffj&{c3tts0|JN>TWgif}6 zEFo{<_J<5}I-lZG~GD)U-3USe#yvZgjrcS|r>Om!lY)K6!0=d9cyNz3x)s!CQL z+|J}n(zHrXKVqr;PO3W-tPeIy(lI{XpVp`r!>lRT%w$CxwaF8)L@R4!vdu)&`A;oqM zFK8y+o_n{yJ{X+jSf20o$+>yYO!8#$G&# z!#INXV;raPI3{ogPojkjm_{2H@ezC!AIB%~S$r8^!B_D$yom4M`}hHVh#%pX_$~e@ zp0K0?NBJV1}>%FTbC$0x?Xz;!Reg6x*mp2JwZ{E7?wuYwGj%au9%BHT_ z$E%TYDH52t_!RJPH*+8@ZV9n2x_2~( zm|RLEGgtY}HWrdM5VT@;_a4UNGNM|{c6QP1M&egmuB#2yupSm;{FRfzHSTMqwNPTk zXe`R&>+lA=3m?Ph#Nc;u1%8HK;dkP%3^!v9(HF#9F@!s@37c^jw%}fj5{LVU!~q<{ z12{x9#&HbCaRMhXi7K%;i*tCISj=D+bC}16T_zvHXNbw?@OgZJsJyU-!Jz_uLgHJ+ z8O+AhreT@0q){MvwXxq@UlAx3j}zee|Ni2?|F5ry_MgU&fFFT>H3C>R5FhBHC5wHw zd9EF%YlbdfxL#gJ*MurJ9Vh9g<0M!9Fr;>vRJl#elX)R&gvx*ZLx6w&`{%z)-i=-T E10<^LLjV8( delta 288 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{MGjUEV6q~50$jG!YU^nAr0~wad`~pfczmf`a zGK)(L3~n+qF|)9;v2$>80RbPEfFR#wPXT$BfW(rF$q54X^)bPjDXB?`Md6t#B^mJo zq5(yzWtpkv0f~93VVT95NtrpBC6$~&z`+?WAW>ayW@@RUU~FbktD{hDZf>BXU}9`m zTPw(@%)ue8Y3k@3Sy0=xXz`Mz%a*S=d<^J7AYf#K&6|6yanKdwwxbE(j^Y0lmWqdNZSULP2+SdVbh- z2aE~nw>|!C)cR(QHybmDQaya=j!i$`zI6tS-2X$(N)Fm45x8 zrSh3ncO+OBY>=d5+}@MXs1;_`7;Iv)A`RJ;iFm{=*34v^4LwMUDMH)W9!XZ&u%RS1 zLztqhLy`yBNKT|HjGe4Ys=^2xOtl^#v0WJIV=Y3H`A$*`5$J+G7>5*?kcTJXDR>&r!v(kqZ^L`=348%x z!PoE&T!x?E7x)eSfIs0c_!~=6!ke%R1Go*hV?8!wJ9gmR*oobE5C?D&@5cmA;BlP9 zDLjc5rZIyy&f%kY4j;!S@L7BrU%^-LHN1%L;QROieuy98m-sFID1Kql5?Kd@zSQCs z>Ur-Xk=46PD>`v4vWEKZI}ra*$a;B`VCcb+H)Zub2#OaJ+$@g%T^ozJlC)9o~R< z;bZumIQJb~fuG@5_?`Gxf)!XzYzyM87{VRch)uW?Be)l%#JhdOyk6|X1K3aOOW-h$ z;3$q^5>?{fG|u2D;$9YWn8yWt#O2^)_zZFIIeZ>pAQoO&!@2$?wh4)EUFBRZkueR+ zoF>Z>LsvWd+VzD%u}CMt&;R=i-~V41xBLI6v86TNXV75eP+vv!#36jffh w--3{C2sNuN0!Ux}!;t!6a^*2GPc8^a7ApVxMS#EmySR(S-~U&DaYJ?g0sM&A0RR91 delta 322 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{MGjUEV6q~50D9Qwq2Z0_mSjv0 z5U{V03C>JOO-d{Z&rB)Fh!+qIC`v8MOf3&c%u5Z+EY3{I%*iaNS{An zOC1GcGlN?K}KZ`4rxtON8iYT+O9>5mn>bje8u5oKz9NGBhckw zAPl8p)Nuxe&3s}%88DkrChq(yk!yZ!G-IJegm{5fnb40AK;pz`y_n M5Lj$;JkK0v0RNgq3IG5A diff --git a/actor-sdk/sdk-core-android/android-sdk/src/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/src/.DS_Store index 01f8a59d3b3d04cfbfba2f312dd13426faf8637b..91147c77017556f98ec0c0f779be35dbf7a836c3 100644 GIT binary patch literal 8196 zcmeI1YfKzf6oAhGTINcDp|(6+SGGkOq+3~N>q13b7K)`5+qh63rG?p@DNGz@=+5kJ zTf|^uqb6#Mj~J`bnEq4KUpB@+CO+dMK4LK1n8w6^{xbeEMvdproh7{XubOsla__nK z+;e93ocqn(+*ts?ct&jns09FtDwlE@H5(K@&+EEU-=s zKLdUS{0#UR@H60N;Qx>T+Ov6)3heu0)^Gg`_!+n%Gr->uA*x))Jh>>O`|6;^Jpz#A zM*z1_U*;W>Ay39UxhN#fP(k5JQn;db#6aOr`jBTA^W>tC!X3~%e4uw{^iC+~-kq)= za?Jr_Li(+r0Y3xlGr%985|{-AbTC(*-;;BOZab04_gGY1vT1XvBuQmbxpXoyW91T# z;$-Z&l0M;%bX7}w{UOUTmitQbxUS_UFSxRBiV<#}sFV zd>LaBo0Mzk=iBy1!=d)*LO3+v8j0Q&4n?Dpg#{+nG`8N;KQ(*q{QN@;55FX0Lhro* zm1|LG{k&$6I@(!>_r`52?ew^YqdNI=-K4yg`yZWi zbj!4lYiXM#V{dNR9^AQWcVz#8dwZA4D=Ouxt&ELRW=%&wt!wGwoUS@EV~U;9OjS3h zN3y!DCk<`LRA#j*yu#R0d38-~-7SGYA=A-JQa_W?opW-7BrVAmmF28Hu!G50qzRRN z{h+1tJE`tWpgzzjNhi3zC#_K{)T}Ac%w$CxvMCaAi9M`^$u=8$kd{-pwy}MZtg>N4 zNos~rMOlX=53rG}2v;aOS(j9WVK$nwW@jl*Td2DOJ(B#Xbc)~mh+;cO=QNXU&!an7 z9|(+beYdJ=DiPTbYZA-trlBDg5hI!JCUp>oF6e`CNP!7CcoLq1r{N-8g3ItWya%7a z7w{E)4d1|3_z8Z2-{24U6aIp~u@oh|3Cpk+ci>KJz!q%B4!j#Xu^SKL01o2)n7|1< ziIX^mr_sVWOrwqS_$Xe$$MFe#7GK6!@Kt;bFXKD-K7N27;z#%;ev3bfUs#mKbx@4+ zEncJE^7BZzdf(HEPHlv1uHwrFSf@-nVjxs?#P+z2pS zVDdn?%eR_B0W%8@6Ia^VLQKo0oFHk5Ti1tzL7Af?hPOA;u!!gu!#kRTOfDvNnQMG! z3k%Ad2vae;cOPSN32`iD+dF7>GZ8B-)z#Eivo026{2`OUb&faEwNPS(_$x@?>+lA= z3m?PhMBR6A4St4S;ddgg1S_zbcnjdI7{p!Jgw41c!?+)#MBV{nuNV995cU&)2^_`| z9K|tAqDu5l;|!i5`ZAcs94_J`E`^WbGeqHY_&mNq99~*OU4Nc8A@Qx1)MXQC)3D5G z(&Z^#ZSIe*j|>!xFlzbv|6t+o|JO&beiVKN{0wZE0W9fF^u}qb(CeO`wL?^=sPe+? t7KL7Z)VuiJ66!jh%y&3kdkQ1O)jeTMNju1SFPZ zOb!yTua61NOi4{jEDFy|DanWz5Dh3wEz3+T4@k^Q4a+RfOv=p3EUDxK0uIi20g38r zGgC_)1!FUVS{;RIb8`b71ruYl+FC(IWeyH$O;bnT$b#CgMT?g#UABD1;bTB|0s$k? z?O-4brD4=@28PWdVxJi|Hhf`P%+A3f$PAGY;0DsJpa9rd_?>w&zl2SP6v4LOX15e5!8L3vw5cdrx?8oB(ngf7mXSIV|*d;`k+yH(fFS^(?Wq7ABZ7gPIAtF z&VM`m|MQ(WbIvlx&{otN8LMH8NmMyi6>2U}xSZGXN+jTv69w5bH=nhfER89k!IQVg*0r#41^iDEHl904{@rTrUE)HsQ>Dq#yRUfvt(p6&v1v- zN|!?K$T@aT!6;E+{W-@f4%;ND%4t@vNXo`W%jz``3+-INv8*1)H9ga@2M0XkpvPt0 z(G1bR4%aDoY2Vp^N&bb_LOw@#o*TQ{je<*5mS0#<9b3NY+NPEpHr_N@sa7q#a*?9! zpa)=k=53}?*fwJ7-u^+&%^9|C+WY!TrfX&`qtDicjVesY@?>RA?UJQeN29Z;4ivNI zfuiXhQtKsYa-mvPsnkX5WpzT@rBj4mj?QP&eMz(~+8{|gIX_)6s1cVub(k!XEyv@?Gh9y|7%6dudl>18}T*2I+q@*e&Uz7n_#cAciE@x1pAtuV!yE8*dOdqb{aqhs!)q% zSdJA~i8V-~3D+To4s1dv`mq-pa?oL-02f7+Fp7I{FYdz;JcP&aIF8~Np2drJ39sN) zyovYlK0d&QIDv2RJ$}HC_zAz`??^@DipXN|OCwWozjZ2-fL~2CSk46Z;5shy%!T0| zyQO1O=jO~M3-^-?1jZL%RUKckdd=F_4e4nZob%+*2BD8T0W2SIQ-Jax_DmFu#h}Et z5iX5`v#klWf+J9xAGe` zQOju^2@@oe zb1)Cph!bKHXvPM@YZ@7}V+(q)6}{-gZVVA}vxHp>Hu5+?_#MRk6<2gLLCsWYf8^%iW)vG);Y3ga`C z!_h^{K$-AV!_WWiv)}(;wE03uVFtnsTzVNmd8RkhM!##eH!eSG$Eoh6$_v*U7t}YQ sX2wMTji>)Gq<)-KxlJmd0_mSjv0 z5U{V03C>JOO-d{Z&rB)Fh!+qIC`v8MOf3&c%u5Z+EY3{I%*iaNS{An zOC1GcGlN?K}KZ`4rxtON8iYT+O9>5mn>bje8u5oKz9NGBhckw zAPl8p)Nuxe&6CAS7&kVQGB0N5;1Fbn$Ov!)X;+Z*Nb!N}KfrG#EKkij#Aa^7C^T!9rnzZETy_CBCst{voKa J`IE?VCIAp(6T1Ka delta 44 zcmZp1XmOa}&&aYdU^hP_%j9@LrOkQ*8jPD81>4vrHfV2Vm-xoASwr+b)5Hc106Mh} AUjP6A diff --git a/actor-sdk/sdk-core-ios/.DS_Store b/actor-sdk/sdk-core-ios/.DS_Store index f11e22a969a4932b28129b6f5dbf2a20a31f581b..d313854b94f75729479596cf8d0b1d493e2d2047 100644 GIT binary patch delta 404 zcmZn(Xem%&U|?W$DortDU@!nOIe-{M3-ADmb_NCoo{0+TvdlmZBM{31F_105z)-@F z&rrk=%;3V{J+V-EvVjT)L9LELwV{DIkZo>mF!`XMsT>PK0MN`7hT@ds79C^9V3<$a8XXa&X2ANLE)H(aCNp yCP`M1uPA*WHxcR3DH!}dUwo_C9 delta 166 zcmZoEXbF&DU|?W$DortDU{C-uIe-{M3-C-V6q~3gIoZI3MH0wo01=EpaR!DW21kYh zhJuvhN*XYyuQ zD?w(EIY8sNfrKl_3ZVAy%#-;|3|WCDGc-(gG*RNz04V`-4JK!pOx(<<%FGM^{^TE3 diff --git a/actor-sdk/sdk-core-ios/Podfile b/actor-sdk/sdk-core-ios/Podfile index 149cff30ba..fed5f293b2 100644 --- a/actor-sdk/sdk-core-ios/Podfile +++ b/actor-sdk/sdk-core-ios/Podfile @@ -43,6 +43,8 @@ target 'ActorSDK' do # J2Objc Runtime pod 'J2ObjC-Framework' + +# pod 'J2ObjC-Framework', :podspec => 'https://raw.githubusercontent.com/dfsilva/J2ObjC-Framework/v1.2/J2ObjC-Framework.podspec' # Core Tools pod 'RegexKitLite' From bb65f030ad97a6b61730aa494beeb6deb5ab926f Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 30 Nov 2016 11:00:45 -0200 Subject: [PATCH 170/253] alteracos --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f7d6b44db2..bf38afe29f 100644 --- a/.gitignore +++ b/.gitignore @@ -144,3 +144,4 @@ node_modules actor-sdk/sdk-api/api-language/solutions/im.actor.api/source_gen actor-sdk/sdk-api/api-language/solutions/im.actor.api/source_gen.caches actor-sdk/sdk-api/api-language/solutions/im.actor.api/classes_gen +.DS_Store From 30f22f53332d107f7a5a59369f0c458d38e096d6 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 30 Nov 2016 15:31:14 -0200 Subject: [PATCH 171/253] alteracoes --- .../com/google/j2objc/annotations/RetainedLocalRef.java | 4 ++-- .../src/main/java/com/google/j2objc/annotations/Weak.java | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/com/google/j2objc/annotations/RetainedLocalRef.java b/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/com/google/j2objc/annotations/RetainedLocalRef.java index 8d7e5d8e20..ad93b89415 100644 --- a/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/com/google/j2objc/annotations/RetainedLocalRef.java +++ b/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/com/google/j2objc/annotations/RetainedLocalRef.java @@ -17,8 +17,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.RetentionPolicy.*; +import static java.lang.annotation.ElementType.LOCAL_VARIABLE; +import static java.lang.annotation.RetentionPolicy.SOURCE; /** * Annotation that indicates a local variable should be retained outside of any diff --git a/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/com/google/j2objc/annotations/Weak.java b/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/com/google/j2objc/annotations/Weak.java index 1924d74db8..930be66883 100644 --- a/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/com/google/j2objc/annotations/Weak.java +++ b/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/com/google/j2objc/annotations/Weak.java @@ -19,8 +19,10 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.RetentionPolicy.*; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.LOCAL_VARIABLE; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.RetentionPolicy.CLASS; /** * Annotation that indicates a variable has a weak relationship to its owner. From 9d5e225621b44a1d7d861526f1928f34146691f7 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 30 Nov 2016 15:40:45 -0200 Subject: [PATCH 172/253] alteracoes --- .../java/org/jetbrains/annotations/NotNull.java | 15 +++++++++++++-- .../java/org/jetbrains/annotations/Nullable.java | 11 +++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/org/jetbrains/annotations/NotNull.java b/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/org/jetbrains/annotations/NotNull.java index aa7c78b3d2..e5091fb6a6 100644 --- a/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/org/jetbrains/annotations/NotNull.java +++ b/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/org/jetbrains/annotations/NotNull.java @@ -16,7 +16,18 @@ package org.jetbrains.annotations; -import java.lang.annotation.*; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.lang.annotation.Target; +import java.lang.annotation.RetentionPolicy; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.LOCAL_VARIABLE; + + /** * An element annotated with NotNull claims null value is forbidden @@ -28,7 +39,7 @@ */ @Documented @Retention(RetentionPolicy.CLASS) -@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE}) +@Target({METHOD, FIELD, PARAMETER, LOCAL_VARIABLE}) public @interface NotNull { String value() default ""; } diff --git a/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/org/jetbrains/annotations/Nullable.java b/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/org/jetbrains/annotations/Nullable.java index 1618621ad3..f7f8367e4a 100644 --- a/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/org/jetbrains/annotations/Nullable.java +++ b/actor-sdk/sdk-core/runtime/runtime-shared/src/main/java/org/jetbrains/annotations/Nullable.java @@ -16,7 +16,14 @@ package org.jetbrains.annotations; -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.lang.annotation.RetentionPolicy; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.LOCAL_VARIABLE; /** * An element annotated with Nullable claims null value is perfectly valid @@ -27,7 +34,7 @@ */ @Documented @Retention(RetentionPolicy.CLASS) -@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE}) +@Target({METHOD, FIELD, PARAMETER, LOCAL_VARIABLE}) public @interface Nullable { String value() default ""; } From 2047588bd949dd42b407d0171f4ebcad0a4413de Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 30 Nov 2016 17:59:49 -0200 Subject: [PATCH 173/253] alteracoes --- .DS_Store | Bin 10244 -> 10244 bytes actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- actor-sdk/sdk-core-ios/Podfile | 4 ++-- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.DS_Store b/.DS_Store index efc4004712164b59c9a496c577dcb57542d7f9be..3092250c23c07c4b21ff5847e407fd69052d684b 100644 GIT binary patch delta 1246 zcmeH_O-NKx6vyv>{Ccms>Kn(8@r}-CrlOgeS~-O_Hd=nBnUbNTWA6zM$Ilt9>_a0V zqHOah)Y?QultvS383ipOh=_=skfOrcxM)#}ptMa_UyB4c(YCX=mwW#Ao^$yB?qJnm zmG_Piw9%HkDJ{;XP74E;$>vU%;`U@_zJ<=uKOiuOi)hEuA(Go<$~9Zb=pSl836 zboD5nBSHel`N9N4D7A=jyfDQzNUTUjhorP9vb3y-7I7WN)i328-7;IXG))#$c)`il zxRpLxE0IRidBM%sv?}etpKhetoFMVFE@!js@`YuyM&f3g%L!%tzFxW8t#q_&J+{$2 z&VV$&?qEk-o80bkYiYZRCFtM=#^kV$fv+#`?4b23ZblX>!md?Vk<53&Fq^aw@>LSaHQ%!ok> zvXG4&*inK~l%oRGs7C`1pb-+<(2h=Y;SdIJ5~nbTb4a{^ix|Nuu3{Xwa2sAc!c)A$ z419Qv517YSET~?i6^rUiW4vW#b-LDF#U+uYE9kCWjqaNe4QWJVR9s?;dOkc>{|7YH zWnRzu7-MrxELF$NTU+!=R?5Kg%gNLvt5wi3=1VuyGnnGX7;0K}4z&sa4402)BxAvS$J!;zOG^uUMrmHTdnI-00nPz37(e|h9x>GIbuDP2=U95po zK}9u1P*FrTQDH?&brbYU6#WneMM%(H7ZKe>RCH!Xf~@YsxtNdld(S!F%=?_a6@4qN zUK7@miqhH6?AiKF(VKa~*V!HjM_jJgh>N$38*gQtPgLrcG%VF&b8}Bb+YxCB?9}v5 zr6BFnq%?JUUV*D@?)-&A35iJ}IfZlmimiwxq))MBWGad-Qf&HnTVhlsCMEDJC5MYa zw%+fJXv;$Wz@~uaA2J*zOUY$yozY*=rOCJ1<_;yF3omO9%ZagtypR`j5$4TX1HqB4 zCA^dgKVQ}E^=a+qY300vi3Yy9Tk8r3LP6P#${CfsiY3FzJ#C?m4lNi7n~UAb0wx}@ z7GwBQZ#dG}sRiYH;|~^PDasn7@AmsOKV!^Z?V#Ax9Q1Z*_G*`@1c*@vIjM?jX)U!; zkb39<9i&5alFm~<4MgcSJ)|e}jGogAdPDE%1AV5i^o_pL4_Lu40TW?E4yMD7V$4AW z=Aja9EI|X7VL6(x9vje#jo5?`I?;tNcA*b@un+rj6sK?+XK)t%xPd#ki+i|_r+A6C zu}{=rrenm-6TQzn^IQzxfQvpWh)$}8P^ztYG|x?I&=X?amY zWM!+WFk)mwhMbWrWt>E9%9;5p7x5A#kGVy~TovOaGt-?_%DJ#esHQuoLb~H6J~osw z#g@*icr{PPAQu$dT$3x$0^`3}MCo@J|3q<)F48S}K#wJXS2RrT=@WgC>06M9beX+^ zsZfyz2l7z>C(2MRDa@4|7NQn)sFy67unMc;!5aABmn1f0OAWS36x-2_9`s^&49Q*` zmPm9Q!*L1aym?FFU{U{T+EM7f7? z^L{}iM#j^Vbrc$Sq^he8EzAsb6by|_C)WzgG0vVmM_8V5&g5P(8P1gA 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/Podfile b/actor-sdk/sdk-core-ios/Podfile index fed5f293b2..116828701c 100644 --- a/actor-sdk/sdk-core-ios/Podfile +++ b/actor-sdk/sdk-core-ios/Podfile @@ -42,9 +42,9 @@ target 'ActorSDK' do project 'ActorSDK.xcodeproj' # J2Objc Runtime - pod 'J2ObjC-Framework' + #pod 'J2ObjC-Framework' -# pod 'J2ObjC-Framework', :podspec => 'https://raw.githubusercontent.com/dfsilva/J2ObjC-Framework/v1.2/J2ObjC-Framework.podspec' + pod 'J2ObjC-Framework', :podspec => 'https://raw.githubusercontent.com/dfsilva/J2ObjC-Framework/v1.2.3/J2ObjC-Framework.podspec' # Core Tools pod 'RegexKitLite' From 93ab0dfb51cf14adac7dd40b3714ace41aecc7ca Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 30 Nov 2016 23:44:34 -0200 Subject: [PATCH 174/253] jobjc1.2 funcionando --- .DS_Store | Bin 10244 -> 10244 bytes actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../ActorApp.xcodeproj/project.pbxproj | 12 +++++++----- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../ActorSDK.xcodeproj/project.pbxproj | 2 +- actor-sdk/sdk-core-ios/ActorSDK/.DS_Store | Bin 8196 -> 8196 bytes .../Sources/ActorCore/ActorCoreExt.swift | 2 +- .../Providers/Storage/FMDBKeyValue.swift | 6 +++--- .../Providers/Storage/FMDBList.swift | 16 ++++++++-------- .../Providers/iOSNotificationProvider.swift | 4 ++-- .../AABubbleBackgroundProcessor.swift | 2 +- .../Cells/AADialogListProcessor.swift | 2 +- .../Managed Runtime/AAManagedTable.swift | 4 ++-- actor-sdk/sdk-core/.DS_Store | Bin 8196 -> 8196 bytes actor-sdk/sdk-core/core/.DS_Store | Bin 8196 -> 8196 bytes actor-sdk/sdk-core/runtime/.DS_Store | Bin 8196 -> 8196 bytes 17 files changed, 27 insertions(+), 25 deletions(-) diff --git a/.DS_Store b/.DS_Store index 3092250c23c07c4b21ff5847e407fd69052d684b..7db9ae2f776f733b6385ecf2ac3e5ed97ad574b7 100644 GIT binary patch delta 675 zcmZn(XbIS`NkGKh*jPuw!njsPq1w>Uz!JzdvzXi^ZaVq5fGy+7$^0T>>{1?{9%4M+ zlXXO@Co@V2*GFU~=jR1yR;3Csa<1kRmr+#J(l@cRbH2haASlEm!Xp-5mRX#cl#?1- zo|#gT5t&$=oSK)CnU@}wnUb1Ul9`s7TEr>Hc#ktAFEKauijaUHzl5ZeR77b~W?^Y& zNu_`?2M5F~IVlBBfvp@dDTyVizWFI2oheu9LDopgNvUvfM1v%pi&BAP3PgvxlqRP@ zB1cFu(0LFM9UeVSfnv^(?94of8Yx2_V-A57&d{91q|_X+A}KQ-3l0Hq&hWC-qT; zPGtuJ2y5~OQBld&3|knsF>Gfz%y5R`3d1diCk*cyJ}`V{_%bOSmcKeFvO&toOyTz7(gM(NziV_)sxx83iY=!?quA> yxSMeg<59+QjOQV4V`7B5+Z#$lDaIR{SBS-PPHYg{%&zc@WipTGdivR0#0UV7@SlDF delta 718 zcmZn(XbIS`NkGKX!c<4W(x6sHq1w>E+)PKo+}vRDF@YkvElCAAnZ+dr2DccQm|0la z*f}`4xOsS`JUqRGy?G`pid1t(WG3h51!q>JPQEB8EFr+ixtdR0Mp0Eu-^9|+`3k>) zppdW#56|S868iN(wuGdVR77b~W?^Y&Nu_`?2gem50YQEqIVlBBfvp@dDTyVizWFJc zX_=`hU>PYnDHRTmXpp#bQ7Vvx2=k~*X>tlAa)cBEEruAO!=uM3P|O*UotX#KYRF^E zA&|lunvAXEJ|a{5jcQR^H(k&;(9~ zM22LB5{7)BUR{P_h7^YEoZ_;Aq@4UD1_q{?*keK7-NRGN3rj3a-XZcsL|Rfxg2$Q1 zl~a&$E2jVh+|dez96kAyXrbX&#vP118Fw@8VLZxsj`2F<1BgGF7$G#!n<#+s;pRzV V@tm946@IZy{wA_(0Bnz81OQc4t8xGU diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index 8ab33dca74d569f649a78ebc2d32c17536aa5aa7..cb3ab4c1ecd345efedc64e13900cfd8532605f36 100644 GIT binary patch literal 12292 zcmeHNYj6|S6+XupyjNcELX5pek}WXC2JHBWje#2Zfw6f6iUFHPFp{-^23c~nvJG)a z-A5)#o6vVtps$2BZ3E4Z4oN0ynzT*R656JZC=*C0bo$J6`lDppA5Ho^_uiF|CEI0E zCds6`GrM>9++*FLgq-j zKNRr;WZmZ<3I)wrP0dBjnvp$oR*u40uCsf?#!da2Hf$Q(jF2xD95Fh4F~jWF^2|e# z(e8mrcx%)c2^yol1Ch}1V3>O54){U?!!+1v4TXAww;E<&%s3L`ce~9^XVb+HEO;PjM0bn^ z1F=K9eCB`=4g|vodq;w1&>u3khkb*_TzrJF`0Rp0y=Z~cIn~g*Pg9Cpo$ZQt zUfIWgdy~(MZ5cAc^z&T1btO*cE-r5k1dM>9D5YK=^XU*~DD~FJCk-jq7eOVoKqu^` zU>=51xCicq<8TsA!^3b6o`N61kKlRuDf|pB!LQ(t@EW`U|A2qOzc2?CbYL#(xDXd% zDOTf3Y{u2N23v6hZp6)a6ZYU2@D}2_M2Ucox5bkK)tvyOY{40)Np!LgW zArzF;0X zs_L57v?g=nv@|$1BNs`y%(6xHoye|5E<7=%m&ky*cTkdU9GMCrXgNF`SK@qhiO22M zcpfev7njjv7C{C1xOADDX)_22FfsVXYUb8vQqC`X>l+x;vI!K(-j&VNJB!kPC0YZ9 zbmJ1Npfq=7E+oA6 zr37MClw4)Da&r$s)1H_wHf*-}qI<*>0Y|@ezdaHOCGUOyodiDnwfy!-IOYq6jcCg7 zy}jffk-$t)N~pL%z==fzIj@+qyYJI3A4PMFbi|!st0W@T1<`lXXmMyDp zXl`kbbG)zSs|5*IpT0y>m;hQkmzh}OVwPT{I~79oNpv5dr_IfC7whVT5I{?piJnEp zx}F+EXhri0OUiXs1QfBTxny~zs*1QG7BZLA)T+9SH)5%C(TYY@PsAOu!nttOYE@4L zFd0&~c&%60)54jEFI;!MSnpJn6l`DWT_N2i3Gqu4?!%IRm_maa>YxKQ!G5B6#t7km z7S0g5e-s{rX9xwy2?hU-!on4ff8lk^!WlRdXJHQ}{HV$LH_@#_>hGjIZJqd`*69 zGDM`K{5Pgs04ezR#N@v1THn=Opl*EU`t~J3V9|b7Q0OUJI_-`&!AnyebK31K&Y3Qk zTP>Mt!N{FX@Jm{b9KFc3m~UvBA|BOpS1#wiWM8?fQc<)l*;DPRvix%i@?W(E)U!i~tC&Pr=t=Y=YMY!+ak%v2%-SaJ(OvqYwA!Ya zP^On(t!)a)GDqdr+NPLV?Wj$uZ33YydE^8pu3S{(lR!2Ny1q%=BAGbHn`h$KVz)zpdH$w~#hjM2 zNV&=?>bXkF)z&#uNx8-*ha-iQTfK&QB`L>Wa>et|S4-njbf{M;Bz(u%B z1?N8z)P5cQO&~iD3$aKraK!|)mkI{1ib~DAl)ehvMY(ysKrY*fgWD;P3y0hWm7HZc zJ%-2deZ;_h06$2u`#65w;^01y56X=r39q~4bK;6$oh%Thp_2c~7pLqW&m{uq+r_-; zV`FvoO+>ae3F57$sj<@2)Krr}yq%CHn38xqnf_Om3pB!ahZ41~Icvo5gvpae^+DNrT(IH(+UTgQzxt~sc@Nwg^6;tS9mE%R9D8-Y^ j`b(LRd1*MGH!fQ-jh^MSx9m><_Wp10|Mvbb`2YU^Uou{= delta 1189 zcmbW1U2GIp6vxlM>@Ih>rOfVjyWJ`7Of76Hu4T8~wu=p=w$+p_ez&oTR<_+SnXuiK z?t<0^x6vjTP!eYVKCDAA`KB&lp5jTnk9*BlVjUnR4i{9C(J{Wj$l9{>Z z{BzIA{D1e%!j6RMuMvC8EZBwKg{w zPj<$lM!c;v>=Jjv9Qa@QVnCT~sUoF3hLGxH*< zj805VPMWzw-bwdreN6qFjoHn&rSpYbr_G$~Z-2%>Skvyd^EYHNW`;4=pfqtTkbcueW-vO*bHCCer zLDWM-16mMA8``l2gV>4`w&8Z%gYCEvW0*h|lbFIZ_MnJ)Jc`F~08ir?JdYRf3Xb9} zybb>`oWN)J3a9Zk$~cD$_*smFbo?Sw>*8!33m?2ZYF(nP8;bk~b)&Dw!5gRx8tXT- zwkJ3DiDSW$Dz1wY>mo&ox}ouET~}=rS=kOF%{o^hK`WK;+GeR%Eo&QNQd=RJI$ENG z>#AGgb9QdJo^#bD`8sOP7O8q9NLFqLY4v=7-=ui4q^R^SiQ;8YI3TXT;Ut}=^OC`z z^cURHf1mW;Km<{Aq6fX`#{h1`Ew~ML;7$xn=kG@v;}!RF758T`hrM`2GI$*OhwucR z#6dhK5gfuIUc&2m14k+_mT(;J;{$w%kMJqJbk0fD@{CgIpR?q=amF6S(u<*8o~Pym zf*Y>}63Il=XzPmajT&?DSXXD%=;-Pa`~4l_4oCewhIZ0*G(l4|L#9Z$zQev! zjr%0*|3ax-T>$opkGXF|F^*3 D3_2C5 diff --git a/actor-sdk/sdk-core-ios/.DS_Store b/actor-sdk/sdk-core-ios/.DS_Store index d313854b94f75729479596cf8d0b1d493e2d2047..d7a70f281b3eda0eed3e6f5252b5ce0d8884bc42 100644 GIT binary patch delta 1540 zcmaJ>U2GIp6h7a!+nt%VbQZTTExUBPTijB%xVv521&S7sA0t{qi>3T#wll)$bavU< z7O^%PwBk<)KVFTAs38Wy2)?+{2SX4aR1!(l$OD+z7o$G-AVdw}LGexp8X@Q;d*`0> z%{^!D_nmVl@)P;PbFlwNu%kXgL={9bkwGSDqkRR-%rQTrERn8k0!J(P&r4Yv`S%yr zPVNP33pbW$;?F7;#-nAQP${6AJu~}geKM2D#KWEG@pyPFnM^E>hclfS_F3~HrYiFr z3)#GB*u_NR5JO?#-IgJqs;O^m zing|=y1JKNtesIOOEaawz^GvxSySJ*$Iyzq2331Vw=~1rx!KTkt7trK=mpV_NwMEj zhxLo{jJn!cvlV62NY>arVifnvQ9*EH1(ms?{E@I#rs z2+^KaE((95JqdRsl0Xf#ka}n>Z6%%Zw3iOhK{`Z7={TLH59thjN$2S+x=CfulOXL~2TV;e+1y)a2 zM(l2tak<7R2mj1_0`+sFu?2}mOCDfv*Z2Ck)D4YuB$f;=DTys1iR&v~beyd%p^)t1 z(mO`Hog)=oNf%3|q>$|8qPb{imn6xRTvZoc+Rf1_uAhtcEaxaW1t$JK|D`(wc!y5W zC!GB6=n_qG;(w(pbe(R%i#p6k1A+))E@GIE1&E`aGoHa>EWyet*4JP?HlQCH@fdbM z#Smv+=gj9h^EQeYM+y7zES|#w9K;d4f?kGK@fJ?Fh2e1;+j-WyuUjil^4+vB?l5p$ zo%^e}U?Y4Gn0ycnu~74&|8DbpZ~IoWhsX^l9!hN27+n5^e@al;a5#P138!@p$Z_To=!-KfS5|O|%u~w`T zxApDH?ddD3#SwdjTG--P>(%0}tXkM12mAQ2;JX25g!JpyDpMcTt=_^q-dt?3d4+Zp z7sY7L@G<8WBnsjVxp8bPl}Ij%hf~R}sY#dUNb;$dN{^3=LPM-$!}cfk9em^Ho9~`D z`QGPK#|XEG_q+D=`UR6CfwC|1nitoP9BySVg{!@K+(+aXf5oPa3_B;s%NhAB@6GZx tzvX2CbTeNf;N4FYt||NRTLr62w|kvL=h(9JnesO+7d+EJeN#b+{sFG4ZTA2G delta 321 zcmZoEXepQ=&DcIs##mIAfq{XUfkA+Qp@boyp@<=v!G*zl;zi}j1|}@5j6g}2$yOQ` zlQ*i1F*7s-Oiol#-gt?beKR`;3kM_rT1$l5yCW?-9Uu3oq<7tXXC~9%#-;|bQu{YJDTj-tfsn{ I3E3t?0G9n(*Z=?k diff --git a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj index 8cb30dc39b..8d3f48b4ae 100644 --- a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj @@ -7,8 +7,8 @@ objects = { /* Begin PBXBuildFile section */ - 06230F091BC7FF3500A4807B /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 06230F081BC7FF3000A4807B /* ActorSDK.framework */; }; - 06230F0A1BC7FF3500A4807B /* ReferenceProxy in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 06230F081BC7FF3000A4807B /* ActorSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 06230F091BC7FF3500A4807B /* ActorSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06230F081BC7FF3000A4807B /* ActorSDK.framework */; }; + 06230F0A1BC7FF3500A4807B /* ActorSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 06230F081BC7FF3000A4807B /* ActorSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 068B397B1C85386A002BFF73 /* ringtone.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 068B397A1C85386A002BFF73 /* ringtone.m4a */; }; 068C6E4F1BBC4BF900182516 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 068C6E4E1BBC4BF900182516 /* Launch Screen.storyboard */; }; 06CE898E1BD841D0005A5530 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06CE898D1BD841D0005A5530 /* SystemConfiguration.framework */; }; @@ -44,7 +44,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 06230F0A1BC7FF3500A4807B /* ReferenceProxy in Embed Frameworks */, + 06230F0A1BC7FF3500A4807B /* ActorSDK.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -72,6 +72,7 @@ 9B2EEB8CEF2E94D58EA09D9D /* Pods-ActorApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorApp.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp.debug.xcconfig"; sourceTree = ""; }; A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ActorApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DE8D1D9859D2C4D4C7EC7AD74BB65F0E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "Supporting Files/Info.plist"; sourceTree = ""; }; + F10BD8AC1DEFAF62007748D6 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; F76A77E9428111C798E69B43EA06A281 /* ActorApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = ActorApp.entitlements; path = "Supporting Files/ActorApp.entitlements"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -82,7 +83,7 @@ files = ( 06CE898E1BD841D0005A5530 /* SystemConfiguration.framework in Frameworks */, 06E7B24F1C109C4B0090660C /* MapKit.framework in Frameworks */, - 06230F091BC7FF3500A4807B /* ReferenceProxy in Frameworks */, + 06230F091BC7FF3500A4807B /* ActorSDK.framework in Frameworks */, A88F4C381ED2B98E99A68937 /* Pods_ActorApp.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -122,6 +123,7 @@ 86C48777C0FD262E78F8BEC9253C9914 /* Frameworks */ = { isa = PBXGroup; children = ( + F10BD8AC1DEFAF62007748D6 /* libc++.tbd */, 06E7B24E1C109C4B0090660C /* MapKit.framework */, 06CE898D1BD841D0005A5530 /* SystemConfiguration.framework */, 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */, @@ -333,7 +335,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run \'pod install\' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; 851EE1A34619AE6677649A27 /* Embed Pods Frameworks */ = { diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index 282128ebc3..e71739b01a 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.4" + s.version = "3.0.457.6" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj index f4d5663f5c..75f6063376 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj @@ -2018,7 +2018,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run \'pod install\' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; A2ED258362D73946D3AE7FB4 /* [CP] Copy Pods Resources */ = { diff --git a/actor-sdk/sdk-core-ios/ActorSDK/.DS_Store b/actor-sdk/sdk-core-ios/ActorSDK/.DS_Store index ac506e682c4adaf8387e8ebfaa7d0a4b843be35e..069a29560087b4259437c40a9ae83e180bf57592 100644 GIT binary patch delta 51 zcmZp1XmOa}&&akhU^hP_+vJVHVw05w-f*TAC+8&P=jSj0MI<*13SMX1%r5bbW%E4| Gc4h#>>k(G~ delta 43 zcmV+`0M!44K!iY$PXPt7P`eKS1(VPd7Ly_n?6WNq+6Iw;AF~G-_5`yW73%_#fE-HX B4@Uq1 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift index 3dccbb452e..d7112c86e0 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift @@ -130,7 +130,7 @@ extension JavaUtilAbstractCollection : Sequence { } -public extension JavaUtilList { +public extension JavaUtilListProtocol { public func toSwiftArray() -> [T] { var res = [T]() for i in 0.. JavaUtilList! { + func loadAllItems() -> JavaUtilListProtocol! { checkTable() let res = JavaUtilArrayList()! @@ -115,7 +115,7 @@ import Foundation return res } - func loadItems(_ keys: IOSLongArray!) -> JavaUtilList! { + func loadItems(_ keys: IOSLongArray!) -> JavaUtilListProtocol! { checkTable() // Converting to NSNumbers diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/Storage/FMDBList.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/Storage/FMDBList.swift index 43227ca25e..887508f74f 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/Storage/FMDBList.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/Storage/FMDBList.swift @@ -103,7 +103,7 @@ class FMDBList : NSObject, ARListStorageDisplayEx { log("updateOrAddWithValue \(tableName): \(valueContainer.getData().length()) in \(Int((Date().timeIntervalSince(start)*1000)))") } - func updateOrAdd(with items: JavaUtilList!) { + func updateOrAdd(with items: JavaUtilListProtocol!) { checkTable(); db!.beginTransaction() @@ -199,13 +199,13 @@ class FMDBList : NSObject, ARListStorageDisplayEx { } } - func loadAllItems() -> JavaUtilList! { + func loadAllItems() -> JavaUtilListProtocol! { let res = JavaUtilArrayList() // TODO: Implement return res } - func loadForward(withSortKey sortingKey: JavaLangLong!, withLimit limit: jint) -> JavaUtilList! { + func loadForward(withSortKey sortingKey: JavaLangLong!, withLimit limit: jint) -> JavaUtilListProtocol! { checkTable(); var result : FMResultSet? = nil; if (sortingKey == nil) { @@ -247,7 +247,7 @@ class FMDBList : NSObject, ARListStorageDisplayEx { return res; } - func loadForward(withQuery query: String!, withSortKey sortingKey: JavaLangLong!, withLimit limit: jint) -> JavaUtilList! { + func loadForward(withQuery query: String!, withSortKey sortingKey: JavaLangLong!, withLimit limit: jint) -> JavaUtilListProtocol! { checkTable(); var result : FMResultSet? = nil; @@ -277,7 +277,7 @@ class FMDBList : NSObject, ARListStorageDisplayEx { } - func loadBackward(withSortKey sortingKey: JavaLangLong!, withLimit limit: jint) -> JavaUtilList! { + func loadBackward(withSortKey sortingKey: JavaLangLong!, withLimit limit: jint) -> JavaUtilListProtocol! { checkTable(); var result : FMResultSet? = nil; if (sortingKey == nil) { @@ -304,7 +304,7 @@ class FMDBList : NSObject, ARListStorageDisplayEx { return res; } - func loadBackward(withQuery query: String!, withSortKey sortingKey: JavaLangLong!, withLimit limit: jint) -> JavaUtilList! { + func loadBackward(withQuery query: String!, withSortKey sortingKey: JavaLangLong!, withLimit limit: jint) -> JavaUtilListProtocol! { checkTable(); var result : FMResultSet? = nil; @@ -333,7 +333,7 @@ class FMDBList : NSObject, ARListStorageDisplayEx { return res; } - func loadCenter(withSortKey centerSortKey: JavaLangLong!, withLimit limit: jint) -> JavaUtilList! { + func loadCenter(withSortKey centerSortKey: JavaLangLong!, withLimit limit: jint) -> JavaUtilListProtocol! { checkTable(); let res: JavaUtilArrayList = JavaUtilArrayList(); @@ -342,7 +342,7 @@ class FMDBList : NSObject, ARListStorageDisplayEx { return res } - func loadSlise(_ result: FMResultSet?) -> JavaUtilList! { + func loadSlise(_ result: FMResultSet?) -> JavaUtilListProtocol! { if (result == nil) { NSLog(db!.lastErrorMessage()) return nil diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/iOSNotificationProvider.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/iOSNotificationProvider.swift index ec1729a4c5..02bd872278 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/iOSNotificationProvider.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/iOSNotificationProvider.swift @@ -43,11 +43,11 @@ import AudioToolbox.AudioServices } - func onNotification(with messenger: ACMessenger!, withTopNotifications topNotifications: JavaUtilList!, withMessagesCount messagesCount: jint, withConversationsCount conversationsCount: jint) { + func onNotification(with messenger: ACMessenger!, withTopNotifications topNotifications: JavaUtilListProtocol!, withMessagesCount messagesCount: jint, withConversationsCount conversationsCount: jint) { // Not Supported } - func onUpdateNotification(with messenger: ACMessenger!, withTopNotifications topNotifications: JavaUtilList!, withMessagesCount messagesCount: jint, withConversationsCount conversationsCount: jint) { + func onUpdateNotification(with messenger: ACMessenger!, withTopNotifications topNotifications: JavaUtilListProtocol!, withMessagesCount messagesCount: jint, withConversationsCount conversationsCount: jint) { // Not Supported } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Layouting/AABubbleBackgroundProcessor.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Layouting/AABubbleBackgroundProcessor.swift index d243c0ae05..76fa510a13 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Layouting/AABubbleBackgroundProcessor.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Layouting/AABubbleBackgroundProcessor.swift @@ -49,7 +49,7 @@ class AAListProcessor: NSObject, ARListProcessor { self.peer = peer } - func process(withItems items: JavaUtilList, withPrevious previous: Any?) -> Any? { + func process(withItems items: JavaUtilListProtocol, withPrevious previous: Any?) -> Any? { var objs = [ACMessage]() var indexes = [jlong: Int]() diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogListProcessor.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogListProcessor.swift index f5b4c11c79..0edaeb1228 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogListProcessor.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogListProcessor.swift @@ -6,7 +6,7 @@ import Foundation class AADialogListProcessor: NSObject, ARListProcessor { - func process(withItems items: JavaUtilList, withPrevious previous: Any?) -> Any? { + func process(withItems items: JavaUtilListProtocol, withPrevious previous: Any?) -> Any? { var uids = Set() diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AAManagedTable.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AAManagedTable.swift index 4d31247c92..135ae6b8c1 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AAManagedTable.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AAManagedTable.swift @@ -500,7 +500,7 @@ private class AAManagedSearchController: NSObject, UISearchBarDelegate if let ds = searchList { return ds.item(with: jint((indexPath as NSIndexPath).row)) as! BindCell.BindData } else if let sm = searchModel { - let list = sm.getResults().get() as! JavaUtilList + let list = sm.getResults().get() as! JavaUtilListProtocol return list.getWith(jint((indexPath as NSIndexPath).row)) as! BindCell.BindData } else { fatalError("No search model or search list is set!") @@ -521,7 +521,7 @@ private class AAManagedSearchController: NSObject, UISearchBarDelegate if let ds = searchList { return Int(ds.size()) } else if let sm = searchModel { - let list = sm.getResults().get() as! JavaUtilList + let list = sm.getResults().get() as! JavaUtilListProtocol return Int(list.size()) } else { fatalError("No search model or search list is set!") diff --git a/actor-sdk/sdk-core/.DS_Store b/actor-sdk/sdk-core/.DS_Store index d43f8f9f895864fbc3637e11f2071d4ab935b7fd..006b9ccb59b7a44866902fbdd6064d643789686a 100644 GIT binary patch delta 52 zcmZp1XmOa}&&akhU^hP_+h!gCIY!Qu;^ds9{QMlo&2oYotQ!m0Fm7g-_{OsNg-9IZ I#=@110IM(&4*&oF delta 46 zcmZp1XmOa}&&awlU^hP_>t-GSImXTQf-2Hwr=94s7+ESq%&ZUMQ9 So7pA4v22zTeaSSjK@I@*&Jm>m diff --git a/actor-sdk/sdk-core/runtime/.DS_Store b/actor-sdk/sdk-core/runtime/.DS_Store index c1b00a458477e1a44459ca4625df47092e7fb227..1592f30fcfec1e310382ee8dc84aaacbb8a1df7b 100644 GIT binary patch delta 100 zcmZp1XmOa}FUrQiz`)4BAi%(o$&kyC%Am`T%#gpaa2or>2Hwr=94s6fAQij}MGU13 qc?>1Usz53k5>twkbCUA&a~L=C2wY*`%r5bbWipSD)aDN&Z2Hwr=94s7+tdj!;B{q8t W>;Vd?Z)TVH# Date: Thu, 1 Dec 2016 19:47:51 -0200 Subject: [PATCH 175/253] alteracoes --- actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../ActorApp.xcodeproj/project.pbxproj | 2 -- 3 files changed, 2 deletions(-) diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index cb3ab4c1ecd345efedc64e13900cfd8532605f36..91e75d3a3760a0a855cb7e71bf3080d7ebbf2d8d 100644 GIT binary patch delta 40 tcmZokXi3;mCd_VWs-vK5X}GyoIGKs5DPi(b3A@b-V$C4-=A{zx;s6Fh46FbE delta 36 qcmZokXi3;mCOmnAg6HP_!ir2xrVNvpO4w~y5NigpH!qcl7Y6|GYYV0T diff --git a/actor-sdk/sdk-core-ios/.DS_Store b/actor-sdk/sdk-core-ios/.DS_Store index d7a70f281b3eda0eed3e6f5252b5ce0d8884bc42..66a5fa57649d17129ce48b6d3c253d72dff9a9a4 100644 GIT binary patch delta 33 ncmZoEXernbufWt0H#t$km^Dpd4Fdy^r8QYcgKP6y1#@u#!ifr# delta 33 ncmZoEXernbufWt8J2_Fom^IbFh=Bpf(weNJ!L|9Ug1I;VyXXoi diff --git a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj index 8d3f48b4ae..0f6bf2bbb1 100644 --- a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj @@ -72,7 +72,6 @@ 9B2EEB8CEF2E94D58EA09D9D /* Pods-ActorApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorApp.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp.debug.xcconfig"; sourceTree = ""; }; A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ActorApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DE8D1D9859D2C4D4C7EC7AD74BB65F0E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "Supporting Files/Info.plist"; sourceTree = ""; }; - F10BD8AC1DEFAF62007748D6 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; F76A77E9428111C798E69B43EA06A281 /* ActorApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = ActorApp.entitlements; path = "Supporting Files/ActorApp.entitlements"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -123,7 +122,6 @@ 86C48777C0FD262E78F8BEC9253C9914 /* Frameworks */ = { isa = PBXGroup; children = ( - F10BD8AC1DEFAF62007748D6 /* libc++.tbd */, 06E7B24E1C109C4B0090660C /* MapKit.framework */, 06CE898D1BD841D0005A5530 /* SystemConfiguration.framework */, 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */, From 89a0f2e3507c46f8c9afc7a294c7601e5fd353a3 Mon Sep 17 00:00:00 2001 From: gputintsev Date: Sun, 4 Dec 2016 15:45:28 +0300 Subject: [PATCH 176/253] chore(core+android+ios): add nl locale --- .../src/main/res/values-nl/ui_text.xml | 13 +- .../Resources/nl.lproj/Localizable.strings | 771 ++++++++++++++++++ .../AAContactsListContentController.swift | 2 +- .../src/main/resources/AppText_Nl.json | 206 +++++ 4 files changed, 982 insertions(+), 10 deletions(-) create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/nl.lproj/Localizable.strings create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/resources/AppText_Nl.json diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-nl/ui_text.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-nl/ui_text.xml index 79d53e45b9..0bc0221e58 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-nl/ui_text.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-nl/ui_text.xml @@ -1,10 +1,5 @@ - - + - Homecrew Nl Bevestig @@ -57,7 +52,7 @@ met Google Naar boven - Homecrew + {app_name} Voorkom inbraak. Buren worden dienstverleners. @@ -152,7 +147,7 @@ Typ iets om te zoeken - Homecrew doorzoeken + {app_name} doorzoeken Niets gevonden Help Zoeken @@ -181,7 +176,7 @@ Bewerk profiel Wijzig foto Account - Over Homecrew + Over {app_name} Help Stel een vraag of geef feedback Twitter diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/nl.lproj/Localizable.strings b/actor-sdk/sdk-core-ios/ActorSDK/Resources/nl.lproj/Localizable.strings new file mode 100644 index 0000000000..5abec5527d --- /dev/null +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/nl.lproj/Localizable.strings @@ -0,0 +1,771 @@ +// +// Copyright (c) 2014-2016 Actor LLC. +// + +/* + * Main Screen + */ + +"TabMessages" = "Berichten"; + +"TabPeople" = "Contacten"; + +"TabSettings" = "Account"; + +// Not sure if we will use this. +"TabDiscover" = "Ontdek"; + +/* + * Contacts + */ + +"ContactsAddHeader" = "Nieuw contact"; + +"ContactsAddHint" = "Geef het telefoonnummer op."; + +// NOTE: no need/way to use {appname} as these are deviations from Actor SDK/core and strings +// are likely not interpolated by default. So use literal Homecrew when we want. +"ContactsActionInvite" = "Vertel buurtgenoten en vrienden over Homecrew!"; + +"ContactsActionAdd" = "Contact toevoegen"; + +"ContactsBack" = "Contacten"; + +/* + * Dialogs + */ + +// Where is this? +"DialogsHint" = "Swipe voor meer opties."; + +"DialogsBack" = "Chats"; + +/* + * Settings + */ + +"SettingsEdit" = "Bewerken"; + +"SettingsSetPhoto" = "Profielfoto instellen"; + + +"SettingsChangeName" = "Naam wijzigen"; + +"SettingsEditHeader" = "Te gebruiken naam"; + +"SettingsEditHint" = "Gebruik een echte naam om eenvoudiger gevonden te worden."; + +"SettingsEditFieldHint" = "Geef naam op"; + + +"SettingsUsernameNotSet" = "Gebruikersnaam instellen"; + +"SettingsUsernameTitle" = "Gebruikersnaam"; + +"SettingsUsernameHintField" = "Kies een gebruikersnaam en geef deze hier op."; + +"SettingsUsernameHint" = "Het is mogelijk zelf een gebruikersnaam te kiezen voor {appname}. Anderen zijn dan makkelijker in staat op basis hiervan deze account te vinden, en kunnen zo contact opnemen zonder het telefoonnummer te weten.\n\nHet is toegestaan de (hoofd)letters a-z, getallen 0-9 en liggende streepjes (_) te gebruiken. Minimum lengte is 5 tekens."; + +// TODO: Is this placeholder or what? +"SettingsAboutNotSet" = "Bio"; + +"SettingsChangeAboutTitle" = "Over mijzelf"; + +"SettingsChangeAboutHint" = "Vertel kort iets over jezelf."; + + +"SettingsSecurity" = "Privacy en beveiliging"; + +"SettingsWallpapers" = "Achtergrond"; + +"SettingsMedia" = "Media"; + +"SettingsNotifications" = "Meldingen en geluiden"; + +"SettingsAskQuestion" = "Stel een vraag"; + +"SettingsTwitter" = "Volg ons op Twitter"; + +"SettingsAbout" = "Homecrew"; + +"SettingsVersion" = "Versie {version}"; + +"SettingsMobilePhone" = "Mobiele telefoon"; + +"SettingsGroupChats" = "Groepen"; + +"SettingsPrivateChats" = "Besloten chats"; + +/* + * Notifications + */ + +"NotificationsTitle" = "Meldingen en geluiden"; + +"NotificationsEffectsTitle" = "Effecten"; + +"NotificationsMobileTitle" = "Mobiele meldingen"; + +// QNA: what is the difference between the two, if any? +"NotificationsInAppTitle" = "In-app meldingen"; + +"NotificationsNotificationHint" = "Meldingen van gebruikers of groepen zijn via de infopagina's uit te schakelen."; + +"NotificationsPrivacyTitle" = "Privacy"; + +"NotificationsSoundEffects" = "Geluidseffecten"; + +"NotificationsEnable" = "Inschakelen"; + +"NotificationsSound" = "Geluid"; + +"NotificationsVibration" = "Trillen"; + +"NotificationsPreview" = "Berichtvoorbeeld"; + +"NotificationsPreviewHint" = "De berichttekst niet in melding weergeven."; + +"NotificationSecretMessage" = "Nieuw bericht"; + +"NotificationsGroups" = "Groepsmeldingen"; + +"NotificationsOnlyMentions" = "Alleen persoonlijk aangesproken"; + +"NotificationsOnlyMentionsHint" = "Het is alleen mogelijk meldingen te ontvangen voor berichten specifiek gericht aan deze gebruiker."; + +/* + * Media + */ + +"MediaTitle" = "Media"; + +"MediaPhotoDownloadHeader"= "Automatisch afbeeldingen downloaden"; + +"MediaAudioDownloadHeader"= "Automatisch geluidsbestanden downloaden"; + +"MediaOtherHeader"= "Overige"; + +"MediaAutoplayGif"= "Automatisch GIF afspelen"; + +/* + * Privacy + */ + +"PrivacyTitle" = "Beveiliging"; + + +"PrivacyHeader" = "Privacy"; + +// TODO: check space Laats gev.: (whatsapp) zonder clone te zijn (synoniem?) +"PrivacyLastSeen" = "Laatst"; + +// TODO: herformuleren zonder 'je' of 'toon' +"PrivacyLastSeenHint" = "Wijzig aan wie het tijdstip van laatst online getoond mag worden"; + +"PrivacyLastSeenEverybody" = "Iedereen"; + +"PrivacyLastSeenContacts" = "Mijn contacten"; + +"PrivacyLastSeenNone" = "Niemand"; + + +"PrivacySecurityHeader" = "Beveiliging"; + +"PrivacyAllSessions" = "Actieve sessies"; + +"PrivacyTerminate" = "Beëindig alle overige sessies"; + +"PrivacyTerminateAlert" = "Alle sessies beëindigen"; + +"PrivacyTerminateAlertSingle" = "Beëindig sessie"; + +"PrivacyTerminateHint" = "Alle andere apparaten behalve deze afmelden."; + +/* + * Wallpapers + */ + +"WallpapersTitle" = "Achtergronden"; + +"WallpapersPhoto" = "Gallerij"; + +/* + * Calls + */ + +"CallsStartAudio" = "Telefoongesprek"; + +"CallsStartGroupAudio" = "Conferentiegesprek"; + +"CallsAnswer" = "opnemen"; + +"CallsDecline" = "weigeren"; + +"CallsMute" = "stil"; + +"CallsSpeaker" = "speaker"; + +"CallsVideo" = "video"; + +"CallStateRinging" = "Gaat over..."; + +"CallStateConnecting" = "Verbinden..."; + +"CallStateIncoming" = "Binnenkomend gesprek..."; + +"CallPrivateTitle" = "Gesprek"; + +"CallPrivateText" = "Oproep van {name}"; + +"CallGroupTitle" = "Conferentiegesprek"; + +"CallGroupText" = "Conferentiegesprek {name}"; + + +/* + * Profile + */ + +"ProfileEditHeader" = "Naam wijzigen"; + +"ProfileSendMessage" = "Bericht versturen"; + +"ProfileNotifications" = "Meldingen"; + +// FIXME: Warring??? +"ProfileNotificationsWarring" = "Definitief meldingen van deze persoon uitschakelen? Dit kan een bron van miscommunicatie vormen."; + +// FIXME: Warring??? +"ProfileNotificationsWarringAction" = "Uitschakelen"; + +"ProfileAddToContacts" = "Aan contacten toevoegen"; + +"ProfileRemoveFromContacts" = "Uit contacten verwijderen"; + +"ProfileBlockContact" = "Blokkeer gebruiker"; + +"ProfileUnblockContact" = "Blokkering opheffen"; + +"ProfileRename" = "Hernoem contact"; + +"ProfileRenameMessage" = "Het is mogelijk om contacten zelf te hernoemen, deze wijzigingen zijn dan alleen hier zichtbaar."; + +"ProfileRenameAction" = "Hernoem"; + +"ProfileAbout" = "over mij"; + +"ProfilePhone" = "telefoonnummer"; + +"ProfileUsername" = "gebruikersnaam"; + +"ProfileTitle" = "Info"; + +"CallNumber" = "Bellen"; + +"CopyNumber" = "Kopieer"; + +"NumberCopied" = "Telefoonnummer is naar het klembord gekopieerd."; + +/* + * Publics + */ + +"JoinAlertMessage" = "Lid worden van deze groep?"; + +/* + * Group + */ + +"GroupEditHeader" = "Onderwerp"; + +"GroupEditHint" = "Geef hier het onderwerp van de groep op."; + +"GroupSetPhoto" = "Groepsafbeelding instellen"; + +"GroupSetTitle" = "Titel van de groep"; + +"GroupSetSound" = "Berichtgeluid"; + +"GroupEditConfirm" = "De titel van deze groep wijzigen?"; + +"GroupEditConfirmAction" = "Wijzig onderwerp"; + +"GroupNotifications" = "Meldingen"; + +"GroupSettings" = "INSTELLINGEN"; + +"GroupIntegrations" = "Koppelingen"; + +"GroupViewMembers" = "Leden"; + +"GroupDescription" = "Omschrijving"; + + + +"GroupAdministration" = "Beheer"; + +"GroupTypeTitle" = "Soort groep"; + +"GroupTypeTitleChannel" = "Soort kanaal"; + +"GroupPermissionsHint" = "Beheer groepsinstellingen en bepaal wat er mogelijk is binnen deze groep"; + +"GroupPermissionsHintChannel" = "Beheer wat er mogelijk is op dit kanaal"; + +"GroupTypeHintPublic" = "Openbare groepen kunnen opgezocht en gevonden worden, zonder uitnodiging mag iedereen lid worden."; + +"GroupTypeHintPrivate" = "Besloten groepen kunnen alleen op uitnodiging nieuwe leden ontvangen"; + +"GroupTypeHintPublicChannel" = "Openbare kanalen kunnen gevonden worden en iedereen kan zichzelf toegang verschaffen"; + +"GroupTypeHintPrivateChannel" = "Besloten kanalen kunnen alleen op uitnodiging leden ontvangen"; + +// TODO: "GroupTypeLinkHint" = "People can share this link with others and find your group using search"; +// I would say people can easily JOIN using the URL, not search right? +"GroupTypeLinkHint" = "Deze link kan met anderen gedeeld worden om deze groep eenvoudig te vinden."; + +"GroupTypeLinkHintChannel" = "Deze link kan met anderen gedeeld worden om het kanaal eenvoudig te vinden"; + +"GroupTypePublic" = "Openbaar"; + +"GroupTypePrivate" = "Afgeschermd"; + +"ChannelTypePublic" = "Openbaar"; + +"ChannelTypePrivate" = "Afgeschermd"; + +"GroupTypePublicFull" = "Openbare groep"; + +"GroupTypePrivateFull" = "Afgeschermde groep"; + +"ChannelTypePublicFull" = "Openbaar kanaal"; + +"ChannelTypePrivateFull" = "Afgeschermd kanaal"; + +"GroupDeleteHint" = "Alle berichten uit deze groep zullen definitief verloren gaan."; + +"GroupDeleteHintChannel" = "Alle berichten uit dit kanaal zullen definitief verloren gaan."; + + + +"GroupShareTitle" = "Gedeelde geschiedenis"; + +"GroupShareEnabled" = "Gedeeld"; + +"GroupShareHint" = "Alle leden krijgen hiermee alle berichten te zien, dit is niet terug te draaien."; + +"GroupShareMessage" = "Definitief berichtengeschiedenis met alle leden delen? Deze handeling is onomkeerbaar."; + +"GroupShareAction" = "Delen"; + + + +"GroupEditTitle" = "Bewerk groep"; + +"GroupEditTitleChannel" = "Bewerk kanaal"; + +"GroupEditName" = "Groepsnaam"; + +"GroupEditNameChannel" = "Naam van het kanaal"; + +"GroupEditDescription" = "Omschrijving"; + + +"GroupMemberAdmin" = "beheerder"; + +"GroupMemberInfo" = "Profiel"; + +"GroupMemberMakeAdmin" = "Groepsbeheerder maken"; + +"GroupMemberMakeMessage" = "Gebruiker {name} als beheerder van deze groep toewijzen?"; + +"GroupMemberMakeAction" = "Ja"; + +"GroupMemberKick" = "Verwijder uit groep"; + +"GroupMemberKickMessage" = "De gebruiker {name} uit deze groep verwijderen?"; + +"GroupMemberKickAction" = "Verwijder (kick)"; + +"GroupMemberWrite" = "Schrijf een bericht"; + +"GroupMemberCall" = "Telefoongesprek"; + +"GroupMemberCallNoPhones" = "Geen beschikbaar telefoonnummer van gebruiker"; + +"GroupAddParticipant" = "Deelnemer toevoegen..."; + +"GroupAddParticipantTitle" = "Contacten"; + +"GroupAddParticipantUrl" = "Uitnodigen voor groep via snelkoppeling"; + + +"GroupInviteLinkPageTitle" = "Uitnodiging link"; + +"GroupInviteLinkTitle" = "LINK"; + +"GroupInviteLinkHint" = "Stuur deze link om anderen voor deze groep uit te nodigen."; + +"GroupInviteLinkRevokeMessage" = "Deze link intrekken? Eenmaal ingetrokken kan niemand deze meer gebruiken om lid te worden van de groep."; + +"GroupInviteLinkRevokeAction" = "Intrekken"; + + + +"GroupJoinMessage" = "Lid van deze groep worden?"; + +"GroupJoinAction" = "Lid worden"; + +/* + * Compose + */ + +"ComposeTitle" = "Nieuw bericht"; + + +"CreateGroup" = "Groep aanmaken"; + +"CreateChannel" = "Kanaal aanmaken"; + + +"CreateGroupTitle" = "Nieuwe groep"; + +"CreateGroupHint" = "Geef een groepsnaam en eventueel groepsafbeelding op"; + +"CreateGroupNamePlaceholder" = "Naam van de groep"; + +"CreateChannelTitle" = "Nieuw kanaal"; + +"CreateChannelHint" = "Geef een naam voor het kanaal en eventueel een afbeelding op"; + +"CreateChannelNamePlaceholder" = "Naam van het kanaal"; + + +"CreateGroupMembersTitle" = "Leden uitnodigen"; + +"CreateGroupMembersPlaceholders" = "Namen invoeren"; + +/* + * Location + */ + +"LocationTitle" = "Locatie"; + +/* + * Chat + */ + +"ChatPlaceholder" = "Tekst invoeren..."; + +"ChatSend" = "Zend"; + +"ChatNoGroupAccess" = "Er is geen lidmaatschap van deze groep"; + +"ChatNewMessages" = "Nieuwe berichten"; + +"ChatVoiceMessage" = "Geluidsfragment"; + +"ChatHoldToTalk" = "Vasthouden om te praten"; + +"ChatReleaseToSend" = "Loslaten om te versturen"; + +// FIXME: this in Android is "Swipe to left to cancel" (slide up doesn't do anything/work) +"ChatSlideUpToCancel" = "Veeg naar links om te annuleren"; + +// FIXME: new convention? (periods) +"Chat.MicrophoneAccessDisabled" = "Om geluid op te nemen is toegang tot de microfoon nodig. Ga naar Account — Privacy — Microfoon en schakel deze in."; + +"ChatDeleted" = "Dit gesprek is door de eigenaar verwijderd."; + +"ChatJoin" = "Lid worden"; + +/* + * Chat attachment menu + */ + +"AttachmentsSendPhoto" = "Stuur {count} foto"; + +"AttachmentsSendPhotos" = "Stuur {count} foto's"; + +/* + * Find + */ + +// NOTE: where does this show up? +"FindTitle" = "Buurtgenoten op Homecrew vinden"; + +"FindFieldHint" = "telefoonnummer, e-mail of gebruikersnaam"; + +"FindHint" = "Zoek op telefoonnummer, e-mailadres of gebruikersnaam."; + +"FindNotFound" = "Helaas, we hebben niemand kunnen vinden."; + +/* + * Placeholders + */ + +"Placeholder_Empty_Title" = "Buurtgenoten uitnodigen"; + +"Placeholder_Empty_Message" = "Geen van de bestaande telefooncontacten zijn op {appname} gevonden. Gebruik de knop hieronder om ze uit te nodigen."; + +"Placeholder_Empty_Action" = "VERTEL BUURTGENOTEN"; + +"Placeholder_Empty_Message2" = "of voer handmatig een contact toe"; + +"Placeholder_Empty_Action2" = "TOEVOEGEN CONTACT"; + +"Placeholder_Loading_Title" = "Bezig met synchroniseren"; + +"Placeholder_Loading_Message" = "Enige momenten geduld, we zijn de omgeving aan het opzetten."; + +"Placeholder_Contacts_Title" = "Buurtgenoten uitnodigen"; + +"Placeholder_Contacts_Message" = "Geen van de bestaande telefooncontacten gebruikt momenteel {appname}. Gebruik de knop hieronder om ze uit te nodigen."; + +"Placeholder_Contacts_Action" = "VERTEL HET DOOR"; + +"Placeholder_Contacts_Message2" = "of voeg handmatig een contact toe met het plusteken hier rechtsboven"; + +"Placeholder_Dialogs_Title" = "Begin met berichten versturen"; + +"Placeholder_Dialogs_Message" = "Kies een contact uit de lijst of druk op de berichtknop in de rechterbovenhoek om nu een gesprek te starten."; + +"Placeholder_Group_Title" = "Geen lid"; + +"Placeholder_Group_Message" = "Helaas, deze groep is besloten."; + +"Placeholder_Location_Title" = "Inschakelen locatiediensten"; + +"Placeholder_Location_Message" = "Schakel diensten voor locaties in bij apparaatinstellingen om de huidige locatie te delen."; + + +/* + * Welcome + */ + +"WelcomeTitle" = "Welkom bij {app_name}!"; + +// FIXME: change me to HC tagline +"WelcomeTagline" = "Voorkom inbraak. Buren worden dienstverleners."; + +"WelcomeSignUp" = "Inschrijven"; + +"WelcomeLogIn" = "Aanmelden"; + + +/* + * Auth + */ + +"AuthCountryTitle" = "Landcode"; + +"AuthUnsupported" = "Deze account wordt niet ondersteund in deze versie van {app_name}. Werk eerst de applicatie naar de meest recente versie bij."; + +"AuthLoginTitle" = "Aanmelden bij {app_name}"; + +"AuthLoginPhone" = "Telefoonnummer"; + +"AuthLoginEmail" = "E-mail"; + +"AuthLoginPhoneEmail" = "Telefoonnummer of e-mailadres"; + +"AuthNameTitle" = "Hoi! Stel jezelf even voor?"; + +"AuthNamePlaceholder" = "Mijn naam"; + +"AuthPhoneTitle" = "Wat is het telefoonnummer?"; + +"AuthPhoneUseEmail" = "Gebruik e-mail"; + +"AuthPhoneHint" = "We hebben een telefoonnummer nodig om de beveiliging van persoonlijke gegevens te kunnen waarborgen."; + +"AuthPhonePlaceholder" = "Telefoonnummer"; + +"AuthEmailTitle" = "Wat is het e-mailadres?"; + +"AuthEmailHint" = "We beloven geen onnodige berichten (spam) te versturen en zullen dit e-mail nooit aan derden overhandigen."; + +"AuthEmailPlaceholder" = "E-mail"; + +"AuthEmailUsePhone" = "Telefoon gebruiken"; + +"AuthDisclaimer" = "Door het gebruik van deze omgeving wordt akkoord gegaan met de op dat moment geldende Algemene Voorwaarden en het Privacybeleid."; + +"AuthDisclaimerTosOnly" = "Door aan te melden wordt met de Algemene Servicevoorwaarden akkoord gegaan."; + +"AuthDisclaimerPrivacyOnly" = "Door aan te melden wordt met het Privacybeleid akkoord gegaan."; + +"AuthDisclaimerToS" = "Algemene Servicevoorwaarden"; + +"AuthDisclaimerPrivacy" = "Privacybeleid"; + +"AuthOTPEmailTitle" = "E-mail bevestigen"; + +"AuthOTPPhoneTitle" = "Telefoonnummer bevestigen"; + +"AuthOTPEmailHint" = "We hebben een e-mailbericht gestuurd met de activatiecode.\nVoer deze code in het veld hieronder in."; + +"AuthOTPPhoneHint" = "We hebben een SMS bericht gestuurd met de activatiecode.\nVoer deze code in het veld hieronder in."; + +"AuthOTPPlaceholder" = "Activatiecode"; + +"AuthOTPNoCode" = "Code niet ontvangen?"; + +"AuthOTPCallHint" = "{app_name} zal in {time} contact opnemen"; + + +/* + * Common Elements + */ + +"CurrentLocale" = "Nl"; + + +// NOTE: theming +"InviteText" = "Hoi! Zullen we {appname} gebruiken voor een veilige en verbonden buurt? {link}"; + +"PhotoRemove" = "Verwijder foto"; + +"PhotoRemoveGroupMessage" = "Deze groepsafbeelding verwijderen? Sommige leden zullen teleurgesteld zijn."; + +"PhotoCamera" = "Maak een foto of neem een video op"; + +"PhotoLibrary" = "Mediagallerij"; + +"SendDocument" = "Document"; + +"ShareLocation" = "Locatie"; + +"ShareContact" = "Contact delen"; + +/* + * Navigation + */ + +"NavigationEdit" = "Bewerk"; + +"NavigationDone" = "Klaar"; + +"NavigationCancel" = "Annuleer"; + +"NavigationBack" = ""; + +"NavigationNext" = "Volgende"; + +"NavigationSave" = "Opslaan"; + +"NavigationFind" = "Zoeken"; + +/* + * Alerts + */ + +"AlertUnblock" = "Blokkering opheffen"; + +"AlertCancel" = "Annuleer"; + +"AlertNext" = "Volgende"; + +"AlertSave" = "Opslaan"; + +"AlertSet" = "Instellen"; + +"AlertOk" = "OK"; + +"AlertYes" = "Ja"; + +"AlertNo" = "Nee"; + +"AlertError" = "Fout"; + +"AlertTryAgain" = "Probeer opnieuw"; + +"AlertInvite" = "Uitnodigen"; + +"UnsupportedContent" = "Dit bericht wordt in deze versie niet ondersteund. Wacht op het bijwerken van de applicatie om het bericht te kunnen zien."; + +/* + * Actions + */ + +"ActionCopyLink" = "Kopieer link"; + +"ActionRevokeLink" = "Intrekken"; + +"ActionShareLink" = "Delen"; + +"AlertLinkCopied" = "Gekopieerd naar het klembord."; + +"ActionOpenLink" = "Koppeling openen"; + +"ActionCancel" = "Annuleer"; + +"ActionAddPhoto1" = "toevoegen"; + +"ActionAddPhoto2" = "foto"; + +"ActionOpenCode" = "Code bekijken"; + +"ActionMute" = "Stil"; + +"ActionUnmute" = "Geluid aan"; + + +"ActionDelete" = "Verwijder"; + +// FIXME: I am not getting delete confirmation message +"ActionDeleteMessage" = "Deze berichtgeschiedenis definitief verwijderen?"; + + +"ActionDeleteChannel" = "Verwijder kanaal"; + +"ActionDeleteChannelMessage" = "Let op! Door dit kanaal te verwijderen worden alle berichten verwijderd en alle lidmaatschappen beeindigd. Dit kan niet ongedaan gemaakt worden. Toch dit kanaal verwijderen?"; + +"ActionDeleteGroup" = "Verwijder groep"; + +"ActionDeleteGroupMessage" = "Let op! Door deze groep te verwijderen worden alle berichten verwijderd en alle lidmaatschappen beeindigd. Dit kan niet ongedaan gemaakt worden. Toch deze groep verwijderen?"; + + +"ActionLeaveChannel" = "Verlaat kanaal"; + +"ActionLeaveChannelMessage" = "Het lidmaatschap wordt hiermee beëindigd. Toch dit kanaal verlaten?"; + +"ActionLeaveChannelAction" = "Verlaten"; + + + +"ActionDeleteAndExit" = "Verwijder en afsluiten"; + +"ActionDeleteAndExitMessage" = "Definitief deze groep verlaten en alle berichten verwijderen?"; + +"ActionDeleteAndExitAction" = "Verwijder"; + + + +"ActionClearHistory" = "Geschiedenis wissen"; + +"ActionClearHistoryMessage" = "De geschiedenis wordt gewist, is dit de bedoeling?"; + +"ActionClearHistoryAction" = "Wissen"; + +/* + * Network + */ + +"StatusConnecting" = "Verbinden..."; + +"StatusSyncing" = "Synchroniseren..."; + +/* + * Errors + */ + +"ErrorPhoneIncorrect" = "Opgegeven telefoonnummer is ongeldig. Probeer het nog eens."; + +"ErrorCodeExpired" = "Code verlopen. Start aanmelding en autoriseer opnieuw."; + +"ErrorAlreadyJoined" = "Er is al een lidmaatschap van deze groep."; + +"ErrorUnableToJoin" = "Nu niet mogelijk lid te worden van de groep."; + +"ErrorUnableToCall" = "Niet mogelijk dit nummer nu te bellen."; diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Contacts List/AAContactsListContentController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Contacts List/AAContactsListContentController.swift index 61119c1e3e..5f94b414e3 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Contacts List/AAContactsListContentController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Contacts List/AAContactsListContentController.swift @@ -39,7 +39,7 @@ open class AAContactsListContentController: AAContentTableController { section { (s) -> () in s.autoSeparatorsInset = 80 - + if let d = self.delegate { d.willAddContacts(self, section: s) } diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/resources/AppText_Nl.json b/actor-sdk/sdk-core/core/core-shared/src/main/resources/AppText_Nl.json new file mode 100644 index 0000000000..564e1e90ab --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/resources/AppText_Nl.json @@ -0,0 +1,206 @@ +{ + "app": { + "name": "{app_name}" + }, + + "language": { + + "code": "Nl", + + "format": { + "time": { + "yesterday":{ + "short": "Gisteren", + "full": "Gisteren" + }, + "now": "Nu", + "minutes": { + "short": "{minutes} min", + "full": "{minutes} minuten" + }, + "hours": { + "short": "{hours} uur", + "full": "{hours} uren" + } + } + }, + + "file_size": { + "bytes": "{bytes} B", + "kbytes": "{kbytes} KB", + "mbytes": "{mbytes} MB", + "gbytes": "{gbytes} GB" + }, + + "referencing": { + "you": "Je", + "thee": "U" + }, + + "sequence": { + "or": ", ", + "and": " en " + } + }, + + "groups": { + "members": { + "one": "{count} lid", + "other": "{count} leden" + } + }, + + "presence": { + "online": "online", + "offline": "offline", + "now": "zojuist gezien", + "today": "laatst gezien vandaag om {time}", + "yesterday": "laatst gezien gisteren om {time}", + "at_day": "voor het laatst gezien op {date}", + "at_day_time": "laatst gezien op {date} om {time}", + "members": "{count} online" + }, + + "typing": { + "simple": "typt...", + "user": "{user} is aan het typen...", + "group": { + "sequenced": "{users} zijn aan het typen...", + "many": "{count} personen zijn aan het typen..." + } + }, + + "content": { + + "unknown": "Niet ondersteunde inhoud", + "document": "Document", + "photo": "Foto", + "video": "Video", + "audio": "Geluid", + "contact": "Contact", + "location": "Locatie", + "sticker": "Sticker", + + "service": { + "registered": { + "full": "{name} is lid geworden van {app_name}", + "compact": "{name} is nu lid" + }, + "groups": { + "created": "{name} heeft een nieuwe groep gemaakt", + "invited": "{name} heeft {name_added} uitgenodigd", + "joined": "{name} is lid van de groep geworden", + "kicked": "{name} heeft {name_kicked} uit de group verwijderd", + "left": "{name} heeft de groep verlaten", + "title_changed": { + "full": "{name} heeft de groepsnaam gewijzigd naar \"{title}\"", + "compact": "{name} heeft de groepsnaam gewijzigd" + }, + "topic_changed": { + "full": "{name} heeft het groepsonderwerp gewijzigd naar \"{topic}\"", + "compact": "{name} heeft het onderwerp gewijzigd" + }, + "about_changed": { + "full": "{name} heeft de omschrijving van de groep gewijzigd naar \"{about}\"", + "compact": "{name} heeft de omschrijving gewijzigd" + }, + "avatar_changed": "{name} heeft de groepsafbeelding gewijzigd", + "avatar_removed": "{name} heeft de groepsafbeelding verwijderd" + }, + "channels": { + "created": "Kanaal aangemaakt", + "invited": "{name} heeft {name_added} uitgenodigd", + "joined": "{name} is aan het kanaal toegevoegd", + "kicked": "{name} heeft {name_kicked} uit het kanaal verwijderd", + "left": "{name} heeft het kanaal verlaten", + "title_changed": { + "full": "{name} heeft de naam van het kanaal gewijzigd naar \"{title}\"", + "compact": "{name} heeft de naam van het kanaal gewijzigd" + }, + "topic_changed": { + "full": "{name} heeft het onderwerp van het kanaal gewijzigd naar \"{topic}\"", + "compact": "{name} heeft het onderwerp gewijzigd" + }, + "about_changed": { + "full": "{name} heeft de beschrijving van het kanaal gewijzigd naar \"{about}\"", + "compact": "{name} heeft de beschrijving gewijzigd" + }, + "avatar_changed": "{name} heeft de afbeelding bij het kanaal gewijzigd", + "avatar_removed": "{name} heeft de afbeelding bij het kanaal verwijderd" + }, + "calls": { + "missed": "Gemiste oproep", + "ended": "Gesprek beeindigd" + } + } + }, + + "errors": { + "unknown": "Onbekende fout. Probeer het nog eens.", + "internal": "Interne server fout. Probeer het later nog eens.", + "phone": { + "empty": "Voer het telefoonnummer in.", + "incorrect": "Ingevoerd telefoonnummer is onjuist. Probeer het nog eens." + }, + "code": { + "empty": "De code is ongeldig. Probeer het nog eens.", + "incorrect": "Ingevoerde code is niet juist. Probeer het nog eens.", + "expired": "De code is verlopen. Start de authenticatie opnieuw." + }, + "groups": { + "already_joined": "Al lid van de groep.", + "unable_to_join": "Niet in staat lid te worden van de groep." + } + }, + + "months": { + "january": { + "compact": "jan", + "full":"januari" + }, + "february": { + "compact": "feb", + "full":"februari" + }, + "march": { + "compact": "mrt", + "full":"maart" + }, + "april": { + "compact": "apr", + "full":"april" + }, + "may": { + "compact": "mei", + "full":"mei" + }, + "june": { + "compact": "jun", + "full":"juni" + }, + "july": { + "compact": "jul", + "full":"juli" + }, + "august": { + "compact": "aug", + "full":"augustus" + }, + "september": { + "compact": "sep", + "full":"september" + }, + "october": { + "compact": "okt", + "full":"oktober" + }, + "november": { + "compact": "nov", + "full":"november" + }, + "december": { + "compact": "dec", + "full":"december" + } + } +} \ No newline at end of file From 6f2fcdc41d7dc2099f6e389f763f50f35eadb111 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sun, 4 Dec 2016 11:02:41 -0200 Subject: [PATCH 177/253] alteracoes --- .DS_Store | Bin 10244 -> 10244 bytes actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes actor-sdk/sdk-core-android/.DS_Store | Bin 8196 -> 8196 bytes .../sdk-core-android/android-sdk/.DS_Store | Bin 8196 -> 8196 bytes .../android-sdk/src/.DS_Store | Bin 8196 -> 8196 bytes .../android-sdk/src/main/.DS_Store | Bin 8196 -> 8196 bytes .../android-sdk/src/main/res/.DS_Store | Bin 8196 -> 18436 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../ActorApp.xcodeproj/project.pbxproj | 4 +- .../sdk-core-ios/ActorApp/AppDelegate.swift | 10 ++- .../ActorApp/Supporting Files/Info.plist | 4 + actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../ActorSDK.xcodeproj/project.pbxproj | 4 +- .../Contents.json | 23 ++++++ .../ic_smiles_backspace-1.png | Bin 0 -> 1836 bytes .../ic_smiles_backspace-2.png | Bin 0 -> 1574 bytes .../ic_smiles_backspace.png | Bin 0 -> 2182 bytes .../ic_smiles_bell.imageset/Contents.json | 23 ++++++ .../ic_smiles_bell-1.png | Bin 0 -> 1546 bytes .../ic_smiles_bell-2.png | Bin 0 -> 1603 bytes .../ic_smiles_bell.png | Bin 0 -> 1330 bytes .../ic_smiles_car.imageset/Contents.json | 23 ++++++ .../ic_smiles_car-1.png | Bin 0 -> 1798 bytes .../ic_smiles_car-2.png | Bin 0 -> 1610 bytes .../ic_smiles_car.imageset/ic_smiles_car.png | Bin 0 -> 2103 bytes .../ic_smiles_flower.imageset/Contents.json | 23 ++++++ .../ic_smiles_flower-1.png | Bin 0 -> 1995 bytes .../ic_smiles_flower-2.png | Bin 0 -> 1716 bytes .../ic_smiles_flower.png | Bin 0 -> 2438 bytes .../ic_smiles_grid.imageset/Contents.json | 23 ++++++ .../ic_smiles_grid-1.png | Bin 0 -> 1825 bytes .../ic_smiles_grid-2.png | Bin 0 -> 1703 bytes .../ic_smiles_grid.png | Bin 0 -> 1695 bytes .../ic_smiles_recent.imageset/Contents.json | 23 ++++++ .../ic_smiles_recent-1.png | Bin 0 -> 2200 bytes .../ic_smiles_recent-2.png | Bin 0 -> 1785 bytes .../ic_smiles_recent.png | Bin 0 -> 2621 bytes .../ic_smiles_smile.imageset/Contents.json | 23 ++++++ .../ic_smiles_smile-1.png | Bin 0 -> 2606 bytes .../ic_smiles_smile-2.png | Bin 0 -> 3366 bytes .../ic_smiles_smile.png | Bin 0 -> 2095 bytes .../ConversationViewController.swift | 73 ++++++++++++++++-- actor-sdk/sdk-core-ios/Podfile | 4 +- 43 files changed, 246 insertions(+), 16 deletions(-) create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_backspace.imageset/Contents.json create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_backspace.imageset/ic_smiles_backspace-1.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_backspace.imageset/ic_smiles_backspace-2.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_backspace.imageset/ic_smiles_backspace.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_bell.imageset/Contents.json create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_bell.imageset/ic_smiles_bell-1.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_bell.imageset/ic_smiles_bell-2.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_bell.imageset/ic_smiles_bell.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_car.imageset/Contents.json create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_car.imageset/ic_smiles_car-1.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_car.imageset/ic_smiles_car-2.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_car.imageset/ic_smiles_car.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/Contents.json create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/ic_smiles_flower-1.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/ic_smiles_flower-2.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/ic_smiles_flower.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_grid.imageset/Contents.json create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_grid.imageset/ic_smiles_grid-1.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_grid.imageset/ic_smiles_grid-2.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_grid.imageset/ic_smiles_grid.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_recent.imageset/Contents.json create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_recent.imageset/ic_smiles_recent-1.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_recent.imageset/ic_smiles_recent-2.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_recent.imageset/ic_smiles_recent.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/Contents.json create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/ic_smiles_smile-1.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/ic_smiles_smile-2.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/ic_smiles_smile.png diff --git a/.DS_Store b/.DS_Store index 7db9ae2f776f733b6385ecf2ac3e5ed97ad574b7..36f870723ae153b7198696b40be2b78edb58e6d2 100644 GIT binary patch delta 602 zcmZn(XbIS$E5LYqvYtSLwp4Ysv7w>4j)I|qVXclrwV{E5sg8oVg+*;GCx^JIp{-{^ zZe>+N!m$u|V#8Rty?At1-dFj-vChFRE)XR@M5HD^R-a(-TLW>xCsi-N)u0*sui z`NU-uRkid@EbW}H@CyhE35)RXOr9yBS7urNAk$l_Mr4u_VPW^f(2IIYY8D^PpM{d5k#(QaD3%5>1j)b0Ef<@mO#OcyorAr4|)u=I22Kt$A!Y z1Q~TWBa-uTb5rw5iowE@9|}pZfP69euaL5ZvV#Ew7;rLhFvv0(F}N`JFeES(F;p}3 zGR$CD$gqWB8^d;n!whE_t~1g&oN%#TqHJy Sb2GcbFP2H78)#?8L`DE7t(1lU delta 659 zcmZn(XbIS$D=_(vSc|Bkxv{a1f`xIdjzYDep@AikZDujKRNQp(9|37b#>oHc#ktA zFEKauijaUHzl5ZeR77b~W?^Y&Nu_`?2M5F~IjPBkLc;YRbEV{@R5&=IQ-BU|E=mQG zDG(*P{dHp(91A`VKu`RhHVVn84fd?VYtF@i{S~w zdxj4TpBcVPjug&hd@=d3a4Zv#7c9hO@P+u~ogzP+fPp3L_cZV?4jPSZoUCW;TW2ER*+3OHY;+okBZ{CNTm4 DOO>qj diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index 91e75d3a3760a0a855cb7e71bf3080d7ebbf2d8d..15184fd6ba03f4c560efc755d7590fcd2d937af5 100644 GIT binary patch delta 712 zcmZokXi3;mDlB4bX{e)MXk<~Vqfl*VU|_1FU~VzFQ#hQFVe&&^b-9&E1v#0;B?bn! z7@3$^SlQS)IJvlacqKeMJ%qh@Cf`$bo}4LSF?p2$_hbhZ5z*Cr;xdY=TKXoIcFtG$ z1q6kJMR<57KW5RaXY%FbydoqZ$S)x&APfK5zWmcfX@g~5j*fuV?@nxU6r2E#&z zEezWjwlf@NIKyzA;V#2-hW89#7``+7m~1GPH91aFp7A3vc;zSG5#x~S!yd#k?jG)9 zp6Ed=I(e@67fA_8DQO;O9#>95V6X}>pgKnwi*qL5kto#P%D97ZC*y9$J&Z>g&oN$y z_<)HK>Jx96mmoCb4WI*MHqVkQWSiI^wwYTYfsOI>WF3VDZK>*NV?#r8V5%`NL{2pp twY8ia;;M$Wo(Z{?Rn;}Mb+aeW5te71GdWGf8k#~t&M(@`qLEHD!vJ|Zw)qq&WnXIU-7vG7C#HODeAj2?+Ab z%1Q9VqySCw%}>cp%S=rX*vi2PmQj+EkcbA!I2WY?$rKI_u&|oC1W!mY$ihUZLTw!$ zo{;R!ycB_APKZ_mLmr9HoW!Km9Dx*0pf-J=MW$vv65(a3Ma7x>-bQJ|oeHIGC@ za(-@ZYFC!MJOT`YjQ2P>De>Fn6B31n+ZcB;?qb}{xQFp5 z<2lCbj5i>m!Ndp+6(3kgL1@N@KwrshZjmfx+sv(yz{YrTvW`N7rbKnMk+Hdsf`xgl zjzYDefw`HEg1NatZ7nBM8XF_geRdr2m-OR~zgyk7$P1X|kAmr8T%`6(}v@{<8 DMl0Hq diff --git a/actor-sdk/sdk-core-android/.DS_Store b/actor-sdk/sdk-core-android/.DS_Store index 7691feb75f1a8dbbe54f309563c6b611f8619b73..ae4b9fe3861e1caf3aba0fb0230f36de571b484f 100644 GIT binary patch delta 82 zcmZp1XmQwJD8P7nvXMZ8wp4Ysv7w>4j)I|qVXclrwV{E5sg8oVg+*;GCx^JIp{-{^ mZe>+N!m$+rdM8Rtyq5s=y}D)@nIGrPn$md(FK*qH(D1{pE{ delta 80 zcmZp1XmQwJD8P7fvXMZ8rbKnMk+Hdsf`xgljzYDefw`HEg1NatZ7nBM8XF_ge kRdr2m-OR~%1>_lLO|}!0+AJ>kfo(IZ#1EFu|3%oD0ncU`6aWAK diff --git a/actor-sdk/sdk-core-android/android-sdk/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/.DS_Store index c8431bb081e84ca9b53acb73de345dbe772eb2fe..58cb6523b01a9131051f57b8ad9c713ac97e27a5 100644 GIT binary patch delta 93 zcmV-j0HXhdK!iY$VFSxzaItZg2a$jcvj+$o2m#BJA`pNp8hd*)F)=qRATcm8eJmh* zF)%PSEFd>HIDLHy2p1(WJxO3~d3t+%eSVvh%Mc#{oU`i?8V9on81@9S`xFNQX?h*1 delta 91 zcmV-h0HptfK!iY$VFSrxaItZg2a$jcvj+$o2m#5HA`pNn7<+p%GdCB9|4-P?GPFVvjrIV1hfAX2LnA89Z~=Q diff --git a/actor-sdk/sdk-core-android/android-sdk/src/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/src/.DS_Store index 91147c77017556f98ec0c0f779be35dbf7a836c3..5676c519cae9ba14f79804a76b6eac062f301116 100644 GIT binary patch delta 91 zcmV-h0HptfK!iY$V*$&tah3;>fDN+;2pk9j%abG!fGZk%dowXHH!L7AFfn~BAbT+| xFf}Y7H#j(beF+E`B{4loU~PGNdwhLfDN+;2pk9j$&(}yfGHSzdonXOEFd^HeJmh*F)%ka vEFd>GFnxUq2p1(WJxO3~d3t+%eSVpf&k!F0nzQc^7zeWj82ALU{}cxU^c5V2 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/src/main/.DS_Store index a0c6523cc441d733e0751df4044efa581beeb980..3993773acead22117ee987a5cc2fe4f092b23b44 100644 GIT binary patch literal 8196 zcmeHMU2GIp6u#fK&>1_>Y56O|&o0!qhz)E*(G~(OZAF@vP;E};_ni6e+`Y4mF*IiNTE@y5V-i)4YB4qQ6t3s>rVgc%4k5N06EK$wBWkOA7Wd65>__k}iW!wiHOxFs{d-w!dW91{Uf3iMwc)c8jL zLVg7B3-wjrA&do>2yjv$X{bP$5(-lUM+^valE;E^i2x@B3Uh|w@PXjY2u>*Q?@s<> z{&0qbz_1N75N6=!4DjVsz%tBWZfbP)`Q0*IFCM>)NI~I}rA3k?6-&#c2Rn{Aqa9w- z%esxpOuv6+>P9N)cRG$W(@&-jo5tv%y0Xc!y`*UynOVaJx=mYmMjM^1t-HRT_M~@= zY-L%NnA2;X-#GAo|YrSCr*w(I&tb15fg&< z0xOvl7m?w=vwZx@}Tj;Vq zW8^5F?zCfNhi!LIElnq_bk<6G#y-p9gGpB6rZbLZwL7lqnU3At;~8UK-q8)Jo<7&f zcul^uK~>GV#sdcVGIK^Vc_de5{BDOvxEuGdk#Pwt5^)in{Oo-+y-CozQw`rrJ|8!`4lEs5@u6X38=;?c}ggiVL#rTa~ZXw4Q9r zd?agnC)5f_nkrLEOO%aTOja*Q13Jy*prdn-y06hTYPU;LKbJRU3~Gf~sn+h0)uhzv zQWk`Z8fBZTx^m}ndd$MKR@ot`y4+ihm+#YcLno$IkUR zC+lQKnZr)AXV^J*o?T>@*jMa(_A~p1U1itUpX@L8HyC7;VI@{!HKK@NGb#{A19o9I z?n687M+Z95ixko@a1_VkA&XIr;S|o`Nj!z8@dD1`RlJ7R@eV%3d3=PA@dduc6-?tt z{Dfa|6~BuKM)LG+%gj-$26I%=5`6*yOV;&my1VQ^f3b>o+LTF5;gtw$O4=i#XFHfApr!(WuHP zCN8V0qlyYz1+uTbvzoM#K({?kx&k7+(ADi!qUsXjwy^F7|5fot=u~Q>vZoxLxVK4UM09w(8gE)*H^r0UE z#LFR=c-ZG=&gbT7Jch^d1TpkEJdYRg5?;nR;^!N96K~-?ypIojre4G)e1cE$89v81 zxIBlWt#df~!*!14Ix@E9*h3`AGy2BC;nm{FK!KP_IY0m3yYTn_#WUe>CSeA`4E*OA zKw)!7b0fK3=#|aS+A*p}sPe+cO$zi)sPT{Eg#K}yaOMv~>c?m(w@CyzDUc*o{`U_7 SvwjYT`+vCq`y{*tn|}ZruKrvA literal 8196 zcmeHMTWl0n7(U;&&>2SP6v4LOX15e5!8L3vw5cdrx?8oB(ngf7mXSIV|*d;`k+yH(fFS^(?Wq7ABZ7gPIAtF z&VM`m|MQ(WbIvlx&{otN8LMH8NmMyi6>2U}xSZGXN+jTv69w5bH=nhfER89k!IQVg*0r#41^iDEHl904{@rTrUE)HsQ>Dq#yRUfvt(p6&v1v- zN|!?K$T@aT!6;E+{W-@f4%;ND%4t@vNXo`W%jz``3+-INv8*1)H9ga@2M0XkpvPt0 z(G1bR4%aDoY2Vp^N&bb_LOw@#o*TQ{je<*5mS0#<9b3NY+NPEpHr_N@sa7q#a*?9! zpa)=k=53}?*fwJ7-u^+&%^9|C+WY!TrfX&`qtDicjVesY@?>RA?UJQeN29Z;4ivNI zfuiXhQtKsYa-mvPsnkX5WpzT@rBj4mj?QP&eMz(~+8{|gIX_)6s1cVub(k!XEyv@?Gh9y|7%6dudl>18}T*2I+q@*e&Uz7n_#cAciE@x1pAtuV!yE8*dOdqb{aqhs!)q% zSdJA~i8V-~3D+To4s1dv`mq-pa?oL-02f7+Fp7I{FYdz;JcP&aIF8~Np2drJ39sN) zyovYlK0d&QIDv2RJ$}HC_zAz`??^@DipXN|OCwWozjZ2-fL~2CSk46Z;5shy%!T0| zyQO1O=jO~M3-^-?1jZL%RUKckdd=F_4e4nZob%+*2BD8T0W2SIQ-Jax_DmFu#h}Et z5iX5`v#klWf+J9xAGe` zQOju^2@@oe zb1)Cph!bKHXvPM@YZ@7}V+(q)6}{-gZVVA}vxHp>Hu5+?_#MRk6<2gLLCsWYf8^%iW)vG);Y3ga`C z!_h^{K$-AV!_WWiv)}(;wE03uVFtnsTzVNmd8RkhM!##eH!eSG$Eoh6$_v*U7t}YQ sX2wMTji>)Gq<)-KxlJmd~XUjcQ*+S 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 diff --git a/actor-sdk/sdk-core-ios/.DS_Store b/actor-sdk/sdk-core-ios/.DS_Store index 66a5fa57649d17129ce48b6d3c253d72dff9a9a4..057cdccfe89322d3e6c9fd3ad37dc26c23a77787 100644 GIT binary patch delta 972 zcmajeNla5w6b9h)w^rZd3Osmau$1&^8ER>1X#tByL_uW`2gI1Dpnyb)2m}%mC0eJ2 ziW=>89-|9F)HtM~(Wna-8YC{jMq{E2H!Kxn;<&(TpE0cTuFgGwau(k`cVEZ8j$8do z{4BrErR5jyaA`exKA)H0Q<`|U(`u-k${(wx{H!~`dlNM7$(d^~RP(l+G0k4$rRb4K zqIB|687-j=)JZ*bm`>AWzSFfEVv)6aH*KzQ5sAvlU5=RW3+?A*L-ink zp6xfb9HypoWpni&h(XX;MrVEj;ycNxpJ%#@V|skWRZ=~5&^GF&lXQvh&;Z?~Cp1K_=q-)X2l`B3=qr5_VlkMCSi~U(sjwgo4&=cH zKjxtv6{x}ztiT$qMIGwVgjQ@tJ37#fAa-F7_M$ff$8iFuaRyg#4cBo4H}M$HFpLqr zLDN0o=uXJitRd!qae{XNL4= MnWu@PKL7v# delta 1220 zcmaizT})eL9LE1oq4b;sj064Pz*?vjq$>pqtaNNdi)?I+>6Qrs4mVrQnI3IVyPkrX zWNA>0UQBenCYl%%HAanKqBeM87WK|$Te2+UV)0@(#*f6C5xpUC(YHI8Xky%Zao&$7 z|Bv%~-ghaxl>O{unYGl9vQ2qcV=kFZ>1I9>xd~fYxxK<6h*G68;yNg?E$1*Z+L~Fx zP)MFry~&+QS*O6sg`-6tB`E z2q)A67lv~h|61o#o6;`I31QsSpVzD$At@}%ra1nrZfwVPOFe?DiW8|sQcGFsc1!(& zJSI-gYdKTT7}nu{v`?r-Se%;8q|>}{(>i`Yi3{>2;bf^P|B-~5KbqAHUcdAo4|x@3 zx+Dy#s-_Bpz}|Cv3JugnaXLgZq*0d6(s^2@*XV8ffY#^>x=7#ACAvaa={kK+KhTf# z6a7rLX_J1V-vLOdL=_a=hZeM=4I%VlH~JC7AP!&zhcJqxn8GwpU`C3=d;OFCP`$Q{4e8u2V5inG~QiT zRWiG_&gpVD1=>3z(Y+6{%|?ZN?TQK9%!bCDl8@bS-Or4j&ZOAtlemrIMo9^_`h2pD zJ6zg?JGoNE4YRbKUdbohxi^;DACn}xoSSE<`v$pM!ELhC_z+jAbdSXU!~8z2(pMbu z4Z2CUINo15+AaDMcGRFA4e-K;CbVN0IuJ%D2fGIY*o)!2a1Y`bj$<4XcnqhIz$^!> zally)*hC)ZP{1Nyz>7HFg=Jj83K-tNJNS^}<--PR=I;M%;G^O*9uGjp#d^*D`E^#t zD*Y2U$rAoP`)U6g5nqK^I4Bmc`v0h~jcu{Z?R{lh*s&6fT2qK^`KybW;03t$421oC zJ<)Sv|3XhB)*tpqV=;D7j$Fu!&WuM-|m9Q6km7QIN^0sCL!=Ql0ZCYE$> Bool{ - return false + return true } open override func useOnClientPrivacy() -> Bool{ diff --git a/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist b/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist index 5525958353..9748219882 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist +++ b/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist @@ -2,6 +2,10 @@ + NSPhotoLibraryUsageDescription + $(PRODUCT_NAME) precisa acessar suas fotos + NSContactsUsageDescription + $(PRODUCT_NAME) precisa acessar seus contatos CFBundleDevelopmentRegion en CFBundleDisplayName diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index e71739b01a..f71995344b 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.6" + s.version = "3.0.457.7" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj index 75f6063376..798109286d 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj @@ -342,7 +342,7 @@ 15F89F0A1C211FED00776ACD /* opus.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F061C211FED00776ACD /* opus.h */; }; 9AA6A41F1D08568A00957A7F /* AASettingsMediaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AA6A41E1D08568A00957A7F /* AASettingsMediaViewController.swift */; }; 9AAE96481CF81F140092E366 /* AARingtonesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AAE96471CF81F140092E366 /* AARingtonesViewController.swift */; }; - BDF21708B376E212CEAEC43D /* Pods_ActorSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 354C3EFA48FBFAEAD0DEEE17 /* Pods_ActorSDK.framework */; }; + BDF21708B376E212CEAEC43D /* Pods_ActorSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 354C3EFA48FBFAEAD0DEEE17 /* Pods_ActorSDK.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BE237C9D1C422FFA00060648 /* AAStickersKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE237C9C1C422FFA00060648 /* AAStickersKeyboard.swift */; }; BE2621571C4656D700A817AB /* AAConvActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2621561C4656D700A817AB /* AAConvActionSheet.swift */; }; BE2621591C4656EE00A817AB /* AAThumbnailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2621581C4656EE00A817AB /* AAThumbnailView.swift */; }; @@ -766,6 +766,7 @@ BEFE68D41C4657360001F2D6 /* AAThumbnailCollectionCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAThumbnailCollectionCell.swift; sourceTree = ""; }; E30822B631D108159E8B306B /* Pods-ActorSDK.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorSDK.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK.debug.xcconfig"; sourceTree = ""; }; F076508E3899D309954904A3 /* Pods-ActorSDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorSDK.release.xcconfig"; path = "Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK.release.xcconfig"; sourceTree = ""; }; + F15398CB1DF3A8C600C67C7D /* AGEmojiKeyboard.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGEmojiKeyboard.framework; path = "../../../../../Library/Developer/Xcode/DerivedData/ActorSDK-hfpcbgrswlpuwlafdzjxrahnyfmr/Build/Products/Debug-iphonesimulator/AGEmojiKeyboard/AGEmojiKeyboard.framework"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1672,6 +1673,7 @@ 2F428D134E194A828C3DF863 /* Frameworks */ = { isa = PBXGroup; children = ( + F15398CB1DF3A8C600C67C7D /* AGEmojiKeyboard.framework */, 06CE898B1BD841C9005A5530 /* SystemConfiguration.framework */, 066A51FF1BC4E0B0000E606E /* libsqlite3.tbd */, 354C3EFA48FBFAEAD0DEEE17 /* Pods_ActorSDK.framework */, diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_backspace.imageset/Contents.json b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_backspace.imageset/Contents.json new file mode 100644 index 0000000000..49a1223d57 --- /dev/null +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_backspace.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_smiles_backspace-2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_smiles_backspace-1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_smiles_backspace.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_backspace.imageset/ic_smiles_backspace-1.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_backspace.imageset/ic_smiles_backspace-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4d64c15a6d006a8cfa22295735208b1205ccf7 GIT binary patch literal 1836 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 L)z4*}Q$iB}`zA$= literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_backspace.imageset/ic_smiles_backspace.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_backspace.imageset/ic_smiles_backspace.png new file mode 100644 index 0000000000000000000000000000000000000000..8580a8b67335c3841665ae2ec2487d7688893402 GIT binary patch literal 2182 zcmaJ>2~<;O7JdQQ9I;46K!iR5I1HE-6G(;-NCF|GK@DNCgJMV?kU|!dCrMZ=gMfml zWf+txRj5F%mSw84?@Gb6EEQ%zQ3{mJwo(M79l*jotk^lHW!`!B{mc2j@80|0`~J*> zfo#*QySD-WV9N1l@saV^x)~cH-*58O9>`z~`-Z_m@+ep>R6>A{SRM(19H}rG;zL5Q z_P7r61OR=sL=Xmt@!qD234tW68%BgD5I`~+OW02$lL`AkBA!6R;gOe&A?&A;$W)>``07C; z-jw1fDxc-|$``Vtp<`fJLB-+JYBg5vhLtO$aRds5vaUfSVh{vIrIo=#4MwJN*ic|W zDv?s6fF*JnxUMLSl%IfUXe82KQjjWM%gR)*jtMz1oJOd?5wQ66ls14o-v5V6rLWN{ zm=FCL@9zq$1X=}z<3lR>38e@rT$IDQD+QIQgoLnMDUi$KHcs(ij2xD$V&n>t8AJx1 zLnSh?T&?=kOFWN9<;Ya9P$q&nEE*b7z)B=ysxOH`_G2*^z9fP>f#AEJf%jpu@I*ff z-j9j*z`Jj7S#r?{DI|k8xZ+>A%uTuLtsqq(o>`Dm5)X;}lyWKfGG(e{^H?aG>b>HM zH;=_hJ^_LY+2^8d<2@Ir=m5SINE*InrdKTbBA%KLnIorV6Ypx+*D2VC+sTcp{q{2>=r9J%_NL}vi${d z58lb_WSn6+Vo1%n1(J2~bo^9L(@&38Kdf9oAV!qFmAY~`= zA9^EZhS(OwP`|S@J8Us!1LpYG4#Rp{n$}$FTt}~~ftF$&S{&&1?(O4qgVi6Rd?!Mb zCfYsPGwHhMMf3%rl*8ev`k z$baZxJ`b1`yp@KK<>YI89Xi)-ENL(I&$@oorwftuxOtcE{NzhX6(ybnPHS21`~g%^ z@q0I!g}c)(a^?qPz`s-C9xUG z`OIdQ9u#BR*7|c7mQo+AxKm0}9&E4YtRB`@-n8|$f@ZP`Yygb?%C^RdxE%P$|vOIz&`7L44S4J~grG)prg zF5{iBoU)MR&vU8AL%(}pDo;asdx^BoZ)!3EhOgL`m=n(rIu#D8znmoW=Bs1DviEx< z#KYELbenp~%m+I*oMT;9(ap4;G&-6@d7{|6FDE~KJJaNj%HpwUjoL|AKM{IeK)?ni z=ACRRVy1jurL}9V`Z3gNHu|jN+NG(*fKnXARa?$q7&?$S9O;@8|84H0q@m74m*A?n z!NwkTGC95N-R{Mr1viDwPtwaKEr*ut6TK2X;V&i}nO6t26qdg$wy{l1@B28f)VR5O z{Cek#y4!vU!dBARd8-ZKk3(*i1OG{_&U!I?H@}-0)w^@#en=rZycq*=Eqg0>Jqgh} z))d@x*1j&w^1uhg^I^@G7HW+?JK$gT-0cR(;KdA&zALzP%B#?`zgR<{L>lGL141nq zoMor7%Q7h8MdkXfBy>f?LQRKJg4N)KErhiGfxz}X&yQ+V`qGKX>C~>tqSG+&tg<%z zg@uG{G^$^Zz6DSluCo2BC_tGx>>GtrgbMx&7wETs@<|; zAKZWeZeGL=OxN;9tIZ@Y*MHQuUF2>J?;k5|-QlwMb1H+I`}Ic-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij|9-rG=}j zlbfNbtEsDrp`nGLfupO5xrMornW2%Jg%QjQY}?JEnQtrf!YjRO`J?j4BQ-z zj4Yij%^eNg3}Jdb^NLFn^O93x_GSX@h3a*|tJli8C^fMpzbGU>KL?fq0y6ST@{2R_ z3lyA#%@j1kGxJjN%ZoKZ(F5_VOKMSOS!#+~QGTuhIDD-#vDoiwK*-+^y(#2`nLf}l z`k=&tlvrRwz!V5#!jnFb1J69EdB7Y~1k4)K8lD1k9Fvu&i(^Q|tv9p%HCO^=j;EK2 zpU%74J-Z-Eg?*{a5*ZEl*5HFNjQKT%91UVv~2DQSV3U;yDeh2I>puTAXO|o65q|EZX=sv{`mS zkRyZk_f+{?soT$XYjMnA$egd09aXYiBg(;2{6Tm~M_&Av1~bm)S?dhA6HdC;ie2EE zbx2Dg_lNw{KW>^+n1b5oc(jE!tl8)qvbDuo8pXRR4h|dGXVgymG*8G>PC&K6H*@3j zpPZgdEpPReUYtpH?YnU2&Gk)dQWBUpd@ekhes7~th1|SFH+CMJ$#8B@ueM}Q)9KKeRDiOh$$u#PDWE)u8a{Z)d3l>_mj0(1ZsAF=pFSOR{o!8TTgw0Mj z71+!);3oj}IJ z7y)katUC)-5Hta?xT&vVqC~R@)LU4NTspd1kNOth69$sj$k8u>u5OaM(?(bvQA%8X3~X*m*cCLf|0? zV^<@?MHL!y;S7=nuuLcsn3GWymdk~xR3?|BNw7E>6^oMDS1v%Mm`sj|74XP|u-Rx! zDQ47Wj^tujYQ)Mg6ebe6TrQzYA|&ZD5vo)w!y00-fJF$L9tVTF1rBHYsDc(a&9seT zY@`DYE8->OdPa?~l@4!#pvGh!&XG2;4HLO>N`wlN!&@2!8VvsrC5SP!lQDu<^}bQq zndhN^$OxR|dfLn$Txonb6@_Kc0B1-#k0jTQb}`pVGNjW=QgDVz4ks+PIV_~hnK*0t%&}-EQt01)5ESOf4o-URs6gnBIKvA7kiHfBe3JI!INVF1-QasAllIHaU za4@4>%PVfmxZJQ62#U?D1+;Aguw>FC0S|2%vyESiY+St&u4VjMiXxNUl^CeQu*{R4XY3{BjYqqA$`CMs0gFB&2T zN;XC9OxYG0-`@yJ?}#YQ?#)qiZ!P;_>Sxb6x`YYdfkO@M-Wylz>bG4}xv7f208^#; z#a4FeRMtJu4FDHOWRKNFMW(CS@7dY{lb-J|awA|U#s@8exDba2y|#F%c9wT=>_m%b zM?%r+eE;#!V|yn?)l~WI!K06|PSz(CM@UW2kNEpnY+Th;Tkv!B0e@sa>Qk^T?C!_}!94<66)9Lna$^BOZd#7!zw>&3tJc?RnEit2xPPaiAxl#}Y) z)<>x;E9YoCTh=C2rQL3?Gk~;vv43v9=r@D~3s=GI!Ik!B zB{Qk~D|ebgcyQ-$`GEN`Ju%V;l!s)I1dF4lHt;Y1Mfx)aLiQliDoY?h*KmYL4kKbvZ%X#S?IIuDL z5+~`WTkj4G=9I5#FZ&>e>Pd;#_(XO1Vqy00ucY}xf{^8x}%m@-)tz`DPIymA& z_u`Te|*?pS~>f~wFT2;l3<^~^hfXCSQJ`3=S@Bt eHciZw>k)BK4ZS_YxSILlYhABfs%=g$-t-^#(@Yuw literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_bell.imageset/ic_smiles_bell.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_bell.imageset/ic_smiles_bell.png new file mode 100644 index 0000000000000000000000000000000000000000..a7a2cffb3a83bc2371f8746e88b37c8e68da5cdc GIT binary patch literal 1330 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_car.imageset/ic_smiles_car.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_car.imageset/ic_smiles_car.png new file mode 100644 index 0000000000000000000000000000000000000000..430ef9348eed743c59fe16df3eb4d3c4d0232303 GIT binary patch literal 2103 zcmaJ?4OA0X7JdN)`4bftaI+EzR4mPZ2qXm+2!RL*6at|@)sPGjFqxPPCV^9nbv+B% zvn7as{HVL~r)XJQq_9$(R$2)PNG;21fwT}r+bz(r6vEQuPOMk|2n7ciHR$0C4BUa1yccfX!ArV&BoTnhl&B0*5NwR%Oe7x-gD|DPY(cJErd6n4920h6WUW|9rjjVOEiD20{QnP? z%a_q=G!cHO_jifaLY)#OC&FqZUnRi`m*rHHs0z;zqE7 zf`eI6+$dT&J$NaWgGln_umW9*mA;G(UoqC!3UVcunFFh2hhZsKg~$odx6GEUtR;9w zz8A65m9>Pd7)!>)kZpziRiT%buZe{C8d0Cr z4kYf|GggzNkV?@d2Zpo4*G`mkcg4e|BDP2=~r*1fX-y4yiUBZ=G7b2_8O?ta{(FA{`0 zqV=?GW7mQWYmMTI*dw+MTDBKMt7Us}-Zwb3CF)i}UD6pZ39j z7$YY}%DljK{nw0eAm27;z`0TQA}a~xbT_BV02l|fx7=N1T7tr_lU>Kd$z zzMc2U@guWCi*|oc!n1aKbu_f5`e5R7dPWNft;> z?D3Sn4Zs@zL-+EG;l!ds-j+GT{LRc1vgs+jMqroouy`zDm)$p0xq9>UYYcnubLK-5 zJ3x6fhOc&@eCmJ1a5OtkBjpq6+gyZAfZ09vcUsa;eZc)cQ&iv6VYt<>I$kNtmo zwFjhj)V(*C-pl;f{ifS-FT^o6zLsHFH@&??e6h2FxZ`~AnHm{~KE4=p*3(?m|DLgL z{L1Fsq0}oGd-p}$+IH+SypQvL{}y-QWPX1ByHl%pt6fNS5 zf4p`7%--JE__6-U>@#5c@leJ#pq=2JLG#{;C{1%TW%f){|AjiNRpIu0kk|gS?b!Px ztALS|W=cjg-@0pb1$VkW^2FapK7Uld+K^JhIv+CONdn(QFHBTTlRk>yz6jOF>_62P zxDnS_cDDHqi`Boqm;TeB4`VXx*zU(AddjjK2TT&~rMe~e@&g3t2(GQ`bgknk*%$`! Mq6D1xBM!XtKjIiUbN~PV literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/Contents.json b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/Contents.json new file mode 100644 index 0000000000..a0e576a9ec --- /dev/null +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_smiles_flower-2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_smiles_flower-1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_smiles_flower.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/ic_smiles_flower-1.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/ic_smiles_flower-1.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e2a36a21e09b3e6fca0de51a9db7192bddf02e GIT binary patch literal 1995 zcmbVN3sh5e9KPf2j2SREvJ5U$2$4PR*v2+C*kBtBg~mVxI~}>(E^M;x&h6p`Qt}is z%t!)DlO%hHg0$2qO~EGxCT6La(ufKzYbat!7(QpLKT57^zJI!QWIIAE7lSP&RPEjcJ^n5_V%4#iNb4mE=**<3Jsh2Eq^ zZPvx^nB3iixHG+5ZE6_j0zKr=_ao^)=|4+^sxHAlQar~`VX1DMPbWb0Y zKE8O+JctSJ7z^GSzt>}dc*jjEq>>!_ z0;_UWzkdE}L{&4Rv6&VXFu5~2*74ddyA)22&R-nq6X~PMt=XSiODo8K1^MH6LU{5H zwD41*Ynkh+XHqBI_TBLGdK-Ui;F}+A++ep2m4#-RRsyt&5b@mCy$3yXg#AEPF_anZ z{CWD#A2WgTV&aq!MMBdZn0S5r_60WYNAoDrUP~qFmSRqMhd|ZR<1y%!>k}%>59ywB zXC{7W&xQ;_3vJ^L-y_wcMwX|#7uxn?utOIRA*OGQ?nX;?`E@DnU#SOO>xVo~O+<0Y zQ$2A?@33mGk+{*)Ulw)MkBV1~li1_CZ=N?2Lf-+B@>E+|!>y9Ko@GpC-|fPw zh|+OydU}G(`cjZ|)T&gD{{HmZYeX=)QAJ=*H46QML|=c=S?8D9WT={7zF_0kFp6+! z?PT$b?b#J?%>-^f$=O}LIy#^rq<*5n-16r4xfvf>xS`VNtHZ0k&~ zNFoV7=-5{9HmRv9)afyQZ`-QRA_o_BkH!D-VPWGi?Zr9YFP~f*1Jv#{a$Q5j7}|wr z=H~hxK1_-9a31a$x%O#0$B|lOYvrweZ>IF+-bZWqoTXh5`Cj%mHaQZECvV+6{+lWa zpiEb(>8@{b3oA~9RmMk^TqEb#%rq^TS9k7OHu=2&#Dd`>IB37`;dyI5s@=|-d}H8D zxj1p_YE>$Q^fN&b(fLI6Yv#)Arvm{0*5r4e*Gww8(o0fD?Yir_j^tIJH4!U(E{0a# z=nU=;=58robEn}zX$*gE9W?a_d4*)drY{}FDT2@0cAw1dyce>%!gKa)B@A(WpUgd$ zeYySdgM7Q=m-c4yTh6eR{TF+6TgpD_)pw;2p3*M&NDGRXOdL<-0Z}*UuF+?ex00KV`HkYn~{f3tmr-pMa5;7@~(VwxmvrPQggQ5WjSc8 zv5t!(#modk;+&tBT)+Op?!b!XzQoFXBb&*DzB|>`AwOK;_eI!q0mm7+^HA$gEng UOn129w)^+0kY!3clMAZ;1UVA@NB{r; literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/ic_smiles_flower-2.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/ic_smiles_flower-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b70bcd452c9d00e1d78a810fd747ecd53f3ff605 GIT binary patch literal 1716 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xRe+5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8KW+g=7RhMR$W{Yl!|Z$R@KEJl?AE#L8-<0 zrA5iW_()TRX$FQJev3c~fv&OgFUkZ)N@9*nesXDUYF>$_i>(q+MlU5Z#mdFa(!$l% z$<5Hz)zsC*(9purz|qyj+``<*%+Scq!U$#tHoayhuFj^$rmn80hK`1Yt|pGAjwX(l zCeDVAZl>mLMwT$Wo_WP3iFwJXFncqB_Coc#;MHs8T$Gwvl3x^(pPvIu0Rb8LCHch} z`2`Bj!Db2?;hA|U`Q^o$py+}4)+Mzlvn(~mttdZN0UW+onON+1H6Y|~h~5-(!b~6N z7=2LUKuRnyAz%swG2uxc$bn~`)I4C0DFSAV@6)zDV_;x<;_2cTQgQ3eOz#X4M}fBT zngpAl4%c*=R=7{D_@p+=xkIYwL9XcexaNF=1?)!?3@&z=@B#9TxqHdngh+BG8Ml7FiI`4z*ghH?8zwF#U-=}Th*>kAr z--KNZJT=C8>IeBYw9Gz!ptgWPN3`W9=eh>7duvam9h5C#b8-t7Y&cl{pvd}IYg1)Y zKw(|UdS<0}tGEt4kS?qgpYhA&t$qZvpzB%Jnl)a{-#=dteCu*8?4X0%LH7+@Yqr&d zU73HDXU&EWvTW7|t?s41@Ou4xo@>w4TTER}`?>cxUsRg&aGT`4#BI%t-8X|p3%nnE z7LYOgA@k_axfJJHOfT%sb3eQkJ7)CLxAF8UrVUGLk1w6NIq%9n@9wXi1~O+4EH|=j zn3Sab>-WMqZp9ZC(@*_Z%Glipp9iteBJW0@s0J8!f4YeAs3fqXA6{o^d< zs>xu}ld94CxO=@s z)b=0#^=(S|{K&)=@ilcOVi}9m^8;$WDC_N>JjcuA)5;^_ACwNRbP0YCl60v|Chk&x z%EHYT(-S5?*cdqPZ=@8zq_pXYk7m)FGD_l zNn-P!!$0n`-)lH7xJYRBbGs62M!yDNT2t9*$;ifV!u!DK%NIHvLG_5ItDnm{r-UW| DpV^EI literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/ic_smiles_flower.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_flower.imageset/ic_smiles_flower.png new file mode 100644 index 0000000000000000000000000000000000000000..63ba2bcee2c322ee5ac51f92cd6eb3e98244c278 GIT binary patch literal 2438 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_grid.imageset/ic_smiles_grid.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_grid.imageset/ic_smiles_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..f311de53e892834b5a30e5094c0e9ca87877afdc GIT binary patch literal 1695 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xRe+5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8KW+g=7RhMR$W{Yl!|Z$R@KEJl?AE#L8-<0 zrA5iW_()TRX$FQJev3c~fv&OgFUkZ)N@9*nesXDUYF>$_i>(q+MlU5Z#mdFa(!$l% z$<5Hz)zsC*(9purz|qyj+``<*%+Scq!U$#tHocZc#*XGDuI8?$hL(ngt|m@S25uIH z=1#^gZU&Ae$__{(!TB zXt0=Vo zM=%-=PiHBN2MekqB7D#?HLkGl?V zJ`r^5@?4|L{ zg4s&PS#O+NCiozx>89p`b(i!H-(SDe>zUuGgWY?!Z?H^yksp(`xSIEGb8GLt15R$H z=`7n;R)75cTkQVptJQ3Gp3n7WvI;xTcwZ-|$c=-bm-+^q05^^LXTu< zx_`a9#-J)oE*?bbejHk0l*S6W^C0@?IayE53%NNZfdyZRdGtDh`q8r^twqjzm^=l{q*A9ukL)P+l* c+#47flo=PTVLjeI5maS(y85}Sb4q9e0B8t(?*IS* literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_recent.imageset/Contents.json b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_recent.imageset/Contents.json new file mode 100644 index 0000000000..9eb2674964 --- /dev/null +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_recent.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_smiles_recent-2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_smiles_recent-1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_smiles_recent.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_recent.imageset/ic_smiles_recent-1.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_recent.imageset/ic_smiles_recent-1.png new file mode 100644 index 0000000000000000000000000000000000000000..aa1b12a7e5c91494bcd2f25cc81c6250dde10e96 GIT binary patch literal 2200 zcmbVOeK=J49zQdAmz(s$QcNQ*VrI^m88gE$GD9{rUNY>W#>~NB=8T!cj8==08fmvh zn_M=o9+aDE!_^CtYAd;3Zkt_6>55*o(Mqf=dq(N@N6+5px#xGz`MsR)=kxh~zrXMA zc}^ZL$j`*c(g*+m6aOuo5VU7&9|Jw~T`Nwxk9MCR+z2ETjzg3JIRto%;8+OfFA>B; zA&@|no^liN0Dxt2;;;xLA~1j{ge3%l)`p;x$WSx@czCH~0$~z_;9{Y8v6O`$zjz6c z6N^}QJ~faODD#05#9MaBq0n7HVZvQWLWT(M<%#o9F;M~uga~jdNwQSIRI%`jyi9bg zT_)mjizY}C3;))sh(I3B2bM!PD#6u7NCH6|jYa?|R2mI*#*s-NnMgu!nhQu_QfW-G z8}8kON7dw_IA#dP_nj6xW8o7JM8+f%l}aT+=}Lg*@kEfpU}!nWWEa%JMUgH=1S%J) z!gh&)11W@Zu?!KzQk<4i5DTXwEIjJz+YltOz`*y!QpLMOp(!J(1TrE>AQ2@JZCs1i z3M2&juNxn=R)nR?AYurlfK%l{bU)&3m%wQ5{#;0FhD zOYtUCs2nocjX|UPa46*WSbwPk5lDs5lCBuleTSv}DVFIYhXe>L4};<4r3&CBzzD2J zfMqzJP#VsGFP4g6rNU9WJ#VAsKyq;!B=VKR65L{bnc|P=b4mXz?zdRc|C2K!>I_j^ z93K?R(h^#M+Tr`sMWUZjiJ-`E_DWR_Sw1DW5c zI~nyX;>LCHdiu(ZnAchVB8=FyrN}JqP0X~k8qe#mXk#4So@LXP_^@W}j5%rL-0D4k z6^=m@ms~ZA@@_K&kwb39<5ScXqOudNk*40}=gc!{dH*pu9&b$&GYzeEb1O4!F0==> z8fOiqPN#*ep3X{4+d)hA{316bxYZ0__G=)Z<8`zqboEbt z+4=YQk+j*K4b^>XXx7>AwU;)S&wehrDXTWY*lUKn0K=Y=Hoh(PKuX4oWed7nvNE|a zsc$b(75k)LNY^A_oAtI1zH*GaA~E1O%r0oU>z-31_G{cLZgfv&;eKZKe)YQF6o(Hl zG;&3Dm0q6AzgpXyWQBdD>F100Vku|u6jp)WUpi@q{{do-=6x;=%d*byeRZ>clZE+E z0sZJY9LC;m;*JJry83b&W5%BSx4;Kz`E+1xoitWWu^TA3t^c^EiC=Zb=(`4>EIN8E z>+%mk!@O_rvZ$am`y*ZSp(FH|zjV}FWH5G5{MuUv@WL-uwYa=cS34V>+0igBnLVC7 zh`F1l86IbEU#mVX_y5v8v~J_zG}io1&890WnTo-hp?C$WonhIsr|)z?V!nu4 zRw7+B8N99}Moy+*`5_{9!X%)@fiS%OOk3=PvC8E9!%AyU*2_R(f5ijij;4CM+RPkI zUG7j)gfhy6OtkpN-fIuS>raJSeSPz2!p9wFM{*aahlkf1nSRi|x%fIb3j^qTY$&)Q S0$ytW75uqDoKu^3s{a64Kym;8 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_recent.imageset/ic_smiles_recent-2.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_recent.imageset/ic_smiles_recent-2.png new file mode 100644 index 0000000000000000000000000000000000000000..3208bcecc4d8473dca72eb7ebeb8b64b1d59324f GIT binary patch literal 1785 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/Contents.json b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/Contents.json new file mode 100644 index 0000000000..88f9c0d79e --- /dev/null +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_smiles_smile.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_smiles_smile-1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_smiles_smile-2.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/ic_smiles_smile-1.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/ic_smiles_smile-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0f94a602e375247da505ca3afbd26b18e81a4ef7 GIT binary patch literal 2606 zcmbVOdpK0<8efKDyT{p5*v2T==CTH3W->81g-Gt@I?Te9ximA(Owpm8+}pZPBy1H* zMY`9P4#nlipg{tGu)u-EA{7=$frKMuh>;wD`62@i z5=8M?JRytAfiEyJBDwKG5<=nW=MdODPtUK!9Kn}FDN=?OGk9nag+a5~3vqq276^Ty z|GM#AYk{AH2cdl+0XLo>rPz;X^F^>CcYiOmV5snhxQWkFYziZe#*K<+LmZ(Sjf7Bq zK`~iOBF&Y6r_(8}pab23ZV!TZ5JRThJK`O&I1uZK$1ZYw4~wC@Qs`JJhVB3oK#*=v zc61<9sRS~GM#fXg1cybe8%H2yaH60^U6w-kGnV4|w^$;T4>5#Xz8{wxw^#w*v0Ncn z5XB|uD9K9>#ulwTt2JNk6Y|BCxFmihnW46Sem zy-*zA6wBh0q5>C&UrS#x`FeODj^f1d6-Ps}Q@$MlmWH{}$bRC!H^E68^ZX5+gQ87! z4-A^#X|~VXwi_O4e{0Jzj|Vd;D>MQ;dwTk2&HK&<1P2eC)A|^D&Oi9Fzgnxx8ry(d ztD;xxxx43QtwI(?&?s7MoR%25sHgYY{M9G&e}#0+#kK4h5Zoh-Np`<1dg*jefMOlk zK+B0KD3vwrRr$7MhZELzYo9rDrpfP^`tQmTsqvsY+^BO-J}5 zWp(5Os&2}U01@DkY@BwrU=<5hlMnSvk4OzlwbP5-f+I}2)Z&&rYP8~765<;3lKK-Y zbTOvybSsrOyh@R}AuyY+l;4~2)?X{JO>}axZqJcMW~~e0t?k!oDsfk7Qghn2d7WmHMw8N;gjjUdpjC}&CA7tiXUeMpz0BT` zB5;2O*~F#rjfS1e^^8If*B$DQ+htPI|9qF^<%_+@c*GCOj8o9h?pd6uH+}4~cCaFS zS)$Pf$D84@&Gpu=R9qy4r#9Ko!%EXT0(EQmR#5Uchr#r&tjYnboU`WQ4+cD;UY|;m z-u><0_LaR`drRNx!k?uvdy@k-hvy{Is^^-XuYELr94u%9mvB|UxvKG))9uS1AEhmC zJ}~wWvhFZ=r!KxP<^Wf6$i^3Q#u8Q@Yf(vNjE^oie3@8~R$g$zyUXJkcE6d023{r& zkoLRRiPp|0pFo--Sdhzevia5dO@hvMHtUdwwA z%kh^k%$@HU4rQaFrc#q_FWswPoh+hJ2Eub{&7ws``>&Xtc;h%dyvo_AqV*D7trHuv zscy?MstEmOTE0r}2qnZ)`E(GU*7tNM!hR~xu9CD#8)2HuDf&47Q(xjW&HX{U#~!+6=}G6nR=&TR(9@#vk9`^7s=~uBl-E67K|z6>p6oF$8?Xt)8;E=%wo+w z$zkTRH{H!(wb>(=9Mh4!yEo zijV!QzE8U5aW)wFo!=0Bv1GDd@59m$&jJWHaY=<9{cX7CgYTc~ zY2FCEu36pc9YP@I!o!|y8@i3UTsgaE);Z>5VP<)?PDcZbHlCKEIpG{t)SxFVUDwPH ze~=pmOOR@n8he3*U2)9Rm20L;%arE&R{sjVX*GzqYZ|Q?x1SP?rA{mvAF(Se8oVf* zL`rS4b~=wg9N~l4yl#pv=-3ViZqfZ1Qc56Oz+X2UzLQknSvHF*9*RE!znae$ZAq-# zkke#5?^JxMq*LA7DSux!DZFY_GKoKAzL9egastNj(?6n-aeQ36SxsDrs6i z%zta*Fd^3Lh3y?i#lF7O>iXw5OUd@i_2u>clbq&FdI2E6TM=gJIhd zjiyu2JMVAv>AbS*@sYfX{`n(=^X}1{e$@&Y+ zvht=jF(ZTDDE&B}m+t-}jAm0Xy;Bw~6Q1(w=IhuUG9Nm+0e>T5=~m=!t-i7FjLX=N zP_BMm2NNL|So~Zz8G4u-Sz2tjoRW|@zM7;i3pX;OM~deog(*x`jVD MH@X+?JSAe!U&)<7(f|Me literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/ic_smiles_smile-2.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/ic_smiles_smile-2.png new file mode 100644 index 0000000000000000000000000000000000000000..0e8515a12545c0f6efa6b9585b12b9173268fbd0 GIT binary patch literal 3366 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/ic_smiles_smile.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_smiles_smile.imageset/ic_smiles_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..2d98101f8ee487e79cb3ee0669f80e277063174d GIT binary patch literal 2095 zcmbVNdsI{R9Zv`#Cj|jVQN+O|Kt!6?4M`vw0Rl-RC@3NFk^&*Qkd(YgE=^>L1QDTD z#FkL()ZM7K{o(1(***9Ep5M>s`#!gF zbHaKT>}o6ug>n(Za)roDv3*XC$e3ccum_pEU|uSmq|Sx)Vl9N?NYyzIAW(|)AR#1{ zZY#J5g`-fIT)8L}PL1EllBks=u}y|#P-+k~3Kbq{(1<1Z5Der%d2$sS_wdYF93Ypn zaVhk8O1vfplF4I>v`|t}f=E)7FJVe?kr6<+frSt#Ay^C;lnRxOWnkl8^0JV%?U;-M zUW&l^Y}_lOQsXxRF={OY&`BXg2?YcJ27?6B=nMu(0H_p@N~Rz$g9y@CbOwtW3cP-B zh&HV>mnG!#U+Y44Y@7^+H7qh&uh*0GAtbdnj|?)IOdAK4N<<`xx@{_0Y#^$1{!0v8 zNGH+CHLzT*0&I-p9Cabg#vzuzazUwykAFj~(!CB85;C$utRaIW3R$VN`Sns-2MeM9 znDJI=ooJf|A`2m%x=<@Y@{#Mm1V&=_+lp+0h&8NDS~-#wv4X3X6e=MVEa0+n$PGy< zm$JBgW*Cnb%?If`I*$f|VIYOWqlJcrQW+qXA4Xl`cpEm1!sOFqcwsy`$OJ(iEt(d> z3H?gc3EhL83T9I0p)vjkj@$S{0AElshH%AeL zs8G|&LA%!eXTtGy8i#JQ$8Oe4zXipcU9P z`{|>qrc*5zTu@gq9vh{(J^#D} z^vqW|CSa`ML*~udjnK{Ib`#C93t361zRSZA7-!*)wZ=6jO7z6+vRcfyTSl4Lu>o=1 zANj7U`^acM*Kd2t4u19e3daKH7Z!ACZcm| zx*GDbtAc&YTU6=8C-2Of>_7J@AEGt7UORmZ@>D&pS$YkvypQQ!F`E8n;#5S6gfI-#s9 zFkNcuJGpgPuR}UI-$>n1PbD3ONe3Fl^Pjb87gNt;jB)nZt0|Jxy{$dLFEnY$!8Pe`AAS5s$+Y{o}LrfJ8M>@7O;eB(@)FD`k!CwT5e*`E5E zp_w@7Uzq(y*Kbx1Xo)8D;EI`za|>k!PcWv2bAPxUQ(kefdL;g%G?hz!;CnmYH@mz? zYr-n*Gch|#1mPF*;!J%#p}i>rXZEfg`@KTyH|DvG-=nA!iq(6kCX11!1wskyZ4l$;6xI22747>A z`wnfe0=((h71%t%o%kM|TAV>h z+FR%2o(>*=H?X%~G%<=laFn<8w4Zn1@sH)Inz(?U9sq(*|de7 zKuzW*>sR=UqQ!{C7ssDId+~VZc(7lGs95uKibpg)=h)RuXQZE99M`mD|FT}6VeGam gaJY-@9^8a>M9D9w3rvy#we1%!;3aT7qO(i?4VpkWZ2$lO literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift index 34c2f3c22d..b9c6134814 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift @@ -8,6 +8,8 @@ import MobileCoreServices import AddressBook import AddressBookUI import AVFoundation +import AGEmojiKeyboard + final public class ConversationViewController: AAConversationContentController, @@ -19,7 +21,9 @@ final public class ConversationViewController: ABPeoplePickerNavigationControllerDelegate, AAAudioRecorderDelegate, AAConvActionSheetDelegate, - AAStickersKeyboardDelegate { + //AAStickersKeyboardDelegate, + AGEmojiKeyboardViewDataSource, + AGEmojiKeyboardViewDelegate{ // Data binder fileprivate let binder = AABinder() @@ -49,9 +53,10 @@ final public class ConversationViewController: // Stickers // - fileprivate var stickersView: AAStickersKeyboard! + //fileprivate var stickersView: AAStickersKeyboard! open var stickersButton : UIButton! fileprivate var stickersOpen = false + fileprivate var emojiKeyboar: AGEmojiKeyboardView! // @@ -279,8 +284,13 @@ final public class ConversationViewController: navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: nil, action: nil) let frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216) - self.stickersView = AAStickersKeyboard(frame: frame) - self.stickersView.delegate = self + // self.stickersView = AAStickersKeyboard(frame: frame) + //self.stickersView.delegate = self + + self.emojiKeyboar = AGEmojiKeyboardView(frame:frame, dataSource: self) + self.emojiKeyboar.delegate = self + self.emojiKeyboar.autoresizingMask = UIViewAutoresizing.flexibleHeight + //emojiKeyboar.frame = frame NotificationCenter.default.addObserver( self, @@ -466,7 +476,8 @@ final public class ConversationViewController: titleView.frame = CGRect(x: 0, y: 4, width: (navigationView.frame.width - 0), height: 20) subtitleView.frame = CGRect(x: 0, y: 22, width: (navigationView.frame.width - 0), height: 20) - stickersView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216) + //stickersView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216) + emojiKeyboar.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216) } override open func viewDidAppear(_ animated: Bool) { @@ -1062,9 +1073,10 @@ final public class ConversationViewController: open func changeKeyboard() { if self.stickersOpen == false { - // self.stickersView.loadStickers() + //self.stickersView.loadStickers() - self.textInputbar.textView.inputView = self.stickersView + //self.textInputbar.textView.inputView = self.stickersView + self.textInputbar.textView.inputView = self.emojiKeyboar self.textInputbar.textView.inputView?.isOpaque = false self.textInputbar.textView.inputView?.backgroundColor = UIColor.clear self.textInputbar.textView.refreshFirstResponder() @@ -1092,6 +1104,53 @@ final public class ConversationViewController: open func stickerDidSelected(_ keyboard: AAStickersKeyboard, sticker: ACSticker) { Actor.sendSticker(with: self.peer, with: sticker) } + + + public func emojiKeyboardView(_ emojiKeyboardView: AGEmojiKeyboardView!, imageForSelectedCategory category: AGEmojiKeyboardViewCategoryImage) -> UIImage{ + switch category { + case .recent: + return UIImage.bundled("ic_smiles_recent")! + case .face: + return UIImage.bundled("ic_smiles_smile")! + case .car: + return UIImage.bundled("ic_smiles_car")! + case .bell: + return UIImage.bundled("ic_smiles_bell")! + case .flower: + return UIImage.bundled("ic_smiles_flower")! + case .characters: + return UIImage.bundled("ic_smiles_grid")! + } + } + + public func emojiKeyboardView(_ emojiKeyboardView: AGEmojiKeyboardView!, imageForNonSelectedCategory category: AGEmojiKeyboardViewCategoryImage) -> UIImage!{ + switch category { + case .recent: + return UIImage.bundled("ic_smiles_recent")! + case .face: + return UIImage.bundled("ic_smiles_smile")! + case .car: + return UIImage.bundled("ic_smiles_car")! + case .bell: + return UIImage.bundled("ic_smiles_bell")! + case .flower: + return UIImage.bundled("ic_smiles_flower")! + case .characters: + return UIImage.bundled("ic_smiles_grid")! + } + } + + public func backSpaceButtonImage(for emojiKeyboardView: AGEmojiKeyboardView!) -> UIImage!{ + return UIImage.bundled("ic_smiles_backspace")! + } + + public func emojiKeyBoardView(_ emojiKeyBoardView: AGEmojiKeyboardView!, didUseEmoji emoji: String!){ + self.textView.text = self.textView.text.appending(emoji) + } + + public func emojiKeyBoardViewDidPressBackSpace(_ emojiKeyBoardView: AGEmojiKeyboardView!){ + self.textView.deleteBackward() + } } class AABarAvatarView : AAAvatarView { diff --git a/actor-sdk/sdk-core-ios/Podfile b/actor-sdk/sdk-core-ios/Podfile index 116828701c..0474d90ae9 100644 --- a/actor-sdk/sdk-core-ios/Podfile +++ b/actor-sdk/sdk-core-ios/Podfile @@ -25,6 +25,7 @@ target 'ActorApp' do pod 'YYWebImage' pod 'YYCategories' pod 'DZNWebViewController' + pod 'AGEmojiKeyboard' # Small UI pod 'VBFPopFlatButton' @@ -44,7 +45,7 @@ target 'ActorSDK' do # J2Objc Runtime #pod 'J2ObjC-Framework' - pod 'J2ObjC-Framework', :podspec => 'https://raw.githubusercontent.com/dfsilva/J2ObjC-Framework/v1.2.3/J2ObjC-Framework.podspec' + pod 'J2ObjC-Framework', :podspec => 'https://raw.githubusercontent.com/dfsilva/J2ObjC-Framework/v1.2a/J2ObjC-Framework.podspec' # Core Tools pod 'RegexKitLite' @@ -61,6 +62,7 @@ target 'ActorSDK' do pod 'YYWebImage' pod 'YYCategories' pod 'DZNWebViewController' + pod 'AGEmojiKeyboard' # Small UI pod 'VBFPopFlatButton' From 76699f176c9c23672e1dd5d8008e248aef7fec7a Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sun, 4 Dec 2016 15:35:31 -0200 Subject: [PATCH 178/253] podspec fixes --- .../android-sdk/src/main/res/.DS_Store | Bin 18436 -> 18436 bytes actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/src/main/res/.DS_Store index 6f6c30165ade3ee273079e8c8ade1621bb746e4a..28511456876e6ffbaf258c9ec26e7a41a0c1fd7b 100644 GIT binary patch delta 157 zcmZpfz}PZ@af62$C1sCGYO=lhQ2=Jr B9$Wwb diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index f71995344b..77e70a6e7b 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.7" + s.version = "3.0.457.9" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } @@ -27,6 +27,7 @@ Pod::Spec.new do |s| s.dependency 'YYCategories' s.dependency 'YYWebImage' s.dependency 'DZNWebViewController' + s.dependency 'AGEmojiKeyboard' s.dependency 'TTTAttributedLabel' s.dependency 'M13ProgressSuite' From ce449dc7511adc249d151190e422c4eb3f9fc528 Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 4 Dec 2016 22:42:33 -0200 Subject: [PATCH 179/253] alteracoes --- .../android-app/src/main/java/im/actor/Application.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index 9c3d7b46e1..6e0d8cef39 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -79,14 +79,14 @@ public void onConfigureActorSDK() { ActorSDK.sharedActor().setTosUrl("http://actor.im"); ActorSDK.sharedActor().setPrivacyText("bla bla bla"); - ActorSDK.sharedActor().setVideoCallsEnabled(true); + ActorSDK.sharedActor().setVideoCallsEnabled(false); ActorSDK.sharedActor().setAutoJoinGroups(new String[]{ - "actor_news" + "canalxloto" }); // ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); - ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://64.137.170.2:9070"}); + ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); ActorSDK.sharedActor().setAuthType(AuthActivity.AUTH_TYPE_PHONE); // ActorSDK.sharedActor().setTwitter(""); From 738d71863c7632d9057511dd1a859a5aea0bce01 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 7 Dec 2016 13:47:05 -0200 Subject: [PATCH 180/253] alteracoes --- .DS_Store | Bin 10244 -> 10244 bytes .../sdk-core-android/android-app/build.gradle | 2 +- .../android-google-maps/build.gradle | 2 +- .../android-google-push/build.gradle | 2 +- .../sdk-core-android/android-sdk/build.gradle | 2 +- .../android-sdk/src/main/res/.DS_Store | Bin 18436 -> 18436 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../ActorApp.xcodeproj/project.pbxproj | 4 + .../ActorApp/AppCocoaHttpRuntime.swift | 75 ++++++++++++++++++ .../Providers/CocoaHttpRuntime.swift | 6 +- .../sdk-core/core/core-android/build.gradle | 2 +- .../runtime/runtime-android/build.gradle | 2 +- 12 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 actor-sdk/sdk-core-ios/ActorApp/AppCocoaHttpRuntime.swift diff --git a/.DS_Store b/.DS_Store index 36f870723ae153b7198696b40be2b78edb58e6d2..256b3305b6b5033f2a9778f5c433ac9ac4e76a1c 100644 GIT binary patch delta 80 zcmV-W0I&aqP=rvhEf4|8lP(Z|DHwZuHZU|SAUQC7EFgO^FgG?VAU8KKeSHZC7bP)0 mNnmYxdV73*ewmZm5FY`Wv-uDX53>az`~;K08yd4673l)rSsA+k delta 82 zcmV-Y0ImOoP=rvhEf4|AlP(Z|D;j%yGchqYEFdv3F?}o`doeIDH7p=EI5>TM2?!S@ oF+E9OZFzcoe0_eKlh+U*0i2WJ6Be@#5%> ARPromise! { + + return ARPromise { (resolver) in + + let request = NSMutableURLRequest(url: URL(string: url)!) + + let username = "LezxRxSDgFMA" + let password = "X@U+e(>Hc^%h!V3]p*-6" + let loginString = String(format: "%@:%@", username, password) + let loginData = loginString.data(using: String.Encoding.utf8)! + let base64LoginString = loginData.base64EncodedString() + + request.httpShouldHandleCookies = false + request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData + + request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization") + request.setValue("X@U+e(>Hc^%h!V3]p*-6", forHTTPHeaderField: "X-API-KEY") + + request.httpMethod = "GET" + + NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: self.queue, completionHandler:{ (response: URLResponse?, data: Data?, error: Error?) -> Void in + if let respHttp = response as? HTTPURLResponse { + if (respHttp.statusCode >= 200 && respHttp.statusCode < 300) { + resolver.result(ARHTTPResponse(code: jint(respHttp.statusCode), withContent: data!.toJavaBytes())) + } else { + resolver.error(ARHTTPError(int: jint(respHttp.statusCode))) + } + } else { + resolver.error(ARHTTPError(int: 0)) + } + }) + } + } + + + public func getMethodWithUrl2(_ url: String!, withStartOffset startOffset: jint, withSize size: jint, withTotalSize totalSize: jint) -> ARPromise! { + + return ARPromise { (resolver) in + + let header = "bytes=\(startOffset)-\(min(startOffset + size, totalSize))" + let request = NSMutableURLRequest(url: URL(string: url)!) + request.httpShouldHandleCookies = false + request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData + request.setValue(header, forHTTPHeaderField: "Range") + request.httpMethod = "GET" + + NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: self.queue, completionHandler:{ (response: URLResponse?, data: Data?, error: Error?) -> Void in + if let respHttp = response as? HTTPURLResponse { + if (respHttp.statusCode >= 200 && respHttp.statusCode < 300) { + resolver.result(ARHTTPResponse(code: jint(respHttp.statusCode), withContent: data!.toJavaBytes())) + } else { + resolver.error(ARHTTPError(int: jint(respHttp.statusCode))) + } + } else { + resolver.error(ARHTTPError(int: 0)) + } + }) + } + } + +} diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/CocoaHttpRuntime.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/CocoaHttpRuntime.swift index ec7ea7f187..94fc0a0a68 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/CocoaHttpRuntime.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/CocoaHttpRuntime.swift @@ -4,11 +4,11 @@ import Foundation -class CocoaHttpRuntime: NSObject, ARHttpRuntime { +open class CocoaHttpRuntime: NSObject, ARHttpRuntime { let queue:OperationQueue = OperationQueue() - func getMethodWithUrl(_ url: String!, withStartOffset startOffset: jint, withSize size: jint, withTotalSize totalSize: jint) -> ARPromise! { + public func getMethodWithUrl(_ url: String!, withStartOffset startOffset: jint, withSize size: jint, withTotalSize totalSize: jint) -> ARPromise! { return ARPromise { (resolver) in @@ -33,7 +33,7 @@ class CocoaHttpRuntime: NSObject, ARHttpRuntime { } } - func putMethod(withUrl url: String!, withContents contents: IOSByteArray!) -> ARPromise! { + public func putMethod(withUrl url: String!, withContents contents: IOSByteArray!) -> ARPromise! { return ARPromise { (resolver) in let request = NSMutableURLRequest(url: URL(string: url)!) request.httpShouldHandleCookies = false diff --git a/actor-sdk/sdk-core/core/core-android/build.gradle b/actor-sdk/sdk-core/core/core-android/build.gradle index 6fb950eb39..614a6907fc 100644 --- a/actor-sdk/sdk-core/core/core-android/build.gradle +++ b/actor-sdk/sdk-core/core/core-android/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } diff --git a/actor-sdk/sdk-core/runtime/runtime-android/build.gradle b/actor-sdk/sdk-core/runtime/runtime-android/build.gradle index 4784fed81a..81abc2815e 100644 --- a/actor-sdk/sdk-core/runtime/runtime-android/build.gradle +++ b/actor-sdk/sdk-core/runtime/runtime-android/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } From 34e93fc0f4738ce02b911fbff969f7b61198e225 Mon Sep 17 00:00:00 2001 From: gputintsev Date: Thu, 8 Dec 2016 22:36:32 +0300 Subject: [PATCH 181/253] chore(iOS): toolbar subtitle open --- .../Controllers/Conversation/ConversationViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift index cc9e6c66d8..af32ca047b 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift @@ -36,7 +36,7 @@ open class ConversationViewController: // fileprivate let titleView: UILabel = UILabel() - fileprivate let subtitleView: UILabel = UILabel() + open let subtitleView: UILabel = UILabel() fileprivate let navigationView: UIView = UIView() fileprivate let avatarView = AABarAvatarView() fileprivate let backgroundView = UIImageView() From 9a6cac1f432c7db567d587a12dde6d0a6845dd05 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 8 Dec 2016 23:07:15 -0200 Subject: [PATCH 182/253] alteracoes --- .DS_Store | Bin 10244 -> 10244 bytes actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../ActorApp.xcodeproj/project.pbxproj | 6 ++++ .../sdk-core-ios/ActorApp/ActorCoreExt.swift | 28 ++++++++++++++++ .../ActorApp/AppCocoaHttpRuntime.swift | 31 ++---------------- .../sdk-core-ios/ActorApp/AppDelegate.swift | 2 ++ actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- actor-sdk/sdk-core-ios/Podfile | 2 +- 9 files changed, 41 insertions(+), 30 deletions(-) create mode 100644 actor-sdk/sdk-core-ios/ActorApp/ActorCoreExt.swift diff --git a/.DS_Store b/.DS_Store index 256b3305b6b5033f2a9778f5c433ac9ac4e76a1c..79c291d1d9bbaeb8ad0f4ebc1921689fb80ffa44 100644 GIT binary patch delta 103 zcmZn(XbG6$&&abeU^hP_&*X=~Vw2B{^@|!CnCU1OnwZtrY-U&Z#j;8CAQP(G () + init(closure: @escaping (_ resolver: ARPromiseResolver) -> ()){ + self.closure = closure + } + + open func exec(_ resolver: ARPromiseResolver) { + closure(resolver) + } +} + +extension ARPromise { + convenience init(closure: @escaping (_ resolver: ARPromiseResolver) -> ()) { + self.init(executor: AAAPromiseFunc(closure: closure)) + } +} diff --git a/actor-sdk/sdk-core-ios/ActorApp/AppCocoaHttpRuntime.swift b/actor-sdk/sdk-core-ios/ActorApp/AppCocoaHttpRuntime.swift index c0c532fd7e..d0b742e666 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/AppCocoaHttpRuntime.swift +++ b/actor-sdk/sdk-core-ios/ActorApp/AppCocoaHttpRuntime.swift @@ -9,10 +9,11 @@ import Foundation import ActorSDK -open class AppCocoaHttpRuntime: CocoaHttpRuntime { +open class AppCocoaHttpRuntime: NSObject { + static let queue:OperationQueue = OperationQueue() - public func getMethod(_ url: String) -> ARPromise! { + public class func getMethod(_ url: String) -> ARPromise! { return ARPromise { (resolver) in @@ -45,31 +46,5 @@ open class AppCocoaHttpRuntime: CocoaHttpRuntime { }) } } - - - public func getMethodWithUrl2(_ url: String!, withStartOffset startOffset: jint, withSize size: jint, withTotalSize totalSize: jint) -> ARPromise! { - - return ARPromise { (resolver) in - - let header = "bytes=\(startOffset)-\(min(startOffset + size, totalSize))" - let request = NSMutableURLRequest(url: URL(string: url)!) - request.httpShouldHandleCookies = false - request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData - request.setValue(header, forHTTPHeaderField: "Range") - request.httpMethod = "GET" - - NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: self.queue, completionHandler:{ (response: URLResponse?, data: Data?, error: Error?) -> Void in - if let respHttp = response as? HTTPURLResponse { - if (respHttp.statusCode >= 200 && respHttp.statusCode < 300) { - resolver.result(ARHTTPResponse(code: jint(respHttp.statusCode), withContent: data!.toJavaBytes())) - } else { - resolver.error(ARHTTPError(int: jint(respHttp.statusCode))) - } - } else { - resolver.error(ARHTTPError(int: 0)) - } - }) - } - } } diff --git a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift index d94d5a40b5..1431df0f8b 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift @@ -34,6 +34,8 @@ open class AppDelegate : ActorApplicationDelegate { ActorSDK.sharedActor().endpoints = ["tcp://api-mtproto.im.xloto.com.br:9070"] + //AppCocoaHttpRuntime.getMethod("") + // Creating Actor ActorSDK.sharedActor().createActor() diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index 77e70a6e7b..dd1a1454b7 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.9" + s.version = "3.0.457.12" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/Podfile b/actor-sdk/sdk-core-ios/Podfile index 0474d90ae9..fde45835d7 100644 --- a/actor-sdk/sdk-core-ios/Podfile +++ b/actor-sdk/sdk-core-ios/Podfile @@ -36,7 +36,7 @@ target 'ActorApp' do pod 'MBProgressHUD' # Calls - # pod 'libjingle_peerconnection' + pod 'libjingle_peerconnection' end target 'ActorSDK' do From 8e86081629da00c2be62ce3ca39607c4b632ac93 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sun, 11 Dec 2016 17:57:19 -0200 Subject: [PATCH 183/253] alteracoes --- .../activation/fake/FakeSmsProvider.scala | 43 +++++++++++++++++++ .../push/apple/ApplePushExtension.scala | 12 ++++-- .../server/push/apple/ApplePushProvider.scala | 2 +- actor-server/conf/server.conf | 11 ++++- actor-server/project/Dependencies.scala | 2 +- 5 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 actor-server/actor-activation/src/main/scala/im/actor/server/activation/fake/FakeSmsProvider.scala diff --git a/actor-server/actor-activation/src/main/scala/im/actor/server/activation/fake/FakeSmsProvider.scala b/actor-server/actor-activation/src/main/scala/im/actor/server/activation/fake/FakeSmsProvider.scala new file mode 100644 index 0000000000..7d072f522c --- /dev/null +++ b/actor-server/actor-activation/src/main/scala/im/actor/server/activation/fake/FakeSmsProvider.scala @@ -0,0 +1,43 @@ +package im.actor.server.activation.fake + +import akka.actor.ActorSystem +import akka.event.Logging +import akka.http.scaladsl.util.FastFuture +import cats.data.Xor +import im.actor.server.activation.common._ +import im.actor.server.db.DbExtension +import im.actor.server.persist.auth.GateAuthCodeRepo +import spray.client.pipelining._ +import spray.http.HttpMethods.{ GET, POST } +import spray.http._ +import spray.httpx.PlayJsonSupport +import spray.httpx.marshalling._ +import spray.httpx.unmarshalling._ + +import scala.concurrent.Future +import scala.reflect.ClassTag + +import scala.concurrent.ExecutionContext.Implicits.global + +private[activation] final class FakeSmsProvider(implicit system: ActorSystem) + extends ActivationProvider + with PlayJsonSupport { + + private val log = Logging(system, getClass) + + override def send(txHash: String, code: Code): Future[CodeFailure Xor Unit] = { + Future { + Xor.right(None) + } + } + + override def validate(txHash: String, code: String): Future[ValidationResponse] = { + + Future { + Validated + } + } + + override def cleanup(txHash: String): Future[Unit] = Future {} + +} \ No newline at end of file diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala index 04f12cab82..658c46209a 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala @@ -5,7 +5,7 @@ import java.util.concurrent.{ ExecutionException, TimeUnit, TimeoutException } import akka.actor.{ ActorSystem, ExtendedActorSystem, Extension, ExtensionId, ExtensionIdProvider } import akka.event.Logging -import com.relayrides.pushy.apns.ApnsClient +import com.relayrides.pushy.apns.{ ApnsClient, ApnsClientBuilder } import com.relayrides.pushy.apns.util.SimpleApnsPushNotification import im.actor.server.db.DbExtension import im.actor.server.model.push.ApplePushCredentials @@ -29,7 +29,7 @@ final class ApplePushExtension(system: ActorSystem) extends Extension with AnyRe private val MaxCreateAttempts = 50 - type Client = ApnsClient[SimpleApnsPushNotification] + type Client = ApnsClient import system.dispatcher @@ -69,9 +69,13 @@ final class ApplePushExtension(system: ActorSystem) extends Extension with AnyRe val connectFuture: Future[Client] = Future { blocking { - val client = new ApnsClient[SimpleApnsPushNotification](new File(cert.path), cert.password) + // val client = new ApnsClient[SimpleApnsPushNotification](new File(cert.path), cert.password) + // client.connect(host).get(20, TimeUnit.SECONDS) + // log.debug("Established client connection for cert: {}, is voip: {}", certKey, cert.isVoip) + // client + + val client = new ApnsClientBuilder().setClientCredentials(new File(cert.path), cert.password).build() client.connect(host).get(20, TimeUnit.SECONDS) - log.debug("Established client connection for cert: {}, is voip: {}", certKey, cert.isVoip) client } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala index 135eebb2f2..7a947802a8 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala @@ -76,7 +76,7 @@ final class ApplePushProvider(userId: Int)(implicit system: ActorSystem) extends private def isLegacyCreds(creds: ApplePushCredentials) = creds.bundleId.isEmpty - private def withClient[A](creds: ApplePushCredentials)(f: ApnsClient[SimpleApnsPushNotification] ⇒ A): Unit = { + private def withClient[A](creds: ApplePushCredentials)(f: ApnsClient ⇒ A): Unit = { val credsKey = extractCredsId(creds) applePushExt.client(credsKey) match { case Some(futureClient) ⇒ futureClient foreach { f(_) } diff --git a/actor-server/conf/server.conf b/actor-server/conf/server.conf index 4e432dca71..451e5e95ee 100644 --- a/actor-server/conf/server.conf +++ b/actor-server/conf/server.conf @@ -179,7 +179,7 @@ services { providers { #sms: im.actor.server.activation.gate.ActorGateSmsProvider - sms: br.com.diegosilva.lotericas.activation.LotericaSmsProvider + sms: im.actor.server.activation.fake.FakeSmsProvider smtp: im.actor.server.activation.smtp.SMTPProvider } } @@ -273,6 +273,15 @@ services { # Accessing Apple servers for push notifications apple { + push { + certs = [{ + bundleId: "br.com.diegosilva.xlotomessenger" + path: "/Users/diego/Dropbox/actor/apple/production/xloto_apns.p12" + password: "xlotoapns123" + sandbox: false + voip: false + }] + } } actor { diff --git a/actor-server/project/Dependencies.scala b/actor-server/project/Dependencies.scala index 93bfb61b77..4d7985a830 100644 --- a/actor-server/project/Dependencies.scala +++ b/actor-server/project/Dependencies.scala @@ -94,7 +94,7 @@ object Dependencies { val tyrex = "tyrex" % "tyrex" % "1.0.1" - val pushy = "com.relayrides" % "pushy" % "0.6.1" + val pushy = "com.relayrides" % "pushy" % "0.8.1" val logbackClassic = "ch.qos.logback" % "logback-classic" % "1.1.2" val scalaLogging = "com.typesafe.scala-logging" %% "scala-logging" % "3.1.0" From 035f719c6bebe2108dce1630b145ee5e653c4bc4 Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 11 Dec 2016 17:59:55 -0200 Subject: [PATCH 184/253] alteracoes --- actor-sdk/sdk-core-android/android-app/build.gradle | 2 +- .../android-app/src/main/java/im/actor/Application.java | 6 +++--- actor-sdk/sdk-core-android/android-google-maps/build.gradle | 2 +- actor-sdk/sdk-core-android/android-google-push/build.gradle | 2 +- actor-sdk/sdk-core-android/android-sdk/build.gradle | 2 +- actor-sdk/sdk-core/core/core-android/build.gradle | 2 +- actor-sdk/sdk-core/runtime/runtime-android/build.gradle | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-app/build.gradle b/actor-sdk/sdk-core-android/android-app/build.gradle index d5d477387b..594fe30839 100644 --- a/actor-sdk/sdk-core-android/android-app/build.gradle +++ b/actor-sdk/sdk-core-android/android-app/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'me.tatarka:gradle-retrolambda:3.2.5' classpath "com.google.gms:google-services:3.0.0" } diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index 6e0d8cef39..ba5dfb7d47 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -56,7 +56,7 @@ public void onCreate() { @Override public void onConfigureActorSDK() { ActorSDK.sharedActor().setDelegate(new ActorSDKDelegate()); - ActorSDK.sharedActor().setPushId(209133700967L); + ActorSDK.sharedActor().setPushId(43880936595L); ActorSDK.sharedActor().setActorPushEndpoint(null); ActorSDK.sharedActor().setOnClientPrivacyEnabled(true); ActorStyle style = ActorSDK.sharedActor().style; @@ -85,8 +85,8 @@ public void onConfigureActorSDK() { "canalxloto" }); -// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); - ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); + ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); + // ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); ActorSDK.sharedActor().setAuthType(AuthActivity.AUTH_TYPE_PHONE); // ActorSDK.sharedActor().setTwitter(""); diff --git a/actor-sdk/sdk-core-android/android-google-maps/build.gradle b/actor-sdk/sdk-core-android/android-google-maps/build.gradle index ed6fb880ee..b72a2743e8 100644 --- a/actor-sdk/sdk-core-android/android-google-maps/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-maps/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" classpath 'me.tatarka:gradle-retrolambda:3.2.5' diff --git a/actor-sdk/sdk-core-android/android-google-push/build.gradle b/actor-sdk/sdk-core-android/android-google-push/build.gradle index 1888b164aa..96fe3de475 100644 --- a/actor-sdk/sdk-core-android/android-google-push/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-push/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" classpath 'me.tatarka:gradle-retrolambda:3.2.5' diff --git a/actor-sdk/sdk-core-android/android-sdk/build.gradle b/actor-sdk/sdk-core-android/android-sdk/build.gradle index 9c153fc46a..1ac97a2b84 100644 --- a/actor-sdk/sdk-core-android/android-sdk/build.gradle +++ b/actor-sdk/sdk-core-android/android-sdk/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.github.dcendents:android-maven-plugin:1.2' classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" classpath 'me.tatarka:gradle-retrolambda:3.2.5' diff --git a/actor-sdk/sdk-core/core/core-android/build.gradle b/actor-sdk/sdk-core/core/core-android/build.gradle index 6fb950eb39..614a6907fc 100644 --- a/actor-sdk/sdk-core/core/core-android/build.gradle +++ b/actor-sdk/sdk-core/core/core-android/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } diff --git a/actor-sdk/sdk-core/runtime/runtime-android/build.gradle b/actor-sdk/sdk-core/runtime/runtime-android/build.gradle index 4784fed81a..81abc2815e 100644 --- a/actor-sdk/sdk-core/runtime/runtime-android/build.gradle +++ b/actor-sdk/sdk-core/runtime/runtime-android/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } From b5f930c112738605d2a3ca8f82fc3b1b6032e810 Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 11 Dec 2016 22:56:15 -0200 Subject: [PATCH 185/253] alteracoes --- .../src/main/java/im/actor/Application.java | 2 +- actor-server/conf/server.conf | 22 +++++++++---------- actor-server/project/Dependencies.scala | 6 +++-- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index ba5dfb7d47..f6b4815a7d 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -85,7 +85,7 @@ public void onConfigureActorSDK() { "canalxloto" }); - ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); + ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.3:9070"}); // ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); ActorSDK.sharedActor().setAuthType(AuthActivity.AUTH_TYPE_PHONE); diff --git a/actor-server/conf/server.conf b/actor-server/conf/server.conf index 451e5e95ee..b065c79a02 100644 --- a/actor-server/conf/server.conf +++ b/actor-server/conf/server.conf @@ -72,25 +72,25 @@ modules { security { server-keys: [ { - public: "/Users/diego/data/keys/actor-key-0.pub" - private: "/Users/diego/data/keys/actor-key-0.key" + public: "/home/diego/data/keys/actor-key-0.pub" + private: "/home/diego/data/keys/actor-key-0.key" } { - public: "/Users/diego/data/keys/actor-key-1.pub" - private: "/Users/diego/data/keys/actor-key-1.key" + public: "/home/diego/data/keys/actor-key-1.pub" + private: "/home/diego/data/keys/actor-key-1.key" } { - public: "/Users/diego/data/keys/actor-key-2.pub" - private: "/Users/diego/data/keys/actor-key-2.key" + public: "/home/diego/data/keys/actor-key-2.pub" + private: "/home/diego/data/keys/actor-key-2.key" } { - public: "/Users/diego/data/keys/actor-key-3.pub" - private: "/Users/diego/data/keys/actor-key-3.key" + public: "/home/diego/data/keys/actor-key-3.pub" + private: "/home/diego/data/keys/actor-key-3.key" } ] } api { - endpoint = "http://192.168.1.8:9090" + endpoint = "http://192.168.1.3:9090" } raw { @@ -125,7 +125,7 @@ services { #For local file storage file-storage { # provide your own path to directory with read and write permissions for user `actor` - location: "/Users/diego/data/files" + location: "/home/diego/data/files" thread-pool-size: 20 } @@ -276,7 +276,7 @@ services { push { certs = [{ bundleId: "br.com.diegosilva.xlotomessenger" - path: "/Users/diego/Dropbox/actor/apple/production/xloto_apns.p12" + path: "/home/diego/Dropbox/actor/apple/production/xloto_apns.p12" password: "xlotoapns123" sandbox: false voip: false diff --git a/actor-server/project/Dependencies.scala b/actor-server/project/Dependencies.scala index 4d7985a830..518b663f9a 100644 --- a/actor-server/project/Dependencies.scala +++ b/actor-server/project/Dependencies.scala @@ -107,8 +107,10 @@ object Dependencies { val apacheCommonsValidator = "commons-validator" % "commons-validator" % "1.4.1" val guava = "com.google.guava" % "guava" % "19.0" - val alpn = "org.eclipse.jetty.alpn" % "alpn-api" % "1.1.2.v20150522" % "runtime" - val tcnative = "io.netty" % "netty-tcnative" % "1.1.33.Fork15" classifier "linux-x86_64" + val alpn = "org.eclipse.jetty.alpn" % "alpn-api" % "1.1.3.v20160715" % "runtime" + //val tcnative = "io.netty" % "netty-tcnative" % "1.1.33.Fork24" classifier "linux-x86_64" + + val tcnative = "io.netty" % "netty-tcnative-boringssl-static" % "1.1.33.Fork24" val silencer = "com.github.ghik" % "silencer-lib" % "0.4" } From d3f8261ed80f361156a4b717deafc065c71556ca Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 14 Dec 2016 15:42:53 -0200 Subject: [PATCH 186/253] alteracoes --- .../src/main/java/im/actor/sdk/ActorSDK.java | 2 +- .../src/main/java/im/actor/core/AndroidMessenger.java | 11 ++++++----- .../src/main/java/im/actor/core/Messenger.java | 3 ++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java index d6c6684a37..7acc58bbc3 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java @@ -199,7 +199,7 @@ public class ActorSDK { private String inviteDataUrl = "https://api.actor.im/v1/groups/invites/"; - private ActorSDK() { + protected ActorSDK() { endpoints = new String[]{ "tcp://front1-mtproto-api-rev3.actor.im:443", "tcp://front2-mtproto-api-rev3.actor.im:443", diff --git a/actor-sdk/sdk-core/core/core-android/src/main/java/im/actor/core/AndroidMessenger.java b/actor-sdk/sdk-core/core/core-android/src/main/java/im/actor/core/AndroidMessenger.java index 8dfbe72a6f..91b4c1bdd4 100644 --- a/actor-sdk/sdk-core/core/core-android/src/main/java/im/actor/core/AndroidMessenger.java +++ b/actor-sdk/sdk-core/core/core-android/src/main/java/im/actor/core/AndroidMessenger.java @@ -548,11 +548,6 @@ public EventBus getEvents() { return modules.getEvents(); } - - public ModuleContext getModules() { - return getModuleContext(); - } - public AppStateVM getAppStateVM() { return modules.getConductor().getAppStateVM(); } @@ -562,4 +557,10 @@ public void startImport() { } + @Override + public void onLoggedIn() { + super.onLoggedIn(); + + get + } } \ No newline at end of file diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/Messenger.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/Messenger.java index 92a3b602d5..996dd0a0bc 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/Messenger.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/Messenger.java @@ -2747,7 +2747,8 @@ public void forceNetworkCheck() { * * @return Module Contexts */ - ModuleContext getModuleContext() { + @ObjectiveCName("getModulesContext") + public ModuleContext getModuleContext() { return modules; } } \ No newline at end of file From 5ef274c4b9e2e02a26d39ae41e775044507a5229 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sat, 17 Dec 2016 12:15:12 -0200 Subject: [PATCH 187/253] alteracoes --- .DS_Store | Bin 10244 -> 10244 bytes actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes actor-sdk/sdk-core-android/.DS_Store | Bin 8196 -> 8196 bytes .../sdk-core-android/android-sdk/.DS_Store | Bin 8196 -> 8196 bytes .../android-sdk/src/.DS_Store | Bin 8196 -> 8196 bytes .../android-sdk/src/main/.DS_Store | Bin 8196 -> 8196 bytes .../android-sdk/src/main/res/.DS_Store | Bin 18436 -> 18436 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../ActorApp.xcodeproj/project.pbxproj | 4 -- .../sdk-core-ios/ActorApp/ActorCoreExt.swift | 28 ------------ .../sdk-core-ios/ActorApp/AppDelegate.swift | 6 ++- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 4 +- .../ActorSDK.xcodeproj/project.pbxproj | 4 -- actor-sdk/sdk-core-ios/ActorSDK/.DS_Store | Bin 8196 -> 8196 bytes .../sdk-core-ios/ActorSDK/Resources/.DS_Store | Bin 8196 -> 10244 bytes .../ic_channel.imageset/Contents.json | 23 ++++++++++ .../ic_megaphone_18dp_black-1.png | Bin 0 -> 392 bytes .../ic_megaphone_18dp_black-2.png | Bin 0 -> 538 bytes .../ic_megaphone_18dp_black.png | Bin 0 -> 311 bytes .../ic_group.imageset/Contents.json | 23 ++++++++++ .../ic_group_black_18dp-1.png | Bin 0 -> 327 bytes .../ic_group_black_18dp-2.png | Bin 0 -> 319 bytes .../ic_group.imageset/ic_group_black_18dp.png | Bin 0 -> 442 bytes .../ic_robot.imageset/Contents.json | 23 ++++++++++ .../ic_robot_black_18dp-1.png | Bin 0 -> 541 bytes .../ic_robot_black_18dp-2.png | Bin 0 -> 452 bytes .../ic_robot.imageset/ic_robot_black_18dp.png | Bin 0 -> 856 bytes .../Sources/ActorCore/ActorCoreExt.swift | 2 +- .../AADialogsListContentController.swift | 4 ++ .../Dialogs List/Cells/AADialogCell.swift | 42 ++++++++++++++---- .../Managed Runtime/Executions.swift | 10 ++--- .../Sources/SwiftExtensions/Promises.swift | 29 ++++++------ 32 files changed, 135 insertions(+), 67 deletions(-) delete mode 100644 actor-sdk/sdk-core-ios/ActorApp/ActorCoreExt.swift create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_channel.imageset/Contents.json create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_channel.imageset/ic_megaphone_18dp_black-1.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_channel.imageset/ic_megaphone_18dp_black-2.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_channel.imageset/ic_megaphone_18dp_black.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_group.imageset/Contents.json create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_group.imageset/ic_group_black_18dp-1.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_group.imageset/ic_group_black_18dp-2.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_group.imageset/ic_group_black_18dp.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_robot.imageset/Contents.json create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_robot.imageset/ic_robot_black_18dp-1.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_robot.imageset/ic_robot_black_18dp-2.png create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_robot.imageset/ic_robot_black_18dp.png diff --git a/.DS_Store b/.DS_Store index 79c291d1d9bbaeb8ad0f4ebc1921689fb80ffa44..1424adab2b915462ab1fe54ca539923c32a1429a 100644 GIT binary patch delta 76 zcmZn(XbIS$E5LYivYtSLrbKnMsgZ$>f|03tt&T#qxjB$+Vr*Vp%gG_GYG~`3kXu<* fT~k{(bMg%VdB$0re+cmNZ)Q{Y&9a$El$jX-b;}nt delta 55 zcmZn(XbIS$D=_(%Sc|B!ftikip@~_ojzYDefq|)xg1LpodW=t6hguSF>2Ig41-Y~d{BuGMyv*nJnV%>eK1kNi=Nxt7$1~J@5BA& z_xt6X-@W&9PkFXH`%#@6%#7&I_!Q-+Xeku>h6V-$dZ>T67|;vha4?|vhr;F=_k!?`Y6S-t2Z5JQlBdh@d<>0Z*+?bnvNBf%JJkL+6{>uQg5S0lCC!KwtQR80hk(IyJg8111M%F;ZYrPt{KU8WVf zLZ8#u^aK4&x9J!9jee&;=njB&xDV@54-dRh(TZ;Lq7NbL#BNMr5>wcV!#IK`F@s}B zVGbE&aSA0Y;(5G)vv?J+ZNZyZ!bQA?_wfNf#5H`0Z*c?Pp@LhujbCxc{Me=8uDR;g z{MmRa6DM*k{X4rR*_$W*<{{^<8vI80kM%b9#%7P+*|RM)G%{x15?-^^5oXf7)whXj z=Cuxg$x1eF(KKOwT2`@Af0xDuB)?Kk@9&abN3FL#D0^$9wB73;;F_qDsP@X?9h?iN zRJXgMJ7w1;d0C~kMfLJ={*cn(C@X^g_9^`bkd1XOo$GXiR;A2c`V)0hrBRCL@FRdh zj3R<4#_=E?!DHBm$1yEEjv|J5)g)atnMVQpi&&5}FX9Yd!pnFCZ%CK7aSrEk3Gd+D zs?Z9q;3_`Br}zwC;2YeupU#2WFEv$*wSZNr=36ee9Cs~qeb$BRWMaxo`s5+* y8wmgNKo^S&^K|x(Ow7*BpDsLCTv#&Cxi!3H20VM^8NMgw+8X7uv-|1)Va#7+l?~Vc delta 1148 zcmciBS!@$W90u_DoWz-}2QrBhdjrOC2*Ctg#SS4M&?ZKvISApl0s^JBvrAavI3eo< zg30lK)QU?&t6mTx0cr&TA*67M>!GT|C0^HNRH?u#oKXS3aZnSs?%NF|^e4apk!X{muqeb%5qPp^y;XdTsx>H#I){;`q|%b%dM1d$)qb3 zMNF%Td=f91kr&tScmo4fUSrihF&P>hmK*4U^gc5IS$|;4&e)&z)76K zX`IIm2X5gu?%*!&;Xcy%3D5BYe;7UG75LNm)m~vdb5Qq@H@mvp+S?o*uez3%%rq^_ z98OPl&4+c3AFVJhIKvaHqI*QswOCvY@79#$jxABWS4}8dqAx5U)IBt_n7lA8m(QB* zn(LZJ#rkoYePv#kO%lpx=5_fff|03tt&T#qxjB$+Vr*Vp%gG_GYG~`3kXu<* jT~k{(bMjpQdB$0j?Zl)uiwk~W+srEQgJtu75q4$(&2bqH delta 82 zcmZp1XmQwJD8P7nvXMZ8wp4Ysv7w>4j)I|qVXclrwV{E5sg8oVg+*;GCx^JIp{-{^ mZe>+N!m$+rdM8Rtyq5s=y}D)@nIGrPn$md(FK*qH(D1{pE{ diff --git a/actor-sdk/sdk-core-android/android-sdk/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/.DS_Store index 58cb6523b01a9131051f57b8ad9c713ac97e27a5..c59013dec1bf56e9537fdfa644ae20b964bff51d 100644 GIT binary patch delta 91 zcmZp1XmOa3$b2%XU}NDl_K6L=o7p*}I2cb(RuX8?l&G#YH8RjqFfui-)lsN6HwUs! vjLmCnIXT2t4Q)LWax1HHIDLHy2p1(WJxO3~d3t+%eSVvh%Mc#{oU`i?8V9on81@9S`xFNQX?h*1 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/src/.DS_Store index 5676c519cae9ba14f79804a76b6eac062f301116..b66301d82ed2dfb2f0447e16cb124fd5b960095f 100644 GIT binary patch delta 89 zcmZp1XmOa3%y@ER;WYM%4ZNG#Ib=8(Pfk`5Xwa0Xt~NC?&`~flHLulCs5UnTvQ3Q5 tYil_<#8nM#Jri;(tEy{i>t;?qFCfo2Yx8>n3HHsb5fDN+;2pk9j%abG!fGZk%dowXHH!L7AFfn~BAbT+| xFf}Y7H#j(beF+E`B{4loU~PGNdwhLB9|4-P?GPFVvjrIV1hfAX2Lm}|9YX*B delta 93 zcmZp1XmOa3$b34fU}NDl_K6L=o7p*}I2cb)RuX8?ma48cHZZZ!Q7|+xsMS%Z22!Rv x3g#9TwY8ia;;M$Wo(Z{?Rn;}Mb+ad*7LaG0v-!1v6#Hg&iEk{Me~Yj)0|06C9jpKV diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/src/main/res/.DS_Store index 564009f77ec2b4a216f97d86a788e4b97865093f..63676a97940c7d69495444d5db29012f6e81befc 100644 GIT binary patch delta 3153 zcmds(e{2(F9LC?L47|%;#%cPneh7-LYjUe~SN>PE)~G8hbD2#B(E>!BC64%Ti6 zV-({O6(xaOPz0kQ@#i!`2KWON5@UjBG|CKUq5)&VKPJvVqQu1bzIP*IV~qI+iQ1&S z_rBk^z3clv&-1ySJ?PnkBg>>LI@xj0qM9_iq(MsQ)YL6?n_^m9Bzm9P9%VnnQVn15wzhEY{PbRV+S6`lXwbGV>h0`ejI?~AfCr7cnxphP4wazj^jPN zkCXTipW;iL*N>*0(ifHVr20$TE~irD?RGi4d_Fez7WwpxCB=GzHM_4dwKuU(blQNk z`ey6S*%@739=}gb$5$GdahDl)7ZLoTi5pP9S8KU3mrJ956sBc zlco#$oU*BG=jBB;i_>WBm^&Z8&Cd5GrQ5S}XBT=)E2{dr2xuxzTivNewWbzz)fO!r zdw6Xq+N?&xTI8YowXhnAX&W@PT}-z0i1m?BtJNjc;bB?UgB7rGt zRZFNzZ80XvCDbo48LjR#g>DuDv|LDrOI*|3*4oPMG-{UPL3zF)oe|dai`RytvARua zgk7KCcy*R6ujTd1a99ls0+Zp3%MGaw$#CAlbs3IJg`bcwNI&_W{LGX%K(3IhE#w+3 zOpcS0gegpt8OVek`S73!UIbBt#i+$ntiU=vz(m=Aup!7z*o-aMiAV7mdYBmZF)=>J z#CRBQ;cdKwBRGXK_y*_Dk8klKE@J?{>8I~@GM(h>r4rZ3e>EL=%*?N1*+IC_#Id*K zUzZLiST=kxEFE(7D>E|tF61q}%ZQ0$#p7~%+@6s!u{X9*PjpwZjk7UxTbIzW%w1)@ zDbywCm&#Htl&2o>{ieqk1}bJ*&T+&L*rTJ(Xp40LX;ZoTE)P}vA3M9>`DWB z4TIQgVL8LGw-sFsd>nh`8guMDYh(?l-m5ZRXW$zJd$`!Qw>W^*Tgdsrf)N-UNzq&Q zM8A-?ma@#X489Zeqs7iXw_mahQqOuD>Sc{hy&FA}8<5$41_SOoIt)b|4s;lbcx42N zjM7LH8AWE3Q-SLEX@eX?C>eU988=F9cF_1qQvT0SGTcEXN-lYAx3T&EQht32!M_sX XH$G%uPqjP#cZbX-4S&eIgKqm9uf-t9 delta 2963 zcmd^>du&r>7{M+mn@-(GwU)X`i7qFv<}5|9<0OT*nlUn5zk@^Ucgpt!yY*HVLy6t07r2QuiDZwpuEDPeY`^;xoZoBGU-2x}itNdT4CDq3EVFU7BEVsGZHA~w|`qQ>)^zHDv} zwRCoA+E*}*F-JsN6l)ac(eB#1`Z*1AhlpUe_r^FpX_=FA3#V4h>^B7ATtwTml~{f5 z$!@o3vN^>PdrVK9YK!Hm?g>^><@P{RSFpY<&~jHxFwn1e+^KG_qAbztRUJWkHOhRV z+h--I7Ie0(3d#@i9PYQ0JPYn_X&v}#9xqTxzlEWu=3vP9wPIeXkZ6m#gB_hMZLL&{ zqz~=L>^F7^fCV-rVm#82PMYUHLoTL}>a$UUS}ekyr1dfc z(1H$h;$C!<)@!g9kCN89%Fp3>(s?(D`!WvUa5<^_K0Y9IKf-C8#W%Qsi})75;EKs& z8f&sM`7pt_vUvm7fs4r@e)KwYt+PU%-R;exwr0jmJBF8B=dQM{dWhshxXZ~aE~_H$ zoZ^C`&|*k_jX*+l4 z$nDZ-^S#J~AJfS3rehZB(LjDT4~qwRT?e}4{`b)CKSmQ?kEh7pc3>ymyU5)PS36F7 ze*!1*Ir?!1=kWtB>9Z9Vb1Nt*l4Vk4jl8jglcFfEWI6XHXX%!tLhe?wH+iz6s3!S_ zYstB~`>11#UOq3>jYf?yx+Q$7?nJ8D=uYPqy632oMmH=eb{dl$agM_$MJBRQBgsIDScXzY9cILH;6?>sf)0v zDAgLc*F_SCg@})5hlhyE&!-Ft5mx~(8WJM5SQnA;PH8oa`IYo~C5jVvunFuizlALk2F3vw4Z5@y4Mi fl>gh_^_k1Bn0rQlg8Mh;a}CRwzn$RzGhF@&U;ot> diff --git a/actor-sdk/sdk-core-ios/.DS_Store b/actor-sdk/sdk-core-ios/.DS_Store index 3f536144774df1798d7a92614d7665f91504fa34..6aff7c0114f692d110ad84f3a7fd8602ec548ed4 100644 GIT binary patch delta 947 zcmb`GT}YEr7{{OgHf^uI;z`}qrR+`9X-(VQOs9PqNEsSwM)V<=A5&J#4c|3OQ~NG5 zN;?%4l}QEFg{12PqJkodB#MzYS#)I=-RPY+f_0qT1zmOEobx>V&vSUr?>x^5{|SG; zNu!GyNOKsL5s{XN5qZc<&0aO=Z}g6YZ)>^DsT=4^4CUut)9~S?=K-!{B=Ldd`?3gu zm}2N-N5aXvkVT%4uCSRjC^`74}9?4DV>MAI3Sd{`-VYgN3 zayg2u$|`$tcekWZ&a$uBv}gaJ&aT7VJy-chX2vx>#VTUu${n62Ut6uG)6L7W^7-nd zVtYMf2UPb~x3?kS3A)Q00&caQB?LY0jxGLx$JeHAcekrz&n&Y=a->jru^qh<1L-N9 zvZ_6b8l*?`f?m=XeWvd;NmDdKvouG)K#-7tBp6_X845Cx2^(A}K`Az( z8a1fJHta+rn&3tY_91`+=)ghr;55$QEc(E49XD_bLnb^x2#@dtPw^I?@C6h2if{OV zDL!Y-;_niz@fDjYjB@sWcrl;O^YGcE(zg|eANv1VyOb(P36(=ksB-#3{kE9~W^6mvIGy z7{YDb!Ced|;2}mMTwmZNUg0&~gvyP>k|BA%IB7jKQ9%52yRiJ^=l3 z+k6og71^wc(^15qvqB!Pq^JKC6Rd4-^ZMFa#eLunN)CT!iPO@tQDHlx)csXN!dlL) zIa26@;>SXlglaN6qBNEF_?X3^?JT)Dnv)qdGCl#m$d(wbiy>0vk?^#Z$2;@V=4*7m Xn~p5(k;W2>M!3Z5oI|1M%vkMjf}`(> delta 734 zcmaKqOGs2<7>2+1%*At@<9Nn#rnx9{ropMvG7s^% z5hXSJ6n0xkNOVt*c8`KK-BxKti!6eWRu)7T0_k^bQJenV_dk3ud=GD|E!KA2B~V{H zBWRmTL^>jcXa}`Wcz11kq@^_;^|Abro|*Jk=2FZo;&o_gqD?>Clc$rwH~14xnnkqh zHNX5(mtx`{dRkAd6s8WQs>j5FqF~_yHMEFXa#pfrOPNq9v-d6=8_tQc-gJwgK>K1T zK)0_XKM_X~iIho&R7zFUNbR(b`e}d$X@qXlEqY8Z=rz5iNt&Xs^qqdtPY5s}1!kne z0VmwZKmdgZB7_oDpb}N6#zxek9u3%rFm@t>Hbk)pJvfM7#Bdb86F7-eIF0kTf~&ZW z8+eE(c!@EL;}s?_iO=kTwZ>S!rrcif&j}U<(i?NCVo9^6+w61HtN^>~&twznom)(P zkF1P}(zwIva%cNJ9z_tv#E`d;6P?oZhXq5jM=>a2X_hWtBFl5yhOmo4YisI2AG z?Q}WhRdN}7XYh6ZU)3`jqYqruFA$7ek(KN5Vjgl)gkr2fDax=KHQ0b!Y{F(Prx8uq zj^>1*R&-)7_TvD$a0rKSgiGq@jt01+GdPPOTu8%3T*76HU=+7;2lsGa+iJfi#e1Bv zvu~=(`;x`#yk;TR#hSfAUF4Ih4SI(FV$)f3v= y^+Q5DTFjF2tw!o2Qe|GTDIH4<tZ2|GDs2OcIZo;lBYc(5^`U diff --git a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj index c298b4b73e..7f1bfa9529 100644 --- a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj @@ -17,7 +17,6 @@ 34279C7FB8E40393FEAC939F6474BE2E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 148837AEB986AFDE519BEBD3686AB073 /* main.m */; }; A88F4C381ED2B98E99A68937 /* Pods_ActorApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */; }; DFE814D1E12D2647AF2DBA3F76405F06 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A521812020DAAAA325065ADC32B7DEB /* AppDelegate.swift */; }; - F11B4CDF1DF9702000023729 /* ActorCoreExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = F11B4CDE1DF9702000023729 /* ActorCoreExt.swift */; }; F153992B1DF83A0900C67C7D /* AppCocoaHttpRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = F153992A1DF83A0900C67C7D /* AppCocoaHttpRuntime.swift */; }; F45B35E37C8CB7140417EA87AAFEFDA2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 13C57576F07AC8694C15B51DFDFDC4C6 /* InfoPlist.strings */; }; /* End PBXBuildFile section */ @@ -74,7 +73,6 @@ 9B2EEB8CEF2E94D58EA09D9D /* Pods-ActorApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorApp.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp.debug.xcconfig"; sourceTree = ""; }; A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ActorApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DE8D1D9859D2C4D4C7EC7AD74BB65F0E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "Supporting Files/Info.plist"; sourceTree = ""; }; - F11B4CDE1DF9702000023729 /* ActorCoreExt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActorCoreExt.swift; sourceTree = ""; }; F153992A1DF83A0900C67C7D /* AppCocoaHttpRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppCocoaHttpRuntime.swift; sourceTree = ""; }; F76A77E9428111C798E69B43EA06A281 /* ActorApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = ActorApp.entitlements; path = "Supporting Files/ActorApp.entitlements"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -159,7 +157,6 @@ 1ACEA023B930E6F261DAC0A6BDB410C1 /* Supporting Files */, 2A521812020DAAAA325065ADC32B7DEB /* AppDelegate.swift */, F153992A1DF83A0900C67C7D /* AppCocoaHttpRuntime.swift */, - F11B4CDE1DF9702000023729 /* ActorCoreExt.swift */, ); path = ActorApp; sourceTree = ""; @@ -394,7 +391,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - F11B4CDF1DF9702000023729 /* ActorCoreExt.swift in Sources */, DFE814D1E12D2647AF2DBA3F76405F06 /* AppDelegate.swift in Sources */, 34279C7FB8E40393FEAC939F6474BE2E /* main.m in Sources */, F153992B1DF83A0900C67C7D /* AppCocoaHttpRuntime.swift in Sources */, diff --git a/actor-sdk/sdk-core-ios/ActorApp/ActorCoreExt.swift b/actor-sdk/sdk-core-ios/ActorApp/ActorCoreExt.swift deleted file mode 100644 index 0dd5c9ce45..0000000000 --- a/actor-sdk/sdk-core-ios/ActorApp/ActorCoreExt.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// ActorCoreExt.swift -// ActorApp -// -// Created by Diego Ferreira da Silva on 08/12/16. -// Copyright © 2016 Actor LLC. All rights reserved. -// - -import Foundation -import ActorSDK - -open class AAAPromiseFunc: NSObject, ARPromiseFunc { - - let closure: (_ resolver: ARPromiseResolver) -> () - init(closure: @escaping (_ resolver: ARPromiseResolver) -> ()){ - self.closure = closure - } - - open func exec(_ resolver: ARPromiseResolver) { - closure(resolver) - } -} - -extension ARPromise { - convenience init(closure: @escaping (_ resolver: ARPromiseResolver) -> ()) { - self.init(executor: AAAPromiseFunc(closure: closure)) - } -} diff --git a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift index 1431df0f8b..7bb0b66873 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift @@ -30,9 +30,11 @@ open class AppDelegate : ActorApplicationDelegate { ActorSDK.sharedActor().style.dialogAvatarSize = 58 - ActorSDK.sharedActor().autoJoinGroups = ["canalxloto"] + // ActorSDK.sharedActor().autoJoinGroups = ["canalxloto"] - ActorSDK.sharedActor().endpoints = ["tcp://api-mtproto.im.xloto.com.br:9070"] + // ActorSDK.sharedActor().endpoints = ["tcp://api-mtproto.im.xloto.com.br:9070"] + + ActorSDK.sharedActor().endpoints = ["tcp://192.168.1.3:9070"] //AppCocoaHttpRuntime.getMethod("") diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index dd1a1454b7..aee4c52633 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.12" + s.version = "3.0.457.18" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } @@ -13,7 +13,7 @@ Pod::Spec.new do |s| # Core s.dependency 'RegexKitLite' s.dependency 'zipzap' - s.dependency 'J2ObjC-Framework' + #s.dependency 'J2ObjC-Framework', :podspec => 'https://raw.githubusercontent.com/dfsilva/J2ObjC-Framework/v1.2a/J2ObjC-Framework.podspec' s.dependency 'ReachabilitySwift' # UI diff --git a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj index 798109286d..0351fac014 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj @@ -342,7 +342,6 @@ 15F89F0A1C211FED00776ACD /* opus.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F061C211FED00776ACD /* opus.h */; }; 9AA6A41F1D08568A00957A7F /* AASettingsMediaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AA6A41E1D08568A00957A7F /* AASettingsMediaViewController.swift */; }; 9AAE96481CF81F140092E366 /* AARingtonesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AAE96471CF81F140092E366 /* AARingtonesViewController.swift */; }; - BDF21708B376E212CEAEC43D /* Pods_ActorSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 354C3EFA48FBFAEAD0DEEE17 /* Pods_ActorSDK.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BE237C9D1C422FFA00060648 /* AAStickersKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE237C9C1C422FFA00060648 /* AAStickersKeyboard.swift */; }; BE2621571C4656D700A817AB /* AAConvActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2621561C4656D700A817AB /* AAConvActionSheet.swift */; }; BE2621591C4656EE00A817AB /* AAThumbnailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2621581C4656EE00A817AB /* AAThumbnailView.swift */; }; @@ -723,7 +722,6 @@ 15F89F051C211FED00776ACD /* opus_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_types.h; sourceTree = ""; }; 15F89F061C211FED00776ACD /* opus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus.h; sourceTree = ""; }; 15F89F0F1C21317400776ACD /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; - 354C3EFA48FBFAEAD0DEEE17 /* Pods_ActorSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ActorSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9AA6A41E1D08568A00957A7F /* AASettingsMediaViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsMediaViewController.swift; sourceTree = ""; }; 9AAE96471CF81F140092E366 /* AARingtonesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARingtonesViewController.swift; sourceTree = ""; }; BE237C9C1C422FFA00060648 /* AAStickersKeyboard.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAStickersKeyboard.swift; sourceTree = ""; }; @@ -777,7 +775,6 @@ 06CE898C1BD841C9005A5530 /* SystemConfiguration.framework in Frameworks */, BEAC2B311C42D683007F7A2F /* libopus.a in Frameworks */, 066A52001BC4E0B0000E606E /* libsqlite3.tbd in Frameworks */, - BDF21708B376E212CEAEC43D /* Pods_ActorSDK.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1676,7 +1673,6 @@ F15398CB1DF3A8C600C67C7D /* AGEmojiKeyboard.framework */, 06CE898B1BD841C9005A5530 /* SystemConfiguration.framework */, 066A51FF1BC4E0B0000E606E /* libsqlite3.tbd */, - 354C3EFA48FBFAEAD0DEEE17 /* Pods_ActorSDK.framework */, ); name = Frameworks; sourceTree = ""; diff --git a/actor-sdk/sdk-core-ios/ActorSDK/.DS_Store b/actor-sdk/sdk-core-ios/ActorSDK/.DS_Store index 069a29560087b4259437c40a9ae83e180bf57592..a0d4e70b4a9036d547ba71bce6c71ed933029991 100644 GIT binary patch delta 35 ocmZp1XmQveCdkM*`GT*qvQe zjL|5lF);?mXksr9eI-5+(mu$Gv`uRplZJ!`(=<&RUwrhfX_Vht*_G8!%O8wOUY=u+qTT zAt&FL)nx0Yd85+IMUo9$`i$mo(ZXA~u=wyvJ^gZN2k&G;GgcW7X$?sBC zO=Zmfqbh!Wffi|*zNa7PNBW6=rpNRfJ*8*#7yV8D&~tcE3XXNCK?L=93o*ozz*cNS z58lUq^kV=Y;}8yG9G^f#8YVKxVg{Emiz~Q_dECXP_#9v09=^r{tl%4bi$_?+FGTj8 z>Jb0+f0I|LYif_Y&acqk_xAPLabMn^@SpIGNL zut+-OhE2^OExZmD`DbXVQ6Q>r9yhO72A$gRLQ z+hjkf3fOZSVk*5rF)9#15DMxL!aHb0Gu}lMT@qP$0oiWs#l8ZzA&lSvMlpsIR2;(u zj!SG7@|eacT);&MZw{AnL*ly$8@D9DFYTH@xPIY3Sg&69>7i`eFw+xK!(yhwuq(`&Bbz6)E z#I8LJq$0EsE1yAuNQGM<6@8)@C@e^TN+TO6R*vjtAGg7&nscQd=y%pWQm>UHigC2krJR)Bbw&!ihJ!ISr_Qmz mI=aF&&sCt5vTEqh89DpGWUM|VlwZw)ktXic7DzFnNx3#QJ*& z^N3k%sqYQ3nX_%-oPvk#ehXHV zW2KG~)#uW}6PGgu%Vqf+PH2%W(8m+Qq}7{(<$JUD02UkMFejcB^1C-7=%irZl8)9m zPhNiY0yebMMxJ+)elm!mvajJRp2MKAW*V_gQ9!2gL58=P=j3C&VBnX$jIuqbpfm-e z{U=E`7LFu!a5lN?0AvnUGih^4hvT_ihx(^<0Gb30hsYu1wr%9w1!@R1m25hlOa>O6 zh$|8tNOJ`sWXs@UWpM>WTOV`YXd)vTr_tH1w>#+K4sx*Ku4<&9N34-R6uaROEAFaB c3NAKcf7_&SH#y{z@Bjb+07*qoM6N<$f)2v<-2eap literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_channel.imageset/ic_megaphone_18dp_black.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_channel.imageset/ic_megaphone_18dp_black.png new file mode 100644 index 0000000000000000000000000000000000000000..2eb8ba4977162f172ad28f8949e19f4f0b433d36 GIT binary patch literal 311 zcmV-70m%M|P)BnFP=Qea9iRg$FglP9%$?aclQF`+7s-$8*CrqL?B3+v zB%{H~8f4MJQr+$YL*O8RI&2&R6JQDmb_R6sC$MfoT%x)zR%Mv13Dc|pRM9X^J2GoD zz3lOp3noELFLC*wT5n-%U;ylZ2e407_dK(cS+xSxA6r<;+t}I|``)G>u?syWU%$X&y z0E!~H*(vyIg)9|ZcDpwVLSg!l_R3Lh`mJjJQkM=;$8W(O!k$VKKpcP^7T^E?002ov JPDHLkV1f~2gPi~X literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_group.imageset/Contents.json b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_group.imageset/Contents.json new file mode 100644 index 0000000000..046b6e8c55 --- /dev/null +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_group.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_group_black_18dp-2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_group_black_18dp-1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_group_black_18dp.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_group.imageset/ic_group_black_18dp-1.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_group.imageset/ic_group_black_18dp-1.png new file mode 100644 index 0000000000000000000000000000000000000000..792d67d93ee1b684b36a290922aabf8c9d3631f4 GIT binary patch literal 327 zcmV-N0l5B&P)0{Df+P3|7Ob%27?zxcJ4o!tJ|RPsH^lQiwy zuW!^!m0iAO>B430ykw2O$C5Yj!QzE}q z>j)*nT*?2K zOB(Jp@=r8geAJ@q?5dh?Zd)_&u{BV}b>o|x(ad|?3>LZtX6xo7-K4AT?D!XA7=~fu Z$O95TAr;jtr0DeH;sPQAkvH&~=c@v?AB+K}rafEKjTcltlMh(%x70ob^Ax;F;yu*@+Nb(^l zxcu=%I!sL;$Jw_ zv?5z}jRMQABAN3Dhnic+mOY@rvIj(%^I*U%3jyK;GI0nI=7fwk4MqV$00310%ILvl R%Z2~|002ovPDHLkV1i~fc*Ot! literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_group.imageset/ic_group_black_18dp.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_group.imageset/ic_group_black_18dp.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe1b2a6ed064ae1adfc50ed3cf0db44295d40d4 GIT binary patch literal 442 zcmV;r0Y(0aP)vlZH81gmq}aTetd+`g7^vjaDU&)h>JbKN z_;f5%hlVw%i`_&R=sJN8jY5Qh@(FZkv>v_pA%>}#S3|cu^cQp`V3Px#07*qoM6N<$g4(UZSO5S3 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_robot.imageset/Contents.json b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_robot.imageset/Contents.json new file mode 100644 index 0000000000..f804cc420f --- /dev/null +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_robot.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_robot_black_18dp-2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_robot_black_18dp-1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_robot_black_18dp.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_robot.imageset/ic_robot_black_18dp-1.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_robot.imageset/ic_robot_black_18dp-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8401a0e7939dfe68efa56c71fcd2fe870b83a22a GIT binary patch literal 541 zcmV+&0^>Y5g-CYz(s%v$bb-JK)tJJ)pcfeX8X3>meN)Gt`U-3?j67@%w9L^jf|d?1AYEJAa`b?MkqItwaHcwLi4$ujb9@qncv*z z*XhJ6VM{1qaqN=UQu#v)`I1Q)xvAwnW}BHBDz%kup^~Yg?Q{ly0$jGplT4sS_J@#a z!U!qkPqve0j8uATB$QhtOgXPNq51x?e(OU>8;gMAv!#!^n))!!58+t<7^VmB63gRj zf}7(s&s54EQ6jXF=8sfT%v&`=$oG+kteV@@`zDqnBodm&cBN3Vt`(ABKnmYmC561I zEtoT$9HEknH1g#-g_pmDPzz>}P*+dbf2x0NICk2*v`KAJm)7|!M=2+C6^RmRQ8ARW zD4~+u!nomu>G-m;%4hRM&Qhs*e;}HiixLvfsP5FGE7|A><>t{Hp!Z-XhUlTt#zPOr fK}mS9(JAx=_JL(3h7mHO00000NkvXXu0mjfRk`<6 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_robot.imageset/ic_robot_black_18dp-2.png b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Images.xcassets/ic_robot.imageset/ic_robot_black_18dp-2.png new file mode 100644 index 0000000000000000000000000000000000000000..72479f533a0136464c981bb69ec6ae897e4b4d5e GIT binary patch literal 452 zcmV;#0XzPQP)6uQ<n%uV?GjT%<>rkoPr17*y4>YHJrcRdp% z0vp&*@M=gITEo`9Si+gnqs(OWZS7>ysiEkFd3X79ns|BIV=W(wd0z`|g) u+q&+wd6Zek9I9HFvQTeYi+Yv)3-$xG6ipn3Nf)gE00006nP)>Y5g-CCf;$l)0z^PPRXb{`t9Q41c1PK*ovN$* ze)^l~xBuRr-V^O~o$M5s4q#jJY!8n;lyoI&i0_i#CVw+2-UHZYNw<paA!HYrw!lzTJ>? zYJmNebWv5pO?fO+j5Yxbg1%az;`IZA@|~n_)n~l^?+My^3gZ1_KD;x8X~wH5*&dyT zRe&6$NYsl;Nse_}{{mPy<)=12fK}EZw4M#*OE|q4IO+FFuEE%FA7^kDB+ePB(9L>` z3U}`C5`_C)()ESlDEs82C3JZ2rm3W>cK4-Iu$yAdUk%q4yAQxF4W6>!l};vPyR65i zI(N9q@>NKQN(kj?vAmTc@hmW}p+$)=LoSdPOBT6Aet98X8t2gdSzzSYS7&DkmqfQ+ zd`O8(=+Tfzme3Ko)-%Uwm);m{N$S$jdJ1L0m5u}>QKaex=y2PW^%xu1dBhN=^o3sQ zlmUfoF%qxoAM2qIIgDXLD+}z0DfQ(tSq@vuWwk!#5?c1Aurg}_YdJd{iY=SBkaX&<6;Y~($GnmDoGxYLJtr6bz6Y@I z;XMU=0;59CJ+dVPDH5x%p1>kq$RrmnLE94;mqPv^SljV4BO$NoEyK6s4A7pyrn-?` zJe1ho)0W-l*a0k46r!>{i^te-wbm^)1dW11t|u_|2i({!kTPFChtB9dE882`tOC6R i4q&}3+iTz5dh8FrBc?ZD;gVzk0000 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift index d7112c86e0..cb7df2d627 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift @@ -422,7 +422,7 @@ open class AAPromiseFunc: NSObject, ARPromiseFunc { } } -extension ARPromise { +public extension ARPromise { convenience init(closure: @escaping (_ resolver: ARPromiseResolver) -> ()) { self.init(executor: AAPromiseFunc(closure: closure)) } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/AADialogsListContentController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/AADialogsListContentController.swift index f6da1e3821..0bec46cbc7 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/AADialogsListContentController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/AADialogsListContentController.swift @@ -56,6 +56,10 @@ open class AADialogsListContentController: AAContentTableController, UISearchBar } r.selectAction = { (dialog: ACDialog) -> Bool in + print(dialog.isBot) + print(dialog.isChannel) + print(dialog.peer.peerType) + if let d = self.delegate { return d.recentsDidTap(self, dialog: dialog) } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift index ea4cacba8e..109980a7f8 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift @@ -119,7 +119,6 @@ final class AADialogCell: AATableViewCell, AABindedCell { // avatarView.bind(item.dialogTitle, id: Int(item.peer.peerId), avatar: item.dialogAvatar) - // Forcing Async Rendering. // This flag can became false when cell was resized if !titleView.displaysAsynchronously { @@ -129,7 +128,7 @@ final class AADialogCell: AATableViewCell, AABindedCell { if !messageView.displaysAsynchronously { messageView.displaysAsynchronously = true } - + // Reseting Text Layout on new peer binding if !isRebind { @@ -170,6 +169,9 @@ final class AADialogCell: AATableViewCell, AABindedCell { } } + + + // Cancelling Renderer and forcing layouting to start new rendering cellRenderer.cancelRender() @@ -186,6 +188,17 @@ final class AADialogCell: AATableViewCell, AABindedCell { // } // } + + + open func addImageDialogType(_ image: UIImage!){ + let dialogTypeView = UIImageView(image:image) + let dialogTypeFrame = CGRect(x: 76, y: 17, width: 18, height: 18) + dialogTypeView.frame = dialogTypeFrame + self.titleView.left = self.titleView.left+20 + self.contentView.addSubview(dialogTypeView) + } + + open override func layoutSubviews() { super.layoutSubviews() @@ -209,11 +222,9 @@ final class AADialogCell: AATableViewCell, AABindedCell { self.titleView.frame = titleFrame } - // // Status Icon // - if (!self.statusView.isHidden) { statusView.frame = CGRect(x: leftPadding, y: 44, width: 20, height: 18) } @@ -222,10 +233,9 @@ final class AADialogCell: AATableViewCell, AABindedCell { // // Rest of Elements are layouted on the last phase // - - if bindedItem != nil { + if let binItem = bindedItem { let config = AADialogCellConfig( - item: bindedItem!, + item: binItem, isStatusVisible: !statusView.isHidden, titleWidth: titleFrame.width, contentWidth: width) @@ -242,6 +252,23 @@ final class AADialogCell: AATableViewCell, AABindedCell { counterView.displaysAsynchronously = false counterView.clearContentsBeforeAsynchronouslyDisplay = false } + + let isBot = binItem.isBot + let isChannel = binItem.isChannel + + if(binItem.peer.peerType == ACPeerType.group()){ + if(isChannel){ + addImageDialogType(UIImage.bundled("ic_channel")) + }else { + addImageDialogType(UIImage.bundled("ic_group")) + } + }else if(bindedItem?.peer.peerType == ACPeerType.private()){ + if(isBot){ + addImageDialogType(UIImage.bundled("ic_robot")) + } + } + + } } @@ -259,7 +286,6 @@ final class AADialogCell: AATableViewCell, AABindedCell { titleContainer.truncationType = .end let titleLayout = YYTextLayout(container: titleContainer, text: title)! - // // Message Status // diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/Executions.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/Executions.swift index 0ff5c7dad5..ce203585a1 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/Executions.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/Executions.swift @@ -61,12 +61,12 @@ open class AAExecutions { command.start(with: AACommandCallback(result: { (val:Any?) -> () in dispatchOnUi { - hud?.hide(true) + hud?.hide(animated: true) successBlock?(val) } }, error: { (val) -> () in dispatchOnUi { - hud?.hide(true) + hud?.hide(animated: true) if type == .safe { @@ -141,13 +141,13 @@ open class AAExecutions { } class fileprivate func showProgress() -> MBProgressHUD { - let window = UIApplication.shared.windows[1] - let hud = MBProgressHUD(window: window) + let window = UIApplication.shared.windows[0] + let hud = MBProgressHUD(view: window) hud.mode = MBProgressHUDMode.indeterminate hud.removeFromSuperViewOnHide = true window.addSubview(hud) window.bringSubview(toFront: hud) - hud.show(true) + hud.show(animated: true) return hud } } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Promises.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Promises.swift index 053a6ba4a7..535f5f1c7b 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Promises.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Promises.swift @@ -7,22 +7,25 @@ import MBProgressHUD public extension ARPromise { - func startUserAction(_ ignore: [String] = []) -> ARPromise { + public func startUserAction(_ ignore: [String] = []) -> ARPromise { - let window = UIApplication.shared.windows[1] - let hud = MBProgressHUD(window: window) + let window = UIApplication.shared.windows[0] + // let hud = MBProgressHUD(window: window) + + let hud = MBProgressHUD(view: window) hud.mode = MBProgressHUDMode.indeterminate hud.removeFromSuperViewOnHide = true window.addSubview(hud) window.bringSubview(toFront: hud) - hud.show(true) + //hud.show(true) + hud.show(animated: true) then { (t: AnyObject!) -> () in - hud.hide(true) + hud.hide(animated:true) } failure { (e) -> () in - hud.hide(true) + hud.hide(animated:true) if let rpc = e as? ACRpcException { if ignore.contains(rpc.tag) { return @@ -34,23 +37,23 @@ public extension ARPromise { return self } - func then(_ closure: @escaping (T!) -> ()) -> ARPromise { + public func then(_ closure: @escaping (T!) -> ()) -> ARPromise { then(PromiseConsumer(closure: closure)) return self } - func after(_ closure: @escaping () -> ()) -> ARPromise { + public func after(_ closure: @escaping () -> ()) -> ARPromise { then(PromiseConsumerEmpty(closure: closure)) return self } - func failure(withClosure closure: @escaping (JavaLangException!) -> ()) -> ARPromise { + public func failure(withClosure closure: @escaping (JavaLangException!) -> ()) -> ARPromise { failure(PromiseConsumer(closure: closure)) return self } } -class PromiseConsumer: NSObject, ARConsumer { +open class PromiseConsumer: NSObject, ARConsumer { let closure: (T!) -> () @@ -58,12 +61,12 @@ class PromiseConsumer: NSObject, ARConsumer { self.closure = closure } - func apply(withId t: Any!) { + open func apply(withId t: Any!) { closure(t as? T) } } -class PromiseConsumerEmpty: NSObject, ARConsumer { +open class PromiseConsumerEmpty: NSObject, ARConsumer { let closure: () -> () @@ -71,7 +74,7 @@ class PromiseConsumerEmpty: NSObject, ARConsumer { self.closure = closure } - func apply(withId t: Any!) { + open func apply(withId t: Any!) { closure() } } From 65967b9f6ffa9d6df54c2a3f7e84ae72466c054a Mon Sep 17 00:00:00 2001 From: diego Date: Sat, 17 Dec 2016 12:23:13 -0200 Subject: [PATCH 188/253] alteracoes --- actor-sdk/sdk-api/actor.json | 22845 +++++++++++++--- .../src/main/java/im/actor/Application.java | 4 +- .../java/im/actor/core/AndroidMessenger.java | 7 +- .../actor-core/src/main/actor-api/actor.json | 22845 +++++++++++++--- 4 files changed, 37202 insertions(+), 8499 deletions(-) diff --git a/actor-sdk/sdk-api/actor.json b/actor-sdk/sdk-api/actor.json index 49d5695dab..c9ce0603d7 100644 --- a/actor-sdk/sdk-api/actor.json +++ b/actor-sdk/sdk-api/actor.json @@ -2,4268 +2,18619 @@ "version": "1.6", "scala-package": "im.actor.api.rpc", "java-package": "im.actor.core.api", - "aliases": [ - { - "type": "bytes", - "alias": "seq_state" - }, - { - "type": "int64", - "alias": "date" - }, - { - "type": "int64", - "alias": "randomId" - }, - { - "type": "int64", - "alias": "msec" - }, - { - "type": "int32", - "alias": "sec" - }, - { - "type": "int32", - "alias": "userId" - }, - { - "type": "int32", - "alias": "groupId" - }, - { - "type": "int32", - "alias": "keyId" - }, - { - "type": "int32", - "alias": "keyGroupId" - }, - { - "type": "string", - "alias": "busId" - } - ], - "sections": [ - { - "title": "Authentication", - "package": "auth", - "doc": [ - "

Actor now support only one way for authentication - by SMS or phone call.

", - "

Authorization steps:", - "

    ", - "
  1. Request SMS Code by calling RequestAuthCode
  2. ", - "
  3. If SMS arrives than send Authorization code in SignIn/SignUp
  4. ", - "
  5. If sms doesn't arrive for a long time - request phone activation by", - "calling AuthCodeCall
  6. ", - "
", - "

", - "Some rules
", - "If RequestAuthCode return isRegistered = false than use SignUp method else SignIn.
", - "If on any step API return PHONE_CODE_EXPIRED than application MUST start", - "authorization process from begining.
" - ], - "items": [ - { - "type": "enum", - "content": { - "name": "PhoneActivationType", - "values": [ - { - "name": "CODE", - "id": 1 - }, - { - "name": "PASSWORD", - "id": 2 + "aliases": [{ + "type": "bytes", + "alias": "seq_state" + }, { + "type": "int64", + "alias": "date" + }, { + "type": "int64", + "alias": "randomId" + }, { + "type": "int64", + "alias": "msec" + }, { + "type": "int32", + "alias": "sec" + }, { + "type": "int32", + "alias": "userId" + }, { + "type": "int32", + "alias": "groupId" + }, { + "type": "int32", + "alias": "keyId" + }, { + "type": "int32", + "alias": "keyGroupId" + }, { + "type": "string", + "alias": "busId" + }], + "sections": [{ + "title": "Authentication", + "package": "auth", + "doc": [ + "

Actor now support only one way for authentication - by SMS or phone call.

", + "

Authorization steps:", + "

    ", + "
  1. Request SMS Code by calling RequestAuthCode
  2. ", + "
  3. If SMS arrives than send Authorization code in SignIn/SignUp
  4. ", + "
  5. If sms doesn't arrive for a long time - request phone activation by", + "calling AuthCodeCall
  6. ", + "
", + "

", + "Some rules
", + "If RequestAuthCode return isRegistered = false than use SignUp method else SignIn.
", + "If on any step API return PHONE_CODE_EXPIRED than application MUST start", + "authorization process from begining.
" + ], + "items": [{ + "type": "enum", + "content": { + "name": "PhoneActivationType", + "values": [{ + "name": "CODE", + "id": 1 + }, { + "name": "PASSWORD", + "id": 2 + }] + } + }, { + "type": "enum", + "content": { + "name": "EmailActivationType", + "values": [{ + "name": "CODE", + "id": 1 + }, { + "name": "OAUTH2", + "id": 2 + }, { + "name": "PASSWORD", + "id": 3 + }] + } + }, { + "type": "rpc", + "content": { + "name": "StartPhoneAuth", + "header": 191, + "response": { + "type": "anonymous", + "header": 193, + "doc": [ + "Phone Activation response", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": " Hash of transaction" + }, { + "type": "reference", + "argument": "isRegistered", + "category": "full", + "description": " Is User registered" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "bool", + "id": 2, + "name": "isRegistered" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "PhoneActivationType" } - ] - } - }, { - "type": "enum", - "content": { - "name": "EmailActivationType", - "values": [ - { - "name": "CODE", - "id": 1 - }, - { - "name": "OAUTH2", - "id": 2 - }, - { - "name": "PASSWORD", - "id": 3 + }, + "id": 3, + "name": "activationType" + }] + }, + "doc": [ + "Start Phone Activation", { + "type": "reference", + "argument": "phoneNumber", + "category": "full", + "description": "Phone number" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Appication Id" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device Title" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": "TimeZone of device" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preferred languages of device" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "phoneNumber" + }, { + "type": "int32", + "id": 2, + "name": "appId" + }, { + "type": "string", + "id": 3, + "name": "apiKey" + }, { + "type": "bytes", + "id": 4, + "name": "deviceHash" + }, { + "type": "string", + "id": 5, + "name": "deviceTitle" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 6, + "name": "timeZone" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 7, + "name": "preferredLanguages" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SendCodeByPhoneCall", + "header": 197, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Dial phone and dictate auth code", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": "Transaction hash" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }] + } + }, { + "type": "rpc", + "content": { + "name": "StartEmailAuth", + "header": 185, + "response": { + "type": "anonymous", + "header": 186, + "doc": [ + "Email Activation response", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": " Hash of activation transaction" + }, { + "type": "reference", + "argument": "isRegistered", + "category": "full", + "description": " true if user is registered" + }, { + "type": "reference", + "argument": "activationType", + "category": "full", + "description": " Email Activation type" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "bool", + "id": 2, + "name": "isRegistered" + }, { + "type": { + "type": "enum", + "childType": "EmailActivationType" + }, + "id": 3, + "name": "activationType" + }] + }, + "doc": [ + "Start EMail Activation", { + "type": "reference", + "argument": "email", + "category": "full", + "description": "Email" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application Id" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device Title" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": "TimeZone of device" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preferred languages" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "email" + }, { + "type": "int32", + "id": 2, + "name": "appId" + }, { + "type": "string", + "id": 3, + "name": "apiKey" + }, { + "type": "bytes", + "id": 4, + "name": "deviceHash" + }, { + "type": "string", + "id": 5, + "name": "deviceTitle" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 6, + "name": "timeZone" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 7, + "name": "preferredLanguages" + }] + } + }, { + "type": "rpc", + "content": { + "name": "StartAnonymousAuth", + "header": 198, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Starting Anonymous login", { + "type": "reference", + "argument": "name", + "category": "full", + "description": "Name of new user" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application Id" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device Title" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": "TimeZone of device" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preferred languages" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "name" + }, { + "type": "int32", + "id": 2, + "name": "appId" + }, { + "type": "string", + "id": 3, + "name": "apiKey" + }, { + "type": "bytes", + "id": 4, + "name": "deviceHash" + }, { + "type": "string", + "id": 5, + "name": "deviceTitle" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 6, + "name": "timeZone" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 7, + "name": "preferredLanguages" + }] + } + }, { + "type": "rpc", + "content": { + "name": "StartTokenAuth", + "header": 203, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Starting token-based login", { + "type": "reference", + "argument": "token", + "category": "full", + "description": "Token for authentication" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application Id" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device Title" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": "TimeZone of device" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preferred languages" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }, { + "type": "int32", + "id": 2, + "name": "appId" + }, { + "type": "string", + "id": 3, + "name": "apiKey" + }, { + "type": "bytes", + "id": 4, + "name": "deviceHash" + }, { + "type": "string", + "id": 5, + "name": "deviceTitle" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 6, + "name": "timeZone" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 7, + "name": "preferredLanguages" + }] + } + }, { + "type": "rpc", + "content": { + "name": "StartUsernameAuth", + "header": 2571, + "response": { + "type": "anonymous", + "header": 2572, + "doc": [ + "Result of login auth start. If is not registered move to signup.", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": " Authentication transaction hash" + }, { + "type": "reference", + "argument": "isRegistered", + "category": "full", + "description": " If user is registered with this username" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "bool", + "id": 2, + "name": "isRegistered" + }] + }, + "doc": [ + "Starting Login Authentication", { + "type": "reference", + "argument": "username", + "category": "full", + "description": "Username for signing in" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application id" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device Title" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": "Time Zone of device" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preferred languages of device" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "username" + }, { + "type": "int32", + "id": 2, + "name": "appId" + }, { + "type": "string", + "id": 3, + "name": "apiKey" + }, { + "type": "bytes", + "id": 4, + "name": "deviceHash" + }, { + "type": "string", + "id": 5, + "name": "deviceTitle" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 6, + "name": "timeZone" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 7, + "name": "preferredLanguages" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ValidateCode", + "header": 189, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Performing user sign in.", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": "Hash of transaction" + }, { + "type": "reference", + "argument": "code", + "category": "hidden", + "description": "Activation code" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "string", + "id": 2, + "name": "code" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ValidatePassword", + "header": 207, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Validation of account password", { + "type": "reference", + "argument": "transactionHash", + "category": "full", + "description": "Hash of transaction" + }, { + "type": "reference", + "argument": "password", + "category": "full", + "description": "Password for account" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "string", + "id": 2, + "name": "password" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetOAuth2Params", + "header": 194, + "response": { + "type": "anonymous", + "header": 195, + "doc": [{ + "type": "reference", + "argument": "authUrl", + "category": "hidden", + "description": " Authentication url" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "authUrl" + }] + }, + "doc": [ + "Loading OAuth2 Parameters", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": "Hash of transaction" + }, { + "type": "reference", + "argument": "redirectUrl", + "category": "full", + "description": "Redirect URL for Application" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "string", + "id": 2, + "name": "redirectUrl" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CompleteOAuth2", + "header": 196, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Complete OAuth2 Authentication", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": "Hash of transaction" + }, { + "type": "reference", + "argument": "code", + "category": "danger", + "description": "Authentication Code" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "string", + "id": 2, + "name": "code" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SignUp", + "header": 190, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Perform user SignUp", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": "Hash of transaction" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": "User name" + }, { + "type": "reference", + "argument": "sex", + "category": "full", + "description": "Optional user sex" + }, { + "type": "reference", + "argument": "password", + "category": "full", + "description": "Password for password-based accounts" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "string", + "id": 2, + "name": "name" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "Sex" + } + }, + "id": 3, + "name": "sex" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "password" + }] + } + }, { + "type": "response", + "content": { + "name": "Auth", + "header": 5, + "doc": [ + "Authentication result", { + "type": "reference", + "argument": "user", + "category": "compact", + "description": " The authenticated User" + }, { + "type": "reference", + "argument": "config", + "category": "full", + "description": " Current config of server" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "User" + }, + "id": 2, + "name": "user" + }, { + "type": { + "type": "struct", + "childType": "Config" + }, + "id": 3, + "name": "config" + }] + } + }, { + "type": "struct", + "content": { + "name": "AuthSession", + "doc": [ + "Authentication session", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Unuque ID of session" + }, { + "type": "reference", + "argument": "authHolder", + "category": "full", + "description": " holder of session. 0 - this device, 1 - other." + }, { + "type": "reference", + "argument": "appId", + "category": "full", + "description": " Application Id (user in SignIn/SignUp)" + }, { + "type": "reference", + "argument": "appTitle", + "category": "full", + "description": " Title of application" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": " Title of device" + }, { + "type": "reference", + "argument": "authTime", + "category": "full", + "description": " Time of session creating" + }, { + "type": "reference", + "argument": "authLocation", + "category": "hidden", + "description": " two-letter country code of session create" + }, { + "type": "reference", + "argument": "latitude", + "category": "hidden", + "description": " optional latitude of auth if available" + }, { + "type": "reference", + "argument": "longitude", + "category": "hidden", + "description": " optional longitude of auth if available" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": { + "type": "enum", + "childType": "AuthHolder" + }, + "id": 2, + "name": "authHolder" + }, { + "type": "int32", + "id": 3, + "name": "appId" + }, { + "type": "string", + "id": 4, + "name": "appTitle" + }, { + "type": "string", + "id": 5, + "name": "deviceTitle" + }, { + "type": "int32", + "id": 6, + "name": "authTime" + }, { + "type": "string", + "id": 7, + "name": "authLocation" + }, { + "type": { + "type": "opt", + "childType": "double" + }, + "id": 8, + "name": "latitude" + }, { + "type": { + "type": "opt", + "childType": "double" + }, + "id": 9, + "name": "longitude" + }] + } + }, { + "type": "enum", + "content": { + "name": "AuthHolder", + "values": [{ + "name": "ThisDevice", + "id": 1 + }, { + "name": "OtherDevice", + "id": 2 + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetAuthSessions", + "header": 80, + "response": { + "type": "anonymous", + "header": 81, + "doc": [ + "Current Auth sessions", { + "type": "reference", + "argument": "userAuths", + "category": "compact", + "description": " User authentications" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "AuthSession" } - ] - } - },{"type":"rpc","content":{ -"name":"StartPhoneAuth", -"header":191, -"response":{"type":"anonymous","header":193, "doc":[ -"Phone Activation response",{"type":"reference","argument":"transactionHash","category":"danger","description":" Hash of transaction"},{"type":"reference","argument":"isRegistered","category":"full","description":" Is User registered"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} -,{"type":"bool","id":2,"name":"isRegistered"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"PhoneActivationType"}},"id":3,"name":"activationType"} -]}, -"doc":[ -"Start Phone Activation",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number"},{"type":"reference","argument":"appId","category":"hidden","description":"Appication Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages of device"}],"attributes":[ -{"type":"int64","id":1,"name":"phoneNumber"} -,{"type":"int32","id":2,"name":"appId"} -,{"type":"string","id":3,"name":"apiKey"} -,{"type":"bytes","id":4,"name":"deviceHash"} -,{"type":"string","id":5,"name":"deviceTitle"} -,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} -,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} -]}},{"type":"rpc","content":{ -"name":"SendCodeByPhoneCall", -"header":197, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Dial phone and dictate auth code",{"type":"reference","argument":"transactionHash","category":"danger","description":"Transaction hash"}],"attributes":[ -{"type":"string","id":1,"name":"transactionHash"} -]}},{"type":"rpc","content":{ -"name":"StartEmailAuth", -"header":185, -"response":{"type":"anonymous","header":186, "doc":[ -"Email Activation response",{"type":"reference","argument":"transactionHash","category":"danger","description":" Hash of activation transaction"},{"type":"reference","argument":"isRegistered","category":"full","description":" true if user is registered"},{"type":"reference","argument":"activationType","category":"full","description":" Email Activation type"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} -,{"type":"bool","id":2,"name":"isRegistered"} -,{"type":{"type":"enum","childType":"EmailActivationType"},"id":3,"name":"activationType"} -]}, -"doc":[ -"Start EMail Activation",{"type":"reference","argument":"email","category":"full","description":"Email"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ -{"type":"string","id":1,"name":"email"} -,{"type":"int32","id":2,"name":"appId"} -,{"type":"string","id":3,"name":"apiKey"} -,{"type":"bytes","id":4,"name":"deviceHash"} -,{"type":"string","id":5,"name":"deviceTitle"} -,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} -,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} -]}},{"type":"rpc","content":{ -"name":"StartAnonymousAuth", -"header":198, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Starting Anonymous login",{"type":"reference","argument":"name","category":"full","description":"Name of new user"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ -{"type":"string","id":1,"name":"name"} -,{"type":"int32","id":2,"name":"appId"} -,{"type":"string","id":3,"name":"apiKey"} -,{"type":"bytes","id":4,"name":"deviceHash"} -,{"type":"string","id":5,"name":"deviceTitle"} -,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} -,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} -]}},{"type":"rpc","content":{ -"name":"StartTokenAuth", -"header":203, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Starting token-based login",{"type":"reference","argument":"token","category":"full","description":"Token for authentication"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -,{"type":"int32","id":2,"name":"appId"} -,{"type":"string","id":3,"name":"apiKey"} -,{"type":"bytes","id":4,"name":"deviceHash"} -,{"type":"string","id":5,"name":"deviceTitle"} -,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} -,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} -]}},{"type":"rpc","content":{ -"name":"StartUsernameAuth", -"header":2571, -"response":{"type":"anonymous","header":2572, "doc":[ -"Result of login auth start. If is not registered move to signup.",{"type":"reference","argument":"transactionHash","category":"danger","description":" Authentication transaction hash"},{"type":"reference","argument":"isRegistered","category":"full","description":" If user is registered with this username"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} -,{"type":"bool","id":2,"name":"isRegistered"} -]}, -"doc":[ -"Starting Login Authentication",{"type":"reference","argument":"username","category":"full","description":"Username for signing in"},{"type":"reference","argument":"appId","category":"hidden","description":"Application id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"Time Zone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages of device"}],"attributes":[ -{"type":"string","id":1,"name":"username"} -,{"type":"int32","id":2,"name":"appId"} -,{"type":"string","id":3,"name":"apiKey"} -,{"type":"bytes","id":4,"name":"deviceHash"} -,{"type":"string","id":5,"name":"deviceTitle"} -,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} -,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} -]}},{"type":"rpc","content":{ -"name":"ValidateCode", -"header":189, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Performing user sign in.",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"code","category":"hidden","description":"Activation code"}],"attributes":[ -{"type":"string","id":1,"name":"transactionHash"} -,{"type":"string","id":2,"name":"code"} -]}},{"type":"rpc","content":{ -"name":"ValidatePassword", -"header":207, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Validation of account password",{"type":"reference","argument":"transactionHash","category":"full","description":"Hash of transaction"},{"type":"reference","argument":"password","category":"full","description":"Password for account"}],"attributes":[ -{"type":"string","id":1,"name":"transactionHash"} -,{"type":"string","id":2,"name":"password"} -]}},{"type":"rpc","content":{ -"name":"GetOAuth2Params", -"header":194, -"response":{"type":"anonymous","header":195, "doc":[ -{"type":"reference","argument":"authUrl","category":"hidden","description":" Authentication url"}] ,"attributes":[{"type":"string","id":1,"name":"authUrl"} -]}, -"doc":[ -"Loading OAuth2 Parameters",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"redirectUrl","category":"full","description":"Redirect URL for Application"}],"attributes":[ -{"type":"string","id":1,"name":"transactionHash"} -,{"type":"string","id":2,"name":"redirectUrl"} -]}},{"type":"rpc","content":{ -"name":"CompleteOAuth2", -"header":196, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Complete OAuth2 Authentication",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"code","category":"danger","description":"Authentication Code"}],"attributes":[ -{"type":"string","id":1,"name":"transactionHash"} -,{"type":"string","id":2,"name":"code"} -]}},{"type":"rpc","content":{ -"name":"SignUp", -"header":190, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Perform user SignUp",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"name","category":"full","description":"User name"},{"type":"reference","argument":"sex","category":"full","description":"Optional user sex"},{"type":"reference","argument":"password","category":"full","description":"Password for password-based accounts"}],"attributes":[ -{"type":"string","id":1,"name":"transactionHash"} -,{"type":"string","id":2,"name":"name"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"Sex"}},"id":3,"name":"sex"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"password"} -]}},{"type":"response","content":{ -"name":"Auth", -"header":5, -"doc":[ -"Authentication result",{"type":"reference","argument":"user","category":"compact","description":" The authenticated User"},{"type":"reference","argument":"config","category":"full","description":" Current config of server"}],"attributes":[ -{"type":{"type":"struct","childType":"User"},"id":2,"name":"user"} -,{"type":{"type":"struct","childType":"Config"},"id":3,"name":"config"} -]}}, { - "type":"struct", - "content": { - "name":"AuthSession", -"doc":[ -"Authentication session",{"type":"reference","argument":"id","category":"full","description":" Unuque ID of session"},{"type":"reference","argument":"authHolder","category":"full","description":" holder of session. 0 - this device, 1 - other."},{"type":"reference","argument":"appId","category":"full","description":" Application Id (user in SignIn/SignUp)"},{"type":"reference","argument":"appTitle","category":"full","description":" Title of application"},{"type":"reference","argument":"deviceTitle","category":"full","description":" Title of device"},{"type":"reference","argument":"authTime","category":"full","description":" Time of session creating"},{"type":"reference","argument":"authLocation","category":"hidden","description":" two-letter country code of session create"},{"type":"reference","argument":"latitude","category":"hidden","description":" optional latitude of auth if available"},{"type":"reference","argument":"longitude","category":"hidden","description":" optional longitude of auth if available"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":{"type":"enum","childType":"AuthHolder"},"id":2,"name":"authHolder"} -,{"type":"int32","id":3,"name":"appId"} -,{"type":"string","id":4,"name":"appTitle"} -,{"type":"string","id":5,"name":"deviceTitle"} -,{"type":"int32","id":6,"name":"authTime"} -,{"type":"string","id":7,"name":"authLocation"} -,{"type":{"type":"opt","childType":"double"},"id":8,"name":"latitude"} -,{"type":{"type":"opt","childType":"double"},"id":9,"name":"longitude"} -]}}, { - "type": "enum", - "content": { - "name": "AuthHolder", - "values": [ - { - "name": "ThisDevice", - "id": 1 - }, - { - "name": "OtherDevice", - "id": 2 + }, + "id": 1, + "name": "userAuths" + }] + }, + "doc": [ + "Getting of all active user's authentication sessions" + ], + "attributes": [] + } + }, { + "type": "rpc", + "content": { + "name": "TerminateSession", + "header": 82, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "SignOut on specified user's session", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "id from AuthItem" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }] + } + }, { + "type": "rpc", + "content": { + "name": "TerminateAllSessions", + "header": 83, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "SignOut on all exept current sessions" + ], + "attributes": [] + } + }, { + "type": "rpc", + "content": { + "name": "SignOut", + "header": 84, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "SignOut current session" + ], + "attributes": [] + } + }, { + "type": "comment", + "content": "OBSOLETE METHODS" + }, { + "type": "rpc", + "content": { + "name": "SignInObsolete", + "header": 3, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Performing user signin", { + "type": "reference", + "argument": "phoneNumber", + "category": "danger", + "description": "Phone number in international format" + }, { + "type": "reference", + "argument": "smsHash", + "category": "danger", + "description": "Code request hash from RequestAuthCode" + }, { + "type": "reference", + "argument": "smsCode", + "category": "danger", + "description": "Confirmation code from SMS" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device title like 'Steven's iPhone'" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application ID" + }, { + "type": "reference", + "argument": "appKey", + "category": "hidden", + "description": "Application API key" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "phoneNumber" + }, { + "type": "string", + "id": 2, + "name": "smsHash" + }, { + "type": "string", + "id": 3, + "name": "smsCode" + }, { + "type": "bytes", + "id": 5, + "name": "deviceHash" + }, { + "type": "string", + "id": 6, + "name": "deviceTitle" + }, { + "type": "int32", + "id": 7, + "name": "appId" + }, { + "type": "string", + "id": 8, + "name": "appKey" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SignUpObsolete", + "header": 4, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Performing user signup. If user perform signup on already registered user it just override previous", "profile information", { + "type": "reference", + "argument": "phoneNumber", + "category": "danger", + "description": "Phone number in international format" + }, { + "type": "reference", + "argument": "smsHash", + "category": "danger", + "description": "Code request hash from RequestAuthCode" + }, { + "type": "reference", + "argument": "smsCode", + "category": "danger", + "description": "Confirmation code from SMS" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": "User name" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device title like 'Steven's iPhone'" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application ID" + }, { + "type": "reference", + "argument": "appKey", + "category": "hidden", + "description": "pplication API key" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "phoneNumber" + }, { + "type": "string", + "id": 2, + "name": "smsHash" + }, { + "type": "string", + "id": 3, + "name": "smsCode" + }, { + "type": "string", + "id": 4, + "name": "name" + }, { + "type": "bytes", + "id": 7, + "name": "deviceHash" + }, { + "type": "string", + "id": 8, + "name": "deviceTitle" + }, { + "type": "int32", + "id": 9, + "name": "appId" + }, { + "type": "string", + "id": 10, + "name": "appKey" + }, { + "type": "bool", + "id": 11, + "name": "isSilent" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SendAuthCodeObsolete", + "header": 1, + "response": { + "type": "anonymous", + "header": 2, + "doc": [ + "Sms Request response", { + "type": "reference", + "argument": "smsHash", + "category": "danger", + "description": " Hash of SMS request" + }, { + "type": "reference", + "argument": "isRegistered", + "category": "full", + "description": " true if user is registered" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "smsHash" + }, { + "type": "bool", + "id": 2, + "name": "isRegistered" + }] + }, + "doc": [ + "Sending SMS with activation code", { + "type": "reference", + "argument": "phoneNumber", + "category": "full", + "description": "Phone number in international format" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application ID" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "phoneNumber" + }, { + "type": "int32", + "id": 2, + "name": "appId" + }, { + "type": "string", + "id": 3, + "name": "apiKey" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SendAuthCallObsolete", + "header": 90, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Requesting Phone activation", { + "type": "reference", + "argument": "phoneNumber", + "category": "full", + "description": "Phone number in international format" + }, { + "type": "reference", + "argument": "smsHash", + "category": "danger", + "description": "Code request hash from RequestAuthCode" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application ID" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "phoneNumber" + }, { + "type": "string", + "id": 2, + "name": "smsHash" + }, { + "type": "int32", + "id": 3, + "name": "appId" + }, { + "type": "string", + "id": 4, + "name": "apiKey" + }] + } + }] + }, { + "title": "Users", + "package": "users", + "doc": [ + "Users are objects that secured by accessHash. You can't load user profile by it's id.", + "You can't send message to user without finding it's object in Updates or by calling", + "method for user search, contacts import or some other methods.", + "", + "Applications need to keep all Users information forever.", + "", + "Each User have optional localName - name of user that was set by current user and can be changed", + "any time by calling EditUserLocalName method." + ], + "items": [{ + "type": "enum", + "content": { + "name": "Sex", + "values": [{ + "name": "Unknown", + "id": 1 + }, { + "name": "Male", + "id": 2 + }, { + "name": "Female", + "id": 3 + }] + } + }, { + "type": "enum", + "content": { + "name": "ContactType", + "values": [{ + "name": "Phone", + "id": 1 + }, { + "name": "Email", + "id": 2 + }, { + "name": "Web", + "id": 3 + }, { + "name": "Social", + "id": 4 + }] + } + }, { + "type": "struct", + "content": { + "name": "ContactRecord", + "doc": [ + "Contact information record", { + "type": "reference", + "argument": "type", + "category": "full", + "description": " Record type" + }, { + "type": "reference", + "argument": "typeSpec", + "category": "hidden", + "description": " Value for specification type of contact, for example 'mobile/standalone/office' for phones or 'vk/fb/telegram' for extenrnal networks." + }, { + "type": "reference", + "argument": "stringValue", + "category": "full", + "description": " String value of record" + }, { + "type": "reference", + "argument": "longValue", + "category": "full", + "description": " Long value of record" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Title of record" + }, { + "type": "reference", + "argument": "subtitle", + "category": "hidden", + "description": " Subtitle of record" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "enum", + "childType": "ContactType" + }, + "id": 1, + "name": "type" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 6, + "name": "typeSpec" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "stringValue" + }, { + "type": { + "type": "opt", + "childType": "int64" + }, + "id": 3, + "name": "longValue" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "title" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 5, + "name": "subtitle" + }] + } + }, { + "type": "struct", + "content": { + "name": "User", + "doc": [ + "Main user object", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " uid" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " user's access hash" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " user's name" + }, { + "type": "reference", + "argument": "localName", + "category": "full", + "description": " user's local name" + }, { + "type": "reference", + "argument": "nick", + "category": "full", + "description": " User's nickname" + }, { + "type": "reference", + "argument": "sex", + "category": "full", + "description": " optional sex of user" + }, { + "type": "reference", + "argument": "avatar", + "category": "compact", + "description": " avatar of user" + }, { + "type": "reference", + "argument": "isBot", + "category": "full", + "description": " Is user actually bot. By default is false." + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " Extension values" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": " [DEPRECATED] User's about information" + }, { + "type": "reference", + "argument": "contactInfo", + "category": "compact", + "description": " [DEPRECATED] Contact information of user" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": " [DEPRECATED] Preferred user languages" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": " [DEPRECATED] Time Zone of user in TZ format" + }, { + "type": "reference", + "argument": "botCommands", + "category": "full", + "description": " [DEPRECATED] Available Bot Commands" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": "string", + "id": 3, + "name": "name" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "localName" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 13, + "name": "nick" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "Sex" + } + }, + "id": 5, + "name": "sex" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 8, + "name": "avatar" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 11, + "name": "isBot" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 20, + "name": "ext" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "ContactRecord" + } + }, + "id": 12, + "name": "contactInfo", + "deprecated": "true" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 14, + "name": "about", + "deprecated": "true" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 16, + "name": "preferredLanguages", + "deprecated": "true" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 17, + "name": "timeZone", + "deprecated": "true" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "BotCommand" + } + }, + "id": 19, + "name": "botCommands", + "deprecated": "true" + }] + } + }, { + "type": "struct", + "content": { + "name": "FullUser", + "doc": [ + "Full User representation", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " User's Id" + }, { + "type": "reference", + "argument": "contactInfo", + "category": "compact", + "description": " User's contact information" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": " User's about information" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": " Preferred user languages" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": " Time Zone of user in TZ format" + }, { + "type": "reference", + "argument": "botCommands", + "category": "full", + "description": " Available Commands for Bot" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " Extension values. NOTE: This values are not related to ext field in User object." + }, { + "type": "reference", + "argument": "isBlocked", + "category": "full", + "description": " Is user blocked. Default is false." + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "ContactRecord" + } + }, + "id": 2, + "name": "contactInfo" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "about" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 4, + "name": "preferredLanguages" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 5, + "name": "timeZone" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "BotCommand" + } + }, + "id": 6, + "name": "botCommands" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 7, + "name": "ext" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 8, + "name": "isBlocked" + }] + } + }, { + "type": "struct", + "content": { + "name": "BotCommand", + "doc": [ + "Available bot commands", { + "type": "reference", + "argument": "slashCommand", + "category": "full", + "description": " Slash command name (wihtout slash)" + }, { + "type": "reference", + "argument": "description", + "category": "full", + "description": " Slash command description" + }, { + "type": "reference", + "argument": "locKey", + "category": "full", + "description": " Optional Localization Key for i18n" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "slashCommand" + }, { + "type": "string", + "id": 2, + "name": "description" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "locKey" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditUserLocalName", + "header": 96, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Renaming of user's visible name", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": "target User's uid" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": "User's accessHash" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": "New user name" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": "string", + "id": 3, + "name": "name" + }] + } + }, { + "type": "update", + "content": { + "name": "UserAvatarChanged", + "header": 16, + "doc": [ + "Update about avatar changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " user's uid" + }, { + "type": "reference", + "argument": "avatar", + "category": "compact", + "description": " user's new avatar" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 2, + "name": "avatar" + }] + } + }, { + "type": "update", + "content": { + "name": "UserNameChanged", + "header": 32, + "doc": [ + "Update about name changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " user's uid" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " user's name" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": "string", + "id": 2, + "name": "name" + }] + } + }, { + "type": "update", + "content": { + "name": "UserLocalNameChanged", + "header": 51, + "doc": [ + "Update about local name changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " user's uid" + }, { + "type": "reference", + "argument": "localName", + "category": "full", + "description": " new user's local name" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "localName" + }] + } + }, { + "type": "update", + "content": { + "name": "UserContactsChanged", + "header": 134, + "doc": [ + "Update about contact information change", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " user's uid" + }, { + "type": "reference", + "argument": "contactRecords", + "category": "compact", + "description": " new phones list" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "ContactRecord" + } + }, + "id": 4, + "name": "contactRecords" + }] + } + }, { + "type": "update", + "content": { + "name": "UserNickChanged", + "header": 209, + "doc": [ + "Update about nick changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " user's uid" + }, { + "type": "reference", + "argument": "nickname", + "category": "full", + "description": " user's new nickname" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "nickname" + }] + } + }, { + "type": "update", + "content": { + "name": "UserAboutChanged", + "header": 210, + "doc": [ + "Update about user's about changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's uid" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": " User's about" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "about" + }] + } + }, { + "type": "update", + "content": { + "name": "UserPreferredLanguagesChanged", + "header": 212, + "doc": [ + "Update about user's preferred languages", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's uid" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": " User's preferred languages. Can be empty." + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 2, + "name": "preferredLanguages" + }] + } + }, { + "type": "update", + "content": { + "name": "UserTimeZoneChanged", + "header": 216, + "doc": [ + "User TimeZone changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's uid" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": " User's new time zone in TZ format" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "timeZone" + }] + } + }, { + "type": "update", + "content": { + "name": "UserBotCommandsChanged", + "header": 217, + "doc": [ + "Update about bot commands changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's Id" + }, { + "type": "reference", + "argument": "commands", + "category": "full", + "description": " New List of commands" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "BotCommand" + } + }, + "id": 2, + "name": "commands" + }] + } + }, { + "type": "update", + "content": { + "name": "UserExtChanged", + "header": 218, + "doc": [ + "Update about user ext changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " New Ext Value in User (NOT FullUser) object." + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 2, + "name": "ext" + }] + } + }, { + "type": "update", + "content": { + "name": "UserFullExtChanged", + "header": 219, + "doc": [ + "Update about user ext changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's Id" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " New Ext Value in FullUser (NOT User) object." + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 3, + "name": "ext" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadFullUsers", + "header": 2649, + "response": { + "type": "anonymous", + "header": 2650, + "doc": [{ + "type": "reference", + "argument": "fullUsers", + "category": "compact", + "description": " Loaded users" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "FullUser" } - ] - } - },{"type":"rpc","content":{ -"name":"GetAuthSessions", -"header":80, -"response":{"type":"anonymous","header":81, "doc":[ -"Current Auth sessions",{"type":"reference","argument":"userAuths","category":"compact","description":" User authentications"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"AuthSession"}},"id":1,"name":"userAuths"} -]}, -"doc":[ -"Getting of all active user's authentication sessions"],"attributes":[ -]}},{"type":"rpc","content":{ -"name":"TerminateSession", -"header":82, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"SignOut on specified user's session",{"type":"reference","argument":"id","category":"full","description":"id from AuthItem"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -]}},{"type":"rpc","content":{ -"name":"TerminateAllSessions", -"header":83, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"SignOut on all exept current sessions"],"attributes":[ -]}},{"type":"rpc","content":{ -"name":"SignOut", -"header":84, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"SignOut current session"],"attributes":[ -]}},{"type":"comment","content":"OBSOLETE METHODS"},{"type":"rpc","content":{ -"name":"SignInObsolete", -"header":3, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Performing user signin",{"type":"reference","argument":"phoneNumber","category":"danger","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"smsCode","category":"danger","description":"Confirmation code from SMS"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device title like 'Steven's iPhone'"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"appKey","category":"hidden","description":"Application API key"}],"attributes":[ -{"type":"int64","id":1,"name":"phoneNumber"} -,{"type":"string","id":2,"name":"smsHash"} -,{"type":"string","id":3,"name":"smsCode"} -,{"type":"bytes","id":5,"name":"deviceHash"} -,{"type":"string","id":6,"name":"deviceTitle"} -,{"type":"int32","id":7,"name":"appId"} -,{"type":"string","id":8,"name":"appKey"} -]}},{"type":"rpc","content":{ -"name":"SignUpObsolete", -"header":4, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Performing user signup. If user perform signup on already registered user it just override previous","profile information",{"type":"reference","argument":"phoneNumber","category":"danger","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"smsCode","category":"danger","description":"Confirmation code from SMS"},{"type":"reference","argument":"name","category":"full","description":"User name"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device title like 'Steven's iPhone'"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"appKey","category":"hidden","description":"pplication API key"}],"attributes":[ -{"type":"int64","id":1,"name":"phoneNumber"} -,{"type":"string","id":2,"name":"smsHash"} -,{"type":"string","id":3,"name":"smsCode"} -,{"type":"string","id":4,"name":"name"} -,{"type":"bytes","id":7,"name":"deviceHash"} -,{"type":"string","id":8,"name":"deviceTitle"} -,{"type":"int32","id":9,"name":"appId"} -,{"type":"string","id":10,"name":"appKey"} -,{"type":"bool","id":11,"name":"isSilent"} -]}},{"type":"rpc","content":{ -"name":"SendAuthCodeObsolete", -"header":1, -"response":{"type":"anonymous","header":2, "doc":[ -"Sms Request response",{"type":"reference","argument":"smsHash","category":"danger","description":" Hash of SMS request"},{"type":"reference","argument":"isRegistered","category":"full","description":" true if user is registered"}] ,"attributes":[{"type":"string","id":1,"name":"smsHash"} -,{"type":"bool","id":2,"name":"isRegistered"} -]}, -"doc":[ -"Sending SMS with activation code",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number in international format"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"}],"attributes":[ -{"type":"int64","id":1,"name":"phoneNumber"} -,{"type":"int32","id":2,"name":"appId"} -,{"type":"string","id":3,"name":"apiKey"} -]}},{"type":"rpc","content":{ -"name":"SendAuthCallObsolete", -"header":90, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Requesting Phone activation",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"}],"attributes":[ -{"type":"int64","id":1,"name":"phoneNumber"} -,{"type":"string","id":2,"name":"smsHash"} -,{"type":"int32","id":3,"name":"appId"} -,{"type":"string","id":4,"name":"apiKey"} -]}}]}, { - "title": "Users", - "package": "users", - "doc": [ - "Users are objects that secured by accessHash. You can't load user profile by it's id.", - "You can't send message to user without finding it's object in Updates or by calling", - "method for user search, contacts import or some other methods.", - "", - "Applications need to keep all Users information forever.", - "", - "Each User have optional localName - name of user that was set by current user and can be changed", - "any time by calling EditUserLocalName method." - ], - "items": [ - { - "type": "enum", - "content": { - "name": "Sex", - "values": [ - { - "name": "Unknown", - "id": 1 - }, - { - "name": "Male", - "id": 2 - }, - { - "name": "Female", - "id": 3 + }, + "id": 1, + "name": "fullUsers" + }] + }, + "doc": [ + "Loading Full User information", { + "type": "reference", + "argument": "userPeers", + "category": "compact", + "description": "User's peers to load. Should be non-empy" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 1, + "name": "userPeers" + }] + } + }] + }, { + "title": "Profile", + "package": "profile", + "items": [{ + "type": "rpc", + "content": { + "name": "EditName", + "header": 53, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Changing account's name", { + "type": "reference", + "argument": "name", + "category": "full", + "description": "New name" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "name" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditNickName", + "header": 205, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Changing account's nickname", { + "type": "reference", + "argument": "nickname", + "category": "full", + "description": "New Nickname" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "nickname" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CheckNickName", + "header": 206, + "response": { + "type": "reference", + "name": "Bool" + }, + "doc": [ + "Checking availability of nickname", { + "type": "reference", + "argument": "nickname", + "category": "full", + "description": "Nickname for checking" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "nickname" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditAbout", + "header": 212, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Changing about information", { + "type": "reference", + "argument": "about", + "category": "full", + "description": "new about information" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "about" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditAvatar", + "header": 31, + "response": { + "type": "anonymous", + "header": 103, + "doc": [ + "Response for change account avatar", { + "type": "reference", + "argument": "avatar", + "category": "full", + "description": " New avatar" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Sequence state" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Avatar" + }, + "id": 1, + "name": "avatar" + }, { + "type": "int32", + "id": 2, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }] + }, + "doc": [ + "Changing account's avatar", { + "type": "reference", + "argument": "fileLocation", + "category": "compact", + "description": "File Location of uploaded unencrypted avatar" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 1, + "name": "fileLocation" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RemoveAvatar", + "header": 91, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Removing account's avatar" + ], + "attributes": [] + } + }, { + "type": "rpc", + "content": { + "name": "EditMyTimeZone", + "header": 144, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Updating user's time zone", { + "type": "reference", + "argument": "tz", + "category": "full", + "description": "New Time Zone" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "tz" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditMyPreferredLanguages", + "header": 145, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Changing preffered languages", { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preffered Languages" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": "string" + }, + "id": 1, + "name": "preferredLanguages" + }] + } + }] + }, { + "title": "Contacts", + "package": "contacts", + "doc": [ + "Before working with contact list is is useful to import contacts from phone first by calling", + "method ImportContacts#0x07.", + "", + "All phone numbers MUST be preprocessed before import by some library (like libphonenumber)", + "and build international phone number depending on current users phone and/or locale.", + "", + "For loading contact list from server use GetContacts#0x57.", + "If during this call there are some updates about contact list change", + "it is recommended to call it again. Also applications need to sync contacts on application start.", + "", + "For searching for users without adding to contacts list use method FindContacts#0x70.", + "", + "For adding/deleting contacts AddContact#0x72 and DeleteContact#0x59." + ], + "items": [{ + "type": "struct", + "content": { + "name": "PhoneToImport", + "doc": [ + "Phone for import", { + "type": "reference", + "argument": "phoneNumber", + "category": "full", + "description": " phone number for import in international format" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " optional name for contact" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "phoneNumber" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "name" + }] + } + }, { + "type": "struct", + "content": { + "name": "EmailToImport", + "doc": [ + "Email for import", { + "type": "reference", + "argument": "email", + "category": "full", + "description": " email for importing" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " optional name for contact" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "email" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "name" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ImportContacts", + "header": 7, + "response": { + "type": "anonymous", + "header": 8, + "doc": [ + "Imported contacts", { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Imported users" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number if users are imported" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Sequence state if users are imported" + }, { + "type": "reference", + "argument": "userPeers", + "category": "full", + "description": " Imported user peers" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" } - ] - } - }, { - "type": "enum", - "content": { - "name": "ContactType", - "values": [ - { - "name": "Phone", - "id": 1 - }, - { - "name": "Email", - "id": 2 - }, - { - "name": "Web", - "id": 3 - }, - { - "name": "Social", - "id": 4 + }, + "id": 1, + "name": "users" + }, { + "type": "int32", + "id": 2, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" } - ] - } - }, { - "type":"struct", - "content": { - "name":"ContactRecord", -"doc":[ -"Contact information record",{"type":"reference","argument":"type","category":"full","description":" Record type"},{"type":"reference","argument":"typeSpec","category":"hidden","description":" Value for specification type of contact, for example 'mobile/standalone/office' for phones or 'vk/fb/telegram' for extenrnal networks."},{"type":"reference","argument":"stringValue","category":"full","description":" String value of record"},{"type":"reference","argument":"longValue","category":"full","description":" Long value of record"},{"type":"reference","argument":"title","category":"full","description":" Title of record"},{"type":"reference","argument":"subtitle","category":"hidden","description":" Subtitle of record"}],"expandable":"true","attributes":[ -{"type":{"type":"enum","childType":"ContactType"},"id":1,"name":"type"} -,{"type":{"type":"opt","childType":"string"},"id":6,"name":"typeSpec"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"stringValue"} -,{"type":{"type":"opt","childType":"int64"},"id":3,"name":"longValue"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"title"} -,{"type":{"type":"opt","childType":"string"},"id":5,"name":"subtitle"} -]}}, { - "type":"struct", - "content": { - "name":"User", -"doc":[ -"Main user object",{"type":"reference","argument":"id","category":"full","description":" uid"},{"type":"reference","argument":"accessHash","category":"danger","description":" user's access hash"},{"type":"reference","argument":"name","category":"full","description":" user's name"},{"type":"reference","argument":"localName","category":"full","description":" user's local name"},{"type":"reference","argument":"nick","category":"full","description":" User's nickname"},{"type":"reference","argument":"sex","category":"full","description":" optional sex of user"},{"type":"reference","argument":"avatar","category":"compact","description":" avatar of user"},{"type":"reference","argument":"isBot","category":"full","description":" Is user actually bot. By default is false."},{"type":"reference","argument":"ext","category":"full","description":" Extension values"},{"type":"reference","argument":"about","category":"full","description":" [DEPRECATED] User's about information"},{"type":"reference","argument":"contactInfo","category":"compact","description":" [DEPRECATED] Contact information of user"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" [DEPRECATED] Preferred user languages"},{"type":"reference","argument":"timeZone","category":"full","description":" [DEPRECATED] Time Zone of user in TZ format"},{"type":"reference","argument":"botCommands","category":"full","description":" [DEPRECATED] Available Bot Commands"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":"string","id":3,"name":"name"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"localName"} -,{"type":{"type":"opt","childType":"string"},"id":13,"name":"nick"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"Sex"}},"id":5,"name":"sex"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":8,"name":"avatar"} -,{"type":{"type":"opt","childType":"bool"},"id":11,"name":"isBot"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":20,"name":"ext"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":12,"name":"contactInfo", "deprecated":"true"} -,{"type":{"type":"opt","childType":"string"},"id":14,"name":"about", "deprecated":"true"} -,{"type":{"type":"list","childType":"string"},"id":16,"name":"preferredLanguages", "deprecated":"true"} -,{"type":{"type":"opt","childType":"string"},"id":17,"name":"timeZone", "deprecated":"true"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":19,"name":"botCommands", "deprecated":"true"} -]}}, { - "type":"struct", - "content": { - "name":"FullUser", -"doc":[ -"Full User representation",{"type":"reference","argument":"id","category":"full","description":" User's Id"},{"type":"reference","argument":"contactInfo","category":"compact","description":" User's contact information"},{"type":"reference","argument":"about","category":"full","description":" User's about information"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" Preferred user languages"},{"type":"reference","argument":"timeZone","category":"full","description":" Time Zone of user in TZ format"},{"type":"reference","argument":"botCommands","category":"full","description":" Available Commands for Bot"},{"type":"reference","argument":"ext","category":"full","description":" Extension values. NOTE: This values are not related to ext field in User object."},{"type":"reference","argument":"isBlocked","category":"full","description":" Is user blocked. Default is false."}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"id"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":2,"name":"contactInfo"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} -,{"type":{"type":"list","childType":"string"},"id":4,"name":"preferredLanguages"} -,{"type":{"type":"opt","childType":"string"},"id":5,"name":"timeZone"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":6,"name":"botCommands"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":7,"name":"ext"} -,{"type":{"type":"opt","childType":"bool"},"id":8,"name":"isBlocked"} -]}}, { - "type":"struct", - "content": { - "name":"BotCommand", -"doc":[ -"Available bot commands",{"type":"reference","argument":"slashCommand","category":"full","description":" Slash command name (wihtout slash)"},{"type":"reference","argument":"description","category":"full","description":" Slash command description"},{"type":"reference","argument":"locKey","category":"full","description":" Optional Localization Key for i18n"}],"attributes":[ -{"type":"string","id":1,"name":"slashCommand"} -,{"type":"string","id":2,"name":"description"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"locKey"} -]}},{"type":"rpc","content":{ -"name":"EditUserLocalName", -"header":96, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Renaming of user's visible name",{"type":"reference","argument":"uid","category":"full","description":"target User's uid"},{"type":"reference","argument":"accessHash","category":"danger","description":"User's accessHash"},{"type":"reference","argument":"name","category":"full","description":"New user name"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":"string","id":3,"name":"name"} -]}},{"type":"update","content":{ -"name":"UserAvatarChanged", -"header":16, -"doc":[ -"Update about avatar changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"avatar","category":"compact","description":" user's new avatar"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":2,"name":"avatar"} -]}},{"type":"update","content":{ -"name":"UserNameChanged", -"header":32, -"doc":[ -"Update about name changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"name","category":"full","description":" user's name"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":"string","id":2,"name":"name"} -]}},{"type":"update","content":{ -"name":"UserLocalNameChanged", -"header":51, -"doc":[ -"Update about local name changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"localName","category":"full","description":" new user's local name"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"localName"} -]}},{"type":"update","content":{ -"name":"UserContactsChanged", -"header":134, -"doc":[ -"Update about contact information change",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"contactRecords","category":"compact","description":" new phones list"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":4,"name":"contactRecords"} -]}},{"type":"update","content":{ -"name":"UserNickChanged", -"header":209, -"doc":[ -"Update about nick changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"nickname","category":"full","description":" user's new nickname"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"nickname"} -]}},{"type":"update","content":{ -"name":"UserAboutChanged", -"header":210, -"doc":[ -"Update about user's about changed",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"about","category":"full","description":" User's about"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} -]}},{"type":"update","content":{ -"name":"UserPreferredLanguagesChanged", -"header":212, -"doc":[ -"Update about user's preferred languages",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" User's preferred languages. Can be empty."}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"list","childType":"string"},"id":2,"name":"preferredLanguages"} -]}},{"type":"update","content":{ -"name":"UserTimeZoneChanged", -"header":216, -"doc":[ -"User TimeZone changed",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"timeZone","category":"full","description":" User's new time zone in TZ format"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"timeZone"} -]}},{"type":"update","content":{ -"name":"UserBotCommandsChanged", -"header":217, -"doc":[ -"Update about bot commands changed",{"type":"reference","argument":"uid","category":"full","description":" User's Id"},{"type":"reference","argument":"commands","category":"full","description":" New List of commands"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":2,"name":"commands"} -]}},{"type":"update","content":{ -"name":"UserExtChanged", -"header":218, -"doc":[ -"Update about user ext changed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"ext","category":"full","description":" New Ext Value in User (NOT FullUser) object."}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} -]}},{"type":"update","content":{ -"name":"UserFullExtChanged", -"header":219, -"doc":[ -"Update about user ext changed",{"type":"reference","argument":"uid","category":"full","description":" User's Id"},{"type":"reference","argument":"ext","category":"full","description":" New Ext Value in FullUser (NOT User) object."}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":3,"name":"ext"} -]}},{"type":"rpc","content":{ -"name":"LoadFullUsers", -"header":2649, -"response":{"type":"anonymous","header":2650, "doc":[ -{"type":"reference","argument":"fullUsers","category":"compact","description":" Loaded users"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"FullUser"}},"id":1,"name":"fullUsers"} -]}, -"doc":[ -"Loading Full User information",{"type":"reference","argument":"userPeers","category":"compact","description":"User's peers to load. Should be non-empy"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"userPeers"} -]}}]}, { - "title": "Profile", - "package": "profile", - "items": [ -{"type":"rpc","content":{ -"name":"EditName", -"header":53, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Changing account's name",{"type":"reference","argument":"name","category":"full","description":"New name"}],"attributes":[ -{"type":"string","id":1,"name":"name"} -]}},{"type":"rpc","content":{ -"name":"EditNickName", -"header":205, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Changing account's nickname",{"type":"reference","argument":"nickname","category":"full","description":"New Nickname"}],"attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"nickname"} -]}},{"type":"rpc","content":{ -"name":"CheckNickName", -"header":206, -"response":{"type":"reference","name":"Bool"}, -"doc":[ -"Checking availability of nickname",{"type":"reference","argument":"nickname","category":"full","description":"Nickname for checking"}],"attributes":[ -{"type":"string","id":1,"name":"nickname"} -]}},{"type":"rpc","content":{ -"name":"EditAbout", -"header":212, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Changing about information",{"type":"reference","argument":"about","category":"full","description":"new about information"}],"attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"about"} -]}},{"type":"rpc","content":{ -"name":"EditAvatar", -"header":31, -"response":{"type":"anonymous","header":103, "doc":[ -"Response for change account avatar",{"type":"reference","argument":"avatar","category":"full","description":" New avatar"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"}] ,"attributes":[{"type":{"type":"struct","childType":"Avatar"},"id":1,"name":"avatar"} -,{"type":"int32","id":2,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -]}, -"doc":[ -"Changing account's avatar",{"type":"reference","argument":"fileLocation","category":"compact","description":"File Location of uploaded unencrypted avatar"}],"attributes":[ -{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} -]}},{"type":"rpc","content":{ -"name":"RemoveAvatar", -"header":91, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Removing account's avatar"],"attributes":[ -]}},{"type":"rpc","content":{ -"name":"EditMyTimeZone", -"header":144, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Updating user's time zone",{"type":"reference","argument":"tz","category":"full","description":"New Time Zone"}],"attributes":[ -{"type":"string","id":1,"name":"tz"} -]}},{"type":"rpc","content":{ -"name":"EditMyPreferredLanguages", -"header":145, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Changing preffered languages",{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preffered Languages"}],"attributes":[ -{"type":{"type":"list","childType":"string"},"id":1,"name":"preferredLanguages"} -]}}]}, { - "title": "Contacts", - "package": "contacts", - "doc": [ - "Before working with contact list is is useful to import contacts from phone first by calling", - "method ImportContacts#0x07.", - "", - "All phone numbers MUST be preprocessed before import by some library (like libphonenumber)", - "and build international phone number depending on current users phone and/or locale.", - "", - "For loading contact list from server use GetContacts#0x57.", - "If during this call there are some updates about contact list change", - "it is recommended to call it again. Also applications need to sync contacts on application start.", - "", - "For searching for users without adding to contacts list use method FindContacts#0x70.", - "", - "For adding/deleting contacts AddContact#0x72 and DeleteContact#0x59." - ], - "items": [ - { - "type":"struct", - "content": { - "name":"PhoneToImport", -"doc":[ -"Phone for import",{"type":"reference","argument":"phoneNumber","category":"full","description":" phone number for import in international format"},{"type":"reference","argument":"name","category":"full","description":" optional name for contact"}],"attributes":[ -{"type":"int64","id":1,"name":"phoneNumber"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} -]}}, { - "type":"struct", - "content": { - "name":"EmailToImport", -"doc":[ -"Email for import",{"type":"reference","argument":"email","category":"full","description":" email for importing"},{"type":"reference","argument":"name","category":"full","description":" optional name for contact"}],"attributes":[ -{"type":"string","id":1,"name":"email"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} -]}},{"type":"rpc","content":{ -"name":"ImportContacts", -"header":7, -"response":{"type":"anonymous","header":8, "doc":[ -"Imported contacts",{"type":"reference","argument":"users","category":"compact","description":" Imported users"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number if users are imported"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state if users are imported"},{"type":"reference","argument":"userPeers","category":"full","description":" Imported user peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} -,{"type":"int32","id":2,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} -]}, -"doc":[ -"Importing phones and emails for building contact list","Maximum amount of items for import per method call equals to 100.",{"type":"reference","argument":"phones","category":"compact","description":"Phones for import"},{"type":"reference","argument":"emails","category":"compact","description":"Emails for import"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"PhoneToImport"}},"id":1,"name":"phones"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EmailToImport"}},"id":2,"name":"emails"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} -]}},{"type":"empty"},{"type":"rpc","content":{ -"name":"GetContacts", -"header":87, -"response":{"type":"anonymous","header":88, "doc":[ -"Current contact list",{"type":"reference","argument":"users","category":"hidden","description":" User list if list is changed"},{"type":"reference","argument":"isNotChanged","category":"full","description":" is list changed"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} -,{"type":"bool","id":2,"name":"isNotChanged"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"userPeers"} -]}, -"doc":[ -"Getting current contact list","SHA256 hash of list of a comma-separated list of contact UIDs in ascending","order may be passed in contactsHash parameter.","If the contact list was not changed, isNotChanged will be true.",{"type":"reference","argument":"contactsHash","category":"full","description":"Hash of saved list in application"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":"string","id":1,"name":"contactsHash"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"RemoveContact", -"header":89, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Removing contact from contact list",{"type":"reference","argument":"uid","category":"full","description":"Contact's UID"},{"type":"reference","argument":"accessHash","category":"danger","description":"Contact's AccessHash"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":"int64","id":2,"name":"accessHash"} -]}},{"type":"rpc","content":{ -"name":"AddContact", -"header":114, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Adding contact to contact list",{"type":"reference","argument":"uid","category":"full","description":"Contact's UID"},{"type":"reference","argument":"accessHash","category":"danger","description":"Contact's AccessHash"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":"int64","id":2,"name":"accessHash"} -]}},{"type":"rpc","content":{ -"name":"SearchContacts", -"header":112, -"response":{"type":"anonymous","header":113, "doc":[ -"Founded users",{"type":"reference","argument":"users","category":"compact","description":" Founded users"},{"type":"reference","argument":"userPeers","category":"compact","description":" Founded users peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":2,"name":"userPeers"} -]}, -"doc":[ -"Searching contacts by user's query",{"type":"reference","argument":"request","category":"full","description":"Search query"}],"attributes":[ -{"type":"string","id":1,"name":"request"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} -]}},{"type":"empty"},{"type":"update","content":{ -"name":"ContactRegistered", -"header":5, -"doc":[ -"Update about contact registration",{"type":"reference","argument":"uid","category":"full","description":" contact's uid"},{"type":"reference","argument":"isSilent","category":"full","description":" is registration silent. If this value is true then don't show notification about registration"},{"type":"reference","argument":"date","category":"full","description":" date of registration"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":"bool","id":2,"name":"isSilent"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -]}},{"type":"update","content":{ -"name":"ContactsAdded", -"header":40, -"doc":[ -"Update about contacts added",{"type":"reference","argument":"uids","category":"compact","description":" added contacts"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"uids"} -]}},{"type":"update","content":{ -"name":"ContactsRemoved", -"header":41, -"doc":[ -"Update about contacts removed",{"type":"reference","argument":"uids","category":"compact","description":" removed contacts"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"uids"} -]}}]}, { - "title": "Privacy", - "package": "privacy", - "items": [ -{"type":"rpc","content":{ -"name":"BlockUser", -"header":2636, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Block User",{"type":"reference","argument":"peer","category":"full","description":"Peer for blocking"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"UnblockUser", -"header":2637, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Unblock User",{"type":"reference","argument":"peer","category":"full","description":"Peer for unblocking"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"LoadBlockedUsers", -"header":2638, -"response":{"type":"anonymous","header":2639, "doc":[ -{"type":"reference","argument":"userPeers","category":"full","description":" Blocked user peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"userPeers"} -]}, -"doc":[ -"Load Blocked Users"],"attributes":[ -]}},{"type":"update","content":{ -"name":"UserBlocked", -"header":2629, -"doc":[ -"Update about User Blocked",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -]}},{"type":"update","content":{ -"name":"UserUnblocked", -"header":2630, -"doc":[ -"Update about User Unblocked",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -]}}]}, { - "title": "Messaging", - "package": "messaging", - "doc": [ - "Actor can work with encrypted and plain messages in one conversation. For both types of messages API", - "contains a bit different methods. Also encrypted and plain messages have different schemes.", - "

Messages

", - "Message entity contains:", - "
    ", - "
  • PeerType - group chat or private
  • ", - "
  • PeerId - group or user id of conversation
  • ", - "
  • RandomId - unique id of message that generated by sender. In Encrypted messages random id is encrypted.
  • ", - "
  • Date - date of message (calculated on server)
  • ", - "
  • Content
  • ", - "
", - "

Message content

", - "Message can be one of three basic types of messages: Text Message, File Message and Service message.", - "All messages can contain extensions. For example we can send text message and add markdown extension with", - "formatted text in markdown and clients that support this extension will show markdown, and that clients that", - "not supported extension then show simple text. File messages can have photo, video or voice extensions.", - "Service message can have extensions extensions such as \"user added\", \"group created\", \"avatar changed\", etc.", - "

Send messages

", - "Sending messages looks same for encrypted and plain messages. Client MUST prepare all required data", - "before sending message (for example FastThumb for photo/video/documents) and call required methods.", - "Encrypted messages differs here only by a little different scheme and encryption.", - "

WRONG_KEYS and incorrect keys

", - "For sending encrypted messages client MUST send messages encrypted for all own and receivers keys.", - "If client send encryption with missing, old or incorrect keys it will receive WRONG_KEYS.", - "In WRONG_KEYS you need to deserialize relatedData from RpcError to WrongKeysErrorData", - "and get detailed information about keys. Sometimes there are some broken keys on server and client can't", - "encrypt messages with it than client MUST send empty encrypted key in request elsewhere API return WRONG_KEYS.", - "

Encrypted messages and New Devices

", - "When you send message to someone and when he registered with new device there are no way to receive old encrypted", - "messages on new device and because of this there are a problem about read/delivery statuses.", - "Alice send messages to Bob, but Bob lose his device and buy new iPhone and installed Actor.", - "Alice receive notification about new device and send another message. Bob open chat with Alice and", - "send read status with maximum message read date. Alice will mark all sent messages as read and one that", - "was not delivered. We can use status notifications per message, but in VERY heavy conversations it will be", - "a lot of unnecessary traffic. For resolving this small issue we have different ways of message statuses", - "for encrypted and plain messages. Also it is recomended to mark all undelivered messages on new device update as", - "not devered with warring sign.", - "

Message Read and Delivery

", - "There are two different ways for read and delivery statuses for encrypted and plain messages.", - "For encrypted messages used status change by RandomId and for plain messages used by maximum", - "date of read/delivered message." - ], - "items": [ - { - "type":"struct", - "content": { - "name":"MessageAttributes", -"doc":[ -"Message Attributes",{"type":"reference","argument":"isMentioned","category":"full","description":" Is mentioned. If set overrides built-in value."},{"type":"reference","argument":"isHighlighted","category":"full","description":" Is message highlighted. Default is false."},{"type":"reference","argument":"isNotified","category":"full","description":" Is notified. If set overrides built-in settings."},{"type":"reference","argument":"isOnlyForYou","category":"full","description":" If this message is only for you. Default is false"}],"attributes":[ -{"type":{"type":"opt","childType":"bool"},"id":1,"name":"isMentioned"} -,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isHighlighted"} -,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isNotified"} -,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isOnlyForYou"} -]}}, { - "type":"struct", - "content": { - "name":"QuotedMessage", -"doc":[ -"Quoted Message",{"type":"reference","argument":"messageId","category":"full","description":" Message Id if present"},{"type":"reference","argument":"publicGroupId","category":"full","description":" Public Group id if present"},{"type":"reference","argument":"senderUserId","category":"full","description":" Sender of message"},{"type":"reference","argument":"messageDate","category":"full","description":" Date of message"},{"type":"reference","argument":"quotedMessageContent","category":"full","description":" Optional Quoted Message Content. Can be empty if messageId is present and message is in current peer."}],"attributes":[ -{"type":{"type":"opt","childType":{"type":"alias","childType":"randomId"}},"id":1,"name":"messageId"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"groupId"}},"id":2,"name":"publicGroupId"} -,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"senderUserId"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"messageDate"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"Message"}},"id":5,"name":"quotedMessageContent"} -]}},{"type":"trait","content":{ -"isContainer":"true","name":"Message","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"TextMessage", -"doc":[ -"Text message",{"type":"reference","argument":"text","category":"danger","description":" the text"},{"type":"reference","argument":"mentions","category":"full","description":" User mentions in message"},{"type":"reference","argument":"ext","category":"full","description":" Optional bytes of extension"}],"trait":{"name":"Message","key":1},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"text"} -,{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"mentions"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"TextMessageEx"}},"id":3,"name":"ext"} -]}},{"type":"trait","content":{ -"isContainer":"true","name":"TextMessageEx","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"TextExMarkdown", -"doc":[ -"Markdown extension",{"type":"reference","argument":"markdown","category":"full","description":" Markdown text"}],"trait":{"name":"TextMessageEx","key":1},"expandable":"true","attributes":[ -{"type":"string","id":2,"name":"markdown"} -]}}, { - "type":"struct", - "content": { - "name":"TextModernMessage", -"doc":[ -"Modern text message",{"type":"reference","argument":"text","category":"full","description":" optional text of message"},{"type":"reference","argument":"senderNameOverride","category":"full","description":" optional overriding of sender"},{"type":"reference","argument":"senderPhotoOverride","category":"full","description":" optional overriding sender's photo"},{"type":"reference","argument":"style","category":"full","description":" optional paragraph style"},{"type":"reference","argument":"attaches","category":"full","description":" optional Attaches of message"}],"trait":{"name":"TextMessageEx","key":2},"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"text"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"senderNameOverride"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":3,"name":"senderPhotoOverride"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ParagraphStyle"}},"id":4,"name":"style"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"TextModernAttach"}},"id":5,"name":"attaches"} -]}}, { - "type":"struct", - "content": { - "name":"ParagraphStyle", -"doc":[ -"Paragraph style",{"type":"reference","argument":"showParagraph","category":"full","description":" Show quote-like paragraph?"},{"type":"reference","argument":"paragraphColor","category":"full","description":" Override paragraph color"},{"type":"reference","argument":"bgColor","category":"full","description":" Override background color"}],"attributes":[ -{"type":{"type":"opt","childType":"bool"},"id":1,"name":"showParagraph"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"Color"}},"id":2,"name":"paragraphColor"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"Color"}},"id":3,"name":"bgColor"} -]}}, { - "type":"struct", - "content": { - "name":"TextModernAttach", -"doc":[ -"Attaches to message",{"type":"reference","argument":"title","category":"full","description":" Attach of message"},{"type":"reference","argument":"titleUrl","category":"full","description":" Attach title url"},{"type":"reference","argument":"titleIcon","category":"full","description":" Attach title icon"},{"type":"reference","argument":"text","category":"full","description":" Attach text"},{"type":"reference","argument":"style","category":"full","description":" Attach style"}],"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"title"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"titleUrl"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":3,"name":"titleIcon"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"text"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ParagraphStyle"}},"id":5,"name":"style"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"TextModernField"}},"id":6,"name":"fields"} -]}}, { - "type":"struct", - "content": { - "name":"TextModernField", -"doc":[ -"Modern message fields",{"type":"reference","argument":"title","category":"full","description":" Field title"},{"type":"reference","argument":"value","category":"full","description":" Field value"},{"type":"reference","argument":"isShort","category":"full","description":" Is field can be shown in compact way (default is TRUE)"}],"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"title"} -,{"type":"string","id":2,"name":"value"} -,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isShort"} -]}}, { - "type":"struct", - "content": { - "name":"TextCommand", -"doc":[ -"Text Command Message for bots",{"type":"reference","argument":"command","category":"full","description":" Slash-Command For execution"},{"type":"reference","argument":"args","category":"full","description":" Arguments of slash command"}],"trait":{"name":"TextMessageEx","key":3},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"command"} -,{"type":"string","id":2,"name":"args"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceMessage", -"doc":[ -"Service message",{"type":"reference","argument":"text","category":"full","description":" service message text"},{"type":"reference","argument":"ext","category":"compact","description":" Extension"}],"trait":{"name":"Message","key":2},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"text"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"ServiceEx"}},"id":3,"name":"ext"} -]}},{"type":"trait","content":{ -"isContainer":"true","name":"ServiceEx","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"ServiceExUserInvited", -"doc":[ -"Service message about adding user to group",{"type":"reference","argument":"invitedUid","category":"full","description":" added user id"}],"trait":{"name":"ServiceEx","key":1},"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"invitedUid"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExUserJoined", -"doc":[ -"Service message about user join to group"],"trait":{"name":"ServiceEx","key":17},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"ServiceExUserKicked", -"doc":[ -"Service message about kicking user from group",{"type":"reference","argument":"kickedUid","category":"full","description":" kicked user id"}],"trait":{"name":"ServiceEx","key":2},"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"kickedUid"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExUserLeft", -"doc":[ -"Service message about user left group"],"trait":{"name":"ServiceEx","key":3},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"ServiceExGroupCreated", -"doc":[ -"Service message about group creating"],"trait":{"name":"ServiceEx","key":4},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"ServiceExChangedTitle", -"doc":[ -"Service message about group title change",{"type":"reference","argument":"title","category":"full","description":" New group title"}],"trait":{"name":"ServiceEx","key":5},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"title"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExChangedTopic", -"doc":[ -"Service message on group topic change",{"type":"reference","argument":"topic","category":"full","description":" New group topic"}],"trait":{"name":"ServiceEx","key":18},"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"topic"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExChangedAbout", -"doc":[ -"Service message on group about change",{"type":"reference","argument":"about","category":"full","description":" New group about"}],"trait":{"name":"ServiceEx","key":19},"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"about"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExChangedAvatar", -"doc":[ -"Service message about avatar change",{"type":"reference","argument":"avatar","category":"compact","description":" Updated avatar"}],"trait":{"name":"ServiceEx","key":6},"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":1,"name":"avatar"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExContactRegistered", -"doc":[ -"Service message about user registration",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"trait":{"name":"ServiceEx","key":8},"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExPhoneMissed", -"doc":[ -"Update about missing phone call"],"trait":{"name":"ServiceEx","key":9},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"ServiceExPhoneCall", -"doc":[ -"Update about phone call",{"type":"reference","argument":"duration","category":"full","description":" Duration of a phone call"}],"trait":{"name":"ServiceEx","key":16},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"duration"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExChatArchived", -"doc":[ -"Message about chat archived"],"trait":{"name":"ServiceEx","key":20},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"ServiceExChatRestored", -"doc":[ -"Message about chat restored"],"trait":{"name":"ServiceEx","key":21},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"DocumentMessage", -"doc":[ -"File message",{"type":"reference","argument":"fileId","category":"full","description":" file id"},{"type":"reference","argument":"accessHash","category":"danger","description":" file access hash"},{"type":"reference","argument":"fileSize","category":"full","description":" file size"},{"type":"reference","argument":"name","category":"full","description":" name of file"},{"type":"reference","argument":"mimeType","category":"full","description":" mimetype of file"},{"type":"reference","argument":"thumb","category":"compact","description":" optional thumb of file. JPEG less that 90x90 with 60-70 quality."},{"type":"reference","argument":"ext","category":"compact","description":" Extension"}],"trait":{"name":"Message","key":3},"expandable":"true","attributes":[ -{"type":"int64","id":1,"name":"fileId"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":"int32","id":3,"name":"fileSize"} -,{"type":"string","id":4,"name":"name"} -,{"type":"string","id":5,"name":"mimeType"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"FastThumb"}},"id":6,"name":"thumb"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"DocumentEx"}},"id":8,"name":"ext"} -]}},{"type":"trait","content":{ -"isContainer":"true","name":"DocumentEx","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"DocumentExPhoto", -"doc":[ -"File photo extension. Can be set ONLY for JPEG.",{"type":"reference","argument":"w","category":"full","description":" image width"},{"type":"reference","argument":"h","category":"full","description":" image height"}],"trait":{"name":"DocumentEx","key":1},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"w"} -,{"type":"int32","id":2,"name":"h"} -]}}, { - "type":"struct", - "content": { - "name":"DocumentExVideo", -"doc":[ -"File video extension",{"type":"reference","argument":"w","category":"full","description":" video width"},{"type":"reference","argument":"h","category":"full","description":" video height"},{"type":"reference","argument":"duration","category":"full","description":" video duration"}],"trait":{"name":"DocumentEx","key":2},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"w"} -,{"type":"int32","id":2,"name":"h"} -,{"type":"int32","id":3,"name":"duration"} -]}}, { - "type":"struct", - "content": { - "name":"DocumentExVoice", -"doc":[ -"File voice extension",{"type":"reference","argument":"duration","category":"full","description":" voice duration"}],"trait":{"name":"DocumentEx","key":3},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"duration"} -]}}, { - "type":"struct", - "content": { - "name":"DocumentExAnimation", -"doc":[ -"Animation extension. Can be set ONLY for GIF.",{"type":"reference","argument":"w","category":"full","description":" Animation width"},{"type":"reference","argument":"h","category":"full","description":" Animation height"}],"trait":{"name":"DocumentEx","key":6},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"w"} -,{"type":"int32","id":2,"name":"h"} -]}}, { - "type":"struct", - "content": { - "name":"DocumentExAnimationVid", -"doc":[ -"Animation video extension. More compact version of Animation with video codec instead of GIF.","Can be set ONLY for MP4.",{"type":"reference","argument":"w","category":"full","description":" Animation width"},{"type":"reference","argument":"h","category":"full","description":" Animation height"},{"type":"reference","argument":"duration","category":"full","description":" Animation duration"}],"trait":{"name":"DocumentEx","key":7},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"w"} -,{"type":"int32","id":2,"name":"h"} -,{"type":"int32","id":3,"name":"duration"} -]}}, { - "type":"struct", - "content": { - "name":"JsonMessage", -"doc":[ -"Custom-data JsonMessage",{"type":"reference","argument":"rawJson","category":"danger","description":" JSON object"}],"trait":{"name":"Message","key":4},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"rawJson"} -]}}, { - "type":"struct", - "content": { - "name":"UnsupportedMessage", -"doc":[ -"Explicit type for unsupported message"],"trait":{"name":"Message","key":5},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"StickerMessage", -"doc":[ -"Sticker message",{"type":"reference","argument":"stickerId","category":"full","description":" Optional Unique ID of sticker"},{"type":"reference","argument":"fastPreview","category":"full","description":" Optional Fast preview of sticker in webp format"},{"type":"reference","argument":"image512","category":"full","description":" Optional 512x512 sticker image in webp format"},{"type":"reference","argument":"image256","category":"full","description":" Optional 256x256 sticker image in webp format"},{"type":"reference","argument":"stickerCollectionId","category":"full","description":" Optional Collection ID"},{"type":"reference","argument":"stickerCollectionAccessHash","category":"full","description":" Optional Collection Access Hash"}],"trait":{"name":"Message","key":6},"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":"int32"},"id":1,"name":"stickerId"} -,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"fastPreview"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":3,"name":"image512"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":4,"name":"image256"} -,{"type":{"type":"opt","childType":"int32"},"id":5,"name":"stickerCollectionId"} -,{"type":{"type":"opt","childType":"int64"},"id":6,"name":"stickerCollectionAccessHash"} -]}}, { - "type":"struct", - "content": { - "name":"BinaryMessage", -"doc":[ -"Binary Message. Useful for implementing your own content types",{"type":"reference","argument":"contentTag","category":"full","description":" Content Tag"},{"type":"reference","argument":"msg","category":"compact","description":" Message contents"}],"trait":{"name":"Message","key":7},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"contentTag"} -,{"type":"bytes","id":2,"name":"msg"} -]}}, { - "type":"struct", - "content": { - "name":"EncryptedMessage", -"doc":[ -"Encrypted Message",{"type":"reference","argument":"box","category":"full","description":" Encrypted box"}],"trait":{"name":"Message","key":8},"expandable":"true","attributes":[ -{"type":{"type":"struct","childType":"EncryptedBox"},"id":1,"name":"box"} -]}}, { - "type":"struct", - "content": { - "name":"EmptyMessage", -"doc":[ -"Empty Message"],"trait":{"name":"Message","key":9},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"DialogShort", -"doc":[ -"Short Dialog from grouped conversation list",{"type":"reference","argument":"peer","category":"full","description":" Peer of conversation"},{"type":"reference","argument":"counter","category":"full","description":" Conversation unread count"},{"type":"reference","argument":"date","category":"full","description":" Conversation top message date"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":"int32","id":2,"name":"counter"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}}, { - "type":"struct", - "content": { - "name":"DialogGroup", -"doc":[ -"Grouped dialog list",{"type":"reference","argument":"title","category":"full","description":" Title of group"},{"type":"reference","argument":"key","category":"full","description":" Key of group"},{"type":"reference","argument":"dialogs","category":"full","description":" Conversations in group"}],"attributes":[ -{"type":"string","id":1,"name":"title"} -,{"type":"string","id":2,"name":"key"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"DialogShort"}},"id":3,"name":"dialogs"} -]}}, { - "type":"struct", - "content": { - "name":"MessageReaction", -"doc":[ -"Reaction to message",{"type":"reference","argument":"users","category":"full","description":" User's reaction"},{"type":"reference","argument":"code","category":"full","description":" Reaction EMOJI code"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"users"} -,{"type":"string","id":2,"name":"code"} -]}}, { - "type":"struct", - "content": { - "name":"MessageOutReference", -"doc":[ -"Message Out Reference",{"type":"reference","argument":"peer","category":"full","description":" Out Peer of message"},{"type":"reference","argument":"rid","category":"full","description":" Message random id"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -]}},{"type":"rpc","content":{ -"name":"SendMessage", -"header":92, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Sending plain message",{"type":"reference","argument":"peer","category":"full","description":"Destination peer for message"},{"type":"reference","argument":"rid","category":"full","description":"Message random id (generated on client side)"},{"type":"reference","argument":"message","category":"full","description":"The message"},{"type":"reference","argument":"isOnlyForUser","category":"full","description":"If message is shown only for specific user"},{"type":"reference","argument":"quotedMessageReference","category":"full","description":"Quoted message if present"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"rid"} -,{"type":{"type":"trait","childType":"Message"},"id":4,"name":"message"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":5,"name":"isOnlyForUser"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageOutReference"}},"id":6,"name":"quotedMessageReference"} -]}},{"type":"rpc","content":{ -"name":"UpdateMessage", -"header":2658, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Changing Message content",{"type":"reference","argument":"peer","category":"full","description":"Destination Peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"updatedMessage","category":"full","description":"Updated Message content"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"trait","childType":"Message"},"id":3,"name":"updatedMessage"} -]}},{"type":"rpc","content":{ -"name":"MessageReceived", -"header":55, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Confirmation of plain message receive by device",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"date","category":"full","description":"Maximum date of received messages"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -]}},{"type":"rpc","content":{ -"name":"MessageRead", -"header":57, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Marking plain messages as read",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"date","category":"full","description":"Maximum date of read messages"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -]}},{"type":"rpc","content":{ -"name":"DeleteMessage", -"header":98, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Deleting messages",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rids","category":"full","description":"Message random id"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":3,"name":"rids"} -]}},{"type":"rpc","content":{ -"name":"ClearChat", -"header":99, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Clearing of conversation (without removing dialog from dialogs list)",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"DeleteChat", -"header":100, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Deleting of conversation (also leave group for group conversations)",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"ArchiveChat", -"header":2654, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Archiving chat",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"MessageSetReaction", -"header":210, -"response":{"type":"reference","name":"ReactionsResponse"}, -"doc":[ -"Setting Message reaction",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"code","category":"full","description":"Reaction code"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":"string","id":3,"name":"code"} -]}},{"type":"rpc","content":{ -"name":"MessageRemoveReaction", -"header":220, -"response":{"type":"reference","name":"ReactionsResponse"}, -"doc":[ -"Removing Message reaction",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"code","category":"full","description":"Reaction code"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":"string","id":3,"name":"code"} -]}},{"type":"response","content":{ -"name":"ReactionsResponse", -"header":219, -"doc":[ -"Response for reactions change"],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":3,"name":"reactions"} -]}},{"type":"update","content":{ -"name":"Message", -"header":55, -"doc":[ -"Update about plain message",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"senderUid","category":"full","description":" Sender of message"},{"type":"reference","argument":"date","category":"full","description":" date of message"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"message","category":"full","description":" message content"},{"type":"reference","argument":"attributes","category":"full","description":" optional message attributes"},{"type":"reference","argument":"quotedMessage","category":"full","description":" optional quoted message"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"senderUid"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"message"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":6,"name":"attributes"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":7,"name":"quotedMessage"} -]}},{"type":"update","content":{ -"name":"MessageContentChanged", -"header":162, -"doc":[ -"Update about message change",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"message","category":"full","description":" Message content"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"trait","childType":"Message"},"id":3,"name":"message"} -]}},{"type":"update","content":{ -"name":"MessageQuotedChanged", -"header":169, -"doc":[ -"Update about quoted message changed",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"quotedMessage","category":"full","description":" Quoted Message"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":3,"name":"quotedMessage"} -]}},{"type":"update","content":{ -"name":"MessageDateChanged", -"header":163, -"doc":[ -"Update about message date changed",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -]}},{"type":"update","content":{ -"name":"MessageSent", -"header":4, -"doc":[ -"Update about message sent",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -]}},{"type":"update","content":{ -"name":"MessageReceived", -"header":54, -"doc":[ -"Update about message received",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of received message"},{"type":"reference","argument":"receivedDate","category":"full","description":" Date of receive"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"receivedDate"} -]}},{"type":"update","content":{ -"name":"MessageRead", -"header":19, -"doc":[ -"Update about message read",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of read message"},{"type":"reference","argument":"readDate","category":"full","description":" Date of read"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"readDate"} -]}},{"type":"update","content":{ -"name":"MessageReadByMe", -"header":50, -"doc":[ -"Update about message read by me",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of read message"},{"type":"reference","argument":"unreadCounter","category":"full","description":" Optional unread counter in conversation"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} -,{"type":{"type":"opt","childType":"int32"},"id":3,"name":"unreadCounter"} -]}},{"type":"update","content":{ -"name":"MessageDelete", -"header":46, -"doc":[ -"Update about message delete",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rids","category":"full","description":" Deleted messages"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"rids"} -]}},{"type":"update","content":{ -"name":"ChatClear", -"header":47, -"doc":[ -"Update about chat clear",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -]}},{"type":"update","content":{ -"name":"ChatDelete", -"header":48, -"doc":[ -"Update about chat delete",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -]}},{"type":"update","content":{ -"name":"ChatArchive", -"header":94, -"doc":[ -"Update about chat archive",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -]}},{"type":"update","content":{ -"name":"ChatDropCache", -"header":2690, -"doc":[ -"Update about cache drop",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -]}},{"type":"update","content":{ -"name":"ChatGroupsChanged", -"header":1, -"doc":[ -"Update about chat groups changed. Called only when adding, removing and reordering of grouped dialog.",{"type":"reference","argument":"dialogs","category":"compact","description":" New dialgos list"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":1,"name":"dialogs"} -]}},{"type":"update","content":{ -"name":"ReactionsUpdate", -"header":222, -"doc":[ -"Update about reactions change",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Message random id"},{"type":"reference","argument":"reactions","category":"full","description":" New Reactions"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":3,"name":"reactions"} -]}}, { - "type": "enum", - "content": { - "name": "MessageState", - "values": [ - { - "name": "Sent", - "id": 1 - }, - { - "name": "Received", - "id": 2 - }, - { - "name": "Read", - "id": 3 + }, + "id": 4, + "name": "userPeers" + }] + }, + "doc": [ + "Importing phones and emails for building contact list", "Maximum amount of items for import per method call equals to 100.", { + "type": "reference", + "argument": "phones", + "category": "compact", + "description": "Phones for import" + }, { + "type": "reference", + "argument": "emails", + "category": "compact", + "description": "Emails for import" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "PhoneToImport" + } + }, + "id": 1, + "name": "phones" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EmailToImport" + } + }, + "id": 2, + "name": "emails" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 3, + "name": "optimizations" + }] + } + }, { + "type": "empty" + }, { + "type": "rpc", + "content": { + "name": "GetContacts", + "header": 87, + "response": { + "type": "anonymous", + "header": 88, + "doc": [ + "Current contact list", { + "type": "reference", + "argument": "users", + "category": "hidden", + "description": " User list if list is changed" + }, { + "type": "reference", + "argument": "isNotChanged", + "category": "full", + "description": " is list changed" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" } - ] - } - }, { - "type":"struct", - "content": { - "name":"MessageContainer", -"doc":[ -"Message from history",{"type":"reference","argument":"senderUid","category":"full","description":" Sender of mesasge"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"},{"type":"reference","argument":"message","category":"full","description":" Content of message"},{"type":"reference","argument":"reactions","category":"full","description":" Message reactions"},{"type":"reference","argument":"attribute","category":"full","description":" Optional message attributes"},{"type":"reference","argument":"quotedMessage","category":"full","description":" Optional quoted Message"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"senderUid"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"message"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"MessageState"}},"id":6,"name":"state"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":7,"name":"reactions"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":8,"name":"attribute"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":9,"name":"quotedMessage"} -]}}, { - "type": "enum", - "content": { - "name": "ListLoadMode", - "values": [ - { - "name": "Forward", - "id": 1 - }, - { - "name": "Backward", - "id": 2 - }, - { - "name": "Both", - "id": 3 + }, + "id": 1, + "name": "users" + }, { + "type": "bool", + "id": 2, + "name": "isNotChanged" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" } - ] - } - },{"type":"rpc","content":{ -"name":"LoadHistory", -"header":118, -"response":{"type":"anonymous","header":119, "doc":[ -"Loaded history",{"type":"reference","argument":"history","category":"compact","description":" Messages"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":1,"name":"history"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupPeers"} -]}, -"doc":[ -"Loading history of chat",{"type":"reference","argument":"peer","category":"full","description":"Peer of conversation"},{"type":"reference","argument":"date","category":"full","description":"start date of messages for loading or 0 for loading from start"},{"type":"reference","argument":"loadMode","category":"full","description":"Loading mode: Forward loading, backward or both ways"},{"type":"reference","argument":"limit","category":"full","description":"maximum amount of messages (max is 100)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"ListLoadMode"}},"id":5,"name":"loadMode"} -,{"type":"int32","id":4,"name":"limit"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":6,"name":"optimizations"} -]}}, { - "type":"struct", - "content": { - "name":"Dialog", -"doc":[ -"Conversation from history",{"type":"reference","argument":"peer","category":"full","description":" Peer of conversation"},{"type":"reference","argument":"unreadCount","category":"full","description":" plain messages unread messages count"},{"type":"reference","argument":"sortDate","category":"full","description":" date of conversation for sorting"},{"type":"reference","argument":"senderUid","category":"full","description":" Sender of top message (may be zero)"},{"type":"reference","argument":"rid","category":"full","description":" Random ID of top message (may be zero)"},{"type":"reference","argument":"date","category":"full","description":" Date of top message (can't be zero)"},{"type":"reference","argument":"message","category":"full","description":" Content of message"},{"type":"reference","argument":"firstUnreadDate","category":"full","description":" Date of first unread message"},{"type":"reference","argument":"attributes","category":"full","description":" Optional top message attributes"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":"int32","id":3,"name":"unreadCount"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"sortDate"} -,{"type":{"type":"alias","childType":"userId"},"id":5,"name":"senderUid"} -,{"type":{"type":"alias","childType":"randomId"},"id":6,"name":"rid"} -,{"type":{"type":"alias","childType":"date"},"id":7,"name":"date"} -,{"type":{"type":"trait","childType":"Message"},"id":8,"name":"message"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"MessageState"}},"id":9,"name":"state"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"date"}},"id":10,"name":"firstUnreadDate"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":11,"name":"attributes"} -]}},{"type":"rpc","content":{ -"name":"LoadDialogs", -"header":104, -"response":{"type":"anonymous","header":105, "doc":[ -"Loaded dialogs",{"type":"reference","argument":"groups","category":"compact","description":" Loaded groups"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"dialogs","category":"compact","description":" Loaded dialogs"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Dialog"}},"id":3,"name":"dialogs"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":5,"name":"groupPeers"} -]}, -"doc":[ -"Loading conversation history",{"type":"reference","argument":"minDate","category":"full","description":"start date of conversation loading. Use 0 to load latest messages"},{"type":"reference","argument":"limit","category":"full","description":"limit maximum amount of messages (max is 100)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":{"type":"alias","childType":"date"},"id":1,"name":"minDate"} -,{"type":"int32","id":2,"name":"limit"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"LoadArchived", -"header":2651, -"response":{"type":"anonymous","header":2652, "doc":[ -"Archived dialogs",{"type":"reference","argument":"groups","category":"full","description":" Referenced groups"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"dialogs","category":"full","description":" Archived dialogs"},{"type":"reference","argument":"nextOffset","category":"compact","description":" Offset for next bunch"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Dialog"}},"id":3,"name":"dialogs"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupPeers"} -,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"nextOffset"} -]}, -"doc":[ -"Loading archived messages",{"type":"reference","argument":"nextOffset","category":"compact","description":"Optional next offset"},{"type":"reference","argument":"limit","category":"full","description":"Maximum number of elements"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":{"type":"opt","childType":"bytes"},"id":1,"name":"nextOffset"} -,{"type":"int32","id":2,"name":"limit"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"LoadGroupedDialogs", -"header":225, -"response":{"type":"anonymous","header":226, "doc":[ -"Loaded grouped dialogs",{"type":"reference","argument":"dialogs","category":"compact","description":" Loaded groups of dialogs"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"groups","category":"full","description":" Loaded groups"},{"type":"reference","argument":"showArchived","category":"full","description":" Show archived section"},{"type":"reference","argument":"showInvite","category":"full","description":" Show invite message"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":1,"name":"dialogs"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} -,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"showArchived"} -,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"showInvite"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":6,"name":"userPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":7,"name":"groupPeers"} -]}, -"doc":[ -"Load all dialogs from grouped list"],"attributes":[ -{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":1,"name":"optimizations"} -]}},{"type":"response","content":{ -"name":"DialogsOrder", -"header":235, -"doc":[ -"Dialogs order response",{"type":"reference","argument":"seq","category":"full","description":" update seq"},{"type":"reference","argument":"state","category":"full","description":" update state"},{"type":"reference","argument":"groups","category":"full","description":" Update groups"}],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":3,"name":"groups"} -]}},{"type":"rpc","content":{ -"name":"HideDialog", -"header":231, -"response":{"type":"reference","name":"DialogsOrder"}, -"doc":[ -"Hide Dialog from grouped list",{"type":"reference","argument":"peer","category":"full","description":"Dialog peer"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"ShowDialog", -"header":232, -"response":{"type":"reference","name":"DialogsOrder"}, -"doc":[ -"Show Dialog in grouped list"],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"FavouriteDialog", -"header":224, -"response":{"type":"reference","name":"DialogsOrder"}, -"doc":[ -"Marking dialog as favourite",{"type":"reference","argument":"peer","category":"full","description":"Peer for favouriting"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"UnfavouriteDialog", -"header":227, -"response":{"type":"reference","name":"DialogsOrder"}, -"doc":[ -"Making dialog as unfavourite",{"type":"reference","argument":"peer","category":"full","description":"Peer for favouriting"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"NotifyDialogOpened", -"header":2785, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Notifying about dialog open",{"type":"reference","argument":"peer","category":"full","description":"Peer that was opened"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}}]}, { - "title": "Groups", - "package": "groups", - "items": [ -{"type":"comment","content":"Entities"}, { - "type":"struct", - "content": { - "name":"Member", -"doc":[ -"Member information",{"type":"reference","argument":"uid","category":"full","description":" User id"},{"type":"reference","argument":"inviterUid","category":"full","description":" User inviter id"},{"type":"reference","argument":"date","category":"full","description":" Adding date"},{"type":"reference","argument":"isAdmin","category":"full","description":" is member admin of group"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"inviterUid"} -,{"type":"int64","id":3,"name":"date"} -,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isAdmin"} -]}}, { - "type": "enum", - "content": { - "name": "GroupType", - "values": [ - { - "name": "GROUP", - "id": 1 - }, - { - "name": "CHANNEL", - "id": 2 + }, + "id": 3, + "name": "userPeers" + }] + }, + "doc": [ + "Getting current contact list", "SHA256 hash of list of a comma-separated list of contact UIDs in ascending", "order may be passed in contactsHash parameter.", "If the contact list was not changed, isNotChanged will be true.", { + "type": "reference", + "argument": "contactsHash", + "category": "full", + "description": "Hash of saved list in application" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "contactsHash" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 2, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RemoveContact", + "header": 89, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Removing contact from contact list", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": "Contact's UID" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": "Contact's AccessHash" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "rpc", + "content": { + "name": "AddContact", + "header": 114, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Adding contact to contact list", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": "Contact's UID" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": "Contact's AccessHash" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SearchContacts", + "header": 112, + "response": { + "type": "anonymous", + "header": 113, + "doc": [ + "Founded users", { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Founded users" + }, { + "type": "reference", + "argument": "userPeers", + "category": "compact", + "description": " Founded users peers" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" } - ] - } - }, { - "type": "enum", - "content": { - "name": "GroupPermissions", - "values": [ - { - "name": "SEND_MESSAGE", - "id": 1 - }, - { - "name": "CLEAR", - "id": 2 - }, - { - "name": "LEAVE", - "id": 3 - }, - { - "name": "DELETE", - "id": 4 - }, - { - "name": "JOIN", - "id": 5 - }, - { - "name": "VIEW_INFO", - "id": 6 + }, + "id": 1, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" } - ] - } - }, { - "type": "enum", - "content": { - "name": "GroupFullPermissions", - "values": [ - { - "name": "EDIT_INFO", - "id": 1 - }, - { - "name": "VIEW_MEMBERS", - "id": 2 - }, - { - "name": "INVITE_MEMBERS", - "id": 3 - }, - { - "name": "INVITE_VIA_LINK", - "id": 4 - }, - { - "name": "CALL", - "id": 5 - }, - { - "name": "EDIT_ADMIN_SETTINGS", - "id": 6 - }, - { - "name": "VIEW_ADMINS", - "id": 7 - }, - { - "name": "EDIT_ADMINS", - "id": 8 - }, - { - "name": "KICK_INVITED", - "id": 9 - }, - { - "name": "KICK_ANYONE", - "id": 10 - }, - { - "name": "EDIT_FOREIGN", - "id": 11 - }, - { - "name": "DELETE_FOREIGN", - "id": 12 + }, + "id": 2, + "name": "userPeers" + }] + }, + "doc": [ + "Searching contacts by user's query", { + "type": "reference", + "argument": "request", + "category": "full", + "description": "Search query" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "request" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 2, + "name": "optimizations" + }] + } + }, { + "type": "empty" + }, { + "type": "update", + "content": { + "name": "ContactRegistered", + "header": 5, + "doc": [ + "Update about contact registration", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " contact's uid" + }, { + "type": "reference", + "argument": "isSilent", + "category": "full", + "description": " is registration silent. If this value is true then don't show notification about registration" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " date of registration" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": "bool", + "id": 2, + "name": "isSilent" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }] + } + }, { + "type": "update", + "content": { + "name": "ContactsAdded", + "header": 40, + "doc": [ + "Update about contacts added", { + "type": "reference", + "argument": "uids", + "category": "compact", + "description": " added contacts" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 1, + "name": "uids" + }] + } + }, { + "type": "update", + "content": { + "name": "ContactsRemoved", + "header": 41, + "doc": [ + "Update about contacts removed", { + "type": "reference", + "argument": "uids", + "category": "compact", + "description": " removed contacts" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 1, + "name": "uids" + }] + } + }] + }, { + "title": "Privacy", + "package": "privacy", + "items": [{ + "type": "rpc", + "content": { + "name": "BlockUser", + "header": 2636, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Block User", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Peer for blocking" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnblockUser", + "header": 2637, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Unblock User", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Peer for unblocking" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadBlockedUsers", + "header": 2638, + "response": { + "type": "anonymous", + "header": 2639, + "doc": [{ + "type": "reference", + "argument": "userPeers", + "category": "full", + "description": " Blocked user peers" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" } - ] - } - }, { - "type":"struct", - "content": { - "name":"Group", -"doc":[ -"Group information","","Permissions.","Permissions of this structure is about group messages operation, such as","ability to send messages, clear chat, leave group and so on. This operations","Can be held outside of the Group Info page.","","Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.","If default is TRUE then ONE == FALSE.","Bits:","0 - canSendMessage. Default is FALSE.","1 - canClear. Default is FALSE.","2 - canLeave. Default is FALSE.","3 - canDelete. Default is FALSE.","4 - canJoin. Default is FALSE.","5 - canViewInfo. Default is FALSE.","",{"type":"reference","argument":"id","category":"full","description":" group id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Access hash of group"},{"type":"reference","argument":"title","category":"full","description":" Title of group"},{"type":"reference","argument":"avatar","category":"compact","description":" Avatar of group"},{"type":"reference","argument":"membersCount","category":"full","description":" Number of members"},{"type":"reference","argument":"isHidden","category":"full","description":" Is group hidden (not showing it in recent list). Default is false."},{"type":"reference","argument":"isMember","category":"full","description":" Is current user a member of a group. Default is true."},{"type":"reference","argument":"groupType","category":"full","description":" Group Type. Used only for displaying information. Default is GROUP."},{"type":"reference","argument":"permissions","category":"full","description":" Permissions of group object"},{"type":"reference","argument":"isDeleted","category":"full","description":" Is this group deleted"},{"type":"reference","argument":"ext","category":"full","description":" Group extension Data"},{"type":"reference","argument":"isAdmin","category":"full","description":" [DEPRECATED] Is current user an admin of a group"},{"type":"reference","argument":"theme","category":"hidden","description":" [DEPRECATED] Theme of group"},{"type":"reference","argument":"about","category":"hidden","description":" [DEPRECATED] About of group"},{"type":"reference","argument":"creatorUid","category":"hidden","description":" [DEPRECATED] Group creator"},{"type":"reference","argument":"members","category":"compact","description":" [DEPRECATED] Members of group"},{"type":"reference","argument":"createDate","category":"full","description":" [DEPRECATED] Date of creation"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":"string","id":3,"name":"title"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":4,"name":"avatar"} -,{"type":{"type":"opt","childType":"int32"},"id":24,"name":"membersCount"} -,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isMember"} -,{"type":{"type":"opt","childType":"bool"},"id":20,"name":"isHidden"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"GroupType"}},"id":25,"name":"groupType"} -,{"type":{"type":"opt","childType":"int64"},"id":26,"name":"permissions"} -,{"type":{"type":"opt","childType":"bool"},"id":27,"name":"isDeleted"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":22,"name":"ext"} -,{"type":{"type":"opt","childType":"bool"},"id":16,"name":"isAdmin", "deprecated":"true"} -,{"type":{"type":"alias","childType":"userId"},"id":8,"name":"creatorUid", "deprecated":"true"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":9,"name":"members", "deprecated":"true"} -,{"type":{"type":"alias","childType":"date"},"id":10,"name":"createDate", "deprecated":"true"} -,{"type":{"type":"opt","childType":"string"},"id":17,"name":"theme", "deprecated":"true"} -,{"type":{"type":"opt","childType":"string"},"id":18,"name":"about", "deprecated":"true"} -]}}, { - "type":"struct", - "content": { - "name":"GroupFull", -"doc":[ -"Goup Full information","Permissions.","Idea of Group Full mermissions is about Group Info pages. This permissions","are usefull only when trying to view and update group settings and not related","to chat messages itself.","Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.","If default is TRUE then ONE == FALSE.","Bits:","0 - canEditInfo. Default is FALSE.","1 - canViewMembers. Default is FALSE.","2 - canInviteMembers. Default is FALSE.","3 - canInviteViaLink. Default is FALSE.","4 - canCall. Default is FALSE.","5 - canEditAdminSettings. Default is FALSE.","6 - canViewAdmins. Default is FALSE.","7 - canEditAdmins. Default is FALSE.","8 - canKickInvited. Default is FALSE.","9 - canKickAnyone. Default is FALSE.","10 - canEditForeign. Default is FALSE.","11 - canDeleteForeign. Default is FALSE.","",{"type":"reference","argument":"id","category":"full","description":" Group Id"},{"type":"reference","argument":"createDate","category":"full","description":" Date created"},{"type":"reference","argument":"ownerUid","category":"full","description":" Optional group owner"},{"type":"reference","argument":"members","category":"full","description":" Group members. Can be empty when isAsyncMembers enabled."},{"type":"reference","argument":"theme","category":"full","description":" Group Theme"},{"type":"reference","argument":"about","category":"full","description":" Group about"},{"type":"reference","argument":"isAsyncMembers","category":"full","description":" Is Members need to be loaded asynchronous. Default is false."},{"type":"reference","argument":"isSharedHistory","category":"full","description":" Is history shared among all users. Default is false."},{"type":"reference","argument":"shortName","category":"full","description":" Group's short name"},{"type":"reference","argument":"permissions","category":"full","description":" Group Permissions"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"id"} -,{"type":{"type":"alias","childType":"date"},"id":6,"name":"createDate"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":5,"name":"ownerUid"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":12,"name":"members"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"theme"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":7,"name":"ext"} -,{"type":{"type":"opt","childType":"bool"},"id":11,"name":"isAsyncMembers"} -,{"type":{"type":"opt","childType":"bool"},"id":10,"name":"isSharedHistory"} -,{"type":{"type":"opt","childType":"string"},"id":14,"name":"shortName"} -,{"type":{"type":"opt","childType":"int64"},"id":27,"name":"permissions"} -]}},{"type":"rpc","content":{ -"name":"LoadFullGroups", -"header":2782, -"response":{"type":"anonymous","header":2783, "doc":[ -{"type":"reference","argument":"groups","category":"compact","description":" Groups to load"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"GroupFull"}},"id":1,"name":"groups"} -]}, -"doc":[ -"Loading Full Groups",{"type":"reference","argument":"groups","category":"compact","description":"Groups to load"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} -]}},{"type":"rpc","content":{ -"name":"LoadMembers", -"header":2786, -"response":{"type":"anonymous","header":2787, "doc":[ -{"type":"reference","argument":"users","category":"full","description":" Group members"},{"type":"reference","argument":"next","category":"full","description":" Load more reference"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":3,"name":"members"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} -,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"next"} -]}, -"doc":[ -"Loading group members",{"type":"reference","argument":"group","category":"full","description":"Group peer"},{"type":"reference","argument":"limit","category":"full","description":"Limit members"},{"type":"reference","argument":"next","category":"full","description":"Load more reference"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"group"} -,{"type":"int32","id":2,"name":"limit"} -,{"type":{"type":"opt","childType":"bytes"},"id":3,"name":"next"} -]}},{"type":"comment","content":"Update"},{"type":"update","content":{ -"name":"GroupTitleChanged", -"header":2609, -"doc":[ -"Update about title changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"title","category":"full","description":" Group Title"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"string","id":2,"name":"title"} -]}},{"type":"update","content":{ -"name":"GroupAvatarChanged", -"header":2610, -"doc":[ -"Update about avatar changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"avatar","category":"full","description":" Group Avatar"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":2,"name":"avatar"} -]}},{"type":"update","content":{ -"name":"GroupTopicChanged", -"header":2616, -"doc":[ -"Update about topic changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"topic","category":"full","description":" Updated topic"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"topic"} -]}},{"type":"update","content":{ -"name":"GroupAboutChanged", -"header":2617, -"doc":[ -"Update about about changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"about","category":"full","description":" Updated about"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} -]}},{"type":"update","content":{ -"name":"GroupExtChanged", -"header":2613, -"doc":[ -"Update about ext changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"ext","category":"full","description":" Updated ext"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} -]}},{"type":"update","content":{ -"name":"GroupFullExtChanged", -"header":2618, -"doc":[ -"Update about full ext changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"ext","category":"full","description":" Updated ext"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} -]}},{"type":"update","content":{ -"name":"GroupShortNameChanged", -"header":2628, -"doc":[ -"Group's short name changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"shortName","category":"full","description":" Group short name"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"shortName"} -]}},{"type":"update","content":{ -"name":"GroupOwnerChanged", -"header":2619, -"doc":[ -"Update about owner changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"userId","category":"full","description":" New Owner"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"userId"} -]}},{"type":"update","content":{ -"name":"GroupHistoryShared", -"header":2620, -"doc":[ -"Update about history shared",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -]}},{"type":"update","content":{ -"name":"GroupDeleted", -"header":2658, -"doc":[ -"Update about group deleted",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -]}},{"type":"update","content":{ -"name":"GroupPermissionsChanged", -"header":2663, -"doc":[ -"Update about group permissions changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"permissions","category":"full","description":" New Permissions"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"int64","id":2,"name":"permissions"} -]}},{"type":"update","content":{ -"name":"GroupFullPermissionsChanged", -"header":2664, -"doc":[ -"Update about Full Group permissions changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"permissions","category":"full","description":" New Permissions"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"int64","id":2,"name":"permissions"} -]}},{"type":"comment","content":" "},{"type":"update","content":{ -"name":"GroupMemberChanged", -"header":2612, -"doc":[ -"Update about membership changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"isMember","category":"full","description":" Is current user a member"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"bool","id":2,"name":"isMember"} -]}},{"type":"update","content":{ -"name":"GroupMembersBecameAsync", -"header":2615, -"doc":[ -"Update about members became async",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -]}},{"type":"update","content":{ -"name":"GroupMembersUpdated", -"header":2614, -"doc":[ -"Update about members updated",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"members","category":"full","description":" Group Members"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":2,"name":"members"} -]}},{"type":"update","content":{ -"name":"GroupMemberDiff", -"header":2623, -"doc":[ -"Update about members changed",{"type":"reference","argument":"removedUsers","category":"full","description":" Removed Users"},{"type":"reference","argument":"addedMembers","category":"full","description":" Added members"},{"type":"reference","argument":"membersCount","category":"full","description":" Current Members count"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"removedUsers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":3,"name":"addedMembers"} -,{"type":"int32","id":4,"name":"membersCount"} -]}},{"type":"update","content":{ -"name":"GroupMembersCountChanged", -"header":2622, -"doc":[ -"Update about members count changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"membersCount","category":"full","description":" Members count"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"int32","id":2,"name":"membersCount"} -]}},{"type":"update","content":{ -"name":"GroupMemberAdminChanged", -"header":2627, -"doc":[ -"Update about member admin changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"userId","category":"full","description":" User Id"},{"type":"reference","argument":"isAdmin","category":"full","description":" Is Admin flag"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"userId"} -,{"type":"bool","id":3,"name":"isAdmin"} -]}},{"type":"comment","content":"Actions"},{"type":"rpc","content":{ -"name":"CreateGroup", -"header":230, -"response":{"type":"anonymous","header":216, "doc":[ -"Created group",{"type":"reference","argument":"seq","category":"full","description":" Update Seq"},{"type":"reference","argument":"state","category":"compact","description":" Update state"},{"type":"reference","argument":"group","category":"full","description":" Created group"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"userPeers","category":"full","description":" Referenced users"},{"type":"reference","argument":"date","category":"full","description":" Group creation date"}] ,"attributes":[{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} -,{"type":{"type":"struct","childType":"Group"},"id":3,"name":"group"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userPeers"} -]}, -"doc":[ -"Creating group chat",{"type":"reference","argument":"rid","category":"full","description":"Random Id for avoiding double create"},{"type":"reference","argument":"title","category":"full","description":"Group Title"},{"type":"reference","argument":"users","category":"hidden","description":"Members of group"},{"type":"reference","argument":"groupType","category":"full","description":"Group Type"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"rid"} -,{"type":"string","id":2,"name":"title"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"GroupType"}},"id":6,"name":"groupType"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":7,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"EditGroupTitle", -"header":85, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Changing group title",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"title","category":"full","description":"new group title"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":"string","id":3,"name":"title"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"EditGroupAvatar", -"header":86, -"response":{"type":"anonymous","header":115, "doc":[ -"Updated group avatar",{"type":"reference","argument":"avatar","category":"compact","description":" Changed avatar"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"},{"type":"reference","argument":"date","category":"full","description":" Avatar change date"}] ,"attributes":[{"type":{"type":"struct","childType":"Avatar"},"id":1,"name":"avatar"} -,{"type":"int32","id":2,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}, -"doc":[ -"Changing group avatar",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"fileLocation","category":"compact","description":"uploaded file for avatar"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":{"type":"struct","childType":"FileLocation"},"id":3,"name":"fileLocation"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"RemoveGroupAvatar", -"header":101, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Removing group avatar",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"EditGroupShortName", -"header":2793, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Edit Group Short Name",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"shortName","category":"full","description":"New group's short name"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"shortName"} -]}},{"type":"rpc","content":{ -"name":"EditGroupTopic", -"header":211, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Edit group topic",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random id of operation"},{"type":"reference","argument":"topic","category":"full","description":"New Topic"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"topic"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":4,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"EditGroupAbout", -"header":213, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Edit Group About",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random id of operation"},{"type":"reference","argument":"about","category":"full","description":"New About"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"InviteUser", -"header":69, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Inviting user to group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"user","category":"full","description":"Users for invitation"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":3,"name":"user"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"LeaveGroup", -"header":70, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Leaving group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"LeaveAndDelete", -"header":2721, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Leave group and Delete Chat",{"type":"reference","argument":"groupPeer","category":"full","description":"Group peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"KickUser", -"header":71, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Kicking user from group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"user","category":"full","description":"users for removing"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":3,"name":"user"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"JoinGroupByPeer", -"header":2722, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Join group by peer",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"JoinGroupByGroupId", -"header":44561, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Join group by peer without a necessity of invite",{"type":"reference","argument":"groupId","category":"hidden","description":"Groups peer"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -]}},{"type":"comment","content":"Administration"},{"type":"rpc","content":{ -"name":"MakeUserAdmin", -"header":2784, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Make user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} -]}},{"type":"rpc","content":{ -"name":"DismissUserAdmin", -"header":2791, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Dismissing user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} -]}},{"type":"rpc","content":{ -"name":"TransferOwnership", -"header":2789, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Transfer ownership of group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"newOwner","category":"full","description":"New group's owner"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"newOwner"} -]}}, { - "type":"struct", - "content": { - "name":"AdminSettings", -"doc":[ -"Admin Settings",{"type":"reference","argument":"showAdminsToMembers","category":"full","description":" Show admins in member list"},{"type":"reference","argument":"canMembersInvite","category":"full","description":" Can members of a group invite people"},{"type":"reference","argument":"canMembersEditGroupInfo","category":"full","description":" Can members edit group info"},{"type":"reference","argument":"canAdminsEditGroupInfo","category":"full","description":" Can admins edit group info"},{"type":"reference","argument":"showJoinLeaveMessages","category":"full","description":" Should join and leave messages be visible to members"}],"expandable":"true","attributes":[ -{"type":"bool","id":1,"name":"showAdminsToMembers"} -,{"type":"bool","id":2,"name":"canMembersInvite"} -,{"type":"bool","id":3,"name":"canMembersEditGroupInfo"} -,{"type":"bool","id":4,"name":"canAdminsEditGroupInfo"} -,{"type":"bool","id":5,"name":"showJoinLeaveMessages"} -]}},{"type":"rpc","content":{ -"name":"LoadAdminSettings", -"header":2790, -"response":{"type":"anonymous","header":2794, "doc":[ -"Loaded settings",{"type":"reference","argument":"settings","category":"full","description":" Current group admin settings"}] ,"attributes":[{"type":{"type":"struct","childType":"AdminSettings"},"id":1,"name":"settings"} -]}, -"doc":[ -"Loading administration settings",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"SaveAdminSettings", -"header":2792, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Save administartion settings",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's Peer"},{"type":"reference","argument":"settings","category":"full","description":"Group's settings"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"struct","childType":"AdminSettings"},"id":2,"name":"settings"} -]}},{"type":"rpc","content":{ -"name":"DeleteGroup", -"header":2795, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Delete Group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"ShareHistory", -"header":2796, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Share History",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"comment","content":"Invite"},{"type":"response","content":{ -"name":"InviteUrl", -"header":178, -"doc":[ -"Response for invite url methods"],"attributes":[ -{"type":"string","id":1,"name":"url"} -]}},{"type":"rpc","content":{ -"name":"GetGroupInviteUrl", -"header":177, -"response":{"type":"reference","name":"InviteUrl"}, -"doc":[ -"Building invite url",{"type":"reference","argument":"groupPeer","category":"full","description":"Destination group peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"RevokeInviteUrl", -"header":179, -"response":{"type":"reference","name":"InviteUrl"}, -"doc":[ -"Revoking invite urls",{"type":"reference","argument":"groupPeer","category":"full","description":"Destination group peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"JoinGroup", -"header":180, -"response":{"type":"anonymous","header":181, "doc":[ -{"type":"reference","argument":"group","category":"hidden","description":" Joined group"},{"type":"reference","argument":"users","category":"hidden","description":" Users from members"},{"type":"reference","argument":"userPeers","category":"hidden","description":" User Peers"},{"type":"reference","argument":"rid","category":"full","description":" Random id"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"hidden","description":" State"},{"type":"reference","argument":"date","category":"full","description":" Date of join"}] ,"attributes":[{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":5,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":7,"name":"userPeers"} -,{"type":{"type":"alias","childType":"randomId"},"id":6,"name":"rid"} -,{"type":"int32","id":2,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}, -"doc":[ -"Join group method",{"type":"reference","argument":"token","category":"full","description":"Url or Token for joining to group"},{"type":"reference","argument":"optimizations","category":"hidden","description":"Enabled Optimizations"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} -]}},{"type":"comment","content":"Obsolete Actions"},{"type":"rpc","content":{ -"name":"CreateGroupObsolete", -"header":65, -"response":{"type":"anonymous","header":66, "doc":[ -"Created group",{"type":"reference","argument":"groupPeer","category":"full","description":" Peer of created group"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"},{"type":"reference","argument":"users","category":"compact","description":" Members of created group"},{"type":"reference","argument":"date","category":"full","description":" Group creation date"}] ,"attributes":[{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":"int32","id":3,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":4,"name":"state"} -,{"type":{"type":"list","childType":"int32"},"id":5,"name":"users"} -,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} -]}, -"doc":[ -"[OBSOLETE] Creating group chat",{"type":"reference","argument":"rid","category":"full","description":"Random Id for avoiding double create"},{"type":"reference","argument":"title","category":"full","description":"Title of new group"},{"type":"reference","argument":"users","category":"compact","description":"Members of new group"}],"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"rid"} -,{"type":"string","id":2,"name":"title"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} -]}},{"type":"rpc","content":{ -"name":"EnterGroupObsolete", -"header":199, -"response":{"type":"anonymous","header":200, "doc":[ -"Joined group",{"type":"reference","argument":"group","category":"full","description":" Joined group"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"rid","category":"full","description":" Rid of join message"},{"type":"reference","argument":"seq","category":"full","description":" Seq of Update"},{"type":"reference","argument":"state","category":"full","description":" State of Update"},{"type":"reference","argument":"date","category":"full","description":" Date of update"}] ,"attributes":[{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"rid"} -,{"type":"int32","id":4,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":5,"name":"state"} -,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} -]}, -"doc":[ -"[OBSOLETE] Join random group by peer id",{"type":"reference","argument":"peer","category":"full","description":"Public group peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"MakeUserAdminObsolete", -"header":214, -"response":{"type":"anonymous","header":215, "doc":[ -{"type":"reference","argument":"members","category":"full","description":" new members"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":1,"name":"members"} -,{"type":"int32","id":2,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -]}, -"doc":[ -"[OBSOLETE] Make user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} -]}},{"type":"comment","content":"Obsolete Updates"},{"type":"update","content":{ -"name":"GroupInviteObsolete", -"header":36, -"doc":[ -"Update about inviting current user to group",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"inviteUid","category":"full","description":" Inviter UID. If equals to current uid than group created by user."},{"type":"reference","argument":"date","category":"full","description":" Date of creating"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":9,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":5,"name":"inviteUid"} -,{"type":{"type":"alias","childType":"date"},"id":8,"name":"date"} -]}},{"type":"update","content":{ -"name":"GroupUserInvitedObsolete", -"header":21, -"doc":[ -"Update about inviting user to group",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Added user ID"},{"type":"reference","argument":"inviterUid","category":"full","description":" Inviter user ID"},{"type":"reference","argument":"date","category":"full","description":" Date of adding user to group"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"inviterUid"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}},{"type":"update","content":{ -"name":"GroupUserLeaveObsolete", -"header":23, -"doc":[ -"Update about leaving user",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" User's ID"},{"type":"reference","argument":"date","category":"full","description":" Date of user leave"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -]}},{"type":"update","content":{ -"name":"GroupUserKickObsolete", -"header":24, -"doc":[ -"Update about kicking user",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Kicked user's ID"},{"type":"reference","argument":"kickerUid","category":"full","description":" Kicker user's ID"},{"type":"reference","argument":"date","category":"full","description":" Date of user kick"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"kickerUid"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}},{"type":"update","content":{ -"name":"GroupMembersUpdateObsolete", -"header":44, -"doc":[ -"Silent group members update",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"members","category":"full","description":" New members list"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":2,"name":"members"} -]}},{"type":"update","content":{ -"name":"GroupTitleChangedObsolete", -"header":38, -"doc":[ -"Update about group title change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Changer UID"},{"type":"reference","argument":"title","category":"full","description":" New Title of group"},{"type":"reference","argument":"date","category":"full","description":" Date of title change"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":"string","id":3,"name":"title"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}},{"type":"update","content":{ -"name":"GroupTopicChangedObsolete", -"header":213, -"doc":[ -"Update about group topic change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Changer UID"},{"type":"reference","argument":"topic","category":"full","description":" New topic of group"},{"type":"reference","argument":"date","category":"full","description":" Date of theme change"},{"type":"reference","argument":"rid","category":"full","description":" Randomd Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"uid"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"topic"} -,{"type":{"type":"alias","childType":"date"},"id":5,"name":"date"} -]}},{"type":"update","content":{ -"name":"GroupAboutChangedObsolete", -"header":214, -"doc":[ -"Update about group about change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"about","category":"full","description":" Group about"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} -]}},{"type":"update","content":{ -"name":"GroupAvatarChangedObsolete", -"header":39, -"doc":[ -"Update about group avatar change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Avatar changer uid"},{"type":"reference","argument":"avatar","category":"compact","description":" New Avatar. If null then avatar is removed"},{"type":"reference","argument":"date","category":"full","description":" Date of avatar change"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":3,"name":"avatar"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}}]}, { - "title": "Stickers", - "package": "stickers", - "doc": [ - "Stickers support in Actor" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"StickerDescriptor", -"doc":[ -"Descriptor of a Sticker",{"type":"reference","argument":"id","category":"full","description":" Sticker unique id"},{"type":"reference","argument":"emoji","category":"full","description":" Emoji code for sticker"},{"type":"reference","argument":"image128","category":"full","description":" Image of sticker 128x128 in WebP format"},{"type":"reference","argument":"image512","category":"full","description":" Image of sticker 512x512 in WebP format"},{"type":"reference","argument":"image256","category":"full","description":" Image of sticker 256x256 in WebP format"}],"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"emoji"} -,{"type":{"type":"struct","childType":"ImageLocation"},"id":3,"name":"image128"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":4,"name":"image512"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":5,"name":"image256"} -]}}, { - "type":"struct", - "content": { - "name":"StickerCollection", -"doc":[ -"Sticker collection",{"type":"reference","argument":"id","category":"full","description":" Unique id of a collection"},{"type":"reference","argument":"accessHash","category":"full","description":" Access Hash of a collection"},{"type":"reference","argument":"stickers","category":"compact","description":" Sticker list"}],"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"StickerDescriptor"}},"id":3,"name":"stickers"} -]}},{"type":"response","content":{ -"name":"StickersReponse", -"header":240, -"doc":[ -"Stickers response",{"type":"reference","argument":"collections","category":"full","description":" Sticker collections"},{"type":"reference","argument":"seq","category":"full","description":" Seq of update"},{"type":"reference","argument":"state","category":"full","description":" State of update"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} -,{"type":"int32","id":2,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -]}},{"type":"rpc","content":{ -"name":"LoadOwnStickers", -"header":238, -"response":{"type":"anonymous","header":239, "doc":[ -"Own Stickers collections",{"type":"reference","argument":"ownStickers","category":"hidden","description":" Own sticker collections"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"ownStickers"} -]}, -"doc":[ -"Loading own stickers"],"attributes":[ -]}},{"type":"update","content":{ -"name":"OwnStickersChanged", -"header":161, -"doc":[ -"Own Stickers changed",{"type":"reference","argument":"collections","category":"compact","description":" New own sticker collections"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} -]}},{"type":"update","content":{ -"name":"StickerCollectionsChanged", -"header":164, -"doc":[ -"Sticker collection changed",{"type":"reference","argument":"collections","category":"full","description":" Updated sticker collections"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} -]}},{"type":"rpc","content":{ -"name":"AddStickerCollection", -"header":244, -"response":{"type":"reference","name":"StickersReponse"}, -"doc":[ -"Adding sticker collection",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -]}},{"type":"rpc","content":{ -"name":"RemoveStickerCollection", -"header":245, -"response":{"type":"reference","name":"StickersReponse"}, -"doc":[ -"Removing sticker collection",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -]}},{"type":"rpc","content":{ -"name":"LoadStickerCollection", -"header":246, -"response":{"type":"anonymous","header":247, "doc":[ -"Loaded collection",{"type":"reference","argument":"collection","category":"full","description":" Collection of stickers"}] ,"attributes":[{"type":{"type":"struct","childType":"StickerCollection"},"id":1,"name":"collection"} -]}, -"doc":[ -"Loading stickers",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -]}}]}, { - "title": "Search", - "package": "search", - "doc": [ - "Searching API" - ], - "items": [ - { - "type": "enum", - "content": { - "name": "SearchPeerType", - "values": [ - { - "name": "Groups", - "id": 1 - }, - { - "name": "Contacts", - "id": 2 - }, - { - "name": "Public", - "id": 3 + }, + "id": 1, + "name": "userPeers" + }] + }, + "doc": [ + "Load Blocked Users" + ], + "attributes": [] + } + }, { + "type": "update", + "content": { + "name": "UserBlocked", + "header": 2629, + "doc": [ + "Update about User Blocked", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }] + } + }, { + "type": "update", + "content": { + "name": "UserUnblocked", + "header": 2630, + "doc": [ + "Update about User Unblocked", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }] + } + }] + }, { + "title": "Messaging", + "package": "messaging", + "doc": [ + "Actor can work with encrypted and plain messages in one conversation. For both types of messages API", + "contains a bit different methods. Also encrypted and plain messages have different schemes.", + "

Messages

", + "Message entity contains:", + "
    ", + "
  • PeerType - group chat or private
  • ", + "
  • PeerId - group or user id of conversation
  • ", + "
  • RandomId - unique id of message that generated by sender. In Encrypted messages random id is encrypted.
  • ", + "
  • Date - date of message (calculated on server)
  • ", + "
  • Content
  • ", + "
", + "

Message content

", + "Message can be one of three basic types of messages: Text Message, File Message and Service message.", + "All messages can contain extensions. For example we can send text message and add markdown extension with", + "formatted text in markdown and clients that support this extension will show markdown, and that clients that", + "not supported extension then show simple text. File messages can have photo, video or voice extensions.", + "Service message can have extensions extensions such as \"user added\", \"group created\", \"avatar changed\", etc.", + "

Send messages

", + "Sending messages looks same for encrypted and plain messages. Client MUST prepare all required data", + "before sending message (for example FastThumb for photo/video/documents) and call required methods.", + "Encrypted messages differs here only by a little different scheme and encryption.", + "

WRONG_KEYS and incorrect keys

", + "For sending encrypted messages client MUST send messages encrypted for all own and receivers keys.", + "If client send encryption with missing, old or incorrect keys it will receive WRONG_KEYS.", + "In WRONG_KEYS you need to deserialize relatedData from RpcError to WrongKeysErrorData", + "and get detailed information about keys. Sometimes there are some broken keys on server and client can't", + "encrypt messages with it than client MUST send empty encrypted key in request elsewhere API return WRONG_KEYS.", + "

Encrypted messages and New Devices

", + "When you send message to someone and when he registered with new device there are no way to receive old encrypted", + "messages on new device and because of this there are a problem about read/delivery statuses.", + "Alice send messages to Bob, but Bob lose his device and buy new iPhone and installed Actor.", + "Alice receive notification about new device and send another message. Bob open chat with Alice and", + "send read status with maximum message read date. Alice will mark all sent messages as read and one that", + "was not delivered. We can use status notifications per message, but in VERY heavy conversations it will be", + "a lot of unnecessary traffic. For resolving this small issue we have different ways of message statuses", + "for encrypted and plain messages. Also it is recomended to mark all undelivered messages on new device update as", + "not devered with warring sign.", + "

Message Read and Delivery

", + "There are two different ways for read and delivery statuses for encrypted and plain messages.", + "For encrypted messages used status change by RandomId and for plain messages used by maximum", + "date of read/delivered message." + ], + "items": [{ + "type": "struct", + "content": { + "name": "MessageAttributes", + "doc": [ + "Message Attributes", { + "type": "reference", + "argument": "isMentioned", + "category": "full", + "description": " Is mentioned. If set overrides built-in value." + }, { + "type": "reference", + "argument": "isHighlighted", + "category": "full", + "description": " Is message highlighted. Default is false." + }, { + "type": "reference", + "argument": "isNotified", + "category": "full", + "description": " Is notified. If set overrides built-in settings." + }, { + "type": "reference", + "argument": "isOnlyForYou", + "category": "full", + "description": " If this message is only for you. Default is false" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 1, + "name": "isMentioned" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 2, + "name": "isHighlighted" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 3, + "name": "isNotified" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 4, + "name": "isOnlyForYou" + }] + } + }, { + "type": "struct", + "content": { + "name": "QuotedMessage", + "doc": [ + "Quoted Message", { + "type": "reference", + "argument": "messageId", + "category": "full", + "description": " Message Id if present" + }, { + "type": "reference", + "argument": "publicGroupId", + "category": "full", + "description": " Public Group id if present" + }, { + "type": "reference", + "argument": "senderUserId", + "category": "full", + "description": " Sender of message" + }, { + "type": "reference", + "argument": "messageDate", + "category": "full", + "description": " Date of message" + }, { + "type": "reference", + "argument": "quotedMessageContent", + "category": "full", + "description": " Optional Quoted Message Content. Can be empty if messageId is present and message is in current peer." + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "randomId" + } + }, + "id": 1, + "name": "messageId" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "groupId" + } + }, + "id": 2, + "name": "publicGroupId" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 3, + "name": "senderUserId" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "messageDate" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "Message" + } + }, + "id": 5, + "name": "quotedMessageContent" + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "Message", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "TextMessage", + "doc": [ + "Text message", { + "type": "reference", + "argument": "text", + "category": "danger", + "description": " the text" + }, { + "type": "reference", + "argument": "mentions", + "category": "full", + "description": " User mentions in message" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " Optional bytes of extension" + } + ], + "trait": { + "name": "Message", + "key": 1 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "text" + }, { + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 2, + "name": "mentions" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "TextMessageEx" + } + }, + "id": 3, + "name": "ext" + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "TextMessageEx", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "TextExMarkdown", + "doc": [ + "Markdown extension", { + "type": "reference", + "argument": "markdown", + "category": "full", + "description": " Markdown text" + } + ], + "trait": { + "name": "TextMessageEx", + "key": 1 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 2, + "name": "markdown" + }] + } + }, { + "type": "struct", + "content": { + "name": "TextModernMessage", + "doc": [ + "Modern text message", { + "type": "reference", + "argument": "text", + "category": "full", + "description": " optional text of message" + }, { + "type": "reference", + "argument": "senderNameOverride", + "category": "full", + "description": " optional overriding of sender" + }, { + "type": "reference", + "argument": "senderPhotoOverride", + "category": "full", + "description": " optional overriding sender's photo" + }, { + "type": "reference", + "argument": "style", + "category": "full", + "description": " optional paragraph style" + }, { + "type": "reference", + "argument": "attaches", + "category": "full", + "description": " optional Attaches of message" + } + ], + "trait": { + "name": "TextMessageEx", + "key": 2 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "text" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "senderNameOverride" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 3, + "name": "senderPhotoOverride" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ParagraphStyle" + } + }, + "id": 4, + "name": "style" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "TextModernAttach" + } + }, + "id": 5, + "name": "attaches" + }] + } + }, { + "type": "struct", + "content": { + "name": "ParagraphStyle", + "doc": [ + "Paragraph style", { + "type": "reference", + "argument": "showParagraph", + "category": "full", + "description": " Show quote-like paragraph?" + }, { + "type": "reference", + "argument": "paragraphColor", + "category": "full", + "description": " Override paragraph color" + }, { + "type": "reference", + "argument": "bgColor", + "category": "full", + "description": " Override background color" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 1, + "name": "showParagraph" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "Color" + } + }, + "id": 2, + "name": "paragraphColor" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "Color" + } + }, + "id": 3, + "name": "bgColor" + }] + } + }, { + "type": "struct", + "content": { + "name": "TextModernAttach", + "doc": [ + "Attaches to message", { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Attach of message" + }, { + "type": "reference", + "argument": "titleUrl", + "category": "full", + "description": " Attach title url" + }, { + "type": "reference", + "argument": "titleIcon", + "category": "full", + "description": " Attach title icon" + }, { + "type": "reference", + "argument": "text", + "category": "full", + "description": " Attach text" + }, { + "type": "reference", + "argument": "style", + "category": "full", + "description": " Attach style" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "title" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "titleUrl" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ImageLocation" + } + }, + "id": 3, + "name": "titleIcon" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "text" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ParagraphStyle" + } + }, + "id": 5, + "name": "style" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "TextModernField" + } + }, + "id": 6, + "name": "fields" + }] + } + }, { + "type": "struct", + "content": { + "name": "TextModernField", + "doc": [ + "Modern message fields", { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Field title" + }, { + "type": "reference", + "argument": "value", + "category": "full", + "description": " Field value" + }, { + "type": "reference", + "argument": "isShort", + "category": "full", + "description": " Is field can be shown in compact way (default is TRUE)" + } + ], + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "title" + }, { + "type": "string", + "id": 2, + "name": "value" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 3, + "name": "isShort" + }] + } + }, { + "type": "struct", + "content": { + "name": "TextCommand", + "doc": [ + "Text Command Message for bots", { + "type": "reference", + "argument": "command", + "category": "full", + "description": " Slash-Command For execution" + }, { + "type": "reference", + "argument": "args", + "category": "full", + "description": " Arguments of slash command" + } + ], + "trait": { + "name": "TextMessageEx", + "key": 3 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "command" + }, { + "type": "string", + "id": 2, + "name": "args" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceMessage", + "doc": [ + "Service message", { + "type": "reference", + "argument": "text", + "category": "full", + "description": " service message text" + }, { + "type": "reference", + "argument": "ext", + "category": "compact", + "description": " Extension" + } + ], + "trait": { + "name": "Message", + "key": 2 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "text" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "ServiceEx" + } + }, + "id": 3, + "name": "ext" + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "ServiceEx", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExUserInvited", + "doc": [ + "Service message about adding user to group", { + "type": "reference", + "argument": "invitedUid", + "category": "full", + "description": " added user id" + } + ], + "trait": { + "name": "ServiceEx", + "key": 1 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "invitedUid" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExUserJoined", + "doc": [ + "Service message about user join to group" + ], + "trait": { + "name": "ServiceEx", + "key": 17 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExUserKicked", + "doc": [ + "Service message about kicking user from group", { + "type": "reference", + "argument": "kickedUid", + "category": "full", + "description": " kicked user id" + } + ], + "trait": { + "name": "ServiceEx", + "key": 2 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "kickedUid" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExUserLeft", + "doc": [ + "Service message about user left group" + ], + "trait": { + "name": "ServiceEx", + "key": 3 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExGroupCreated", + "doc": [ + "Service message about group creating" + ], + "trait": { + "name": "ServiceEx", + "key": 4 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExChangedTitle", + "doc": [ + "Service message about group title change", { + "type": "reference", + "argument": "title", + "category": "full", + "description": " New group title" + } + ], + "trait": { + "name": "ServiceEx", + "key": 5 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "title" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExChangedTopic", + "doc": [ + "Service message on group topic change", { + "type": "reference", + "argument": "topic", + "category": "full", + "description": " New group topic" + } + ], + "trait": { + "name": "ServiceEx", + "key": 18 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "topic" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExChangedAbout", + "doc": [ + "Service message on group about change", { + "type": "reference", + "argument": "about", + "category": "full", + "description": " New group about" + } + ], + "trait": { + "name": "ServiceEx", + "key": 19 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "about" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExChangedAvatar", + "doc": [ + "Service message about avatar change", { + "type": "reference", + "argument": "avatar", + "category": "compact", + "description": " Updated avatar" + } + ], + "trait": { + "name": "ServiceEx", + "key": 6 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 1, + "name": "avatar" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExContactRegistered", + "doc": [ + "Service message about user registration", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User Id" + } + ], + "trait": { + "name": "ServiceEx", + "key": 8 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExPhoneMissed", + "doc": [ + "Update about missing phone call" + ], + "trait": { + "name": "ServiceEx", + "key": 9 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExPhoneCall", + "doc": [ + "Update about phone call", { + "type": "reference", + "argument": "duration", + "category": "full", + "description": " Duration of a phone call" + } + ], + "trait": { + "name": "ServiceEx", + "key": 16 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "duration" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExChatArchived", + "doc": [ + "Message about chat archived" + ], + "trait": { + "name": "ServiceEx", + "key": 20 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExChatRestored", + "doc": [ + "Message about chat restored" + ], + "trait": { + "name": "ServiceEx", + "key": 21 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "DocumentMessage", + "doc": [ + "File message", { + "type": "reference", + "argument": "fileId", + "category": "full", + "description": " file id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " file access hash" + }, { + "type": "reference", + "argument": "fileSize", + "category": "full", + "description": " file size" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " name of file" + }, { + "type": "reference", + "argument": "mimeType", + "category": "full", + "description": " mimetype of file" + }, { + "type": "reference", + "argument": "thumb", + "category": "compact", + "description": " optional thumb of file. JPEG less that 90x90 with 60-70 quality." + }, { + "type": "reference", + "argument": "ext", + "category": "compact", + "description": " Extension" + } + ], + "trait": { + "name": "Message", + "key": 3 + }, + "expandable": "true", + "attributes": [{ + "type": "int64", + "id": 1, + "name": "fileId" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": "int32", + "id": 3, + "name": "fileSize" + }, { + "type": "string", + "id": 4, + "name": "name" + }, { + "type": "string", + "id": 5, + "name": "mimeType" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "FastThumb" + } + }, + "id": 6, + "name": "thumb" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "DocumentEx" + } + }, + "id": 8, + "name": "ext" + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "DocumentEx", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "DocumentExPhoto", + "doc": [ + "File photo extension. Can be set ONLY for JPEG.", { + "type": "reference", + "argument": "w", + "category": "full", + "description": " image width" + }, { + "type": "reference", + "argument": "h", + "category": "full", + "description": " image height" + } + ], + "trait": { + "name": "DocumentEx", + "key": 1 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "w" + }, { + "type": "int32", + "id": 2, + "name": "h" + }] + } + }, { + "type": "struct", + "content": { + "name": "DocumentExVideo", + "doc": [ + "File video extension", { + "type": "reference", + "argument": "w", + "category": "full", + "description": " video width" + }, { + "type": "reference", + "argument": "h", + "category": "full", + "description": " video height" + }, { + "type": "reference", + "argument": "duration", + "category": "full", + "description": " video duration" + } + ], + "trait": { + "name": "DocumentEx", + "key": 2 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "w" + }, { + "type": "int32", + "id": 2, + "name": "h" + }, { + "type": "int32", + "id": 3, + "name": "duration" + }] + } + }, { + "type": "struct", + "content": { + "name": "DocumentExVoice", + "doc": [ + "File voice extension", { + "type": "reference", + "argument": "duration", + "category": "full", + "description": " voice duration" + } + ], + "trait": { + "name": "DocumentEx", + "key": 3 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "duration" + }] + } + }, { + "type": "struct", + "content": { + "name": "DocumentExAnimation", + "doc": [ + "Animation extension. Can be set ONLY for GIF.", { + "type": "reference", + "argument": "w", + "category": "full", + "description": " Animation width" + }, { + "type": "reference", + "argument": "h", + "category": "full", + "description": " Animation height" + } + ], + "trait": { + "name": "DocumentEx", + "key": 6 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "w" + }, { + "type": "int32", + "id": 2, + "name": "h" + }] + } + }, { + "type": "struct", + "content": { + "name": "DocumentExAnimationVid", + "doc": [ + "Animation video extension. More compact version of Animation with video codec instead of GIF.", "Can be set ONLY for MP4.", { + "type": "reference", + "argument": "w", + "category": "full", + "description": " Animation width" + }, { + "type": "reference", + "argument": "h", + "category": "full", + "description": " Animation height" + }, { + "type": "reference", + "argument": "duration", + "category": "full", + "description": " Animation duration" + } + ], + "trait": { + "name": "DocumentEx", + "key": 7 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "w" + }, { + "type": "int32", + "id": 2, + "name": "h" + }, { + "type": "int32", + "id": 3, + "name": "duration" + }] + } + }, { + "type": "struct", + "content": { + "name": "JsonMessage", + "doc": [ + "Custom-data JsonMessage", { + "type": "reference", + "argument": "rawJson", + "category": "danger", + "description": " JSON object" + } + ], + "trait": { + "name": "Message", + "key": 4 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "rawJson" + }] + } + }, { + "type": "struct", + "content": { + "name": "UnsupportedMessage", + "doc": [ + "Explicit type for unsupported message" + ], + "trait": { + "name": "Message", + "key": 5 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "StickerMessage", + "doc": [ + "Sticker message", { + "type": "reference", + "argument": "stickerId", + "category": "full", + "description": " Optional Unique ID of sticker" + }, { + "type": "reference", + "argument": "fastPreview", + "category": "full", + "description": " Optional Fast preview of sticker in webp format" + }, { + "type": "reference", + "argument": "image512", + "category": "full", + "description": " Optional 512x512 sticker image in webp format" + }, { + "type": "reference", + "argument": "image256", + "category": "full", + "description": " Optional 256x256 sticker image in webp format" + }, { + "type": "reference", + "argument": "stickerCollectionId", + "category": "full", + "description": " Optional Collection ID" + }, { + "type": "reference", + "argument": "stickerCollectionAccessHash", + "category": "full", + "description": " Optional Collection Access Hash" + } + ], + "trait": { + "name": "Message", + "key": 6 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 1, + "name": "stickerId" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 2, + "name": "fastPreview" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ImageLocation" + } + }, + "id": 3, + "name": "image512" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ImageLocation" + } + }, + "id": 4, + "name": "image256" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 5, + "name": "stickerCollectionId" + }, { + "type": { + "type": "opt", + "childType": "int64" + }, + "id": 6, + "name": "stickerCollectionAccessHash" + }] + } + }, { + "type": "struct", + "content": { + "name": "BinaryMessage", + "doc": [ + "Binary Message. Useful for implementing your own content types", { + "type": "reference", + "argument": "contentTag", + "category": "full", + "description": " Content Tag" + }, { + "type": "reference", + "argument": "msg", + "category": "compact", + "description": " Message contents" + } + ], + "trait": { + "name": "Message", + "key": 7 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "contentTag" + }, { + "type": "bytes", + "id": 2, + "name": "msg" + }] + } + }, { + "type": "struct", + "content": { + "name": "EncryptedMessage", + "doc": [ + "Encrypted Message", { + "type": "reference", + "argument": "box", + "category": "full", + "description": " Encrypted box" + } + ], + "trait": { + "name": "Message", + "key": 8 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "struct", + "childType": "EncryptedBox" + }, + "id": 1, + "name": "box" + }] + } + }, { + "type": "struct", + "content": { + "name": "EmptyMessage", + "doc": [ + "Empty Message" + ], + "trait": { + "name": "Message", + "key": 9 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "DialogShort", + "doc": [ + "Short Dialog from grouped conversation list", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Peer of conversation" + }, { + "type": "reference", + "argument": "counter", + "category": "full", + "description": " Conversation unread count" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Conversation top message date" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": "int32", + "id": 2, + "name": "counter" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + } + }, { + "type": "struct", + "content": { + "name": "DialogGroup", + "doc": [ + "Grouped dialog list", { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Title of group" + }, { + "type": "reference", + "argument": "key", + "category": "full", + "description": " Key of group" + }, { + "type": "reference", + "argument": "dialogs", + "category": "full", + "description": " Conversations in group" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "title" + }, { + "type": "string", + "id": 2, + "name": "key" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "DialogShort" + } + }, + "id": 3, + "name": "dialogs" + }] + } + }, { + "type": "struct", + "content": { + "name": "MessageReaction", + "doc": [ + "Reaction to message", { + "type": "reference", + "argument": "users", + "category": "full", + "description": " User's reaction" + }, { + "type": "reference", + "argument": "code", + "category": "full", + "description": " Reaction EMOJI code" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 1, + "name": "users" + }, { + "type": "string", + "id": 2, + "name": "code" + }] + } + }, { + "type": "struct", + "content": { + "name": "MessageOutReference", + "doc": [ + "Message Out Reference", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Out Peer of message" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Message random id" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SendMessage", + "header": 92, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Sending plain message", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer for message" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Message random id (generated on client side)" + }, { + "type": "reference", + "argument": "message", + "category": "full", + "description": "The message" + }, { + "type": "reference", + "argument": "isOnlyForUser", + "category": "full", + "description": "If message is shown only for specific user" + }, { + "type": "reference", + "argument": "quotedMessageReference", + "category": "full", + "description": "Quoted message if present" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 3, + "name": "rid" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 4, + "name": "message" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 5, + "name": "isOnlyForUser" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MessageOutReference" + } + }, + "id": 6, + "name": "quotedMessageReference" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UpdateMessage", + "header": 2658, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Changing Message content", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination Peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Message random id" + }, { + "type": "reference", + "argument": "updatedMessage", + "category": "full", + "description": "Updated Message content" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 3, + "name": "updatedMessage" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MessageReceived", + "header": 55, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Confirmation of plain message receive by device", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": "Maximum date of received messages" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MessageRead", + "header": 57, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Marking plain messages as read", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": "Maximum date of read messages" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DeleteMessage", + "header": 98, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Deleting messages", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "rids", + "category": "full", + "description": "Message random id" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "randomId" + } + }, + "id": 3, + "name": "rids" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ClearChat", + "header": 99, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Clearing of conversation (without removing dialog from dialogs list)", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Conversation peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DeleteChat", + "header": 100, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Deleting of conversation (also leave group for group conversations)", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Conversation peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ArchiveChat", + "header": 2654, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Archiving chat", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Conversation peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MessageSetReaction", + "header": 210, + "response": { + "type": "reference", + "name": "ReactionsResponse" + }, + "doc": [ + "Setting Message reaction", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Message random id" + }, { + "type": "reference", + "argument": "code", + "category": "full", + "description": "Reaction code" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": "string", + "id": 3, + "name": "code" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MessageRemoveReaction", + "header": 220, + "response": { + "type": "reference", + "name": "ReactionsResponse" + }, + "doc": [ + "Removing Message reaction", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Message random id" + }, { + "type": "reference", + "argument": "code", + "category": "full", + "description": "Reaction code" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": "string", + "id": 3, + "name": "code" + }] + } + }, { + "type": "response", + "content": { + "name": "ReactionsResponse", + "header": 219, + "doc": [ + "Response for reactions change" + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageReaction" + } + }, + "id": 3, + "name": "reactions" + }] + } + }, { + "type": "update", + "content": { + "name": "Message", + "header": 55, + "doc": [ + "Update about plain message", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "senderUid", + "category": "full", + "description": " Sender of message" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " date of message" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Rid of message" + }, { + "type": "reference", + "argument": "message", + "category": "full", + "description": " message content" + }, { + "type": "reference", + "argument": "attributes", + "category": "full", + "description": " optional message attributes" + }, { + "type": "reference", + "argument": "quotedMessage", + "category": "full", + "description": " optional quoted message" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "senderUid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 5, + "name": "message" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MessageAttributes" + } + }, + "id": 6, + "name": "attributes" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "QuotedMessage" + } + }, + "id": 7, + "name": "quotedMessage" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageContentChanged", + "header": 162, + "doc": [ + "Update about message change", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Rid of message" + }, { + "type": "reference", + "argument": "message", + "category": "full", + "description": " Message content" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 3, + "name": "message" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageQuotedChanged", + "header": 169, + "doc": [ + "Update about quoted message changed", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Rid of message" + }, { + "type": "reference", + "argument": "quotedMessage", + "category": "full", + "description": " Quoted Message" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "QuotedMessage" + } + }, + "id": 3, + "name": "quotedMessage" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageDateChanged", + "header": 163, + "doc": [ + "Update about message date changed", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Rid of message" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of message" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageSent", + "header": 4, + "doc": [ + "Update about message sent", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Rid of message" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of message" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageReceived", + "header": 54, + "doc": [ + "Update about message received", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "startDate", + "category": "full", + "description": " Start date of received message" + }, { + "type": "reference", + "argument": "receivedDate", + "category": "full", + "description": " Date of receive" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 2, + "name": "startDate" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "receivedDate" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageRead", + "header": 19, + "doc": [ + "Update about message read", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "startDate", + "category": "full", + "description": " Start date of read message" + }, { + "type": "reference", + "argument": "readDate", + "category": "full", + "description": " Date of read" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 2, + "name": "startDate" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "readDate" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageReadByMe", + "header": 50, + "doc": [ + "Update about message read by me", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "startDate", + "category": "full", + "description": " Start date of read message" + }, { + "type": "reference", + "argument": "unreadCounter", + "category": "full", + "description": " Optional unread counter in conversation" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 2, + "name": "startDate" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 3, + "name": "unreadCounter" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageDelete", + "header": 46, + "doc": [ + "Update about message delete", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "rids", + "category": "full", + "description": " Deleted messages" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "randomId" + } + }, + "id": 2, + "name": "rids" + }] + } + }, { + "type": "update", + "content": { + "name": "ChatClear", + "header": 47, + "doc": [ + "Update about chat clear", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "update", + "content": { + "name": "ChatDelete", + "header": 48, + "doc": [ + "Update about chat delete", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "update", + "content": { + "name": "ChatArchive", + "header": 94, + "doc": [ + "Update about chat archive", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "update", + "content": { + "name": "ChatDropCache", + "header": 2690, + "doc": [ + "Update about cache drop", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "update", + "content": { + "name": "ChatGroupsChanged", + "header": 1, + "doc": [ + "Update about chat groups changed. Called only when adding, removing and reordering of grouped dialog.", { + "type": "reference", + "argument": "dialogs", + "category": "compact", + "description": " New dialgos list" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "DialogGroup" + } + }, + "id": 1, + "name": "dialogs" + }] + } + }, { + "type": "update", + "content": { + "name": "ReactionsUpdate", + "header": 222, + "doc": [ + "Update about reactions change", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Message random id" + }, { + "type": "reference", + "argument": "reactions", + "category": "full", + "description": " New Reactions" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageReaction" + } + }, + "id": 3, + "name": "reactions" + }] + } + }, { + "type": "enum", + "content": { + "name": "MessageState", + "values": [{ + "name": "Sent", + "id": 1 + }, { + "name": "Received", + "id": 2 + }, { + "name": "Read", + "id": 3 + }] + } + }, { + "type": "struct", + "content": { + "name": "MessageContainer", + "doc": [ + "Message from history", { + "type": "reference", + "argument": "senderUid", + "category": "full", + "description": " Sender of mesasge" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of message" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of message" + }, { + "type": "reference", + "argument": "message", + "category": "full", + "description": " Content of message" + }, { + "type": "reference", + "argument": "reactions", + "category": "full", + "description": " Message reactions" + }, { + "type": "reference", + "argument": "attribute", + "category": "full", + "description": " Optional message attributes" + }, { + "type": "reference", + "argument": "quotedMessage", + "category": "full", + "description": " Optional quoted Message" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "senderUid" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 5, + "name": "message" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "MessageState" + } + }, + "id": 6, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageReaction" + } + }, + "id": 7, + "name": "reactions" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MessageAttributes" + } + }, + "id": 8, + "name": "attribute" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "QuotedMessage" + } + }, + "id": 9, + "name": "quotedMessage" + }] + } + }, { + "type": "enum", + "content": { + "name": "ListLoadMode", + "values": [{ + "name": "Forward", + "id": 1 + }, { + "name": "Backward", + "id": 2 + }, { + "name": "Both", + "id": 3 + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadHistory", + "header": 118, + "response": { + "type": "anonymous", + "header": 119, + "doc": [ + "Loaded history", { + "type": "reference", + "argument": "history", + "category": "compact", + "description": " Messages" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Loaded users" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageContainer" } - ] - } - }, { - "type": "enum", - "content": { - "name": "SearchContentType", - "values": [ - { - "name": "Any", - "id": 1 - }, - { - "name": "Text", - "id": 2 - }, - { - "name": "Links", - "id": 3 - }, - { - "name": "Documents", - "id": 4 - }, - { - "name": "Photos", - "id": 5 + }, + "id": 1, + "name": "history" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" } - ] - } - },{"type":"trait","content":{ -"isContainer":"true","name":"SearchCondition","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"SearchPeerTypeCondition", -"doc":[ -"Search peer type condition",{"type":"reference","argument":"peerType","category":"full","description":" Peer type for searching"}],"trait":{"name":"SearchCondition","key":1},"attributes":[ -{"type":{"type":"enum","childType":"SearchPeerType"},"id":1,"name":"peerType"} -]}}, { - "type":"struct", - "content": { - "name":"SearchPieceText", -"doc":[ -"Search peer name condition",{"type":"reference","argument":"query","category":"full","description":" Search query"}],"trait":{"name":"SearchCondition","key":2},"attributes":[ -{"type":"string","id":1,"name":"query"} -]}}, { - "type":"struct", - "content": { - "name":"SearchAndCondition", -"doc":[ -"Search AND condion",{"type":"reference","argument":"andQuery","category":"full","description":" And Query"}],"trait":{"name":"SearchCondition","key":3},"attributes":[ -{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":1,"name":"andQuery"} -]}}, { - "type":"struct", - "content": { - "name":"SearchOrCondition", -"doc":[ -"Search OR condition",{"type":"reference","argument":"orQuery","category":"full","description":" Or Query"}],"trait":{"name":"SearchCondition","key":4},"attributes":[ -{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":2,"name":"orQuery"} -]}}, { - "type":"struct", - "content": { - "name":"SearchPeerCondition", -"doc":[ -"Serch Peer condition",{"type":"reference","argument":"peer","category":"full","description":" Peer condition"}],"trait":{"name":"SearchCondition","key":5},"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}}, { - "type":"struct", - "content": { - "name":"SearchPeerContentType", -"doc":[ -"Search content type condition",{"type":"reference","argument":"contentType","category":"full","description":" Content Type"}],"trait":{"name":"SearchCondition","key":6},"attributes":[ -{"type":{"type":"enum","childType":"SearchContentType"},"id":1,"name":"contentType"} -]}}, { - "type":"struct", - "content": { - "name":"SearchSenderIdConfition", -"doc":[ -"Searching sender uid condition",{"type":"reference","argument":"senderId","category":"full","description":" sender UID"}],"trait":{"name":"SearchCondition","key":7},"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"senderId"} -]}}, { - "type":"struct", - "content": { - "name":"PeerSearchResult", -"doc":[ -"Peer search result",{"type":"reference","argument":"peer","category":"full","description":" Peer information"},{"type":"reference","argument":"optMatchString","category":"full","description":" Description"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"optMatchString"} -]}},{"type":"rpc","content":{ -"name":"PeerSearch", -"header":233, -"response":{"type":"anonymous","header":234, "doc":[ -"Found peers",{"type":"reference","argument":"searchResults","category":"full","description":" Search Results"},{"type":"reference","argument":"users","category":"full","description":" Related users"},{"type":"reference","argument":"groups","category":"full","description":" Related groups"},{"type":"reference","argument":"userPeers","category":"full","description":" Related user peers"},{"type":"reference","argument":"groupPeers","category":"full","description":" Related group peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"PeerSearchResult"}},"id":1,"name":"searchResults"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":5,"name":"groupPeers"} -]}, -"doc":[ -"Performing peer search",{"type":"reference","argument":"query","category":"full","description":"Search query. Warring not all combinations can be processed by server. (acts as OR)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":1,"name":"query"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} -]}}, { - "type":"struct", - "content": { - "name":"MessageSearchResult", -"doc":[ -"Message container",{"type":"reference","argument":"peer","category":"full","description":" Message Peer"},{"type":"reference","argument":"rid","category":"full","description":" Message Random Id"},{"type":"reference","argument":"date","category":"full","description":" Message Date"},{"type":"reference","argument":"senderId","category":"full","description":" Message sender UID"},{"type":"reference","argument":"content","category":"full","description":" Message content"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -,{"type":{"type":"alias","childType":"userId"},"id":4,"name":"senderId"} -,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"content"} -]}}, { - "type":"struct", - "content": { - "name":"MessageSearchItem", -"doc":[ -"Message Search result container"],"attributes":[ -{"type":{"type":"struct","childType":"MessageSearchResult"},"id":1,"name":"result"} -]}},{"type":"response","content":{ -"name":"MessageSearchResponse", -"header":218, -"doc":[ -"Search Result",{"type":"reference","argument":"searchResults","category":"full","description":" Search results"},{"type":"reference","argument":"users","category":"full","description":" Search users"},{"type":"reference","argument":"groups","category":"full","description":" Search groups"},{"type":"reference","argument":"loadMoreState","category":"hidden","description":" State for loading more results"},{"type":"reference","argument":"userOutPeers","category":"full","description":" Search user peers"},{"type":"reference","argument":"groupOutPeers","category":"full","description":" Search group peers"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"MessageSearchItem"}},"id":1,"name":"searchResults"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} -,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"loadMoreState"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userOutPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupOutPeers"} -]}},{"type":"rpc","content":{ -"name":"MessageSearch", -"header":217, -"response":{"type":"reference","name":"MessageSearchResponse"}, -"doc":[ -"Performing message search",{"type":"reference","argument":"query","category":"full","description":"Search query"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"trait","childType":"SearchCondition"},"id":1,"name":"query"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"MessageSearchMore", -"header":222, -"response":{"type":"reference","name":"MessageSearchResponse"}, -"doc":[ -"Performing message search paging",{"type":"reference","argument":"loadMoreState","category":"hidden","description":"State for loading more results"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":"bytes","id":1,"name":"loadMoreState"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} -]}}]}, { - "title": "Public Groups", - "package": "pubgroups", - "doc": [ - "Public group is easy way to find communities" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"PublicGroup", -"doc":[ -"Public Group description",{"type":"reference","argument":"id","category":"full","description":" Group id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Group Access hash"},{"type":"reference","argument":"title","category":"full","description":" Group title"},{"type":"reference","argument":"avatar","category":"full","description":" Group avatar"},{"type":"reference","argument":"membersCount","category":"full","description":" Members count in group"},{"type":"reference","argument":"friendsCount","category":"full","description":" Friends count int group"},{"type":"reference","argument":"description","category":"full","description":" Description of group"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":"string","id":3,"name":"title"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":7,"name":"avatar"} -,{"type":"int32","id":4,"name":"membersCount"} -,{"type":"int32","id":5,"name":"friendsCount"} -,{"type":"string","id":6,"name":"description"} -]}},{"type":"rpc","content":{ -"name":"GetPublicGroups", -"header":201, -"response":{"type":"anonymous","header":202, "doc":[ -"Loaded public groups",{"type":"reference","argument":"groups","category":"full","description":" All available groups"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"PublicGroup"}},"id":1,"name":"groups"} -]}, -"doc":[ -"Getting public groups"],"attributes":[ -]}}]}, { - "title": "Invites", - "package": "invites", - "doc": [ - "Invite mechanizm" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"InviteState", -"doc":[ -"Invite state",{"type":"reference","argument":"email","category":"full","description":" Email of invite"},{"type":"reference","argument":"name","category":"full","description":" Name of invited user"},{"type":"reference","argument":"uid","category":"full","description":" Uid of registered user"},{"type":"reference","argument":"tid","category":"full","description":" Team id of invite"}],"attributes":[ -{"type":"string","id":1,"name":"email"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} -,{"type":{"type":"opt","childType":"int32"},"id":3,"name":"uid"} -,{"type":{"type":"opt","childType":"int32"},"id":4,"name":"tid"} -]}},{"type":"response","content":{ -"name":"InviteList", -"header":2564, -"doc":[ -"Intites list",{"type":"reference","argument":"invites","category":"full","description":" Intvites"},{"type":"reference","argument":"relatedUsers","category":"full","description":" Related users in invites"},{"type":"reference","argument":"relatedGroups","category":"full","description":" Related groups in invites"},{"type":"reference","argument":"relatedTeams","category":"full","description":" Related teams in invites"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"InviteState"}},"id":1,"name":"invites"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"relatedUsers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"relatedGroups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":4,"name":"relatedTeams"} -]}},{"type":"rpc","content":{ -"name":"LoadOwnSentInvites", -"header":2563, -"response":{"type":"reference","name":"InviteList"}, -"doc":[ -"Loading current invite states"],"attributes":[ -]}},{"type":"rpc","content":{ -"name":"SendInvite", -"header":2565, -"response":{"type":"reference","name":"InviteList"}, -"doc":[ -"Sending an email invite",{"type":"reference","argument":"email","category":"full","description":"Email for invite"},{"type":"reference","argument":"name","category":"full","description":"Optional name for invite"},{"type":"reference","argument":"destTeam","category":"full","description":"Optional team for invite"}],"attributes":[ -{"type":"string","id":1,"name":"email"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"OutTeam"}},"id":3,"name":"destTeam"} -]}}]}, { - "title": "Teams", - "package": "teams", - "doc": [ - "Teams support for Actor" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"Team", -"doc":[ -"Team entity",{"type":"reference","argument":"id","category":"full","description":" Team Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Team Access Hash"},{"type":"reference","argument":"name","category":"full","description":" Team name"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":"string","id":3,"name":"name"} -]}}, { - "type":"struct", - "content": { - "name":"OutTeam", -"doc":[ -"Reference to a team",{"type":"reference","argument":"id","category":"full","description":" Team Id"},{"type":"reference","argument":"accessHash","category":"full","description":" Team access hash"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -]}},{"type":"response","content":{ -"name":"TeamsList", -"header":2562, -"doc":[ -"Teams response",{"type":"reference","argument":"teams","category":"hidden","description":" Teams list"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":1,"name":"teams"} -]}},{"type":"rpc","content":{ -"name":"LoadOwnTeams", -"header":2561, -"response":{"type":"reference","name":"TeamsList"}, -"doc":[ -"Loading own teams"],"attributes":[ -]}},{"type":"update","content":{ -"name":"OwnTeamsChanged", -"header":165, -"doc":[ -"Update about own teams changed",{"type":"reference","argument":"ownTeams","category":"full","description":" Updated own teams list"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":1,"name":"ownTeams"} -]}},{"type":"rpc","content":{ -"name":"CreateTeam", -"header":2566, -"response":{"type":"anonymous","header":2567, "doc":[ -"Created team response",{"type":"reference","argument":"createdTeam","category":"full","description":" Created Team"}] ,"attributes":[{"type":{"type":"struct","childType":"Team"},"id":1,"name":"createdTeam"} -]}, -"doc":[ -"Creation of a Team",{"type":"reference","argument":"title","category":"full","description":"Title of a team"}],"attributes":[ -{"type":"string","id":1,"name":"title"} -]}},{"type":"rpc","content":{ -"name":"InviteToTeam", -"header":2568, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Inviting people to team",{"type":"reference","argument":"user","category":"full","description":"Dest user"},{"type":"reference","argument":"destTeam","category":"full","description":"Dest team"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"user"} -,{"type":{"type":"struct","childType":"OutTeam"},"id":3,"name":"destTeam"} -]}}]}, { - "title": "Integrations", - "package": "integrations", - "doc": [ - "Package contains methods for providing integration" - ], - "items": [ -{"type":"response","content":{ -"name":"IntegrationToken", -"header":183, -"doc":[ -"Group token response",{"type":"reference","argument":"token","category":"danger","description":" current group token"},{"type":"reference","argument":"url","category":"danger","description":" current group url"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -,{"type":"string","id":2,"name":"url"} -]}},{"type":"rpc","content":{ -"name":"GetIntegrationToken", -"header":182, -"response":{"type":"reference","name":"IntegrationToken"}, -"doc":[ -"Getting current group token",{"type":"reference","argument":"groupPeer","category":"full","description":"Peer"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"RevokeIntegrationToken", -"header":184, -"response":{"type":"reference","name":"IntegrationToken"}, -"doc":[ -"Revoke group token",{"type":"reference","argument":"groupPeer","category":"full","description":"Peer"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"groupPeer"} -]}}]}, { - "title": "Typing and Online", - "package": "weak", - "items": [ - { - "type": "enum", - "content": { - "name": "TypingType", - "values": [ - { - "name": "Text", - "id": 0 + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" } - ] - } - },{"type":"rpc","content":{ -"name":"Typing", -"header":27, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Sending typing notification",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"typingType","category":"full","description":"typing type."}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} -]}},{"type":"rpc","content":{ -"name":"StopTyping", -"header":30, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Stop typing",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"typingType","category":"full","description":"typing type"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"enum","childType":"TypingType"},"id":2,"name":"typingType"} -]}}, { - "type": "enum", - "content": { - "name": "DeviceType", - "values": [ - { - "name": "GENERIC", - "id": 1 - }, - { - "name": "PC", - "id": 2 - }, - { - "name": "MOBILE", - "id": 3 - }, - { - "name": "TABLET", - "id": 4 - }, - { - "name": "WATCH", - "id": 5 - }, - { - "name": "MIRROR", - "id": 6 - }, - { - "name": "CAR", - "id": 7 - }, - { - "name": "TABLE", - "id": 8 + }, + "id": 4, + "name": "userPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" } - ] - } - },{"type":"rpc","content":{ -"name":"SetOnline", -"header":29, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Sending online state",{"type":"reference","argument":"isOnline","category":"full","description":"is user online"},{"type":"reference","argument":"timeout","category":"full","description":"timeout of online state in milliseconds"},{"type":"reference","argument":"deviceType","category":"full","description":"Optional device type"},{"type":"reference","argument":"deviceCategory","category":"full","description":"Optional device category, for example android or ios"}],"attributes":[ -{"type":"bool","id":1,"name":"isOnline"} -,{"type":{"type":"alias","childType":"msec"},"id":2,"name":"timeout"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":3,"name":"deviceType"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"deviceCategory"} -]}},{"type":"update","content":{ -"name":"PauseNotifications", -"header":166, -"doc":[ -"Update about pausing notifications",{"type":"reference","argument":"timeout","category":"full","description":" Timeout for notifications resume"}],"attributes":[ -{"type":{"type":"alias","childType":"sec"},"id":1,"name":"timeout"} -]}},{"type":"update","content":{ -"name":"RestoreNotifications", -"header":167, -"doc":[ -"Update about restoring notifications"],"attributes":[ -]}},{"type":"rpc","content":{ -"name":"PauseNotifications", -"header":2641, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Pause notifications",{"type":"reference","argument":"timeout","category":"hidden","description":"Timeout of pause"}],"attributes":[ -{"type":{"type":"alias","childType":"sec"},"id":1,"name":"timeout"} -]}},{"type":"rpc","content":{ -"name":"RestoreNotifications", -"header":2642, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Restoring notifications"],"attributes":[ -]}},{"type":"empty"},{"type":"update","content":{ -"name":"Typing", -"header":6, -"doc":[ -"Update about user's typing",{"type":"reference","argument":"peer","category":"full","description":" Conversation peer"},{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"typingType","category":"full","description":" Type of typing"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} -]}},{"type":"update","content":{ -"name":"TypingStop", -"header":81, -"doc":[ -"Update about user's typing stop",{"type":"reference","argument":"peer","category":"full","description":" Conversation peer"},{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"typingType","category":"hidden","description":" Type of typing"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} -]}},{"type":"update","content":{ -"name":"UserOnline", -"header":7, -"doc":[ -"Update about user became online",{"type":"reference","argument":"uid","category":"full","description":" User's Id"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":2,"name":"deviceType"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"deviceCategory"} -]}},{"type":"update","content":{ -"name":"UserOffline", -"header":8, -"doc":[ -"Update about user became offline",{"type":"reference","argument":"uid","category":"full","description":" User's id"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":2,"name":"deviceType"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"deviceCategory"} -]}},{"type":"update","content":{ -"name":"UserLastSeen", -"header":9, -"doc":[ -"Update about user's last seen state",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"date","category":"full","description":" Last seen time"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"alias","childType":"date"},"id":2,"name":"date"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":3,"name":"deviceType"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"deviceCategory"} -]}},{"type":"update","content":{ -"name":"GroupOnline", -"header":33, -"doc":[ -"Update about group online change",{"type":"reference","argument":"groupId","category":"full","description":" Group id"},{"type":"reference","argument":"count","category":"full","description":" current online user's count"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"int32","id":2,"name":"count"} -]}}]}, { - "title": "Media and Files", - "package": "files", - "items": [ - { - "type":"struct", - "content": { - "name":"FileLocation", -"doc":[ -"Location of file on server",{"type":"reference","argument":"fileId","category":"full","description":" Unique Id of file"},{"type":"reference","argument":"accessHash","category":"danger","description":" Access hash of file"}],"expandable":"true","attributes":[ -{"type":"int64","id":1,"name":"fileId"} -,{"type":"int64","id":2,"name":"accessHash"} -]}}, { - "type":"struct", - "content": { - "name":"ImageLocation", -"doc":[ -"Image location",{"type":"reference","argument":"fileLocation","category":"full","description":" Location of file"},{"type":"reference","argument":"width","category":"full","description":" Width of avatar image"},{"type":"reference","argument":"height","category":"full","description":" Height of avatar image"},{"type":"reference","argument":"fileSize","category":"full","description":" Size of file"}],"expandable":"true","attributes":[ -{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} -,{"type":"int32","id":2,"name":"width"} -,{"type":"int32","id":3,"name":"height"} -,{"type":"int32","id":4,"name":"fileSize"} -]}}, { - "type":"struct", - "content": { - "name":"AvatarImage", -"doc":[ -"Avatar Image",{"type":"reference","argument":"fileLocation","category":"full","description":" Location of file"},{"type":"reference","argument":"width","category":"full","description":" Width of avatar image"},{"type":"reference","argument":"height","category":"full","description":" Height of avatar image"},{"type":"reference","argument":"fileSize","category":"full","description":" Size of file"}],"expandable":"true","attributes":[ -{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} -,{"type":"int32","id":2,"name":"width"} -,{"type":"int32","id":3,"name":"height"} -,{"type":"int32","id":4,"name":"fileSize"} -]}}, { - "type":"struct", - "content": { - "name":"Avatar", -"doc":[ -"Avatar of User or Group",{"type":"reference","argument":"smallImage","category":"compact","description":" Optional small image of avatar box in 100x100"},{"type":"reference","argument":"largeImage","category":"compact","description":" Optional large image of avatar box in 200x200"},{"type":"reference","argument":"fullImage","category":"compact","description":" Optional full screen image of avatar"}],"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":1,"name":"smallImage"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":2,"name":"largeImage"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":3,"name":"fullImage"} -]}}, { - "type":"struct", - "content": { - "name":"FastThumb", -"doc":[ -"Fast thumb of media messages. Less than 90x90 and compressed by JPEG with low quality",{"type":"reference","argument":"w","category":"full","description":" Width of thumb"},{"type":"reference","argument":"h","category":"full","description":" Height of thump"},{"type":"reference","argument":"thumb","category":"compact","description":" compressed image data"}],"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"w"} -,{"type":"int32","id":2,"name":"h"} -,{"type":"bytes","id":3,"name":"thumb"} -]}}, { - "type": "enum", - "content": { - "name": "Colors", - "values": [ - { - "name": "red", - "id": 1 - }, - { - "name": "yellow", - "id": 2 - }, - { - "name": "green", - "id": 3 + }, + "id": 5, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" } - ] - } - },{"type":"trait","content":{ -"isContainer":"true","name":"Color","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"RgbColor", -"doc":[ -"RGB Color",{"type":"reference","argument":"rgb","category":"full","description":" RGB color value"}],"trait":{"name":"Color","key":1},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"rgb"} -]}}, { - "type":"struct", - "content": { - "name":"PredefinedColor", -"doc":[ -"Predefined color",{"type":"reference","argument":"color","category":"hidden","description":" Predefined color value"}],"trait":{"name":"Color","key":2},"expandable":"true","attributes":[ -{"type":{"type":"enum","childType":"Colors"},"id":1,"name":"color"} -]}},{"type":"empty"}, { - "type":"struct", - "content": { - "name":"HTTPHeader", -"doc":[ -"HTTP Header record",{"type":"reference","argument":"key","category":"full","description":" HTTP Header name"},{"type":"reference","argument":"value","category":"full","description":" HTTP Header value"}],"attributes":[ -{"type":"string","id":1,"name":"key"} -,{"type":"string","id":2,"name":"value"} -]}}, { - "type":"struct", - "content": { - "name":"FileUrlDescription", -"doc":[ -"File url description",{"type":"reference","argument":"fileId","category":"full","description":" File id of url"},{"type":"reference","argument":"url","category":"full","description":" Url for downloading"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url"},{"type":"reference","argument":"unsignedUrl","category":"hidden","description":" Unsigned URL (used to honor web caches)"},{"type":"reference","argument":"unsignedUrlHeaders","category":"hidden","description":" Headers that is required to download files with unsigned url"}],"attributes":[ -{"type":"int64","id":1,"name":"fileId"} -,{"type":"string","id":2,"name":"url"} -,{"type":{"type":"alias","childType":"sec"},"id":3,"name":"timeout"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"unsignedUrl"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"HTTPHeader"}},"id":5,"name":"unsignedUrlHeaders"} -]}},{"type":"rpc","content":{ -"name":"GetFileUrl", -"header":77, -"response":{"type":"anonymous","header":78, "doc":[ -{"type":"reference","argument":"url","category":"full","description":" Url for downloading"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url"},{"type":"reference","argument":"unsignedUrl","category":"full","description":" Unsigned URL (used to honor web caches)"},{"type":"reference","argument":"unsignedUrlHeaders","category":"full","description":" Headers that is required to download files with unsigned url"}] ,"attributes":[{"type":"string","id":1,"name":"url"} -,{"type":{"type":"alias","childType":"sec"},"id":2,"name":"timeout"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"unsignedUrl"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"HTTPHeader"}},"id":4,"name":"unsignedUrlHeaders"} -]}, -"doc":[ -"Requesting file URL for downloading",{"type":"reference","argument":"file","category":"full","description":"file's location"}],"attributes":[ -{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"file"} -]}},{"type":"rpc","content":{ -"name":"GetFileUrls", -"header":2573, -"response":{"type":"anonymous","header":2574, "doc":[ -{"type":"reference","argument":"fileUrls","category":"full","description":" File urls"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"FileUrlDescription"}},"id":1,"name":"fileUrls"} -]}, -"doc":[ -"Requesting multiple fle URL for downloading",{"type":"reference","argument":"files","category":"hidden","description":"File locations to load urls"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"FileLocation"}},"id":1,"name":"files"} -]}},{"type":"rpc","content":{ -"name":"GetFileUrlBuilder", -"header":2579, -"response":{"type":"anonymous","header":2580, "doc":[ -{"type":"reference","argument":"baseUrl","category":"full","description":" Base Url for files"},{"type":"reference","argument":"algo","category":"full","description":" Signature algorithm"},{"type":"reference","argument":"seed","category":"full","description":" Public-visible seed of signature"},{"type":"reference","argument":"signatureSecret","category":"full","description":" Signature Secret"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url builder"}] ,"attributes":[{"type":"string","id":1,"name":"baseUrl"} -,{"type":"string","id":2,"name":"algo"} -,{"type":"string","id":5,"name":"seed"} -,{"type":"bytes","id":3,"name":"signatureSecret"} -,{"type":{"type":"alias","childType":"sec"},"id":4,"name":"timeout"} -]}, -"doc":[ -"Get File URL Builder that allows to build file urls from client side",{"type":"reference","argument":"supportedSignatureAlgorithms","category":"hidden","description":"Supported signature algorithms by client"}],"attributes":[ -{"type":{"type":"list","childType":"string"},"id":1,"name":"supportedSignatureAlgorithms"} -]}},{"type":"rpc","content":{ -"name":"GetFileUploadUrl", -"header":97, -"response":{"type":"anonymous","header":121, "doc":[ -{"type":"reference","argument":"url","category":"full","description":" Url for uploading"},{"type":"reference","argument":"uploadKey","category":"compact","description":" Upload key for upload"}] ,"attributes":[{"type":"string","id":1,"name":"url"} -,{"type":"bytes","id":2,"name":"uploadKey"} -]}, -"doc":[ -"Requesting pload url",{"type":"reference","argument":"expectedSize","category":"full","description":"Expected size of uploading file. May be inaccurate. Used for size allocation optimizations."}],"attributes":[ -{"type":"int32","id":1,"name":"expectedSize"} -]}},{"type":"rpc","content":{ -"name":"CommitFileUpload", -"header":122, -"response":{"type":"anonymous","header":138, "doc":[ -{"type":"reference","argument":"uploadedFileLocation","category":"hidden","description":" Result file location"}] ,"attributes":[{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"uploadedFileLocation"} -]}, -"doc":[ -"Comminting uploaded file to storage"],"attributes":[ -{"type":"bytes","id":1,"name":"uploadKey"} -,{"type":"string","id":2,"name":"fileName"} -]}},{"type":"rpc","content":{ -"name":"GetFileUploadPartUrl", -"header":142, -"response":{"type":"anonymous","header":141, "doc":[ -{"type":"reference","argument":"url","category":"full","description":" Upload file part url"}] ,"attributes":[{"type":"string","id":1,"name":"url"} -]}, -"doc":[ -"Upload file part",{"type":"reference","argument":"uploadKey","category":"compact","description":"Upload Key from requestFileUploadUrl"}],"attributes":[ -{"type":"int32","id":1,"name":"partNumber"} -,{"type":"int32","id":2,"name":"partSize"} -,{"type":"bytes","id":3,"name":"uploadKey"} -]}}]}, { - "title": "Features", - "package": "features", - "doc": [ - "Enable feature discovery. Currently available features:", - "* \"call\" - private audio calls" - ], - "items": [ -{"type":"rpc","content":{ -"name":"EnableFeature", -"header":2588, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Enabling feature on the device",{"type":"reference","argument":"featureName","category":"full","description":"Feature name"},{"type":"reference","argument":"args","category":"danger","description":"Optional arguments to a feature"}],"attributes":[ -{"type":"string","id":1,"name":"featureName"} -,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"args"} -]}},{"type":"rpc","content":{ -"name":"DisableFeature", -"header":2589, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Disabling feature on the device",{"type":"reference","argument":"featureName","category":"full","description":"Feature name"}],"attributes":[ -{"type":"string","id":1,"name":"featureName"} -]}},{"type":"rpc","content":{ -"name":"CheckFeatureEnabled", -"header":2590, -"response":{"type":"reference","name":"Bool"}, -"doc":[ -"Method for checking if feature is available to user"],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userOutPeer"} -,{"type":"string","id":2,"name":"featureName"} -]}}]}, { - "title": "EventBus", - "package": "eventbus", - "items": [ -{"type":"rpc","content":{ -"name":"CreateNewEventBus", -"header":2665, -"response":{"type":"anonymous","header":2666, "doc":[ -"Created new Event Bus",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Your Device Id"}] ,"attributes":[{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"deviceId"} -]}, -"doc":[ -"Create new Event Bus",{"type":"reference","argument":"timeout","category":"full","description":"Optional timeout of Event Bus"},{"type":"reference","argument":"isOwned","category":"full","description":"Is Event Bus owned by creator"}],"attributes":[ -{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":1,"name":"timeout"} -,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isOwned"} -]}},{"type":"rpc","content":{ -"name":"JoinEventBus", -"header":2668, -"response":{"type":"anonymous","header":2669, "doc":[ -{"type":"reference","argument":"deviceId","category":"full","description":" Your Device Id"},{"type":"reference","argument":"rejoinToken","category":"full","description":" Token that can be used for rejoining event bus with same device id"}] ,"attributes":[{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"deviceId"} -,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"rejoinToken"} -]}, -"doc":[ -"Joining Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"timeout","category":"full","description":"Join timeout"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} -]}},{"type":"rpc","content":{ -"name":"ReJoinEventBus", -"header":2675, -"response":{"type":"anonymous","header":2676, "doc":[ -{"type":"reference","argument":"deviceId","category":"hidden","description":" Your Device Id"}] ,"attributes":[{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"deviceId"} -]}, -"doc":[ -"Rejoining to event bus after session was disposed",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"rejoinToken","category":"full","description":"Rejoin Token"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":"bytes","id":2,"name":"rejoinToken"} -]}},{"type":"rpc","content":{ -"name":"KeepAliveEventBus", -"header":2670, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Keep Alive Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"timeout","category":"full","description":"Optional timeout for keep alive"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} -]}},{"type":"rpc","content":{ -"name":"DisposeEventBus", -"header":2667, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Dispose Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -]}},{"type":"rpc","content":{ -"name":"PostToEventBus", -"header":2671, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Event Bus Destination",{"type":"reference","argument":"id","category":"full","description":"Bus Id"},{"type":"reference","argument":"destinations","category":"full","description":"If Empty need to broadcase message to everyone"},{"type":"reference","argument":"message","category":"hidden","description":"Message"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"destinations"} -,{"type":"bytes","id":3,"name":"message"} -]}},{"type":"update","content":{ -"name":"EventBusDeviceConnected", -"header":2561, -"doc":[ -"Update about pubsub device connected",{"type":"reference","argument":"id","category":"full","description":" ID of Event Bus"},{"type":"reference","argument":"userId","category":"full","description":" Joined User Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Joined Device Unique Id"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"userId"} -,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} -]}},{"type":"update","content":{ -"name":"EventBusDeviceDisconnected", -"header":2563, -"doc":[ -"Update about device disconnected",{"type":"reference","argument":"id","category":"full","description":" ID of Event Bus"},{"type":"reference","argument":"userId","category":"full","description":" Joined User Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Disconnected Device unique Id"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"userId"} -,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} -]}},{"type":"update","content":{ -"name":"EventBusMessage", -"header":2562, -"doc":[ -"Event Bus Message",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"senderId","category":"full","description":" Sender of message"},{"type":"reference","argument":"senderDeviceId","category":"full","description":" Device Id of sender"},{"type":"reference","argument":"message","category":"hidden","description":" Message"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"senderId"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"randomId"}},"id":3,"name":"senderDeviceId"} -,{"type":"bytes","id":4,"name":"message"} -]}},{"type":"update","content":{ -"name":"EventBusDisposed", -"header":2564, -"doc":[ -"Event Bus dispose",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -]}}]}, { - "title": "Values", - "package": "values", - "doc": [ - "Synced Values" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"SyncedValue", -"doc":[ -"Synced Value container",{"type":"reference","argument":"id","category":"full","description":" Unique Id of a value. Unique in the scope of one named value."},{"type":"reference","argument":"value","category":"full","description":" Optional value"}],"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"id"} -,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"value"} -]}},{"type":"rpc","content":{ -"name":"LoadSyncedSet", -"header":2679, -"response":{"type":"anonymous","header":2680, "doc":[ -{"type":"reference","argument":"values","category":"full","description":" Current set values"},{"type":"reference","argument":"isStrong","category":"full","description":" Is this value strong and stored in sequence. By default is true."}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":1,"name":"values"} -,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isStrong"} -]}, -"doc":[ -"Loading synced set",{"type":"reference","argument":"setName","category":"hidden","description":"readable name of the set"}],"attributes":[ -{"type":"string","id":1,"name":"setName"} -]}},{"type":"update","content":{ -"name":"SynedSetUpdated", -"header":72, -"doc":[ -"Update about synced set update",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"syncedValues","category":"full","description":" Current set values"},{"type":"reference","argument":"isStrong","category":"full","description":" Is this value strong and need to be stored on disk"}],"attributes":[ -{"type":"string","id":1,"name":"setName"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":2,"name":"syncedValues"} -,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isStrong"} -]}},{"type":"update","content":{ -"name":"SyncedSetAddedOrUpdated", -"header":73, -"doc":[ -"Update about added or updated values in the synced set",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"addedOrUpdatedValues","category":"hidden","description":" Added or updated values"}],"attributes":[ -{"type":"string","id":1,"name":"setName"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":2,"name":"addedOrUpdatedValues"} -]}},{"type":"update","content":{ -"name":"SyncedSetRemoved", -"header":74, -"doc":[ -"Update about removed items from synced set",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"removedItems","category":"full","description":" Removed Items from the set"}],"attributes":[ -{"type":"string","id":1,"name":"setName"} -,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"removedItems"} -]}}]}, { - "title": "WebRTC", - "package": "webrtc", - "doc": [ - "WebRTC package that enables support to audio and video calls" - ], - "items": [ -{"type":"update","content":{ -"name":"IncomingCall", -"header":52, -"doc":[ -"Update about incoming call (Sent every 10 seconds)",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"attemptIndex","category":"full","description":" Optional attempt Index"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"opt","childType":"int32"},"id":2,"name":"attemptIndex"} -]}},{"type":"update","content":{ -"name":"CallHandled", -"header":53, -"doc":[ -"Update about incoming call handled",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"attemptIndex","category":"full","description":" Optional attempt Index"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"opt","childType":"int32"},"id":2,"name":"attemptIndex"} -]}},{"type":"update","content":{ -"name":"CallUpgraded", -"header":56, -"doc":[ -"Update about call moved to other peer",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"groupId","category":"full","description":" Upgraded group id"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupId"} -]}},{"type":"rpc","content":{ -"name":"GetCallInfo", -"header":2600, -"response":{"type":"anonymous","header":2606, "doc":[ -{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"groups","category":"compact","description":" Groups"},{"type":"reference","argument":"users","category":"compact","description":" Users"},{"type":"reference","argument":"eventBusId","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"isAudioOnlyCall","category":"full","description":" Is Audio Only Call. Default is true"},{"type":"reference","argument":"isVideoOnlyCall","category":"full","description":" Is Video Only Call. Default is false."},{"type":"reference","argument":"isVideoPreferred","category":"full","description":" Is Video preferred"}] ,"attributes":[{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":2,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} -,{"type":{"type":"alias","childType":"busId"},"id":4,"name":"eventBusId"} -,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"isAudioOnlyCall"} -,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isVideoOnlyCall"} -,{"type":{"type":"opt","childType":"bool"},"id":7,"name":"isVideoPreferred"} -]}, -"doc":[ -"Getting Call Information",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -]}},{"type":"rpc","content":{ -"name":"DoCall", -"header":2597, -"response":{"type":"anonymous","header":2598, "doc":[ -{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"eventBusId","category":"full","description":" Call Event Bus Id"}] ,"attributes":[{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"alias","childType":"busId"},"id":2,"name":"eventBusId"} -,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} -]}, -"doc":[ -"Do Call. Right after a call client need to start sending CallInProgress",{"type":"reference","argument":"peer","category":"full","description":"destination peer"},{"type":"reference","argument":"timeout","category":"full","description":"Initial timeout"},{"type":"reference","argument":"isAudioOnlyCall","category":"full","description":"Is Audio only call. Default is true."},{"type":"reference","argument":"isVideoOnlyCall","category":"full","description":"Is Video Only call. Default is false."},{"type":"reference","argument":"isVideoPreferred","category":"full","description":"Is Video preferred"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} -,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isAudioOnlyCall"} -,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isVideoOnlyCall"} -,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isVideoPreferred"} -]}},{"type":"rpc","content":{ -"name":"UpgradeCall", -"header":2677, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Method for upgrading a call from private call to group call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"},{"type":"reference","argument":"peer","category":"full","description":"Destination peer for upgrading"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"struct","childType":"GroupOutPeer"},"id":2,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"DoCallAgain", -"header":2678, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Call again to user",{"type":"reference","argument":"callId","category":"full","description":"Call Id"},{"type":"reference","argument":"user","category":"full","description":"User to call again"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"user"} -]}},{"type":"rpc","content":{ -"name":"JoinCall", -"header":2683, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Joining Call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -]}},{"type":"rpc","content":{ -"name":"RejectCall", -"header":2684, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Rejecting Call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -]}},{"type":"rpc","content":{ -"name":"OptimizeSDP", -"header":2685, -"response":{"type":"anonymous","header":2686, "doc":[ -{"type":"reference","argument":"optimizedSDP","category":"hidden","description":" Optimized version of SDP"}] ,"attributes":[{"type":"string","id":1,"name":"optimizedSDP"} -]}, -"doc":[ -"Optimizing SDP",{"type":"reference","argument":"type","category":"full","description":"Type of SDP (offer or answer)"},{"type":"reference","argument":"sdp","category":"full","description":"SDP value"},{"type":"reference","argument":"ownSettings","category":"full","description":"Own Settings"},{"type":"reference","argument":"theirSettings","category":"full","description":"Their Settings"}],"attributes":[ -{"type":"string","id":1,"name":"type"} -,{"type":"string","id":2,"name":"sdp"} -,{"type":{"type":"struct","childType":"PeerSettings"},"id":3,"name":"ownSettings"} -,{"type":{"type":"struct","childType":"PeerSettings"},"id":4,"name":"theirSettings"} -]}}, { - "type":"struct", - "content": { - "name":"ICEServer", -"doc":[ -"ICE Server description",{"type":"reference","argument":"url","category":"full","description":" Url to server"},{"type":"reference","argument":"username","category":"full","description":" Optional username"},{"type":"reference","argument":"credential","category":"danger","description":" Optional credential"}],"attributes":[ -{"type":"string","id":1,"name":"url"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"username"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"credential"} -]}},{"type":"trait","content":{ -"isContainer":"true","name":"WebRTCSignaling","attributes":[ -]}},{"type":"comment","content":"Advertising"}, { - "type":"struct", - "content": { - "name":"AdvertiseSelf", -"doc":[ -"Advertizing self to a master mode",{"type":"reference","argument":"peerSettings","category":"full","description":" Optional peer Settings"}],"trait":{"name":"WebRTCSignaling","key":21},"attributes":[ -{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":1,"name":"peerSettings"} -]}}, { - "type":"struct", - "content": { - "name":"AdvertiseMaster", -"doc":[ -"Sent by master"],"trait":{"name":"WebRTCSignaling","key":26},"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"ICEServer"}},"id":1,"name":"server"} -]}},{"type":"comment","content":"Web RTC signaling"}, { - "type":"struct", - "content": { - "name":"Candidate", -"doc":[ -"Candidate signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of candidate"},{"type":"reference","argument":"index","category":"full","description":" Index of candidate"},{"type":"reference","argument":"id","category":"full","description":" Id of candidate"},{"type":"reference","argument":"sdp","category":"full","description":" SDP of candidate"}],"trait":{"name":"WebRTCSignaling","key":3},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} -,{"type":"int32","id":2,"name":"index"} -,{"type":"string","id":3,"name":"id"} -,{"type":"string","id":4,"name":"sdp"} -]}}, { - "type":"struct", - "content": { - "name":"Offer", -"doc":[ -"Offer signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of offer"},{"type":"reference","argument":"sdp","category":"full","description":" Offer SDP"},{"type":"reference","argument":"ownPeerSettings","category":"full","description":" Optional Own Peer settings"}],"trait":{"name":"WebRTCSignaling","key":4},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} -,{"type":"string","id":2,"name":"sdp"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":3,"name":"ownPeerSettings"} -]}}, { - "type":"struct", - "content": { - "name":"Answer", -"doc":[ -"Answer signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of answer"},{"type":"reference","argument":"sdp","category":"full","description":" Answer SDP"}],"trait":{"name":"WebRTCSignaling","key":5},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} -,{"type":"string","id":2,"name":"sdp"} -]}}, { - "type":"struct", - "content": { - "name":"MediaStreamsUpdated", -"doc":[ -"Update about media stream settings updated. Can be sent before offer/answer.",{"type":"reference","argument":"isAudioEnabled","category":"full","description":" Is Audio Enabled in current connection. True by default."},{"type":"reference","argument":"isVideoEnabled","category":"full","description":" Is Video Enabled in current connection. False by default."}],"trait":{"name":"WebRTCSignaling","key":28},"attributes":[ -{"type":{"type":"opt","childType":"bool"},"id":1,"name":"isAudioEnabled"} -,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isVideoEnabled"} -]}},{"type":"comment","content":"Call Controlling events"}, { - "type":"struct", - "content": { - "name":"NeedOffer", -"doc":[ -"Notification from master that offer is required",{"type":"reference","argument":"device","category":"full","description":" Destination Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"},{"type":"reference","argument":"peerSettings","category":"full","description":" Optional peer settings"}],"trait":{"name":"WebRTCSignaling","key":8},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":3,"name":"peerSettings"} -]}}, { - "type":"struct", - "content": { - "name":"NegotinationSuccessful", -"doc":[ -"Notification about on negotiation is successful",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":24},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} -]}}, { - "type":"struct", - "content": { - "name":"EnableConnection", -"doc":[ -"Notification about enabling connection to peer",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":22},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} -]}}, { - "type":"struct", - "content": { - "name":"OnRenegotiationNeeded", -"doc":[ -"Need renegotiate session. For example when streams are changed.",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":25},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} -]}}, { - "type":"struct", - "content": { - "name":"CloseSession", -"doc":[ -"Close this session and be ready to",{"type":"reference","argument":"device","category":"hidden","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id for renegotiation"}],"trait":{"name":"WebRTCSignaling","key":6},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} -]}}, { - "type":"struct", - "content": { - "name":"NeedDisconnect", -"doc":[ -"Notification about requirement about required disconnection from peer",{"type":"reference","argument":"device","category":"hidden","description":" Device Id"}],"trait":{"name":"WebRTCSignaling","key":20},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} -]}}, { - "type":"struct", - "content": { - "name":"ActiveCall", -"doc":[ -"Active Calls. Used in broadcasting states of current calls.",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"peer","category":"full","description":" Call's peer"},{"type":"reference","argument":"callMembers","category":"full","description":" Call Members"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"struct","childType":"Peer"},"id":2,"name":"peer"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"CallMember"}},"id":3,"name":"callMembers"} -]}}, { - "type": "enum", - "content": { - "name": "CallMemberState", - "values": [ - { - "name": "RINGING", - "id": 1 - }, - { - "name": "RINGING_REACHED", - "id": 4 - }, - { - "name": "CONNECTING", - "id": 2 - }, - { - "name": "CONNECTED", - "id": 3 - }, - { - "name": "ENDED", - "id": 5 + }, + "id": 6, + "name": "groupPeers" + }] + }, + "doc": [ + "Loading history of chat", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Peer of conversation" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": "start date of messages for loading or 0 for loading from start" + }, { + "type": "reference", + "argument": "loadMode", + "category": "full", + "description": "Loading mode: Forward loading, backward or both ways" + }, { + "type": "reference", + "argument": "limit", + "category": "full", + "description": "maximum amount of messages (max is 100)" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "ListLoadMode" + } + }, + "id": 5, + "name": "loadMode" + }, { + "type": "int32", + "id": 4, + "name": "limit" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 6, + "name": "optimizations" + }] + } + }, { + "type": "struct", + "content": { + "name": "Dialog", + "doc": [ + "Conversation from history", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Peer of conversation" + }, { + "type": "reference", + "argument": "unreadCount", + "category": "full", + "description": " plain messages unread messages count" + }, { + "type": "reference", + "argument": "sortDate", + "category": "full", + "description": " date of conversation for sorting" + }, { + "type": "reference", + "argument": "senderUid", + "category": "full", + "description": " Sender of top message (may be zero)" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random ID of top message (may be zero)" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of top message (can't be zero)" + }, { + "type": "reference", + "argument": "message", + "category": "full", + "description": " Content of message" + }, { + "type": "reference", + "argument": "firstUnreadDate", + "category": "full", + "description": " Date of first unread message" + }, { + "type": "reference", + "argument": "attributes", + "category": "full", + "description": " Optional top message attributes" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": "int32", + "id": 3, + "name": "unreadCount" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "sortDate" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 5, + "name": "senderUid" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 6, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 7, + "name": "date" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 8, + "name": "message" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "MessageState" + } + }, + "id": 9, + "name": "state" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "date" + } + }, + "id": 10, + "name": "firstUnreadDate" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MessageAttributes" + } + }, + "id": 11, + "name": "attributes" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadDialogs", + "header": 104, + "response": { + "type": "anonymous", + "header": 105, + "doc": [ + "Loaded dialogs", { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Loaded groups" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Loaded users" + }, { + "type": "reference", + "argument": "dialogs", + "category": "compact", + "description": " Loaded dialogs" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" } - ] - } - }, { - "type":"struct", - "content": { - "name":"CallMemberStateHolder", -"doc":[ -"Call Member state holder",{"type":"reference","argument":"state","category":"full","description":" State Value"},{"type":"reference","argument":"fallbackIsRinging","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsConnected","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsConnecting","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsRingingReached","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsEnded","category":"full","description":" Fallback flag for future compatibility of state"}],"attributes":[ -{"type":{"type":"enum","childType":"CallMemberState"},"id":1,"name":"state"} -,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"fallbackIsRinging"} -,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"fallbackIsConnected"} -,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"fallbackIsConnecting"} -,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"fallbackIsRingingReached"} -,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"fallbackIsEnded"} -]}}, { - "type":"struct", - "content": { - "name":"CallMember", -"doc":[ -"Call Member",{"type":"reference","argument":"userId","category":"full","description":" Member User Id"},{"type":"reference","argument":"state","category":"full","description":" State of member"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"userId"} -,{"type":{"type":"struct","childType":"CallMemberStateHolder"},"id":3,"name":"state"} -]}}, { - "type":"struct", - "content": { - "name":"PeerSettings", -"doc":[ -"Peer Settings",{"type":"reference","argument":"is3DESSupported","category":"full","description":" Marking if 3DES supported. Default is false."},{"type":"reference","argument":"isMobile","category":"full","description":" Is Peer a mobile phone. Default is false."},{"type":"reference","argument":"canBeAudioRelay","category":"full","description":" If peer can audio relay. Default is false."},{"type":"reference","argument":"canPreConnect","category":"full","description":" If peer can preconnect before answer"}],"attributes":[ -{"type":{"type":"opt","childType":"bool"},"id":1,"name":"is3DESSupported"} -,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isMobile"} -,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"canBeAudioRelay"} -,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"canPreConnect"} -]}}]}, { - "title": "Config sync", - "package": "configs", - "doc": [ - "Parameter Syncronization across devices. Can be used for simple sync", - "across devices without rewriting server side code." - ], - "items": [ - { - "type":"struct", - "content": { - "name":"Parameter", -"doc":[ -"Syncing Parameter",{"type":"reference","argument":"key","category":"full","description":" Key of parameter"},{"type":"reference","argument":"value","category":"full","description":" Value of parameter"}],"attributes":[ -{"type":"string","id":1,"name":"key"} -,{"type":"string","id":2,"name":"value"} -]}},{"type":"rpc","content":{ -"name":"GetParameters", -"header":134, -"response":{"type":"anonymous","header":135, "doc":[ -{"type":"reference","argument":"parameters","category":"full","description":" Current parameters"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Parameter"}},"id":1,"name":"parameters"} -]}, -"doc":[ -"Getting Parameters"],"attributes":[ -]}},{"type":"rpc","content":{ -"name":"EditParameter", -"header":128, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Change parameter value",{"type":"reference","argument":"key","category":"full","description":"Key of parameter"},{"type":"reference","argument":"value","category":"full","description":"Value of parameter"}],"attributes":[ -{"type":"string","id":1,"name":"key"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"value"} -]}},{"type":"update","content":{ -"name":"ParameterChanged", -"header":131, -"doc":[ -"Update about parameter change",{"type":"reference","argument":"key","category":"full","description":" Key of parameter"},{"type":"reference","argument":"value","category":"full","description":" Value of parameter"}],"attributes":[ -{"type":"string","id":1,"name":"key"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"value"} -]}}]}, { - "title": "Stats", - "package": "stats", - "doc": [ - "Saving statistics information" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"EventRecord", -"doc":[ -"Record for stored event"],"attributes":[ -{"type":{"type":"alias","childType":"date"},"id":1,"name":"date"} -,{"type":{"type":"trait","childType":"Event"},"id":2,"name":"event"} -]}},{"type":"trait","content":{ -"isContainer":"true","name":"Event","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"UntypedEvent", -"doc":[ -"Untyped event",{"type":"reference","argument":"eventType","category":"full","description":" Event type"},{"type":"reference","argument":"params","category":"full","description":" optional params for event"}],"trait":{"name":"Event","key":1},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"eventType"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":2,"name":"params"} -]}}, { - "type":"struct", - "content": { - "name":"ContentViewChanged", -"doc":[ -"Content view event",{"type":"reference","argument":"contentType","category":"full","description":" unique content id"},{"type":"reference","argument":"visible","category":"full","description":" Is content visible"},{"type":"reference","argument":"params","category":"full","description":" optional params for content view"}],"trait":{"name":"Event","key":2},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"contentType"} -,{"type":"string","id":2,"name":"contentId"} -,{"type":"bool","id":3,"name":"visible"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":4,"name":"params"} -]}}, { - "type":"struct", - "content": { - "name":"AppVisibleChanged", -"doc":[ -"On App Visible event",{"type":"reference","argument":"visible","category":"full","description":" Is app visible"}],"trait":{"name":"Event","key":4},"expandable":"true","attributes":[ -{"type":"bool","id":1,"name":"visible"} -]}},{"type":"rpc","content":{ -"name":"StoreEvents", -"header":243, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Storing events on server",{"type":"reference","argument":"events","category":"full","description":"Events for storing"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"trait","childType":"Event"}},"id":1,"name":"events"} -]}}]}, { - "title": "Raw API", - "package": "raw", - "doc": [ - "Schema-less API that is useful for external integrations" - ], - "items": [ -{"type":"rpc","content":{ -"name":"RawRequest", -"header":2569, -"response":{"type":"anonymous","header":2570, "doc":[ -"Response of a raw request",{"type":"reference","argument":"result","category":"full","description":" Result of request"}] ,"attributes":[{"type":{"type":"trait","childType":"RawValue"},"id":1,"name":"result"} -]}, -"doc":[ -"Making raw request to external service via shema-less RPC request",{"type":"reference","argument":"service","category":"full","description":"Service name for RPC request"},{"type":"reference","argument":"method","category":"full","description":"Method for execution"},{"type":"reference","argument":"params","category":"full","description":"Optional params for the method"}],"attributes":[ -{"type":"string","id":1,"name":"service"} -,{"type":"string","id":2,"name":"method"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":3,"name":"params"} -]}}]}, { - "title": "Wallpappers", - "package": "wallpappers", - "doc": [ - "Wallpappers support" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"Wallpapper", -"doc":[ -"Wallpapper structure",{"type":"reference","argument":"id","category":"full","description":" Wallpapper id"},{"type":"reference","argument":"w","category":"full","description":" Image width"},{"type":"reference","argument":"h","category":"full","description":" Image height"},{"type":"reference","argument":"fileSize","category":"full","description":" Image file size"},{"type":"reference","argument":"file","category":"full","description":" Image file reference"},{"type":"reference","argument":"thumb","category":"full","description":" Image thumb"}],"attributes":[ -{"type":"int32","id":7,"name":"id"} -,{"type":"int32","id":1,"name":"w"} -,{"type":"int32","id":2,"name":"h"} -,{"type":"int32","id":3,"name":"fileSize"} -,{"type":{"type":"struct","childType":"FileLocation"},"id":5,"name":"file"} -,{"type":{"type":"struct","childType":"FastThumb"},"id":6,"name":"thumb"} -]}},{"type":"rpc","content":{ -"name":"LoadWallpappers", -"header":241, -"response":{"type":"anonymous","header":242, "doc":[ -"Loaded Wallpappers",{"type":"reference","argument":"wallpappers","category":"full","description":" Available wallpapper list"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Wallpapper"}},"id":1,"name":"wallpappers"} -]}, -"doc":[ -"Load available wallpappers",{"type":"reference","argument":"maxWidth","category":"full","description":"Maximum width of wallpapper"},{"type":"reference","argument":"maxHeight","category":"full","description":"Maximum height of wallpapper"}],"attributes":[ -{"type":"int32","id":1,"name":"maxWidth"} -,{"type":"int32","id":2,"name":"maxHeight"} -]}}]}, { - "title": "Push", - "package": "push", - "doc": [ - "Vendor's pushes for receiving push notifications.", - "Push notification contains current sequence number of main sequence." - ], - "items": [ -{"type":"rpc","content":{ -"name":"RegisterGooglePush", -"header":51, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Registering push token on server",{"type":"reference","argument":"projectId","category":"hidden","description":"Project Id of token"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ -{"type":"int64","id":1,"name":"projectId"} -,{"type":"string","id":2,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"UnregisterGooglePush", -"header":2631, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Unregistering Google Push",{"type":"reference","argument":"token","category":"danger","description":"Token value"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"RegisterApplePush", -"header":76, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Registering apple push on server",{"type":"reference","argument":"apnsKey","category":"hidden","description":"apns key id"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ -{"type":"int32","id":1,"name":"apnsKey"} -,{"type":"string","id":2,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"UnregisterApplePush", -"header":2632, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Unregistering Apple Push",{"type":"reference","argument":"token","category":"full","description":"Token"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"RegisterApplePushKit", -"header":2576, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Registration of a new Apple's PushKit tokens",{"type":"reference","argument":"apnsKey","category":"hidden","description":"APNS key id"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ -{"type":"int32","id":1,"name":"apnsKey"} -,{"type":"string","id":2,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"UnregisterApplePushKit", -"header":2633, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Unregistering Apple Push Kit token",{"type":"reference","argument":"token","category":"hidden","description":"Token Value"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"RegisterApplePushToken", -"header":2593, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Registering Apple Push Token",{"type":"reference","argument":"bundleId","category":"full","description":"Bundle Id of app"},{"type":"reference","argument":"token","category":"full","description":"Push token"}],"attributes":[ -{"type":"string","id":1,"name":"bundleId"} -,{"type":"string","id":2,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"UnregisterApplePushToken", -"header":2634, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Unregister Apple Push token",{"type":"reference","argument":"token","category":"hidden","description":"Token value"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"RegisterActorPush", -"header":2575, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Register Actor Push endpoint",{"type":"reference","argument":"endpoint","category":"full","description":"Endpoint for push sending"},{"type":"reference","argument":"encryptionKeys","category":"full","description":"Push Encryption keys"}],"attributes":[ -{"type":"string","id":1,"name":"endpoint"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":2,"name":"encryptionKeys"} -]}},{"type":"rpc","content":{ -"name":"UnregisterActorPush", -"header":2635, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Unregister Actor Push endpoint",{"type":"reference","argument":"endpoint","category":"full","description":"Endpoint for unregistering"}],"attributes":[ -{"type":"string","id":1,"name":"endpoint"} -]}}]}, { - "title": "Encryption", - "package": "encryption", - "doc": [ - "Package that include encryption support", - "Key alg types:", - "* curve25519 - https://en.wikipedia.org/wiki/Curve25519", - "* rsa-2048", - "* rsa-4096", - "* aes-128", - "* kuznechik-128", - "", - "Signature alg types:", - "* Ed25519 - used curve25519 conveted to Ed255519 for signing and validataion" - ], - "items": [ -{"type":"comment","content":"Public Keys"}, { - "type":"struct", - "content": { - "name":"EncryptionKeyGroup", -"doc":[ -"Encryption Key Group",{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"identityKey","category":"full","description":" Key that is used as identity and for validation of Key Group changes"},{"type":"reference","argument":"supportedEncryption","category":"full","description":" Supported encryption methods by this key group"},{"type":"reference","argument":"keys","category":"compact","description":" keys of Key Group"},{"type":"reference","argument":"signatures","category":"compact","description":" Signatures of keys"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} -,{"type":{"type":"list","childType":"string"},"id":2,"name":"supportedEncryption"} -,{"type":{"type":"struct","childType":"EncryptionKey"},"id":3,"name":"identityKey"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":4,"name":"keys"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":5,"name":"signatures"} -]}}, { - "type":"struct", - "content": { - "name":"EncryptionKeySignature", -"doc":[ -"Signed Key. Usually used for public keys.",{"type":"reference","argument":"keyId","category":"full","description":" Key Id used for signature"},{"type":"reference","argument":"signatureAlg","category":"full","description":" Signature algorithm"},{"type":"reference","argument":"signature","category":"full","description":" Signature value"}],"attributes":[ -{"type":"int64","id":1,"name":"keyId"} -,{"type":"string","id":2,"name":"signatureAlg"} -,{"type":"bytes","id":3,"name":"signature"} -]}}, { - "type":"struct", - "content": { - "name":"EncryptionKey", -"doc":[ -"Encryption Key",{"type":"reference","argument":"keyId","category":"full","description":" Key Id"},{"type":"reference","argument":"keyAlg","category":"full","description":" Key Algorithm"},{"type":"reference","argument":"keyMaterial","category":"compact","description":" Public key material. Can be null, but always not null for LoadPublicKey"},{"type":"reference","argument":"keyHash","category":"hidden","description":" If keyMaterial is null, pass keyHash - SHA256 of key"}],"expandable":"true","attributes":[ -{"type":"int64","id":1,"name":"keyId"} -,{"type":"string","id":2,"name":"keyAlg"} -,{"type":{"type":"opt","childType":"bytes"},"id":3,"name":"keyMaterial"} -,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"keyHash"} -]}},{"type":"response","content":{ -"name":"PublicKeys", -"header":2602, -"doc":[ -"Public Keys response",{"type":"reference","argument":"publicKey","category":"full","description":" Public keys"},{"type":"reference","argument":"signatures","category":"full","description":" Signatures of public keys"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":1,"name":"publicKey"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":2,"name":"signatures"} -]}},{"type":"response","content":{ -"name":"PublicKeyGroups", -"header":2604, -"doc":[ -"Public key groups response"],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeyGroup"}},"id":1,"name":"publicKeyGroups"} -]}},{"type":"rpc","content":{ -"name":"LoadPublicKeyGroups", -"header":2601, -"response":{"type":"reference","name":"PublicKeyGroups"}, -"doc":[ -"Loading Public key groups",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} -]}},{"type":"rpc","content":{ -"name":"LoadPublicKey", -"header":2605, -"response":{"type":"reference","name":"PublicKeys"}, -"doc":[ -"Loading public key explictly",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"},{"type":"reference","argument":"keyGroupId","category":"full","description":"Key group's id"},{"type":"reference","argument":"keyIds","category":"full","description":"Key ids for loading"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} -,{"type":"int32","id":2,"name":"keyGroupId"} -,{"type":{"type":"list","childType":"int64"},"id":3,"name":"keyIds"} -]}},{"type":"rpc","content":{ -"name":"LoadPrePublicKeys", -"header":2603, -"response":{"type":"reference","name":"PublicKeys"}, -"doc":[ -"Loading SOME of ephermal public keys",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"},{"type":"reference","argument":"keyGroupId","category":"full","description":"User's key group id"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} -,{"type":"int32","id":2,"name":"keyGroupId"} -]}},{"type":"update","content":{ -"name":"PublicKeyGroupChanged", -"header":103, -"doc":[ -"Update about public key group changed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Updated Key Group"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} -]}},{"type":"update","content":{ -"name":"KeysAdded", -"header":112, -"doc":[ -"Update about keys added to Key Group",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"keys","category":"compact","description":" Added keys"},{"type":"reference","argument":"signatures","category":"compact","description":" Signatures of a public key"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":3,"name":"keys"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":4,"name":"signatures"} -]}},{"type":"update","content":{ -"name":"KeysRemoved", -"header":113, -"doc":[ -"Update about keys removed from Key Group",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"keyIds","category":"full","description":" Removed keys"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} -,{"type":{"type":"list","childType":"int64"},"id":3,"name":"keyIds"} -]}},{"type":"update","content":{ -"name":"PublicKeyGroupAdded", -"header":104, -"doc":[ -"Update about public key group added",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Added Key Group"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} -]}},{"type":"update","content":{ -"name":"PublicKeyGroupRemoved", -"header":105, -"doc":[ -"Update about public key group removed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Removed Key Group Id"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} -]}},{"type":"comment","content":"Device Side"},{"type":"rpc","content":{ -"name":"CreateNewKeyGroup", -"header":2609, -"response":{"type":"anonymous","header":2610, "doc":[ -{"type":"reference","argument":"keyGroupId","category":"full","description":" Created Key Group id"}] ,"attributes":[{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} -]}, -"doc":[ -"Creation of a new Key Group",{"type":"reference","argument":"identityKey","category":"full","description":"Identity Key of a new group"},{"type":"reference","argument":"supportedEncryptions","category":"full","description":"Supported encryption methods"},{"type":"reference","argument":"keys","category":"full","description":"keys of current group"},{"type":"reference","argument":"signatures","category":"full","description":"signatures of keys"}],"attributes":[ -{"type":{"type":"struct","childType":"EncryptionKey"},"id":1,"name":"identityKey"} -,{"type":{"type":"list","childType":"string"},"id":2,"name":"supportedEncryptions"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":3,"name":"keys"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":4,"name":"signatures"} -]}},{"type":"rpc","content":{ -"name":"DeleteKeyGroup", -"header":2611, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Deletion of a Key Group",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for deletion"}],"attributes":[ -{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} -]}},{"type":"rpc","content":{ -"name":"DisconnectKeyGroup", -"header":2613, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Disconnect Key Group from device",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for disconnection"}],"attributes":[ -{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} -]}},{"type":"rpc","content":{ -"name":"ConnectKeyGroup", -"header":2614, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Connectiong Key Group to device",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for connection"}],"attributes":[ -{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} -]}},{"type":"rpc","content":{ -"name":"UploadPreKey", -"header":2612, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Uploading Ephermal Keys",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id"},{"type":"reference","argument":"keys","category":"compact","description":"Encryprion keys"},{"type":"reference","argument":"signatures","category":"compact","description":"Key signatures"}],"attributes":[ -{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":2,"name":"keys"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":3,"name":"signatures"} -]}},{"type":"comment","content":"Encrypted Packages"}, { - "type":"struct", - "content": { - "name":"EncryptedBox", -"doc":[ -"Encrypted package that is encrypted for multiple keys",{"type":"reference","argument":"keys","category":"full","description":" Encrypted encryption keys"},{"type":"reference","argument":"algType","category":"full","description":" Package encryption type"},{"type":"reference","argument":"encPackage","category":"full","description":" Encrypted package"},{"type":"reference","argument":"senderKeyGroupId","category":"full","description":" Sender key group"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"keyGroupId"},"id":4,"name":"senderKeyGroupId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncyptedBoxKey"}},"id":1,"name":"keys"} -,{"type":"string","id":2,"name":"algType"} -,{"type":"bytes","id":3,"name":"encPackage"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptedBoxSignature"}},"id":5,"name":"signatures"} -]}}, { - "type":"struct", - "content": { - "name":"EncryptedBoxSignature", -"doc":[ -"Signature for encrypted package",{"type":"reference","argument":"algType","category":"full","description":" Alg Type"},{"type":"reference","argument":"signature","category":"full","description":" Signature of encrypted package"}],"attributes":[ -{"type":"string","id":1,"name":"algType"} -,{"type":"bytes","id":2,"name":"signature"} -]}}, { - "type":"struct", - "content": { - "name":"EncyptedBoxKey", -"doc":[ -"Encrypted package encryption key",{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"algType","category":"full","description":" Key encryption algorithm"},{"type":"reference","argument":"encryptedKey","category":"hidden","description":" Encrypted encryption key"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"usersId"} -,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} -,{"type":"string","id":3,"name":"algType"} -,{"type":"bytes","id":4,"name":"encryptedKey"} -]}}, { - "type":"struct", - "content": { - "name":"KeyGroupId", -"doc":[ -"References to key groups",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} -]}}, { - "type":"struct", - "content": { - "name":"KeyGroupHolder", -"doc":[ -"Key Group Holder",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Key Group"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} -]}},{"type":"rpc","content":{ -"name":"SendEncryptedPackage", -"header":2657, -"response":{"type":"anonymous","header":2664, "doc":[ -{"type":"reference","argument":"date","category":"full","description":" date"},{"type":"reference","argument":"obsoleteKeyGroups","category":"full","description":" obsolete key group ids"},{"type":"reference","argument":"missedKeyGroups","category":"full","description":" missed key groups"}] ,"attributes":[{"type":{"type":"opt","childType":{"type":"alias","childType":"date"}},"id":1,"name":"date"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupId"}},"id":2,"name":"obsoleteKeyGroups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupHolder"}},"id":3,"name":"missedKeyGroups"} -]}, -"doc":[ -"Sending encrypted package",{"type":"reference","argument":"randomId","category":"hidden","description":"Random id"}],"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"randomId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":2,"name":"destPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupId"}},"id":3,"name":"ignoredKeyGroups"} -,{"type":{"type":"struct","childType":"EncryptedBox"},"id":4,"name":"encryptedBox"} -]}},{"type":"update","content":{ -"name":"EncryptedPackage", -"header":177, -"doc":[ -"Update about encrypted package",{"type":"reference","argument":"randomId","category":"full","description":" Random Id of package"},{"type":"reference","argument":"date","category":"full","description":" Sending date of package"},{"type":"reference","argument":"senderId","category":"full","description":" Sender id of package"},{"type":"reference","argument":"encryptedBox","category":"full","description":" Encrypted box"}],"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"randomId"} -,{"type":{"type":"alias","childType":"date"},"id":2,"name":"date"} -,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"senderId"} -,{"type":{"type":"struct","childType":"EncryptedBox"},"id":4,"name":"encryptedBox"} -]}}]}, { - "title": "Storage", - "package": "storage", - "items": [ -{"type":"rpc","content":{ -"name":"UploadSharedBlob", -"header":2660, -"response":{"type":"anonymous","header":2661, "doc":[ -{"type":"reference","argument":"sharedObjectId","category":"full","description":" Id of shared object"}] ,"attributes":[{"type":"int32","id":1,"name":"sharedObjectId"} -]}, -"doc":[ -"Upload shared blob with user",{"type":"reference","argument":"destPeer","category":"full","description":"Destination peer"},{"type":"reference","argument":"bucket","category":"full","description":"Bucked name"},{"type":"reference","argument":"blob","category":"full","description":"Blob data"},{"type":"reference","argument":"randomId","category":"full","description":"Random id for protecting from double upload"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"destPeer"} -,{"type":"string","id":2,"name":"bucket"} -,{"type":"bytes","id":3,"name":"blob"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"randomId"} -]}},{"type":"rpc","content":{ -"name":"DownloadSharedBlob", -"header":2662, -"response":{"type":"anonymous","header":2663, "doc":[ -{"type":"reference","argument":"blob","category":"full","description":" Blob contents"}] ,"attributes":[{"type":"bytes","id":1,"name":"blob"} -]}, -"doc":[ -"Download shared blob",{"type":"reference","argument":"destPeer","category":"full","description":"Destination peer"},{"type":"reference","argument":"bucket","category":"full","description":"Bucket name"},{"type":"reference","argument":"objectId","category":"full","description":"Object Id"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"destPeer"} -,{"type":"string","id":2,"name":"bucket"} -,{"type":"int32","id":3,"name":"objectId"} -]}}]}, { - "title": "Peers", - "package": "peers", - "doc": [ - "Peer is an identificator of specific conversation." - ], - "items": [ - { - "type": "enum", - "content": { - "name": "PeerType", - "values": [ - { - "name": "Private", - "id": 1 - }, - { - "name": "Group", - "id": 2 - }, - { - "name": "EncryptedPrivate", - "id": 3 + }, + "id": 1, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" } - ] - } - }, { - "type":"struct", - "content": { - "name":"Peer", -"doc":[ -"Peer",{"type":"reference","argument":"type","category":"full","description":" Peer Type"},{"type":"reference","argument":"id","category":"full","description":" Peer Id"}],"attributes":[ -{"type":{"type":"enum","childType":"PeerType"},"id":1,"name":"type"} -,{"type":"int32","id":2,"name":"id"} -]}}, { - "type":"struct", - "content": { - "name":"OutPeer", -"doc":[ -"Out peer with access hash",{"type":"reference","argument":"type","category":"full","description":" Peer Type"},{"type":"reference","argument":"id","category":"full","description":" Peer Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Peer access hash"}],"attributes":[ -{"type":{"type":"enum","childType":"PeerType"},"id":1,"name":"type"} -,{"type":"int32","id":2,"name":"id"} -,{"type":"int64","id":3,"name":"accessHash"} -]}}, { - "type":"struct", - "content": { - "name":"UserOutPeer", -"doc":[ -"User's out peer",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"accessHash","category":"danger","description":" User's access hash"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":"int64","id":2,"name":"accessHash"} -]}}, { - "type":"struct", - "content": { - "name":"GroupOutPeer", -"doc":[ -"Group's out peer",{"type":"reference","argument":"groupId","category":"full","description":" Group's Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Group's access hash"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"int64","id":2,"name":"accessHash"} -]}}]}, { - "title": "Sequence and Updates", - "package": "sequence", - "doc": [ - "Each device has it's own update sequence. At the begining application request initial sequence state by", - "calling GetState. On each application restart or NewSessionCreated application calls GetDifference for receiving", - "updates in update sequence.", - "GetState and GetDifference automatically subscribes session to receiving updates in session.", - "Each update has seq and state. Seq is sequental index of updated and used for detecting of holes in update sequence", - "(because of server failure or session die) on client side.", - "All updates needed to be processed in partucular order according to seq values.", - "In some updates there can be references to users that are not available at client yer. In this case application need", - "to ignore such update and init getting difference." - ], - "items": [ -{"type":"update_box","content":{ -"name":"SeqUpdate", -"header":13, -"doc":[ -"Sequence update",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of update"},{"type":"reference","argument":"state","category":"compact","description":" Sequece state of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"}],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":"int32","id":3,"name":"updateHeader"} -,{"type":"bytes","id":4,"name":"update"} -]}},{"type":"update_box","content":{ -"name":"FatSeqUpdate", -"header":73, -"doc":[ -"Fat sequence update with additional data",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of update"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"},{"type":"reference","argument":"users","category":"compact","description":" Users that are referenced in update"},{"type":"reference","argument":"groups","category":"compact","description":" Groups that are referenced in update"}],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":"int32","id":3,"name":"updateHeader"} -,{"type":"bytes","id":4,"name":"update"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":5,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":6,"name":"groups"} -]}},{"type":"update_box","content":{ -"name":"WeakUpdate", -"header":26, -"doc":[ -"Out of sequence update (for typing and online statuses)",{"type":"reference","argument":"date","category":"full","description":" Date of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"}],"attributes":[ -{"type":"int64","id":1,"name":"date"} -,{"type":"int32","id":2,"name":"updateHeader"} -,{"type":"bytes","id":3,"name":"update"} -]}},{"type":"update_box","content":{ -"name":"WeakFatUpdate", -"header":2673, -"doc":[ -"Fat Weak Update",{"type":"reference","argument":"date","category":"full","description":" Date of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"full","description":" The update"},{"type":"reference","argument":"users","category":"full","description":" Users that are referenced in update"},{"type":"reference","argument":"groups","category":"full","description":" Groups that are referenced in update"}],"attributes":[ -{"type":"int64","id":1,"name":"date"} -,{"type":"int32","id":2,"name":"updateHeader"} -,{"type":"bytes","id":3,"name":"update"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} -]}},{"type":"update_box","content":{ -"name":"SeqUpdateTooLong", -"header":25, -"doc":[ -"Notification about requiring performing manual GetDifference"],"attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"UpdateContainer", -"doc":[ -"Update container",{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"compact","description":" The updatre"}],"attributes":[ -{"type":"int32","id":1,"name":"updateHeader"} -,{"type":"bytes","id":2,"name":"update"} -]}},{"type":"update_box","content":{ -"name":"CombinedUpdate", -"header":2625, -"doc":[ -"Combined update",{"type":"reference","argument":"seqStart","category":"full","description":" Sequence number start"},{"type":"reference","argument":"seqEnd","category":"full","description":" Sequence number end"},{"type":"reference","argument":"state","category":"full","description":" Sequence state"},{"type":"reference","argument":"users","category":"compact","description":" Update's users"},{"type":"reference","argument":"groups","category":"compact","description":" Update's groups"},{"type":"reference","argument":"updates","category":"full","description":" Updates (can be empty)"},{"type":"reference","argument":"messages","category":"full","description":" New messages"}],"attributes":[ -{"type":"int32","id":1,"name":"seqStart"} -,{"type":"int32","id":2,"name":"seqEnd"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UpdateContainer"}},"id":6,"name":"updates"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":7,"name":"messages"} -]}}, { - "type": "enum", - "content": { - "name": "UpdateOptimization", - "values": [ - { - "name": "NONE", - "id": 1 - }, - { - "name": "STRIP_ENTITIES", - "id": 2 - }, - { - "name": "ENABLE_COMBINED", - "id": 3 - }, - { - "name": "FASTER_MESSAGES", - "id": 4 - }, - { - "name": "STRIP_COUNTERS", - "id": 5 - }, - { - "name": "COMPACT_USERS", - "id": 6 - }, - { - "name": "GROUPS_V2", - "id": 7 + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Dialog" } - ] - } - },{"type":"rpc","content":{ -"name":"GetState", -"header":9, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Get main sequence state",{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":1,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"GetDifference", -"header":11, -"response":{"type":"anonymous","header":12, "doc":[ -{"type":"reference","argument":"seq","category":"full","description":" Seq of LAST update in updates"},{"type":"reference","argument":"state","category":"full","description":" State of LAST update in updates"},{"type":"reference","argument":"users","category":"compact","description":" Users referenced in updates"},{"type":"reference","argument":"groups","category":"compact","description":" Groups referenced in updates"},{"type":"reference","argument":"updates","category":"compact","description":" Updates"},{"type":"reference","argument":"needMore","category":"full","description":" Need to perform other difference"},{"type":"reference","argument":"usersRefs","category":"full","description":" Direct references of users"},{"type":"reference","argument":"groupsRefs","category":"full","description":" Direct References of groups"}] ,"attributes":[{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":3,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":6,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UpdateContainer"}},"id":4,"name":"updates"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":7,"name":"messages"} -,{"type":"bool","id":5,"name":"needMore"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":8,"name":"usersRefs"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":9,"name":"groupsRefs"} -]}, -"doc":[ -"Getting difference of sequence",{"type":"reference","argument":"seq","category":"full","description":"Sequence number"},{"type":"reference","argument":"state","category":"compact","description":"Sequence state"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"GetReferencedEntitites", -"header":2628, -"response":{"type":"anonymous","header":2629, "doc":[ -{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"groups","category":"compact","description":" Loaded groups"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":2,"name":"groups"} -]}, -"doc":[ -"Loading referenced entities",{"type":"reference","argument":"users","category":"compact","description":"Users to load"},{"type":"reference","argument":"groups","category":"compact","description":"Groups to load. Also returns all members of a group."}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":2,"name":"groups"} -]}},{"type":"update","content":{ -"name":"RawUpdate", -"header":80, -"doc":[ -"Custom Raw Update",{"type":"reference","argument":"type","category":"full","description":" Type of content"},{"type":"reference","argument":"bytes","category":"full","description":" Raw data"}],"attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"type"} -,{"type":"bytes","id":2,"name":"bytes"} -]}},{"type":"update","content":{ -"name":"EmptyUpdate", -"header":85, -"doc":[ -"Empty update"],"attributes":[ -]}},{"type":"empty"},{"type":"rpc","content":{ -"name":"SubscribeToOnline", -"header":32, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Subscribing for users online",{"type":"reference","argument":"users","category":"compact","description":"Users for subscription"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} -]}},{"type":"rpc","content":{ -"name":"SubscribeFromOnline", -"header":33, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Removing subscription for users online",{"type":"reference","argument":"users","category":"compact","description":"Users of subscriptions"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} -]}},{"type":"rpc","content":{ -"name":"SubscribeToGroupOnline", -"header":74, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Subscribing for groups online",{"type":"reference","argument":"groups","category":"compact","description":"Groups for subscription"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} -]}},{"type":"rpc","content":{ -"name":"SubscribeFromGroupOnline", -"header":75, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Removing subscription for groups online",{"type":"reference","argument":"groups","category":"compact","description":"Groups of subscriptions"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} -]}}]}, { - "title": "Counters", - "package": "counters", - "doc": [ - "Application Counters, used to display various counters in application" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"AppCounters", -"doc":[ -"Application counters",{"type":"reference","argument":"globalCounter","category":"full","description":" Global unread counter"}],"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":"int32"},"id":1,"name":"globalCounter"} -]}},{"type":"update","content":{ -"name":"CountersChanged", -"header":215, -"doc":[ -"Update about counters changed",{"type":"reference","argument":"counters","category":"full","description":" Current Application counters"}],"attributes":[ -{"type":{"type":"struct","childType":"AppCounters"},"id":1,"name":"counters"} -]}}]}, { - "title": "Miscellaneous", - "package": "misc", - "items": [ -{"type":"response","content":{ -"name":"Void", -"header":50, -"doc":[ -"Empty response"],"attributes":[ -]}},{"type":"response","content":{ -"name":"Seq", -"header":72, -"doc":[ -"Sequence response. Methods that return this value must process response in particular order",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of response"},{"type":"reference","argument":"state","category":"full","description":" Sequence state of response"}],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -]}},{"type":"response","content":{ -"name":"SeqDate", -"header":102, -"doc":[ -"Sequence response with date. Methods that return this value must process response in particular order",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of response"},{"type":"reference","argument":"state","category":"full","description":" Sequence state of response"},{"type":"reference","argument":"date","category":"full","description":" Date of response"}],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -]}},{"type":"response","content":{ -"name":"Bool", -"header":209, -"doc":[ -"Boolean response",{"type":"reference","argument":"value","category":"full","description":" Response value"}],"attributes":[ -{"type":"bool","id":1,"name":"value"} -]}}, { - "type":"struct", - "content": { - "name":"Config", -"doc":[ -"Configuration of system",{"type":"reference","argument":"maxGroupSize","category":"full","description":" Current maximum group size"}],"attributes":[ -{"type":"int32","id":1,"name":"maxGroupSize"} -]}}, { - "type":"struct", - "content": { - "name":"Extension", -"doc":[ -"Extention",{"type":"reference","argument":"id","category":"full","description":" Extension id"},{"type":"reference","argument":"data","category":"full","description":" Extension data"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"bytes","id":2,"name":"data"} -]}},{"type":"update","content":{ -"name":"Config", -"header":42, -"doc":[ -"Update about config change",{"type":"reference","argument":"config","category":"full","description":" new config"}],"attributes":[ -{"type":{"type":"struct","childType":"Config"},"id":1,"name":"config"} -]}}]}, { - "title": "Device Info", - "package": "device", - "doc": [ - "Submiting various information about device for providing better experience.", - "For example, getting timezone or preffered languages" - ], - "items": [ -{"type":"rpc","content":{ -"name":"NotifyAboutDeviceInfo", -"header":229, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Notifying about device information",{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"},{"type":"reference","argument":"timeZone","category":"full","description":"Device Time Zone"}],"attributes":[ -{"type":{"type":"list","childType":"string"},"id":1,"name":"preferredLanguages"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"timeZone"} -]}}]}, { - "title": "Webactions", - "package": "webactions", - "doc": [ - "Web actions allow clients to visit some predefined web pages,", - "perform actions, and pass result on action completion" - ], - "items": [ -{"type":"rpc","content":{ -"name":"InitWebaction", -"header":116, -"response":{"type":"anonymous","header":117, "doc":[ -{"type":"reference","argument":"uri","category":"full","description":" Web action uri"},{"type":"reference","argument":"regexp","category":"full","description":" Regular expression. Required to match completion of web action"},{"type":"reference","argument":"actionHash","category":"danger","description":" Identifier of current web action. Required to complete it"}] ,"attributes":[{"type":"string","id":1,"name":"uri"} -,{"type":"string","id":2,"name":"regexp"} -,{"type":"string","id":3,"name":"actionHash"} -]}, -"doc":[ -"Initialize start of web action",{"type":"reference","argument":"actionName","category":"full","description":"Name of web action"},{"type":"reference","argument":"params","category":"full","description":"Additional params required to make action's uri"}],"attributes":[ -{"type":"string","id":1,"name":"actionName"} -,{"type":{"type":"struct","childType":"MapValue"},"id":2,"name":"params"} -]}},{"type":"rpc","content":{ -"name":"CompleteWebaction", -"header":123, -"response":{"type":"anonymous","header":124, "doc":[ -{"type":"reference","argument":"result","category":"full","description":" Reslut of web action completion"}] ,"attributes":[{"type":{"type":"struct","childType":"MapValue"},"id":1,"name":"result"} -]}, -"doc":[ -"Complete started web action",{"type":"reference","argument":"actionHash","category":"danger","description":"Identifier of given web action"},{"type":"reference","argument":"completeUri","category":"full","description":"Final uri of web action"}],"attributes":[ -{"type":"string","id":1,"name":"actionHash"} -,{"type":"string","id":2,"name":"completeUri"} -]}}]}, { - "title": "Collections", - "package": "collections", - "doc": [ - "Flexible raw collections without structure" - ], - "items": [ -{"type":"trait","content":{ -"isContainer":"true","name":"RawValue","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"StringValue", -"doc":[ -"Text value"],"trait":{"name":"RawValue","key":1},"attributes":[ -{"type":"string","id":1,"name":"text"} -]}}, { - "type":"struct", - "content": { - "name":"Int32Value", -"doc":[ -"Int32 value"],"trait":{"name":"RawValue","key":2},"attributes":[ -{"type":"int32","id":1,"name":"value"} -]}}, { - "type":"struct", - "content": { - "name":"Int64Value", -"doc":[ -"Int64 value"],"trait":{"name":"RawValue","key":3},"attributes":[ -{"type":"int64","id":1,"name":"value"} -]}}, { - "type":"struct", - "content": { - "name":"DoubleValue", -"doc":[ -"Double value"],"trait":{"name":"RawValue","key":4},"attributes":[ -{"type":"double","id":1,"name":"value"} -]}}, { - "type":"struct", - "content": { - "name":"ArrayValue", -"doc":[ -"Array value"],"trait":{"name":"RawValue","key":5},"attributes":[ -{"type":{"type":"list","childType":{"type":"trait","childType":"RawValue"}},"id":1,"name":"array"} -]}}, { - "type":"struct", - "content": { - "name":"MapValueItem", -"doc":[ -"Item of Map"],"attributes":[ -{"type":"string","id":1,"name":"key"} -,{"type":{"type":"trait","childType":"RawValue"},"id":2,"name":"value"} -]}}, { - "type":"struct", - "content": { - "name":"MapValue", -"doc":[ -"Map Value"],"trait":{"name":"RawValue","key":6},"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"MapValueItem"}},"id":1,"name":"items"} -]}}]}, { - "title": "Surveys", - "package": "surveys", - "doc": [ - "Surveys implementation for messages" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"Survey", -"doc":[ -"Main Survey Struct"],"attributes":[ -{"type":"int64","id":1,"name":"id"} -,{"type":"string","id":2,"name":"titulo"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"uf"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"creationTime"} -,{"type":{"type":"alias","childType":"date"},"id":5,"name":"endTime"} -,{"type":{"type":"alias","childType":"userId"},"id":6,"name":"ownerId"} -,{"type":{"type":"list","childType":"string"},"id":7,"name":"answers"} -]}},{"type":"rpc","content":{ -"name":"CreateSurvey", -"header":139, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Criar uma nova enquete"],"attributes":[ -{"type":{"type":"struct","childType":"Survey"},"id":1,"name":"survey"} -]}}]}]} \ No newline at end of file + }, + "id": 3, + "name": "dialogs" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 4, + "name": "userPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 5, + "name": "groupPeers" + }] + }, + "doc": [ + "Loading conversation history", { + "type": "reference", + "argument": "minDate", + "category": "full", + "description": "start date of conversation loading. Use 0 to load latest messages" + }, { + "type": "reference", + "argument": "limit", + "category": "full", + "description": "limit maximum amount of messages (max is 100)" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "date" + }, + "id": 1, + "name": "minDate" + }, { + "type": "int32", + "id": 2, + "name": "limit" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 3, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadArchived", + "header": 2651, + "response": { + "type": "anonymous", + "header": 2652, + "doc": [ + "Archived dialogs", { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " Referenced groups" + }, { + "type": "reference", + "argument": "users", + "category": "full", + "description": " Referenced users" + }, { + "type": "reference", + "argument": "dialogs", + "category": "full", + "description": " Archived dialogs" + }, { + "type": "reference", + "argument": "nextOffset", + "category": "compact", + "description": " Offset for next bunch" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 1, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Dialog" + } + }, + "id": 3, + "name": "dialogs" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 5, + "name": "userPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 6, + "name": "groupPeers" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 4, + "name": "nextOffset" + }] + }, + "doc": [ + "Loading archived messages", { + "type": "reference", + "argument": "nextOffset", + "category": "compact", + "description": "Optional next offset" + }, { + "type": "reference", + "argument": "limit", + "category": "full", + "description": "Maximum number of elements" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 1, + "name": "nextOffset" + }, { + "type": "int32", + "id": 2, + "name": "limit" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 3, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadGroupedDialogs", + "header": 225, + "response": { + "type": "anonymous", + "header": 226, + "doc": [ + "Loaded grouped dialogs", { + "type": "reference", + "argument": "dialogs", + "category": "compact", + "description": " Loaded groups of dialogs" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Loaded users" + }, { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " Loaded groups" + }, { + "type": "reference", + "argument": "showArchived", + "category": "full", + "description": " Show archived section" + }, { + "type": "reference", + "argument": "showInvite", + "category": "full", + "description": " Show invite message" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "DialogGroup" + } + }, + "id": 1, + "name": "dialogs" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 3, + "name": "groups" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 4, + "name": "showArchived" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 5, + "name": "showInvite" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 6, + "name": "userPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 7, + "name": "groupPeers" + }] + }, + "doc": [ + "Load all dialogs from grouped list" + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 1, + "name": "optimizations" + }] + } + }, { + "type": "response", + "content": { + "name": "DialogsOrder", + "header": 235, + "doc": [ + "Dialogs order response", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " update seq" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " update state" + }, { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " Update groups" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "DialogGroup" + } + }, + "id": 3, + "name": "groups" + }] + } + }, { + "type": "rpc", + "content": { + "name": "HideDialog", + "header": 231, + "response": { + "type": "reference", + "name": "DialogsOrder" + }, + "doc": [ + "Hide Dialog from grouped list", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Dialog peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ShowDialog", + "header": 232, + "response": { + "type": "reference", + "name": "DialogsOrder" + }, + "doc": [ + "Show Dialog in grouped list" + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "FavouriteDialog", + "header": 224, + "response": { + "type": "reference", + "name": "DialogsOrder" + }, + "doc": [ + "Marking dialog as favourite", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Peer for favouriting" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnfavouriteDialog", + "header": 227, + "response": { + "type": "reference", + "name": "DialogsOrder" + }, + "doc": [ + "Making dialog as unfavourite", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Peer for favouriting" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "NotifyDialogOpened", + "header": 2785, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Notifying about dialog open", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Peer that was opened" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }] + }, { + "title": "Groups", + "package": "groups", + "items": [{ + "type": "comment", + "content": "Entities" + }, { + "type": "struct", + "content": { + "name": "Member", + "doc": [ + "Member information", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User id" + }, { + "type": "reference", + "argument": "inviterUid", + "category": "full", + "description": " User inviter id" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Adding date" + }, { + "type": "reference", + "argument": "isAdmin", + "category": "full", + "description": " is member admin of group" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "inviterUid" + }, { + "type": "int64", + "id": 3, + "name": "date" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 4, + "name": "isAdmin" + }] + } + }, { + "type": "enum", + "content": { + "name": "GroupType", + "values": [{ + "name": "GROUP", + "id": 1 + }, { + "name": "CHANNEL", + "id": 2 + }] + } + }, { + "type": "enum", + "content": { + "name": "GroupPermissions", + "values": [{ + "name": "SEND_MESSAGE", + "id": 1 + }, { + "name": "CLEAR", + "id": 2 + }, { + "name": "LEAVE", + "id": 3 + }, { + "name": "DELETE", + "id": 4 + }, { + "name": "JOIN", + "id": 5 + }, { + "name": "VIEW_INFO", + "id": 6 + }] + } + }, { + "type": "enum", + "content": { + "name": "GroupFullPermissions", + "values": [{ + "name": "EDIT_INFO", + "id": 1 + }, { + "name": "VIEW_MEMBERS", + "id": 2 + }, { + "name": "INVITE_MEMBERS", + "id": 3 + }, { + "name": "INVITE_VIA_LINK", + "id": 4 + }, { + "name": "CALL", + "id": 5 + }, { + "name": "EDIT_ADMIN_SETTINGS", + "id": 6 + }, { + "name": "VIEW_ADMINS", + "id": 7 + }, { + "name": "EDIT_ADMINS", + "id": 8 + }, { + "name": "KICK_INVITED", + "id": 9 + }, { + "name": "KICK_ANYONE", + "id": 10 + }, { + "name": "EDIT_FOREIGN", + "id": 11 + }, { + "name": "DELETE_FOREIGN", + "id": 12 + }] + } + }, { + "type": "struct", + "content": { + "name": "Group", + "doc": [ + "Group information", "", "Permissions.", "Permissions of this structure is about group messages operation, such as", "ability to send messages, clear chat, leave group and so on. This operations", "Can be held outside of the Group Info page.", "", "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", "If default is TRUE then ONE == FALSE.", "Bits:", "0 - canSendMessage. Default is FALSE.", "1 - canClear. Default is FALSE.", "2 - canLeave. Default is FALSE.", "3 - canDelete. Default is FALSE.", "4 - canJoin. Default is FALSE.", "5 - canViewInfo. Default is FALSE.", "", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " group id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " Access hash of group" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Title of group" + }, { + "type": "reference", + "argument": "avatar", + "category": "compact", + "description": " Avatar of group" + }, { + "type": "reference", + "argument": "membersCount", + "category": "full", + "description": " Number of members" + }, { + "type": "reference", + "argument": "isHidden", + "category": "full", + "description": " Is group hidden (not showing it in recent list). Default is false." + }, { + "type": "reference", + "argument": "isMember", + "category": "full", + "description": " Is current user a member of a group. Default is true." + }, { + "type": "reference", + "argument": "groupType", + "category": "full", + "description": " Group Type. Used only for displaying information. Default is GROUP." + }, { + "type": "reference", + "argument": "permissions", + "category": "full", + "description": " Permissions of group object" + }, { + "type": "reference", + "argument": "isDeleted", + "category": "full", + "description": " Is this group deleted" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " Group extension Data" + }, { + "type": "reference", + "argument": "isAdmin", + "category": "full", + "description": " [DEPRECATED] Is current user an admin of a group" + }, { + "type": "reference", + "argument": "theme", + "category": "hidden", + "description": " [DEPRECATED] Theme of group" + }, { + "type": "reference", + "argument": "about", + "category": "hidden", + "description": " [DEPRECATED] About of group" + }, { + "type": "reference", + "argument": "creatorUid", + "category": "hidden", + "description": " [DEPRECATED] Group creator" + }, { + "type": "reference", + "argument": "members", + "category": "compact", + "description": " [DEPRECATED] Members of group" + }, { + "type": "reference", + "argument": "createDate", + "category": "full", + "description": " [DEPRECATED] Date of creation" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": "string", + "id": 3, + "name": "title" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 4, + "name": "avatar" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 24, + "name": "membersCount" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 6, + "name": "isMember" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 20, + "name": "isHidden" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "GroupType" + } + }, + "id": 25, + "name": "groupType" + }, { + "type": { + "type": "opt", + "childType": "int64" + }, + "id": 26, + "name": "permissions" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 27, + "name": "isDeleted" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 22, + "name": "ext" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 16, + "name": "isAdmin", + "deprecated": "true" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 8, + "name": "creatorUid", + "deprecated": "true" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 9, + "name": "members", + "deprecated": "true" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 10, + "name": "createDate", + "deprecated": "true" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 17, + "name": "theme", + "deprecated": "true" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 18, + "name": "about", + "deprecated": "true" + }] + } + }, { + "type": "struct", + "content": { + "name": "GroupFull", + "doc": [ + "Goup Full information", "Permissions.", "Idea of Group Full mermissions is about Group Info pages. This permissions", "are usefull only when trying to view and update group settings and not related", "to chat messages itself.", "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", "If default is TRUE then ONE == FALSE.", "Bits:", "0 - canEditInfo. Default is FALSE.", "1 - canViewMembers. Default is FALSE.", "2 - canInviteMembers. Default is FALSE.", "3 - canInviteViaLink. Default is FALSE.", "4 - canCall. Default is FALSE.", "5 - canEditAdminSettings. Default is FALSE.", "6 - canViewAdmins. Default is FALSE.", "7 - canEditAdmins. Default is FALSE.", "8 - canKickInvited. Default is FALSE.", "9 - canKickAnyone. Default is FALSE.", "10 - canEditForeign. Default is FALSE.", "11 - canDeleteForeign. Default is FALSE.", "", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "createDate", + "category": "full", + "description": " Date created" + }, { + "type": "reference", + "argument": "ownerUid", + "category": "full", + "description": " Optional group owner" + }, { + "type": "reference", + "argument": "members", + "category": "full", + "description": " Group members. Can be empty when isAsyncMembers enabled." + }, { + "type": "reference", + "argument": "theme", + "category": "full", + "description": " Group Theme" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": " Group about" + }, { + "type": "reference", + "argument": "isAsyncMembers", + "category": "full", + "description": " Is Members need to be loaded asynchronous. Default is false." + }, { + "type": "reference", + "argument": "isSharedHistory", + "category": "full", + "description": " Is history shared among all users. Default is false." + }, { + "type": "reference", + "argument": "shortName", + "category": "full", + "description": " Group's short name" + }, { + "type": "reference", + "argument": "permissions", + "category": "full", + "description": " Group Permissions" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 6, + "name": "createDate" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 5, + "name": "ownerUid" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 12, + "name": "members" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "theme" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "about" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 7, + "name": "ext" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 11, + "name": "isAsyncMembers" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 10, + "name": "isSharedHistory" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 14, + "name": "shortName" + }, { + "type": { + "type": "opt", + "childType": "int64" + }, + "id": 27, + "name": "permissions" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadFullGroups", + "header": 2782, + "response": { + "type": "anonymous", + "header": 2783, + "doc": [{ + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Groups to load" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupFull" + } + }, + "id": 1, + "name": "groups" + }] + }, + "doc": [ + "Loading Full Groups", { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": "Groups to load" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 1, + "name": "groups" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadMembers", + "header": 2786, + "response": { + "type": "anonymous", + "header": 2787, + "doc": [{ + "type": "reference", + "argument": "users", + "category": "full", + "description": " Group members" + }, { + "type": "reference", + "argument": "next", + "category": "full", + "description": " Load more reference" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 3, + "name": "members" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 1, + "name": "users" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 2, + "name": "next" + }] + }, + "doc": [ + "Loading group members", { + "type": "reference", + "argument": "group", + "category": "full", + "description": "Group peer" + }, { + "type": "reference", + "argument": "limit", + "category": "full", + "description": "Limit members" + }, { + "type": "reference", + "argument": "next", + "category": "full", + "description": "Load more reference" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "group" + }, { + "type": "int32", + "id": 2, + "name": "limit" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 3, + "name": "next" + }] + } + }, { + "type": "comment", + "content": "Update" + }, { + "type": "update", + "content": { + "name": "GroupTitleChanged", + "header": 2609, + "doc": [ + "Update about title changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Group Title" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "string", + "id": 2, + "name": "title" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupAvatarChanged", + "header": 2610, + "doc": [ + "Update about avatar changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "avatar", + "category": "full", + "description": " Group Avatar" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 2, + "name": "avatar" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupTopicChanged", + "header": 2616, + "doc": [ + "Update about topic changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "topic", + "category": "full", + "description": " Updated topic" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "topic" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupAboutChanged", + "header": 2617, + "doc": [ + "Update about about changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": " Updated about" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "about" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupExtChanged", + "header": 2613, + "doc": [ + "Update about ext changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " Updated ext" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 2, + "name": "ext" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupFullExtChanged", + "header": 2618, + "doc": [ + "Update about full ext changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " Updated ext" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 2, + "name": "ext" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupShortNameChanged", + "header": 2628, + "doc": [ + "Group's short name changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "shortName", + "category": "full", + "description": " Group short name" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "shortName" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupOwnerChanged", + "header": 2619, + "doc": [ + "Update about owner changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "userId", + "category": "full", + "description": " New Owner" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "userId" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupHistoryShared", + "header": 2620, + "doc": [ + "Update about history shared", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupDeleted", + "header": 2658, + "doc": [ + "Update about group deleted", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupPermissionsChanged", + "header": 2663, + "doc": [ + "Update about group permissions changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "permissions", + "category": "full", + "description": " New Permissions" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "int64", + "id": 2, + "name": "permissions" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupFullPermissionsChanged", + "header": 2664, + "doc": [ + "Update about Full Group permissions changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "permissions", + "category": "full", + "description": " New Permissions" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "int64", + "id": 2, + "name": "permissions" + }] + } + }, { + "type": "comment", + "content": " " + }, { + "type": "update", + "content": { + "name": "GroupMemberChanged", + "header": 2612, + "doc": [ + "Update about membership changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "isMember", + "category": "full", + "description": " Is current user a member" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "bool", + "id": 2, + "name": "isMember" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupMembersBecameAsync", + "header": 2615, + "doc": [ + "Update about members became async", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupMembersUpdated", + "header": 2614, + "doc": [ + "Update about members updated", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "members", + "category": "full", + "description": " Group Members" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 2, + "name": "members" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupMemberDiff", + "header": 2623, + "doc": [ + "Update about members changed", { + "type": "reference", + "argument": "removedUsers", + "category": "full", + "description": " Removed Users" + }, { + "type": "reference", + "argument": "addedMembers", + "category": "full", + "description": " Added members" + }, { + "type": "reference", + "argument": "membersCount", + "category": "full", + "description": " Current Members count" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 2, + "name": "removedUsers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 3, + "name": "addedMembers" + }, { + "type": "int32", + "id": 4, + "name": "membersCount" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupMembersCountChanged", + "header": 2622, + "doc": [ + "Update about members count changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "membersCount", + "category": "full", + "description": " Members count" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "int32", + "id": 2, + "name": "membersCount" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupMemberAdminChanged", + "header": 2627, + "doc": [ + "Update about member admin changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "userId", + "category": "full", + "description": " User Id" + }, { + "type": "reference", + "argument": "isAdmin", + "category": "full", + "description": " Is Admin flag" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "userId" + }, { + "type": "bool", + "id": 3, + "name": "isAdmin" + }] + } + }, { + "type": "comment", + "content": "Actions" + }, { + "type": "rpc", + "content": { + "name": "CreateGroup", + "header": 230, + "response": { + "type": "anonymous", + "header": 216, + "doc": [ + "Created group", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Update Seq" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Update state" + }, { + "type": "reference", + "argument": "group", + "category": "full", + "description": " Created group" + }, { + "type": "reference", + "argument": "users", + "category": "full", + "description": " Referenced users" + }, { + "type": "reference", + "argument": "userPeers", + "category": "full", + "description": " Referenced users" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Group creation date" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 6, + "name": "date" + }, { + "type": { + "type": "struct", + "childType": "Group" + }, + "id": 3, + "name": "group" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 4, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 5, + "name": "userPeers" + }] + }, + "doc": [ + "Creating group chat", { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id for avoiding double create" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": "Group Title" + }, { + "type": "reference", + "argument": "users", + "category": "hidden", + "description": "Members of group" + }, { + "type": "reference", + "argument": "groupType", + "category": "full", + "description": "Group Type" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "rid" + }, { + "type": "string", + "id": 2, + "name": "title" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 3, + "name": "users" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "GroupType" + } + }, + "id": 6, + "name": "groupType" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 7, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditGroupTitle", + "header": 85, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Changing group title", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": "new group title" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id of operation" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": "string", + "id": 3, + "name": "title" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 5, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditGroupAvatar", + "header": 86, + "response": { + "type": "anonymous", + "header": 115, + "doc": [ + "Updated group avatar", { + "type": "reference", + "argument": "avatar", + "category": "compact", + "description": " Changed avatar" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Sequence state" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Avatar change date" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Avatar" + }, + "id": 1, + "name": "avatar" + }, { + "type": "int32", + "id": 2, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + }, + "doc": [ + "Changing group avatar", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "fileLocation", + "category": "compact", + "description": "uploaded file for avatar" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id of operation" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 3, + "name": "fileLocation" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 5, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RemoveGroupAvatar", + "header": 101, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Removing group avatar", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id of operation" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 5, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditGroupShortName", + "header": 2793, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Edit Group Short Name", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "shortName", + "category": "full", + "description": "New group's short name" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "shortName" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditGroupTopic", + "header": 211, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Edit group topic", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random id of operation" + }, { + "type": "reference", + "argument": "topic", + "category": "full", + "description": "New Topic" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "topic" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 4, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditGroupAbout", + "header": 213, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Edit Group About", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random id of operation" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": "New About" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "about" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 5, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "InviteUser", + "header": 69, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Inviting user to group", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "user", + "category": "full", + "description": "Users for invitation" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id of operation" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 3, + "name": "user" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 5, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LeaveGroup", + "header": 70, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Leaving group", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id of operation" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 3, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LeaveAndDelete", + "header": 2721, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Leave group and Delete Chat", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "KickUser", + "header": 71, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Kicking user from group", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "user", + "category": "full", + "description": "users for removing" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id of operation" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 3, + "name": "user" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 5, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "JoinGroupByPeer", + "header": 2722, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Join group by peer", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "JoinGroupByGroupId", + "header": 44561, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Join group by peer without a necessity of invite", { + "type": "reference", + "argument": "groupId", + "category": "hidden", + "description": "Groups peer" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }] + } + }, { + "type": "comment", + "content": "Administration" + }, { + "type": "rpc", + "content": { + "name": "MakeUserAdmin", + "header": 2784, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Make user admin", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 2, + "name": "userPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DismissUserAdmin", + "header": 2791, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Dismissing user admin", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 2, + "name": "userPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "TransferOwnership", + "header": 2789, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Transfer ownership of group", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "newOwner", + "category": "full", + "description": "New group's owner" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 2, + "name": "newOwner" + }] + } + }, { + "type": "struct", + "content": { + "name": "AdminSettings", + "doc": [ + "Admin Settings", { + "type": "reference", + "argument": "showAdminsToMembers", + "category": "full", + "description": " Show admins in member list" + }, { + "type": "reference", + "argument": "canMembersInvite", + "category": "full", + "description": " Can members of a group invite people" + }, { + "type": "reference", + "argument": "canMembersEditGroupInfo", + "category": "full", + "description": " Can members edit group info" + }, { + "type": "reference", + "argument": "canAdminsEditGroupInfo", + "category": "full", + "description": " Can admins edit group info" + }, { + "type": "reference", + "argument": "showJoinLeaveMessages", + "category": "full", + "description": " Should join and leave messages be visible to members" + } + ], + "expandable": "true", + "attributes": [{ + "type": "bool", + "id": 1, + "name": "showAdminsToMembers" + }, { + "type": "bool", + "id": 2, + "name": "canMembersInvite" + }, { + "type": "bool", + "id": 3, + "name": "canMembersEditGroupInfo" + }, { + "type": "bool", + "id": 4, + "name": "canAdminsEditGroupInfo" + }, { + "type": "bool", + "id": 5, + "name": "showJoinLeaveMessages" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadAdminSettings", + "header": 2790, + "response": { + "type": "anonymous", + "header": 2794, + "doc": [ + "Loaded settings", { + "type": "reference", + "argument": "settings", + "category": "full", + "description": " Current group admin settings" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "AdminSettings" + }, + "id": 1, + "name": "settings" + }] + }, + "doc": [ + "Loading administration settings", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SaveAdminSettings", + "header": 2792, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Save administartion settings", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's Peer" + }, { + "type": "reference", + "argument": "settings", + "category": "full", + "description": "Group's settings" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "struct", + "childType": "AdminSettings" + }, + "id": 2, + "name": "settings" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DeleteGroup", + "header": 2795, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Delete Group", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ShareHistory", + "header": 2796, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Share History", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "comment", + "content": "Invite" + }, { + "type": "response", + "content": { + "name": "InviteUrl", + "header": 178, + "doc": [ + "Response for invite url methods" + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "url" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetGroupInviteUrl", + "header": 177, + "response": { + "type": "reference", + "name": "InviteUrl" + }, + "doc": [ + "Building invite url", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Destination group peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RevokeInviteUrl", + "header": 179, + "response": { + "type": "reference", + "name": "InviteUrl" + }, + "doc": [ + "Revoking invite urls", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Destination group peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "JoinGroup", + "header": 180, + "response": { + "type": "anonymous", + "header": 181, + "doc": [{ + "type": "reference", + "argument": "group", + "category": "hidden", + "description": " Joined group" + }, { + "type": "reference", + "argument": "users", + "category": "hidden", + "description": " Users from members" + }, { + "type": "reference", + "argument": "userPeers", + "category": "hidden", + "description": " User Peers" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random id" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number" + }, { + "type": "reference", + "argument": "state", + "category": "hidden", + "description": " State" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of join" + }], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Group" + }, + "id": 1, + "name": "group" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 5, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 7, + "name": "userPeers" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 6, + "name": "rid" + }, { + "type": "int32", + "id": 2, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + }, + "doc": [ + "Join group method", { + "type": "reference", + "argument": "token", + "category": "full", + "description": "Url or Token for joining to group" + }, { + "type": "reference", + "argument": "optimizations", + "category": "hidden", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 2, + "name": "optimizations" + }] + } + }, { + "type": "comment", + "content": "Obsolete Actions" + }, { + "type": "rpc", + "content": { + "name": "CreateGroupObsolete", + "header": 65, + "response": { + "type": "anonymous", + "header": 66, + "doc": [ + "Created group", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": " Peer of created group" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Sequence state" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Members of created group" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Group creation date" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": "int32", + "id": 3, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 4, + "name": "state" + }, { + "type": { + "type": "list", + "childType": "int32" + }, + "id": 5, + "name": "users" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 6, + "name": "date" + }] + }, + "doc": [ + "[OBSOLETE] Creating group chat", { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id for avoiding double create" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": "Title of new group" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": "Members of new group" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "rid" + }, { + "type": "string", + "id": 2, + "name": "title" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 3, + "name": "users" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EnterGroupObsolete", + "header": 199, + "response": { + "type": "anonymous", + "header": 200, + "doc": [ + "Joined group", { + "type": "reference", + "argument": "group", + "category": "full", + "description": " Joined group" + }, { + "type": "reference", + "argument": "users", + "category": "full", + "description": " Referenced users" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Rid of join message" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Seq of Update" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " State of Update" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of update" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Group" + }, + "id": 1, + "name": "group" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 3, + "name": "rid" + }, { + "type": "int32", + "id": 4, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 5, + "name": "state" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 6, + "name": "date" + }] + }, + "doc": [ + "[OBSOLETE] Join random group by peer id", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Public group peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MakeUserAdminObsolete", + "header": 214, + "response": { + "type": "anonymous", + "header": 215, + "doc": [{ + "type": "reference", + "argument": "members", + "category": "full", + "description": " new members" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 1, + "name": "members" + }, { + "type": "int32", + "id": 2, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }] + }, + "doc": [ + "[OBSOLETE] Make user admin", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 2, + "name": "userPeer" + }] + } + }, { + "type": "comment", + "content": "Obsolete Updates" + }, { + "type": "update", + "content": { + "name": "GroupInviteObsolete", + "header": 36, + "doc": [ + "Update about inviting current user to group", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "inviteUid", + "category": "full", + "description": " Inviter UID. If equals to current uid than group created by user." + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of creating" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 9, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 5, + "name": "inviteUid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 8, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupUserInvitedObsolete", + "header": 21, + "doc": [ + "Update about inviting user to group", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " Added user ID" + }, { + "type": "reference", + "argument": "inviterUid", + "category": "full", + "description": " Inviter user ID" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of adding user to group" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 5, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 3, + "name": "inviterUid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupUserLeaveObsolete", + "header": 23, + "doc": [ + "Update about leaving user", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's ID" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of user leave" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupUserKickObsolete", + "header": 24, + "doc": [ + "Update about kicking user", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " Kicked user's ID" + }, { + "type": "reference", + "argument": "kickerUid", + "category": "full", + "description": " Kicker user's ID" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of user kick" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 5, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 3, + "name": "kickerUid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupMembersUpdateObsolete", + "header": 44, + "doc": [ + "Silent group members update", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "members", + "category": "full", + "description": " New members list" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 2, + "name": "members" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupTitleChangedObsolete", + "header": 38, + "doc": [ + "Update about group title change", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " Changer UID" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": " New Title of group" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of title change" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 5, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": "string", + "id": 3, + "name": "title" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupTopicChangedObsolete", + "header": 213, + "doc": [ + "Update about group topic change", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " Changer UID" + }, { + "type": "reference", + "argument": "topic", + "category": "full", + "description": " New topic of group" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of theme change" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Randomd Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 3, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "topic" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 5, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupAboutChangedObsolete", + "header": 214, + "doc": [ + "Update about group about change", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": " Group about" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "about" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupAvatarChangedObsolete", + "header": 39, + "doc": [ + "Update about group avatar change", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " Avatar changer uid" + }, { + "type": "reference", + "argument": "avatar", + "category": "compact", + "description": " New Avatar. If null then avatar is removed" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of avatar change" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 5, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 3, + "name": "avatar" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + } + }] + }, { + "title": "Stickers", + "package": "stickers", + "doc": [ + "Stickers support in Actor" + ], + "items": [{ + "type": "struct", + "content": { + "name": "StickerDescriptor", + "doc": [ + "Descriptor of a Sticker", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Sticker unique id" + }, { + "type": "reference", + "argument": "emoji", + "category": "full", + "description": " Emoji code for sticker" + }, { + "type": "reference", + "argument": "image128", + "category": "full", + "description": " Image of sticker 128x128 in WebP format" + }, { + "type": "reference", + "argument": "image512", + "category": "full", + "description": " Image of sticker 512x512 in WebP format" + }, { + "type": "reference", + "argument": "image256", + "category": "full", + "description": " Image of sticker 256x256 in WebP format" + } + ], + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "emoji" + }, { + "type": { + "type": "struct", + "childType": "ImageLocation" + }, + "id": 3, + "name": "image128" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ImageLocation" + } + }, + "id": 4, + "name": "image512" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ImageLocation" + } + }, + "id": 5, + "name": "image256" + }] + } + }, { + "type": "struct", + "content": { + "name": "StickerCollection", + "doc": [ + "Sticker collection", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Unique id of a collection" + }, { + "type": "reference", + "argument": "accessHash", + "category": "full", + "description": " Access Hash of a collection" + }, { + "type": "reference", + "argument": "stickers", + "category": "compact", + "description": " Sticker list" + } + ], + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "StickerDescriptor" + } + }, + "id": 3, + "name": "stickers" + }] + } + }, { + "type": "response", + "content": { + "name": "StickersReponse", + "header": 240, + "doc": [ + "Stickers response", { + "type": "reference", + "argument": "collections", + "category": "full", + "description": " Sticker collections" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Seq of update" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " State of update" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "StickerCollection" + } + }, + "id": 1, + "name": "collections" + }, { + "type": "int32", + "id": 2, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadOwnStickers", + "header": 238, + "response": { + "type": "anonymous", + "header": 239, + "doc": [ + "Own Stickers collections", { + "type": "reference", + "argument": "ownStickers", + "category": "hidden", + "description": " Own sticker collections" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "StickerCollection" + } + }, + "id": 1, + "name": "ownStickers" + }] + }, + "doc": [ + "Loading own stickers" + ], + "attributes": [] + } + }, { + "type": "update", + "content": { + "name": "OwnStickersChanged", + "header": 161, + "doc": [ + "Own Stickers changed", { + "type": "reference", + "argument": "collections", + "category": "compact", + "description": " New own sticker collections" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "StickerCollection" + } + }, + "id": 1, + "name": "collections" + }] + } + }, { + "type": "update", + "content": { + "name": "StickerCollectionsChanged", + "header": 164, + "doc": [ + "Sticker collection changed", { + "type": "reference", + "argument": "collections", + "category": "full", + "description": " Updated sticker collections" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "StickerCollection" + } + }, + "id": 1, + "name": "collections" + }] + } + }, { + "type": "rpc", + "content": { + "name": "AddStickerCollection", + "header": 244, + "response": { + "type": "reference", + "name": "StickersReponse" + }, + "doc": [ + "Adding sticker collection", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Collection id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "full", + "description": "Collection access hash" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RemoveStickerCollection", + "header": 245, + "response": { + "type": "reference", + "name": "StickersReponse" + }, + "doc": [ + "Removing sticker collection", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Collection id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "full", + "description": "Collection access hash" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadStickerCollection", + "header": 246, + "response": { + "type": "anonymous", + "header": 247, + "doc": [ + "Loaded collection", { + "type": "reference", + "argument": "collection", + "category": "full", + "description": " Collection of stickers" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "StickerCollection" + }, + "id": 1, + "name": "collection" + }] + }, + "doc": [ + "Loading stickers", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Collection id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "full", + "description": "Collection access hash" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }] + }, { + "title": "Search", + "package": "search", + "doc": [ + "Searching API" + ], + "items": [{ + "type": "enum", + "content": { + "name": "SearchPeerType", + "values": [{ + "name": "Groups", + "id": 1 + }, { + "name": "Contacts", + "id": 2 + }, { + "name": "Public", + "id": 3 + }] + } + }, { + "type": "enum", + "content": { + "name": "SearchContentType", + "values": [{ + "name": "Any", + "id": 1 + }, { + "name": "Text", + "id": 2 + }, { + "name": "Links", + "id": 3 + }, { + "name": "Documents", + "id": 4 + }, { + "name": "Photos", + "id": 5 + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "SearchCondition", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "SearchPeerTypeCondition", + "doc": [ + "Search peer type condition", { + "type": "reference", + "argument": "peerType", + "category": "full", + "description": " Peer type for searching" + } + ], + "trait": { + "name": "SearchCondition", + "key": 1 + }, + "attributes": [{ + "type": { + "type": "enum", + "childType": "SearchPeerType" + }, + "id": 1, + "name": "peerType" + }] + } + }, { + "type": "struct", + "content": { + "name": "SearchPieceText", + "doc": [ + "Search peer name condition", { + "type": "reference", + "argument": "query", + "category": "full", + "description": " Search query" + } + ], + "trait": { + "name": "SearchCondition", + "key": 2 + }, + "attributes": [{ + "type": "string", + "id": 1, + "name": "query" + }] + } + }, { + "type": "struct", + "content": { + "name": "SearchAndCondition", + "doc": [ + "Search AND condion", { + "type": "reference", + "argument": "andQuery", + "category": "full", + "description": " And Query" + } + ], + "trait": { + "name": "SearchCondition", + "key": 3 + }, + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "trait", + "childType": "SearchCondition" + } + }, + "id": 1, + "name": "andQuery" + }] + } + }, { + "type": "struct", + "content": { + "name": "SearchOrCondition", + "doc": [ + "Search OR condition", { + "type": "reference", + "argument": "orQuery", + "category": "full", + "description": " Or Query" + } + ], + "trait": { + "name": "SearchCondition", + "key": 4 + }, + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "trait", + "childType": "SearchCondition" + } + }, + "id": 2, + "name": "orQuery" + }] + } + }, { + "type": "struct", + "content": { + "name": "SearchPeerCondition", + "doc": [ + "Serch Peer condition", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Peer condition" + } + ], + "trait": { + "name": "SearchCondition", + "key": 5 + }, + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "struct", + "content": { + "name": "SearchPeerContentType", + "doc": [ + "Search content type condition", { + "type": "reference", + "argument": "contentType", + "category": "full", + "description": " Content Type" + } + ], + "trait": { + "name": "SearchCondition", + "key": 6 + }, + "attributes": [{ + "type": { + "type": "enum", + "childType": "SearchContentType" + }, + "id": 1, + "name": "contentType" + }] + } + }, { + "type": "struct", + "content": { + "name": "SearchSenderIdConfition", + "doc": [ + "Searching sender uid condition", { + "type": "reference", + "argument": "senderId", + "category": "full", + "description": " sender UID" + } + ], + "trait": { + "name": "SearchCondition", + "key": 7 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "senderId" + }] + } + }, { + "type": "struct", + "content": { + "name": "PeerSearchResult", + "doc": [ + "Peer search result", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Peer information" + }, { + "type": "reference", + "argument": "optMatchString", + "category": "full", + "description": " Description" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "optMatchString" + }] + } + }, { + "type": "rpc", + "content": { + "name": "PeerSearch", + "header": 233, + "response": { + "type": "anonymous", + "header": 234, + "doc": [ + "Found peers", { + "type": "reference", + "argument": "searchResults", + "category": "full", + "description": " Search Results" + }, { + "type": "reference", + "argument": "users", + "category": "full", + "description": " Related users" + }, { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " Related groups" + }, { + "type": "reference", + "argument": "userPeers", + "category": "full", + "description": " Related user peers" + }, { + "type": "reference", + "argument": "groupPeers", + "category": "full", + "description": " Related group peers" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "PeerSearchResult" + } + }, + "id": 1, + "name": "searchResults" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 3, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 4, + "name": "userPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 5, + "name": "groupPeers" + }] + }, + "doc": [ + "Performing peer search", { + "type": "reference", + "argument": "query", + "category": "full", + "description": "Search query. Warring not all combinations can be processed by server. (acts as OR)" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "trait", + "childType": "SearchCondition" + } + }, + "id": 1, + "name": "query" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 2, + "name": "optimizations" + }] + } + }, { + "type": "struct", + "content": { + "name": "MessageSearchResult", + "doc": [ + "Message container", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Message Peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Message Random Id" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Message Date" + }, { + "type": "reference", + "argument": "senderId", + "category": "full", + "description": " Message sender UID" + }, { + "type": "reference", + "argument": "content", + "category": "full", + "description": " Message content" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 4, + "name": "senderId" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 5, + "name": "content" + }] + } + }, { + "type": "struct", + "content": { + "name": "MessageSearchItem", + "doc": [ + "Message Search result container" + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "MessageSearchResult" + }, + "id": 1, + "name": "result" + }] + } + }, { + "type": "response", + "content": { + "name": "MessageSearchResponse", + "header": 218, + "doc": [ + "Search Result", { + "type": "reference", + "argument": "searchResults", + "category": "full", + "description": " Search results" + }, { + "type": "reference", + "argument": "users", + "category": "full", + "description": " Search users" + }, { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " Search groups" + }, { + "type": "reference", + "argument": "loadMoreState", + "category": "hidden", + "description": " State for loading more results" + }, { + "type": "reference", + "argument": "userOutPeers", + "category": "full", + "description": " Search user peers" + }, { + "type": "reference", + "argument": "groupOutPeers", + "category": "full", + "description": " Search group peers" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageSearchItem" + } + }, + "id": 1, + "name": "searchResults" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 3, + "name": "groups" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 4, + "name": "loadMoreState" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 5, + "name": "userOutPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 6, + "name": "groupOutPeers" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MessageSearch", + "header": 217, + "response": { + "type": "reference", + "name": "MessageSearchResponse" + }, + "doc": [ + "Performing message search", { + "type": "reference", + "argument": "query", + "category": "full", + "description": "Search query" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "trait", + "childType": "SearchCondition" + }, + "id": 1, + "name": "query" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 2, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MessageSearchMore", + "header": 222, + "response": { + "type": "reference", + "name": "MessageSearchResponse" + }, + "doc": [ + "Performing message search paging", { + "type": "reference", + "argument": "loadMoreState", + "category": "hidden", + "description": "State for loading more results" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": "bytes", + "id": 1, + "name": "loadMoreState" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 2, + "name": "optimizations" + }] + } + }] + }, { + "title": "Public Groups", + "package": "pubgroups", + "doc": [ + "Public group is easy way to find communities" + ], + "items": [{ + "type": "struct", + "content": { + "name": "PublicGroup", + "doc": [ + "Public Group description", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Group id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " Group Access hash" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Group title" + }, { + "type": "reference", + "argument": "avatar", + "category": "full", + "description": " Group avatar" + }, { + "type": "reference", + "argument": "membersCount", + "category": "full", + "description": " Members count in group" + }, { + "type": "reference", + "argument": "friendsCount", + "category": "full", + "description": " Friends count int group" + }, { + "type": "reference", + "argument": "description", + "category": "full", + "description": " Description of group" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": "string", + "id": 3, + "name": "title" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 7, + "name": "avatar" + }, { + "type": "int32", + "id": 4, + "name": "membersCount" + }, { + "type": "int32", + "id": 5, + "name": "friendsCount" + }, { + "type": "string", + "id": 6, + "name": "description" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetPublicGroups", + "header": 201, + "response": { + "type": "anonymous", + "header": 202, + "doc": [ + "Loaded public groups", { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " All available groups" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "PublicGroup" + } + }, + "id": 1, + "name": "groups" + }] + }, + "doc": [ + "Getting public groups" + ], + "attributes": [] + } + }] + }, { + "title": "Invites", + "package": "invites", + "doc": [ + "Invite mechanizm" + ], + "items": [{ + "type": "struct", + "content": { + "name": "InviteState", + "doc": [ + "Invite state", { + "type": "reference", + "argument": "email", + "category": "full", + "description": " Email of invite" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " Name of invited user" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " Uid of registered user" + }, { + "type": "reference", + "argument": "tid", + "category": "full", + "description": " Team id of invite" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "email" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "name" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 3, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 4, + "name": "tid" + }] + } + }, { + "type": "response", + "content": { + "name": "InviteList", + "header": 2564, + "doc": [ + "Intites list", { + "type": "reference", + "argument": "invites", + "category": "full", + "description": " Intvites" + }, { + "type": "reference", + "argument": "relatedUsers", + "category": "full", + "description": " Related users in invites" + }, { + "type": "reference", + "argument": "relatedGroups", + "category": "full", + "description": " Related groups in invites" + }, { + "type": "reference", + "argument": "relatedTeams", + "category": "full", + "description": " Related teams in invites" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "InviteState" + } + }, + "id": 1, + "name": "invites" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 2, + "name": "relatedUsers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 3, + "name": "relatedGroups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Team" + } + }, + "id": 4, + "name": "relatedTeams" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadOwnSentInvites", + "header": 2563, + "response": { + "type": "reference", + "name": "InviteList" + }, + "doc": [ + "Loading current invite states" + ], + "attributes": [] + } + }, { + "type": "rpc", + "content": { + "name": "SendInvite", + "header": 2565, + "response": { + "type": "reference", + "name": "InviteList" + }, + "doc": [ + "Sending an email invite", { + "type": "reference", + "argument": "email", + "category": "full", + "description": "Email for invite" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": "Optional name for invite" + }, { + "type": "reference", + "argument": "destTeam", + "category": "full", + "description": "Optional team for invite" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "email" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "name" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "OutTeam" + } + }, + "id": 3, + "name": "destTeam" + }] + } + }] + }, { + "title": "Teams", + "package": "teams", + "doc": [ + "Teams support for Actor" + ], + "items": [{ + "type": "struct", + "content": { + "name": "Team", + "doc": [ + "Team entity", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Team Id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " Team Access Hash" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " Team name" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": "string", + "id": 3, + "name": "name" + }] + } + }, { + "type": "struct", + "content": { + "name": "OutTeam", + "doc": [ + "Reference to a team", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Team Id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "full", + "description": " Team access hash" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "response", + "content": { + "name": "TeamsList", + "header": 2562, + "doc": [ + "Teams response", { + "type": "reference", + "argument": "teams", + "category": "hidden", + "description": " Teams list" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Team" + } + }, + "id": 1, + "name": "teams" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadOwnTeams", + "header": 2561, + "response": { + "type": "reference", + "name": "TeamsList" + }, + "doc": [ + "Loading own teams" + ], + "attributes": [] + } + }, { + "type": "update", + "content": { + "name": "OwnTeamsChanged", + "header": 165, + "doc": [ + "Update about own teams changed", { + "type": "reference", + "argument": "ownTeams", + "category": "full", + "description": " Updated own teams list" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Team" + } + }, + "id": 1, + "name": "ownTeams" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CreateTeam", + "header": 2566, + "response": { + "type": "anonymous", + "header": 2567, + "doc": [ + "Created team response", { + "type": "reference", + "argument": "createdTeam", + "category": "full", + "description": " Created Team" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Team" + }, + "id": 1, + "name": "createdTeam" + }] + }, + "doc": [ + "Creation of a Team", { + "type": "reference", + "argument": "title", + "category": "full", + "description": "Title of a team" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "title" + }] + } + }, { + "type": "rpc", + "content": { + "name": "InviteToTeam", + "header": 2568, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Inviting people to team", { + "type": "reference", + "argument": "user", + "category": "full", + "description": "Dest user" + }, { + "type": "reference", + "argument": "destTeam", + "category": "full", + "description": "Dest team" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "user" + }, { + "type": { + "type": "struct", + "childType": "OutTeam" + }, + "id": 3, + "name": "destTeam" + }] + } + }] + }, { + "title": "Integrations", + "package": "integrations", + "doc": [ + "Package contains methods for providing integration" + ], + "items": [{ + "type": "response", + "content": { + "name": "IntegrationToken", + "header": 183, + "doc": [ + "Group token response", { + "type": "reference", + "argument": "token", + "category": "danger", + "description": " current group token" + }, { + "type": "reference", + "argument": "url", + "category": "danger", + "description": " current group url" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }, { + "type": "string", + "id": 2, + "name": "url" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetIntegrationToken", + "header": 182, + "response": { + "type": "reference", + "name": "IntegrationToken" + }, + "doc": [ + "Getting current group token", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RevokeIntegrationToken", + "header": 184, + "response": { + "type": "reference", + "name": "IntegrationToken" + }, + "doc": [ + "Revoke group token", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }] + }, { + "title": "Typing and Online", + "package": "weak", + "items": [{ + "type": "enum", + "content": { + "name": "TypingType", + "values": [{ + "name": "Text", + "id": 0 + }] + } + }, { + "type": "rpc", + "content": { + "name": "Typing", + "header": 27, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Sending typing notification", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "typingType", + "category": "full", + "description": "typing type." + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "enum", + "childType": "TypingType" + }, + "id": 3, + "name": "typingType" + }] + } + }, { + "type": "rpc", + "content": { + "name": "StopTyping", + "header": 30, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Stop typing", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "typingType", + "category": "full", + "description": "typing type" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "enum", + "childType": "TypingType" + }, + "id": 2, + "name": "typingType" + }] + } + }, { + "type": "enum", + "content": { + "name": "DeviceType", + "values": [{ + "name": "GENERIC", + "id": 1 + }, { + "name": "PC", + "id": 2 + }, { + "name": "MOBILE", + "id": 3 + }, { + "name": "TABLET", + "id": 4 + }, { + "name": "WATCH", + "id": 5 + }, { + "name": "MIRROR", + "id": 6 + }, { + "name": "CAR", + "id": 7 + }, { + "name": "TABLE", + "id": 8 + }] + } + }, { + "type": "rpc", + "content": { + "name": "SetOnline", + "header": 29, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Sending online state", { + "type": "reference", + "argument": "isOnline", + "category": "full", + "description": "is user online" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": "timeout of online state in milliseconds" + }, { + "type": "reference", + "argument": "deviceType", + "category": "full", + "description": "Optional device type" + }, { + "type": "reference", + "argument": "deviceCategory", + "category": "full", + "description": "Optional device category, for example android or ios" + } + ], + "attributes": [{ + "type": "bool", + "id": 1, + "name": "isOnline" + }, { + "type": { + "type": "alias", + "childType": "msec" + }, + "id": 2, + "name": "timeout" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "DeviceType" + } + }, + "id": 3, + "name": "deviceType" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "deviceCategory" + }] + } + }, { + "type": "update", + "content": { + "name": "PauseNotifications", + "header": 166, + "doc": [ + "Update about pausing notifications", { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": " Timeout for notifications resume" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "sec" + }, + "id": 1, + "name": "timeout" + }] + } + }, { + "type": "update", + "content": { + "name": "RestoreNotifications", + "header": 167, + "doc": [ + "Update about restoring notifications" + ], + "attributes": [] + } + }, { + "type": "rpc", + "content": { + "name": "PauseNotifications", + "header": 2641, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Pause notifications", { + "type": "reference", + "argument": "timeout", + "category": "hidden", + "description": "Timeout of pause" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "sec" + }, + "id": 1, + "name": "timeout" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RestoreNotifications", + "header": 2642, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Restoring notifications" + ], + "attributes": [] + } + }, { + "type": "empty" + }, { + "type": "update", + "content": { + "name": "Typing", + "header": 6, + "doc": [ + "Update about user's typing", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Conversation peer" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "typingType", + "category": "full", + "description": " Type of typing" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": { + "type": "enum", + "childType": "TypingType" + }, + "id": 3, + "name": "typingType" + }] + } + }, { + "type": "update", + "content": { + "name": "TypingStop", + "header": 81, + "doc": [ + "Update about user's typing stop", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Conversation peer" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "typingType", + "category": "hidden", + "description": " Type of typing" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": { + "type": "enum", + "childType": "TypingType" + }, + "id": 3, + "name": "typingType" + }] + } + }, { + "type": "update", + "content": { + "name": "UserOnline", + "header": 7, + "doc": [ + "Update about user became online", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "DeviceType" + } + }, + "id": 2, + "name": "deviceType" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "deviceCategory" + }] + } + }, { + "type": "update", + "content": { + "name": "UserOffline", + "header": 8, + "doc": [ + "Update about user became offline", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "DeviceType" + } + }, + "id": 2, + "name": "deviceType" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "deviceCategory" + }] + } + }, { + "type": "update", + "content": { + "name": "UserLastSeen", + "header": 9, + "doc": [ + "Update about user's last seen state", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Last seen time" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 2, + "name": "date" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "DeviceType" + } + }, + "id": 3, + "name": "deviceType" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "deviceCategory" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupOnline", + "header": 33, + "doc": [ + "Update about group online change", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group id" + }, { + "type": "reference", + "argument": "count", + "category": "full", + "description": " current online user's count" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "int32", + "id": 2, + "name": "count" + }] + } + }] + }, { + "title": "Media and Files", + "package": "files", + "items": [{ + "type": "struct", + "content": { + "name": "FileLocation", + "doc": [ + "Location of file on server", { + "type": "reference", + "argument": "fileId", + "category": "full", + "description": " Unique Id of file" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " Access hash of file" + } + ], + "expandable": "true", + "attributes": [{ + "type": "int64", + "id": 1, + "name": "fileId" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "struct", + "content": { + "name": "ImageLocation", + "doc": [ + "Image location", { + "type": "reference", + "argument": "fileLocation", + "category": "full", + "description": " Location of file" + }, { + "type": "reference", + "argument": "width", + "category": "full", + "description": " Width of avatar image" + }, { + "type": "reference", + "argument": "height", + "category": "full", + "description": " Height of avatar image" + }, { + "type": "reference", + "argument": "fileSize", + "category": "full", + "description": " Size of file" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 1, + "name": "fileLocation" + }, { + "type": "int32", + "id": 2, + "name": "width" + }, { + "type": "int32", + "id": 3, + "name": "height" + }, { + "type": "int32", + "id": 4, + "name": "fileSize" + }] + } + }, { + "type": "struct", + "content": { + "name": "AvatarImage", + "doc": [ + "Avatar Image", { + "type": "reference", + "argument": "fileLocation", + "category": "full", + "description": " Location of file" + }, { + "type": "reference", + "argument": "width", + "category": "full", + "description": " Width of avatar image" + }, { + "type": "reference", + "argument": "height", + "category": "full", + "description": " Height of avatar image" + }, { + "type": "reference", + "argument": "fileSize", + "category": "full", + "description": " Size of file" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 1, + "name": "fileLocation" + }, { + "type": "int32", + "id": 2, + "name": "width" + }, { + "type": "int32", + "id": 3, + "name": "height" + }, { + "type": "int32", + "id": 4, + "name": "fileSize" + }] + } + }, { + "type": "struct", + "content": { + "name": "Avatar", + "doc": [ + "Avatar of User or Group", { + "type": "reference", + "argument": "smallImage", + "category": "compact", + "description": " Optional small image of avatar box in 100x100" + }, { + "type": "reference", + "argument": "largeImage", + "category": "compact", + "description": " Optional large image of avatar box in 200x200" + }, { + "type": "reference", + "argument": "fullImage", + "category": "compact", + "description": " Optional full screen image of avatar" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "AvatarImage" + } + }, + "id": 1, + "name": "smallImage" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "AvatarImage" + } + }, + "id": 2, + "name": "largeImage" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "AvatarImage" + } + }, + "id": 3, + "name": "fullImage" + }] + } + }, { + "type": "struct", + "content": { + "name": "FastThumb", + "doc": [ + "Fast thumb of media messages. Less than 90x90 and compressed by JPEG with low quality", { + "type": "reference", + "argument": "w", + "category": "full", + "description": " Width of thumb" + }, { + "type": "reference", + "argument": "h", + "category": "full", + "description": " Height of thump" + }, { + "type": "reference", + "argument": "thumb", + "category": "compact", + "description": " compressed image data" + } + ], + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "w" + }, { + "type": "int32", + "id": 2, + "name": "h" + }, { + "type": "bytes", + "id": 3, + "name": "thumb" + }] + } + }, { + "type": "enum", + "content": { + "name": "Colors", + "values": [{ + "name": "red", + "id": 1 + }, { + "name": "yellow", + "id": 2 + }, { + "name": "green", + "id": 3 + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "Color", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "RgbColor", + "doc": [ + "RGB Color", { + "type": "reference", + "argument": "rgb", + "category": "full", + "description": " RGB color value" + } + ], + "trait": { + "name": "Color", + "key": 1 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "rgb" + }] + } + }, { + "type": "struct", + "content": { + "name": "PredefinedColor", + "doc": [ + "Predefined color", { + "type": "reference", + "argument": "color", + "category": "hidden", + "description": " Predefined color value" + } + ], + "trait": { + "name": "Color", + "key": 2 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "enum", + "childType": "Colors" + }, + "id": 1, + "name": "color" + }] + } + }, { + "type": "empty" + }, { + "type": "struct", + "content": { + "name": "HTTPHeader", + "doc": [ + "HTTP Header record", { + "type": "reference", + "argument": "key", + "category": "full", + "description": " HTTP Header name" + }, { + "type": "reference", + "argument": "value", + "category": "full", + "description": " HTTP Header value" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "key" + }, { + "type": "string", + "id": 2, + "name": "value" + }] + } + }, { + "type": "struct", + "content": { + "name": "FileUrlDescription", + "doc": [ + "File url description", { + "type": "reference", + "argument": "fileId", + "category": "full", + "description": " File id of url" + }, { + "type": "reference", + "argument": "url", + "category": "full", + "description": " Url for downloading" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": " Timeout of url" + }, { + "type": "reference", + "argument": "unsignedUrl", + "category": "hidden", + "description": " Unsigned URL (used to honor web caches)" + }, { + "type": "reference", + "argument": "unsignedUrlHeaders", + "category": "hidden", + "description": " Headers that is required to download files with unsigned url" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "fileId" + }, { + "type": "string", + "id": 2, + "name": "url" + }, { + "type": { + "type": "alias", + "childType": "sec" + }, + "id": 3, + "name": "timeout" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "unsignedUrl" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "HTTPHeader" + } + }, + "id": 5, + "name": "unsignedUrlHeaders" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetFileUrl", + "header": 77, + "response": { + "type": "anonymous", + "header": 78, + "doc": [{ + "type": "reference", + "argument": "url", + "category": "full", + "description": " Url for downloading" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": " Timeout of url" + }, { + "type": "reference", + "argument": "unsignedUrl", + "category": "full", + "description": " Unsigned URL (used to honor web caches)" + }, { + "type": "reference", + "argument": "unsignedUrlHeaders", + "category": "full", + "description": " Headers that is required to download files with unsigned url" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "url" + }, { + "type": { + "type": "alias", + "childType": "sec" + }, + "id": 2, + "name": "timeout" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "unsignedUrl" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "HTTPHeader" + } + }, + "id": 4, + "name": "unsignedUrlHeaders" + }] + }, + "doc": [ + "Requesting file URL for downloading", { + "type": "reference", + "argument": "file", + "category": "full", + "description": "file's location" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 1, + "name": "file" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetFileUrls", + "header": 2573, + "response": { + "type": "anonymous", + "header": 2574, + "doc": [{ + "type": "reference", + "argument": "fileUrls", + "category": "full", + "description": " File urls" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "FileUrlDescription" + } + }, + "id": 1, + "name": "fileUrls" + }] + }, + "doc": [ + "Requesting multiple fle URL for downloading", { + "type": "reference", + "argument": "files", + "category": "hidden", + "description": "File locations to load urls" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "FileLocation" + } + }, + "id": 1, + "name": "files" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetFileUrlBuilder", + "header": 2579, + "response": { + "type": "anonymous", + "header": 2580, + "doc": [{ + "type": "reference", + "argument": "baseUrl", + "category": "full", + "description": " Base Url for files" + }, { + "type": "reference", + "argument": "algo", + "category": "full", + "description": " Signature algorithm" + }, { + "type": "reference", + "argument": "seed", + "category": "full", + "description": " Public-visible seed of signature" + }, { + "type": "reference", + "argument": "signatureSecret", + "category": "full", + "description": " Signature Secret" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": " Timeout of url builder" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "baseUrl" + }, { + "type": "string", + "id": 2, + "name": "algo" + }, { + "type": "string", + "id": 5, + "name": "seed" + }, { + "type": "bytes", + "id": 3, + "name": "signatureSecret" + }, { + "type": { + "type": "alias", + "childType": "sec" + }, + "id": 4, + "name": "timeout" + }] + }, + "doc": [ + "Get File URL Builder that allows to build file urls from client side", { + "type": "reference", + "argument": "supportedSignatureAlgorithms", + "category": "hidden", + "description": "Supported signature algorithms by client" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": "string" + }, + "id": 1, + "name": "supportedSignatureAlgorithms" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetFileUploadUrl", + "header": 97, + "response": { + "type": "anonymous", + "header": 121, + "doc": [{ + "type": "reference", + "argument": "url", + "category": "full", + "description": " Url for uploading" + }, { + "type": "reference", + "argument": "uploadKey", + "category": "compact", + "description": " Upload key for upload" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "url" + }, { + "type": "bytes", + "id": 2, + "name": "uploadKey" + }] + }, + "doc": [ + "Requesting pload url", { + "type": "reference", + "argument": "expectedSize", + "category": "full", + "description": "Expected size of uploading file. May be inaccurate. Used for size allocation optimizations." + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "expectedSize" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CommitFileUpload", + "header": 122, + "response": { + "type": "anonymous", + "header": 138, + "doc": [{ + "type": "reference", + "argument": "uploadedFileLocation", + "category": "hidden", + "description": " Result file location" + }], + "attributes": [{ + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 1, + "name": "uploadedFileLocation" + }] + }, + "doc": [ + "Comminting uploaded file to storage" + ], + "attributes": [{ + "type": "bytes", + "id": 1, + "name": "uploadKey" + }, { + "type": "string", + "id": 2, + "name": "fileName" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetFileUploadPartUrl", + "header": 142, + "response": { + "type": "anonymous", + "header": 141, + "doc": [{ + "type": "reference", + "argument": "url", + "category": "full", + "description": " Upload file part url" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "url" + }] + }, + "doc": [ + "Upload file part", { + "type": "reference", + "argument": "uploadKey", + "category": "compact", + "description": "Upload Key from requestFileUploadUrl" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "partNumber" + }, { + "type": "int32", + "id": 2, + "name": "partSize" + }, { + "type": "bytes", + "id": 3, + "name": "uploadKey" + }] + } + }] + }, { + "title": "Features", + "package": "features", + "doc": [ + "Enable feature discovery. Currently available features:", + "* \"call\" - private audio calls" + ], + "items": [{ + "type": "rpc", + "content": { + "name": "EnableFeature", + "header": 2588, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Enabling feature on the device", { + "type": "reference", + "argument": "featureName", + "category": "full", + "description": "Feature name" + }, { + "type": "reference", + "argument": "args", + "category": "danger", + "description": "Optional arguments to a feature" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "featureName" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 2, + "name": "args" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DisableFeature", + "header": 2589, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Disabling feature on the device", { + "type": "reference", + "argument": "featureName", + "category": "full", + "description": "Feature name" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "featureName" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CheckFeatureEnabled", + "header": 2590, + "response": { + "type": "reference", + "name": "Bool" + }, + "doc": [ + "Method for checking if feature is available to user" + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "userOutPeer" + }, { + "type": "string", + "id": 2, + "name": "featureName" + }] + } + }] + }, { + "title": "EventBus", + "package": "eventbus", + "items": [{ + "type": "rpc", + "content": { + "name": "CreateNewEventBus", + "header": 2665, + "response": { + "type": "anonymous", + "header": 2666, + "doc": [ + "Created new Event Bus", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Event Bus Id" + }, { + "type": "reference", + "argument": "deviceId", + "category": "full", + "description": " Your Device Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "deviceId" + }] + }, + "doc": [ + "Create new Event Bus", { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": "Optional timeout of Event Bus" + }, { + "type": "reference", + "argument": "isOwned", + "category": "full", + "description": "Is Event Bus owned by creator" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "msec" + } + }, + "id": 1, + "name": "timeout" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 2, + "name": "isOwned" + }] + } + }, { + "type": "rpc", + "content": { + "name": "JoinEventBus", + "header": 2668, + "response": { + "type": "anonymous", + "header": 2669, + "doc": [{ + "type": "reference", + "argument": "deviceId", + "category": "full", + "description": " Your Device Id" + }, { + "type": "reference", + "argument": "rejoinToken", + "category": "full", + "description": " Token that can be used for rejoining event bus with same device id" + }], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "deviceId" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 2, + "name": "rejoinToken" + }] + }, + "doc": [ + "Joining Event Bus", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Event Bus Id" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": "Join timeout" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "msec" + } + }, + "id": 2, + "name": "timeout" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ReJoinEventBus", + "header": 2675, + "response": { + "type": "anonymous", + "header": 2676, + "doc": [{ + "type": "reference", + "argument": "deviceId", + "category": "hidden", + "description": " Your Device Id" + }], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "deviceId" + }] + }, + "doc": [ + "Rejoining to event bus after session was disposed", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Event Bus Id" + }, { + "type": "reference", + "argument": "rejoinToken", + "category": "full", + "description": "Rejoin Token" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": "bytes", + "id": 2, + "name": "rejoinToken" + }] + } + }, { + "type": "rpc", + "content": { + "name": "KeepAliveEventBus", + "header": 2670, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Keep Alive Event Bus", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Event Bus Id" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": "Optional timeout for keep alive" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "msec" + } + }, + "id": 2, + "name": "timeout" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DisposeEventBus", + "header": 2667, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Dispose Event Bus", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Event Bus Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }] + } + }, { + "type": "rpc", + "content": { + "name": "PostToEventBus", + "header": 2671, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Event Bus Destination", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Bus Id" + }, { + "type": "reference", + "argument": "destinations", + "category": "full", + "description": "If Empty need to broadcase message to everyone" + }, { + "type": "reference", + "argument": "message", + "category": "hidden", + "description": "Message" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "randomId" + } + }, + "id": 2, + "name": "destinations" + }, { + "type": "bytes", + "id": 3, + "name": "message" + }] + } + }, { + "type": "update", + "content": { + "name": "EventBusDeviceConnected", + "header": 2561, + "doc": [ + "Update about pubsub device connected", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " ID of Event Bus" + }, { + "type": "reference", + "argument": "userId", + "category": "full", + "description": " Joined User Id" + }, { + "type": "reference", + "argument": "deviceId", + "category": "full", + "description": " Joined Device Unique Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 2, + "name": "userId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 3, + "name": "deviceId" + }] + } + }, { + "type": "update", + "content": { + "name": "EventBusDeviceDisconnected", + "header": 2563, + "doc": [ + "Update about device disconnected", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " ID of Event Bus" + }, { + "type": "reference", + "argument": "userId", + "category": "full", + "description": " Joined User Id" + }, { + "type": "reference", + "argument": "deviceId", + "category": "full", + "description": " Disconnected Device unique Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 2, + "name": "userId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 3, + "name": "deviceId" + }] + } + }, { + "type": "update", + "content": { + "name": "EventBusMessage", + "header": 2562, + "doc": [ + "Event Bus Message", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Event Bus Id" + }, { + "type": "reference", + "argument": "senderId", + "category": "full", + "description": " Sender of message" + }, { + "type": "reference", + "argument": "senderDeviceId", + "category": "full", + "description": " Device Id of sender" + }, { + "type": "reference", + "argument": "message", + "category": "hidden", + "description": " Message" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 2, + "name": "senderId" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "randomId" + } + }, + "id": 3, + "name": "senderDeviceId" + }, { + "type": "bytes", + "id": 4, + "name": "message" + }] + } + }, { + "type": "update", + "content": { + "name": "EventBusDisposed", + "header": 2564, + "doc": [ + "Event Bus dispose", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Event Bus Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }] + } + }] + }, { + "title": "Values", + "package": "values", + "doc": [ + "Synced Values" + ], + "items": [{ + "type": "struct", + "content": { + "name": "SyncedValue", + "doc": [ + "Synced Value container", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Unique Id of a value. Unique in the scope of one named value." + }, { + "type": "reference", + "argument": "value", + "category": "full", + "description": " Optional value" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 2, + "name": "value" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadSyncedSet", + "header": 2679, + "response": { + "type": "anonymous", + "header": 2680, + "doc": [{ + "type": "reference", + "argument": "values", + "category": "full", + "description": " Current set values" + }, { + "type": "reference", + "argument": "isStrong", + "category": "full", + "description": " Is this value strong and stored in sequence. By default is true." + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "SyncedValue" + } + }, + "id": 1, + "name": "values" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 2, + "name": "isStrong" + }] + }, + "doc": [ + "Loading synced set", { + "type": "reference", + "argument": "setName", + "category": "hidden", + "description": "readable name of the set" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "setName" + }] + } + }, { + "type": "update", + "content": { + "name": "SynedSetUpdated", + "header": 72, + "doc": [ + "Update about synced set update", { + "type": "reference", + "argument": "setName", + "category": "full", + "description": " Set Name" + }, { + "type": "reference", + "argument": "syncedValues", + "category": "full", + "description": " Current set values" + }, { + "type": "reference", + "argument": "isStrong", + "category": "full", + "description": " Is this value strong and need to be stored on disk" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "setName" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "SyncedValue" + } + }, + "id": 2, + "name": "syncedValues" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 3, + "name": "isStrong" + }] + } + }, { + "type": "update", + "content": { + "name": "SyncedSetAddedOrUpdated", + "header": 73, + "doc": [ + "Update about added or updated values in the synced set", { + "type": "reference", + "argument": "setName", + "category": "full", + "description": " Set Name" + }, { + "type": "reference", + "argument": "addedOrUpdatedValues", + "category": "hidden", + "description": " Added or updated values" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "setName" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "SyncedValue" + } + }, + "id": 2, + "name": "addedOrUpdatedValues" + }] + } + }, { + "type": "update", + "content": { + "name": "SyncedSetRemoved", + "header": 74, + "doc": [ + "Update about removed items from synced set", { + "type": "reference", + "argument": "setName", + "category": "full", + "description": " Set Name" + }, { + "type": "reference", + "argument": "removedItems", + "category": "full", + "description": " Removed Items from the set" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "setName" + }, { + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "randomId" + } + }, + "id": 2, + "name": "removedItems" + }] + } + }] + }, { + "title": "WebRTC", + "package": "webrtc", + "doc": [ + "WebRTC package that enables support to audio and video calls" + ], + "items": [{ + "type": "update", + "content": { + "name": "IncomingCall", + "header": 52, + "doc": [ + "Update about incoming call (Sent every 10 seconds)", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": " Call Id" + }, { + "type": "reference", + "argument": "attemptIndex", + "category": "full", + "description": " Optional attempt Index" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 2, + "name": "attemptIndex" + }] + } + }, { + "type": "update", + "content": { + "name": "CallHandled", + "header": 53, + "doc": [ + "Update about incoming call handled", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": " Call Id" + }, { + "type": "reference", + "argument": "attemptIndex", + "category": "full", + "description": " Optional attempt Index" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 2, + "name": "attemptIndex" + }] + } + }, { + "type": "update", + "content": { + "name": "CallUpgraded", + "header": 56, + "doc": [ + "Update about call moved to other peer", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": " Call Id" + }, { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Upgraded group id" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 2, + "name": "groupId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetCallInfo", + "header": 2600, + "response": { + "type": "anonymous", + "header": 2606, + "doc": [{ + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Groups" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Users" + }, { + "type": "reference", + "argument": "eventBusId", + "category": "full", + "description": " Event Bus Id" + }, { + "type": "reference", + "argument": "isAudioOnlyCall", + "category": "full", + "description": " Is Audio Only Call. Default is true" + }, { + "type": "reference", + "argument": "isVideoOnlyCall", + "category": "full", + "description": " Is Video Only Call. Default is false." + }, { + "type": "reference", + "argument": "isVideoPreferred", + "category": "full", + "description": " Is Video preferred" + }], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 2, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 3, + "name": "users" + }, { + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 4, + "name": "eventBusId" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 5, + "name": "isAudioOnlyCall" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 6, + "name": "isVideoOnlyCall" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 7, + "name": "isVideoPreferred" + }] + }, + "doc": [ + "Getting Call Information", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": "Call Id" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DoCall", + "header": 2597, + "response": { + "type": "anonymous", + "header": 2598, + "doc": [{ + "type": "reference", + "argument": "callId", + "category": "full", + "description": " Call Id" + }, { + "type": "reference", + "argument": "eventBusId", + "category": "full", + "description": " Call Event Bus Id" + }], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 2, + "name": "eventBusId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 3, + "name": "deviceId" + }] + }, + "doc": [ + "Do Call. Right after a call client need to start sending CallInProgress", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "destination peer" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": "Initial timeout" + }, { + "type": "reference", + "argument": "isAudioOnlyCall", + "category": "full", + "description": "Is Audio only call. Default is true." + }, { + "type": "reference", + "argument": "isVideoOnlyCall", + "category": "full", + "description": "Is Video Only call. Default is false." + }, { + "type": "reference", + "argument": "isVideoPreferred", + "category": "full", + "description": "Is Video preferred" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "msec" + } + }, + "id": 2, + "name": "timeout" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 3, + "name": "isAudioOnlyCall" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 4, + "name": "isVideoOnlyCall" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 6, + "name": "isVideoPreferred" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UpgradeCall", + "header": 2677, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Method for upgrading a call from private call to group call", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": "Call Id" + }, { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer for upgrading" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 2, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DoCallAgain", + "header": 2678, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Call again to user", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": "Call Id" + }, { + "type": "reference", + "argument": "user", + "category": "full", + "description": "User to call again" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 2, + "name": "user" + }] + } + }, { + "type": "rpc", + "content": { + "name": "JoinCall", + "header": 2683, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Joining Call", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": "Call Id" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RejectCall", + "header": 2684, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Rejecting Call", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": "Call Id" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "OptimizeSDP", + "header": 2685, + "response": { + "type": "anonymous", + "header": 2686, + "doc": [{ + "type": "reference", + "argument": "optimizedSDP", + "category": "hidden", + "description": " Optimized version of SDP" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "optimizedSDP" + }] + }, + "doc": [ + "Optimizing SDP", { + "type": "reference", + "argument": "type", + "category": "full", + "description": "Type of SDP (offer or answer)" + }, { + "type": "reference", + "argument": "sdp", + "category": "full", + "description": "SDP value" + }, { + "type": "reference", + "argument": "ownSettings", + "category": "full", + "description": "Own Settings" + }, { + "type": "reference", + "argument": "theirSettings", + "category": "full", + "description": "Their Settings" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "type" + }, { + "type": "string", + "id": 2, + "name": "sdp" + }, { + "type": { + "type": "struct", + "childType": "PeerSettings" + }, + "id": 3, + "name": "ownSettings" + }, { + "type": { + "type": "struct", + "childType": "PeerSettings" + }, + "id": 4, + "name": "theirSettings" + }] + } + }, { + "type": "struct", + "content": { + "name": "ICEServer", + "doc": [ + "ICE Server description", { + "type": "reference", + "argument": "url", + "category": "full", + "description": " Url to server" + }, { + "type": "reference", + "argument": "username", + "category": "full", + "description": " Optional username" + }, { + "type": "reference", + "argument": "credential", + "category": "danger", + "description": " Optional credential" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "url" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "username" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "credential" + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "WebRTCSignaling", + "attributes": [] + } + }, { + "type": "comment", + "content": "Advertising" + }, { + "type": "struct", + "content": { + "name": "AdvertiseSelf", + "doc": [ + "Advertizing self to a master mode", { + "type": "reference", + "argument": "peerSettings", + "category": "full", + "description": " Optional peer Settings" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 21 + }, + "attributes": [{ + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "PeerSettings" + } + }, + "id": 1, + "name": "peerSettings" + }] + } + }, { + "type": "struct", + "content": { + "name": "AdvertiseMaster", + "doc": [ + "Sent by master" + ], + "trait": { + "name": "WebRTCSignaling", + "key": 26 + }, + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "ICEServer" + } + }, + "id": 1, + "name": "server" + }] + } + }, { + "type": "comment", + "content": "Web RTC signaling" + }, { + "type": "struct", + "content": { + "name": "Candidate", + "doc": [ + "Candidate signal", { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id of candidate" + }, { + "type": "reference", + "argument": "index", + "category": "full", + "description": " Index of candidate" + }, { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Id of candidate" + }, { + "type": "reference", + "argument": "sdp", + "category": "full", + "description": " SDP of candidate" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 3 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "sessionId" + }, { + "type": "int32", + "id": 2, + "name": "index" + }, { + "type": "string", + "id": 3, + "name": "id" + }, { + "type": "string", + "id": 4, + "name": "sdp" + }] + } + }, { + "type": "struct", + "content": { + "name": "Offer", + "doc": [ + "Offer signal", { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id of offer" + }, { + "type": "reference", + "argument": "sdp", + "category": "full", + "description": " Offer SDP" + }, { + "type": "reference", + "argument": "ownPeerSettings", + "category": "full", + "description": " Optional Own Peer settings" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 4 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "sessionId" + }, { + "type": "string", + "id": 2, + "name": "sdp" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "PeerSettings" + } + }, + "id": 3, + "name": "ownPeerSettings" + }] + } + }, { + "type": "struct", + "content": { + "name": "Answer", + "doc": [ + "Answer signal", { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id of answer" + }, { + "type": "reference", + "argument": "sdp", + "category": "full", + "description": " Answer SDP" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 5 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "sessionId" + }, { + "type": "string", + "id": 2, + "name": "sdp" + }] + } + }, { + "type": "struct", + "content": { + "name": "MediaStreamsUpdated", + "doc": [ + "Update about media stream settings updated. Can be sent before offer/answer.", { + "type": "reference", + "argument": "isAudioEnabled", + "category": "full", + "description": " Is Audio Enabled in current connection. True by default." + }, { + "type": "reference", + "argument": "isVideoEnabled", + "category": "full", + "description": " Is Video Enabled in current connection. False by default." + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 28 + }, + "attributes": [{ + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 1, + "name": "isAudioEnabled" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 2, + "name": "isVideoEnabled" + }] + } + }, { + "type": "comment", + "content": "Call Controlling events" + }, { + "type": "struct", + "content": { + "name": "NeedOffer", + "doc": [ + "Notification from master that offer is required", { + "type": "reference", + "argument": "device", + "category": "full", + "description": " Destination Device Id" + }, { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id" + }, { + "type": "reference", + "argument": "peerSettings", + "category": "full", + "description": " Optional peer settings" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 8 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "device" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "sessionId" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "PeerSettings" + } + }, + "id": 3, + "name": "peerSettings" + }] + } + }, { + "type": "struct", + "content": { + "name": "NegotinationSuccessful", + "doc": [ + "Notification about on negotiation is successful", { + "type": "reference", + "argument": "device", + "category": "full", + "description": " Device Id" + }, { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 24 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "device" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "sessionId" + }] + } + }, { + "type": "struct", + "content": { + "name": "EnableConnection", + "doc": [ + "Notification about enabling connection to peer", { + "type": "reference", + "argument": "device", + "category": "full", + "description": " Device Id" + }, { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 22 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "device" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "sessionId" + }] + } + }, { + "type": "struct", + "content": { + "name": "OnRenegotiationNeeded", + "doc": [ + "Need renegotiate session. For example when streams are changed.", { + "type": "reference", + "argument": "device", + "category": "full", + "description": " Device Id" + }, { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 25 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "device" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "sessionId" + }] + } + }, { + "type": "struct", + "content": { + "name": "CloseSession", + "doc": [ + "Close this session and be ready to", { + "type": "reference", + "argument": "device", + "category": "hidden", + "description": " Device Id" + }, { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id for renegotiation" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 6 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "device" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "sessionId" + }] + } + }, { + "type": "struct", + "content": { + "name": "NeedDisconnect", + "doc": [ + "Notification about requirement about required disconnection from peer", { + "type": "reference", + "argument": "device", + "category": "hidden", + "description": " Device Id" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 20 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "device" + }] + } + }, { + "type": "struct", + "content": { + "name": "ActiveCall", + "doc": [ + "Active Calls. Used in broadcasting states of current calls.", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": " Call Id" + }, { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Call's peer" + }, { + "type": "reference", + "argument": "callMembers", + "category": "full", + "description": " Call Members" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 2, + "name": "peer" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "CallMember" + } + }, + "id": 3, + "name": "callMembers" + }] + } + }, { + "type": "enum", + "content": { + "name": "CallMemberState", + "values": [{ + "name": "RINGING", + "id": 1 + }, { + "name": "RINGING_REACHED", + "id": 4 + }, { + "name": "CONNECTING", + "id": 2 + }, { + "name": "CONNECTED", + "id": 3 + }, { + "name": "ENDED", + "id": 5 + }] + } + }, { + "type": "struct", + "content": { + "name": "CallMemberStateHolder", + "doc": [ + "Call Member state holder", { + "type": "reference", + "argument": "state", + "category": "full", + "description": " State Value" + }, { + "type": "reference", + "argument": "fallbackIsRinging", + "category": "full", + "description": " Fallback flag for future compatibility of state" + }, { + "type": "reference", + "argument": "fallbackIsConnected", + "category": "full", + "description": " Fallback flag for future compatibility of state" + }, { + "type": "reference", + "argument": "fallbackIsConnecting", + "category": "full", + "description": " Fallback flag for future compatibility of state" + }, { + "type": "reference", + "argument": "fallbackIsRingingReached", + "category": "full", + "description": " Fallback flag for future compatibility of state" + }, { + "type": "reference", + "argument": "fallbackIsEnded", + "category": "full", + "description": " Fallback flag for future compatibility of state" + } + ], + "attributes": [{ + "type": { + "type": "enum", + "childType": "CallMemberState" + }, + "id": 1, + "name": "state" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 2, + "name": "fallbackIsRinging" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 3, + "name": "fallbackIsConnected" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 4, + "name": "fallbackIsConnecting" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 5, + "name": "fallbackIsRingingReached" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 6, + "name": "fallbackIsEnded" + }] + } + }, { + "type": "struct", + "content": { + "name": "CallMember", + "doc": [ + "Call Member", { + "type": "reference", + "argument": "userId", + "category": "full", + "description": " Member User Id" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " State of member" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "userId" + }, { + "type": { + "type": "struct", + "childType": "CallMemberStateHolder" + }, + "id": 3, + "name": "state" + }] + } + }, { + "type": "struct", + "content": { + "name": "PeerSettings", + "doc": [ + "Peer Settings", { + "type": "reference", + "argument": "is3DESSupported", + "category": "full", + "description": " Marking if 3DES supported. Default is false." + }, { + "type": "reference", + "argument": "isMobile", + "category": "full", + "description": " Is Peer a mobile phone. Default is false." + }, { + "type": "reference", + "argument": "canBeAudioRelay", + "category": "full", + "description": " If peer can audio relay. Default is false." + }, { + "type": "reference", + "argument": "canPreConnect", + "category": "full", + "description": " If peer can preconnect before answer" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 1, + "name": "is3DESSupported" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 2, + "name": "isMobile" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 3, + "name": "canBeAudioRelay" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 4, + "name": "canPreConnect" + }] + } + }] + }, { + "title": "Config sync", + "package": "configs", + "doc": [ + "Parameter Syncronization across devices. Can be used for simple sync", + "across devices without rewriting server side code." + ], + "items": [{ + "type": "struct", + "content": { + "name": "Parameter", + "doc": [ + "Syncing Parameter", { + "type": "reference", + "argument": "key", + "category": "full", + "description": " Key of parameter" + }, { + "type": "reference", + "argument": "value", + "category": "full", + "description": " Value of parameter" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "key" + }, { + "type": "string", + "id": 2, + "name": "value" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetParameters", + "header": 134, + "response": { + "type": "anonymous", + "header": 135, + "doc": [{ + "type": "reference", + "argument": "parameters", + "category": "full", + "description": " Current parameters" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Parameter" + } + }, + "id": 1, + "name": "parameters" + }] + }, + "doc": [ + "Getting Parameters" + ], + "attributes": [] + } + }, { + "type": "rpc", + "content": { + "name": "EditParameter", + "header": 128, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Change parameter value", { + "type": "reference", + "argument": "key", + "category": "full", + "description": "Key of parameter" + }, { + "type": "reference", + "argument": "value", + "category": "full", + "description": "Value of parameter" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "key" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "value" + }] + } + }, { + "type": "update", + "content": { + "name": "ParameterChanged", + "header": 131, + "doc": [ + "Update about parameter change", { + "type": "reference", + "argument": "key", + "category": "full", + "description": " Key of parameter" + }, { + "type": "reference", + "argument": "value", + "category": "full", + "description": " Value of parameter" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "key" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "value" + }] + } + }] + }, { + "title": "Stats", + "package": "stats", + "doc": [ + "Saving statistics information" + ], + "items": [{ + "type": "struct", + "content": { + "name": "EventRecord", + "doc": [ + "Record for stored event" + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "date" + }, + "id": 1, + "name": "date" + }, { + "type": { + "type": "trait", + "childType": "Event" + }, + "id": 2, + "name": "event" + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "Event", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "UntypedEvent", + "doc": [ + "Untyped event", { + "type": "reference", + "argument": "eventType", + "category": "full", + "description": " Event type" + }, { + "type": "reference", + "argument": "params", + "category": "full", + "description": " optional params for event" + } + ], + "trait": { + "name": "Event", + "key": 1 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "eventType" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "RawValue" + } + }, + "id": 2, + "name": "params" + }] + } + }, { + "type": "struct", + "content": { + "name": "ContentViewChanged", + "doc": [ + "Content view event", { + "type": "reference", + "argument": "contentType", + "category": "full", + "description": " unique content id" + }, { + "type": "reference", + "argument": "visible", + "category": "full", + "description": " Is content visible" + }, { + "type": "reference", + "argument": "params", + "category": "full", + "description": " optional params for content view" + } + ], + "trait": { + "name": "Event", + "key": 2 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "contentType" + }, { + "type": "string", + "id": 2, + "name": "contentId" + }, { + "type": "bool", + "id": 3, + "name": "visible" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "RawValue" + } + }, + "id": 4, + "name": "params" + }] + } + }, { + "type": "struct", + "content": { + "name": "AppVisibleChanged", + "doc": [ + "On App Visible event", { + "type": "reference", + "argument": "visible", + "category": "full", + "description": " Is app visible" + } + ], + "trait": { + "name": "Event", + "key": 4 + }, + "expandable": "true", + "attributes": [{ + "type": "bool", + "id": 1, + "name": "visible" + }] + } + }, { + "type": "rpc", + "content": { + "name": "StoreEvents", + "header": 243, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Storing events on server", { + "type": "reference", + "argument": "events", + "category": "full", + "description": "Events for storing" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "trait", + "childType": "Event" + } + }, + "id": 1, + "name": "events" + }] + } + }] + }, { + "title": "Raw API", + "package": "raw", + "doc": [ + "Schema-less API that is useful for external integrations" + ], + "items": [{ + "type": "rpc", + "content": { + "name": "RawRequest", + "header": 2569, + "response": { + "type": "anonymous", + "header": 2570, + "doc": [ + "Response of a raw request", { + "type": "reference", + "argument": "result", + "category": "full", + "description": " Result of request" + } + ], + "attributes": [{ + "type": { + "type": "trait", + "childType": "RawValue" + }, + "id": 1, + "name": "result" + }] + }, + "doc": [ + "Making raw request to external service via shema-less RPC request", { + "type": "reference", + "argument": "service", + "category": "full", + "description": "Service name for RPC request" + }, { + "type": "reference", + "argument": "method", + "category": "full", + "description": "Method for execution" + }, { + "type": "reference", + "argument": "params", + "category": "full", + "description": "Optional params for the method" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "service" + }, { + "type": "string", + "id": 2, + "name": "method" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "RawValue" + } + }, + "id": 3, + "name": "params" + }] + } + }] + }, { + "title": "Wallpappers", + "package": "wallpappers", + "doc": [ + "Wallpappers support" + ], + "items": [{ + "type": "struct", + "content": { + "name": "Wallpapper", + "doc": [ + "Wallpapper structure", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Wallpapper id" + }, { + "type": "reference", + "argument": "w", + "category": "full", + "description": " Image width" + }, { + "type": "reference", + "argument": "h", + "category": "full", + "description": " Image height" + }, { + "type": "reference", + "argument": "fileSize", + "category": "full", + "description": " Image file size" + }, { + "type": "reference", + "argument": "file", + "category": "full", + "description": " Image file reference" + }, { + "type": "reference", + "argument": "thumb", + "category": "full", + "description": " Image thumb" + } + ], + "attributes": [{ + "type": "int32", + "id": 7, + "name": "id" + }, { + "type": "int32", + "id": 1, + "name": "w" + }, { + "type": "int32", + "id": 2, + "name": "h" + }, { + "type": "int32", + "id": 3, + "name": "fileSize" + }, { + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 5, + "name": "file" + }, { + "type": { + "type": "struct", + "childType": "FastThumb" + }, + "id": 6, + "name": "thumb" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadWallpappers", + "header": 241, + "response": { + "type": "anonymous", + "header": 242, + "doc": [ + "Loaded Wallpappers", { + "type": "reference", + "argument": "wallpappers", + "category": "full", + "description": " Available wallpapper list" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Wallpapper" + } + }, + "id": 1, + "name": "wallpappers" + }] + }, + "doc": [ + "Load available wallpappers", { + "type": "reference", + "argument": "maxWidth", + "category": "full", + "description": "Maximum width of wallpapper" + }, { + "type": "reference", + "argument": "maxHeight", + "category": "full", + "description": "Maximum height of wallpapper" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "maxWidth" + }, { + "type": "int32", + "id": 2, + "name": "maxHeight" + }] + } + }] + }, { + "title": "Push", + "package": "push", + "doc": [ + "Vendor's pushes for receiving push notifications.", + "Push notification contains current sequence number of main sequence." + ], + "items": [{ + "type": "rpc", + "content": { + "name": "RegisterGooglePush", + "header": 51, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Registering push token on server", { + "type": "reference", + "argument": "projectId", + "category": "hidden", + "description": "Project Id of token" + }, { + "type": "reference", + "argument": "token", + "category": "danger", + "description": "token value" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "projectId" + }, { + "type": "string", + "id": 2, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnregisterGooglePush", + "header": 2631, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Unregistering Google Push", { + "type": "reference", + "argument": "token", + "category": "danger", + "description": "Token value" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RegisterApplePush", + "header": 76, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Registering apple push on server", { + "type": "reference", + "argument": "apnsKey", + "category": "hidden", + "description": "apns key id" + }, { + "type": "reference", + "argument": "token", + "category": "danger", + "description": "token value" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "apnsKey" + }, { + "type": "string", + "id": 2, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnregisterApplePush", + "header": 2632, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Unregistering Apple Push", { + "type": "reference", + "argument": "token", + "category": "full", + "description": "Token" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RegisterApplePushKit", + "header": 2576, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Registration of a new Apple's PushKit tokens", { + "type": "reference", + "argument": "apnsKey", + "category": "hidden", + "description": "APNS key id" + }, { + "type": "reference", + "argument": "token", + "category": "danger", + "description": "token value" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "apnsKey" + }, { + "type": "string", + "id": 2, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnregisterApplePushKit", + "header": 2633, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Unregistering Apple Push Kit token", { + "type": "reference", + "argument": "token", + "category": "hidden", + "description": "Token Value" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RegisterApplePushToken", + "header": 2593, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Registering Apple Push Token", { + "type": "reference", + "argument": "bundleId", + "category": "full", + "description": "Bundle Id of app" + }, { + "type": "reference", + "argument": "token", + "category": "full", + "description": "Push token" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "bundleId" + }, { + "type": "string", + "id": 2, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnregisterApplePushToken", + "header": 2634, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Unregister Apple Push token", { + "type": "reference", + "argument": "token", + "category": "hidden", + "description": "Token value" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RegisterActorPush", + "header": 2575, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Register Actor Push endpoint", { + "type": "reference", + "argument": "endpoint", + "category": "full", + "description": "Endpoint for push sending" + }, { + "type": "reference", + "argument": "encryptionKeys", + "category": "full", + "description": "Push Encryption keys" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "endpoint" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKey" + } + }, + "id": 2, + "name": "encryptionKeys" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnregisterActorPush", + "header": 2635, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Unregister Actor Push endpoint", { + "type": "reference", + "argument": "endpoint", + "category": "full", + "description": "Endpoint for unregistering" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "endpoint" + }] + } + }] + }, { + "title": "Encryption", + "package": "encryption", + "doc": [ + "Package that include encryption support", + "Key alg types:", + "* curve25519 - https://en.wikipedia.org/wiki/Curve25519", + "* rsa-2048", + "* rsa-4096", + "* aes-128", + "* kuznechik-128", + "", + "Signature alg types:", + "* Ed25519 - used curve25519 conveted to Ed255519 for signing and validataion" + ], + "items": [{ + "type": "comment", + "content": "Public Keys" + }, { + "type": "struct", + "content": { + "name": "EncryptionKeyGroup", + "doc": [ + "Encryption Key Group", { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Key Group Id" + }, { + "type": "reference", + "argument": "identityKey", + "category": "full", + "description": " Key that is used as identity and for validation of Key Group changes" + }, { + "type": "reference", + "argument": "supportedEncryption", + "category": "full", + "description": " Supported encryption methods by this key group" + }, { + "type": "reference", + "argument": "keys", + "category": "compact", + "description": " keys of Key Group" + }, { + "type": "reference", + "argument": "signatures", + "category": "compact", + "description": " Signatures of keys" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 1, + "name": "keyGroupId" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 2, + "name": "supportedEncryption" + }, { + "type": { + "type": "struct", + "childType": "EncryptionKey" + }, + "id": 3, + "name": "identityKey" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKey" + } + }, + "id": 4, + "name": "keys" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKeySignature" + } + }, + "id": 5, + "name": "signatures" + }] + } + }, { + "type": "struct", + "content": { + "name": "EncryptionKeySignature", + "doc": [ + "Signed Key. Usually used for public keys.", { + "type": "reference", + "argument": "keyId", + "category": "full", + "description": " Key Id used for signature" + }, { + "type": "reference", + "argument": "signatureAlg", + "category": "full", + "description": " Signature algorithm" + }, { + "type": "reference", + "argument": "signature", + "category": "full", + "description": " Signature value" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "keyId" + }, { + "type": "string", + "id": 2, + "name": "signatureAlg" + }, { + "type": "bytes", + "id": 3, + "name": "signature" + }] + } + }, { + "type": "struct", + "content": { + "name": "EncryptionKey", + "doc": [ + "Encryption Key", { + "type": "reference", + "argument": "keyId", + "category": "full", + "description": " Key Id" + }, { + "type": "reference", + "argument": "keyAlg", + "category": "full", + "description": " Key Algorithm" + }, { + "type": "reference", + "argument": "keyMaterial", + "category": "compact", + "description": " Public key material. Can be null, but always not null for LoadPublicKey" + }, { + "type": "reference", + "argument": "keyHash", + "category": "hidden", + "description": " If keyMaterial is null, pass keyHash - SHA256 of key" + } + ], + "expandable": "true", + "attributes": [{ + "type": "int64", + "id": 1, + "name": "keyId" + }, { + "type": "string", + "id": 2, + "name": "keyAlg" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 3, + "name": "keyMaterial" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 4, + "name": "keyHash" + }] + } + }, { + "type": "response", + "content": { + "name": "PublicKeys", + "header": 2602, + "doc": [ + "Public Keys response", { + "type": "reference", + "argument": "publicKey", + "category": "full", + "description": " Public keys" + }, { + "type": "reference", + "argument": "signatures", + "category": "full", + "description": " Signatures of public keys" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKey" + } + }, + "id": 1, + "name": "publicKey" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKeySignature" + } + }, + "id": 2, + "name": "signatures" + }] + } + }, { + "type": "response", + "content": { + "name": "PublicKeyGroups", + "header": 2604, + "doc": [ + "Public key groups response" + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKeyGroup" + } + }, + "id": 1, + "name": "publicKeyGroups" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadPublicKeyGroups", + "header": 2601, + "response": { + "type": "reference", + "name": "PublicKeyGroups" + }, + "doc": [ + "Loading Public key groups", { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "userPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadPublicKey", + "header": 2605, + "response": { + "type": "reference", + "name": "PublicKeys" + }, + "doc": [ + "Loading public key explictly", { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + }, { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": "Key group's id" + }, { + "type": "reference", + "argument": "keyIds", + "category": "full", + "description": "Key ids for loading" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "userPeer" + }, { + "type": "int32", + "id": 2, + "name": "keyGroupId" + }, { + "type": { + "type": "list", + "childType": "int64" + }, + "id": 3, + "name": "keyIds" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadPrePublicKeys", + "header": 2603, + "response": { + "type": "reference", + "name": "PublicKeys" + }, + "doc": [ + "Loading SOME of ephermal public keys", { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + }, { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": "User's key group id" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "userPeer" + }, { + "type": "int32", + "id": 2, + "name": "keyGroupId" + }] + } + }, { + "type": "update", + "content": { + "name": "PublicKeyGroupChanged", + "header": 103, + "doc": [ + "Update about public key group changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroup", + "category": "full", + "description": " Updated Key Group" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "struct", + "childType": "EncryptionKeyGroup" + }, + "id": 2, + "name": "keyGroup" + }] + } + }, { + "type": "update", + "content": { + "name": "KeysAdded", + "header": 112, + "doc": [ + "Update about keys added to Key Group", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Key Group Id" + }, { + "type": "reference", + "argument": "keys", + "category": "compact", + "description": " Added keys" + }, { + "type": "reference", + "argument": "signatures", + "category": "compact", + "description": " Signatures of a public key" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 2, + "name": "keyGroupId" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKey" + } + }, + "id": 3, + "name": "keys" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKeySignature" + } + }, + "id": 4, + "name": "signatures" + }] + } + }, { + "type": "update", + "content": { + "name": "KeysRemoved", + "header": 113, + "doc": [ + "Update about keys removed from Key Group", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Key Group Id" + }, { + "type": "reference", + "argument": "keyIds", + "category": "full", + "description": " Removed keys" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 2, + "name": "keyGroupId" + }, { + "type": { + "type": "list", + "childType": "int64" + }, + "id": 3, + "name": "keyIds" + }] + } + }, { + "type": "update", + "content": { + "name": "PublicKeyGroupAdded", + "header": 104, + "doc": [ + "Update about public key group added", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroup", + "category": "full", + "description": " Added Key Group" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "struct", + "childType": "EncryptionKeyGroup" + }, + "id": 2, + "name": "keyGroup" + }] + } + }, { + "type": "update", + "content": { + "name": "PublicKeyGroupRemoved", + "header": 105, + "doc": [ + "Update about public key group removed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Removed Key Group Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 2, + "name": "keyGroupId" + }] + } + }, { + "type": "comment", + "content": "Device Side" + }, { + "type": "rpc", + "content": { + "name": "CreateNewKeyGroup", + "header": 2609, + "response": { + "type": "anonymous", + "header": 2610, + "doc": [{ + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Created Key Group id" + }], + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 1, + "name": "keyGroupId" + }] + }, + "doc": [ + "Creation of a new Key Group", { + "type": "reference", + "argument": "identityKey", + "category": "full", + "description": "Identity Key of a new group" + }, { + "type": "reference", + "argument": "supportedEncryptions", + "category": "full", + "description": "Supported encryption methods" + }, { + "type": "reference", + "argument": "keys", + "category": "full", + "description": "keys of current group" + }, { + "type": "reference", + "argument": "signatures", + "category": "full", + "description": "signatures of keys" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "EncryptionKey" + }, + "id": 1, + "name": "identityKey" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 2, + "name": "supportedEncryptions" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKey" + } + }, + "id": 3, + "name": "keys" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKeySignature" + } + }, + "id": 4, + "name": "signatures" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DeleteKeyGroup", + "header": 2611, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Deletion of a Key Group", { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": "Key Group Id for deletion" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 1, + "name": "keyGroupId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DisconnectKeyGroup", + "header": 2613, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Disconnect Key Group from device", { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": "Key Group Id for disconnection" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 1, + "name": "keyGroupId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ConnectKeyGroup", + "header": 2614, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Connectiong Key Group to device", { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": "Key Group Id for connection" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 1, + "name": "keyGroupId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UploadPreKey", + "header": 2612, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Uploading Ephermal Keys", { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": "Key Group Id" + }, { + "type": "reference", + "argument": "keys", + "category": "compact", + "description": "Encryprion keys" + }, { + "type": "reference", + "argument": "signatures", + "category": "compact", + "description": "Key signatures" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 1, + "name": "keyGroupId" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKey" + } + }, + "id": 2, + "name": "keys" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKeySignature" + } + }, + "id": 3, + "name": "signatures" + }] + } + }, { + "type": "comment", + "content": "Encrypted Packages" + }, { + "type": "struct", + "content": { + "name": "EncryptedBox", + "doc": [ + "Encrypted package that is encrypted for multiple keys", { + "type": "reference", + "argument": "keys", + "category": "full", + "description": " Encrypted encryption keys" + }, { + "type": "reference", + "argument": "algType", + "category": "full", + "description": " Package encryption type" + }, { + "type": "reference", + "argument": "encPackage", + "category": "full", + "description": " Encrypted package" + }, { + "type": "reference", + "argument": "senderKeyGroupId", + "category": "full", + "description": " Sender key group" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 4, + "name": "senderKeyGroupId" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncyptedBoxKey" + } + }, + "id": 1, + "name": "keys" + }, { + "type": "string", + "id": 2, + "name": "algType" + }, { + "type": "bytes", + "id": 3, + "name": "encPackage" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptedBoxSignature" + } + }, + "id": 5, + "name": "signatures" + }] + } + }, { + "type": "struct", + "content": { + "name": "EncryptedBoxSignature", + "doc": [ + "Signature for encrypted package", { + "type": "reference", + "argument": "algType", + "category": "full", + "description": " Alg Type" + }, { + "type": "reference", + "argument": "signature", + "category": "full", + "description": " Signature of encrypted package" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "algType" + }, { + "type": "bytes", + "id": 2, + "name": "signature" + }] + } + }, { + "type": "struct", + "content": { + "name": "EncyptedBoxKey", + "doc": [ + "Encrypted package encryption key", { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Key Group Id" + }, { + "type": "reference", + "argument": "algType", + "category": "full", + "description": " Key encryption algorithm" + }, { + "type": "reference", + "argument": "encryptedKey", + "category": "hidden", + "description": " Encrypted encryption key" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "usersId" + }, { + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 2, + "name": "keyGroupId" + }, { + "type": "string", + "id": 3, + "name": "algType" + }, { + "type": "bytes", + "id": 4, + "name": "encryptedKey" + }] + } + }, { + "type": "struct", + "content": { + "name": "KeyGroupId", + "doc": [ + "References to key groups", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Key Group Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 2, + "name": "keyGroupId" + }] + } + }, { + "type": "struct", + "content": { + "name": "KeyGroupHolder", + "doc": [ + "Key Group Holder", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroup", + "category": "full", + "description": " Key Group" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "struct", + "childType": "EncryptionKeyGroup" + }, + "id": 2, + "name": "keyGroup" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SendEncryptedPackage", + "header": 2657, + "response": { + "type": "anonymous", + "header": 2664, + "doc": [{ + "type": "reference", + "argument": "date", + "category": "full", + "description": " date" + }, { + "type": "reference", + "argument": "obsoleteKeyGroups", + "category": "full", + "description": " obsolete key group ids" + }, { + "type": "reference", + "argument": "missedKeyGroups", + "category": "full", + "description": " missed key groups" + }], + "attributes": [{ + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "date" + } + }, + "id": 1, + "name": "date" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "KeyGroupId" + } + }, + "id": 2, + "name": "obsoleteKeyGroups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "KeyGroupHolder" + } + }, + "id": 3, + "name": "missedKeyGroups" + }] + }, + "doc": [ + "Sending encrypted package", { + "type": "reference", + "argument": "randomId", + "category": "hidden", + "description": "Random id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "randomId" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 2, + "name": "destPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "KeyGroupId" + } + }, + "id": 3, + "name": "ignoredKeyGroups" + }, { + "type": { + "type": "struct", + "childType": "EncryptedBox" + }, + "id": 4, + "name": "encryptedBox" + }] + } + }, { + "type": "update", + "content": { + "name": "EncryptedPackage", + "header": 177, + "doc": [ + "Update about encrypted package", { + "type": "reference", + "argument": "randomId", + "category": "full", + "description": " Random Id of package" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Sending date of package" + }, { + "type": "reference", + "argument": "senderId", + "category": "full", + "description": " Sender id of package" + }, { + "type": "reference", + "argument": "encryptedBox", + "category": "full", + "description": " Encrypted box" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "randomId" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 2, + "name": "date" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 3, + "name": "senderId" + }, { + "type": { + "type": "struct", + "childType": "EncryptedBox" + }, + "id": 4, + "name": "encryptedBox" + }] + } + }] + }, { + "title": "Storage", + "package": "storage", + "items": [{ + "type": "rpc", + "content": { + "name": "UploadSharedBlob", + "header": 2660, + "response": { + "type": "anonymous", + "header": 2661, + "doc": [{ + "type": "reference", + "argument": "sharedObjectId", + "category": "full", + "description": " Id of shared object" + }], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "sharedObjectId" + }] + }, + "doc": [ + "Upload shared blob with user", { + "type": "reference", + "argument": "destPeer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "bucket", + "category": "full", + "description": "Bucked name" + }, { + "type": "reference", + "argument": "blob", + "category": "full", + "description": "Blob data" + }, { + "type": "reference", + "argument": "randomId", + "category": "full", + "description": "Random id for protecting from double upload" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "destPeer" + }, { + "type": "string", + "id": 2, + "name": "bucket" + }, { + "type": "bytes", + "id": 3, + "name": "blob" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "randomId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DownloadSharedBlob", + "header": 2662, + "response": { + "type": "anonymous", + "header": 2663, + "doc": [{ + "type": "reference", + "argument": "blob", + "category": "full", + "description": " Blob contents" + }], + "attributes": [{ + "type": "bytes", + "id": 1, + "name": "blob" + }] + }, + "doc": [ + "Download shared blob", { + "type": "reference", + "argument": "destPeer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "bucket", + "category": "full", + "description": "Bucket name" + }, { + "type": "reference", + "argument": "objectId", + "category": "full", + "description": "Object Id" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "destPeer" + }, { + "type": "string", + "id": 2, + "name": "bucket" + }, { + "type": "int32", + "id": 3, + "name": "objectId" + }] + } + }] + }, { + "title": "Peers", + "package": "peers", + "doc": [ + "Peer is an identificator of specific conversation." + ], + "items": [{ + "type": "enum", + "content": { + "name": "PeerType", + "values": [{ + "name": "Private", + "id": 1 + }, { + "name": "Group", + "id": 2 + }, { + "name": "EncryptedPrivate", + "id": 3 + }] + } + }, { + "type": "struct", + "content": { + "name": "Peer", + "doc": [ + "Peer", { + "type": "reference", + "argument": "type", + "category": "full", + "description": " Peer Type" + }, { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Peer Id" + } + ], + "attributes": [{ + "type": { + "type": "enum", + "childType": "PeerType" + }, + "id": 1, + "name": "type" + }, { + "type": "int32", + "id": 2, + "name": "id" + }] + } + }, { + "type": "struct", + "content": { + "name": "OutPeer", + "doc": [ + "Out peer with access hash", { + "type": "reference", + "argument": "type", + "category": "full", + "description": " Peer Type" + }, { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Peer Id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " Peer access hash" + } + ], + "attributes": [{ + "type": { + "type": "enum", + "childType": "PeerType" + }, + "id": 1, + "name": "type" + }, { + "type": "int32", + "id": 2, + "name": "id" + }, { + "type": "int64", + "id": 3, + "name": "accessHash" + }] + } + }, { + "type": "struct", + "content": { + "name": "UserOutPeer", + "doc": [ + "User's out peer", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " User's access hash" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "struct", + "content": { + "name": "GroupOutPeer", + "doc": [ + "Group's out peer", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group's Id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " Group's access hash" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }] + }, { + "title": "Sequence and Updates", + "package": "sequence", + "doc": [ + "Each device has it's own update sequence. At the begining application request initial sequence state by", + "calling GetState. On each application restart or NewSessionCreated application calls GetDifference for receiving", + "updates in update sequence.", + "GetState and GetDifference automatically subscribes session to receiving updates in session.", + "Each update has seq and state. Seq is sequental index of updated and used for detecting of holes in update sequence", + "(because of server failure or session die) on client side.", + "All updates needed to be processed in partucular order according to seq values.", + "In some updates there can be references to users that are not available at client yer. In this case application need", + "to ignore such update and init getting difference." + ], + "items": [{ + "type": "update_box", + "content": { + "name": "SeqUpdate", + "header": 13, + "doc": [ + "Sequence update", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number of update" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Sequece state of update" + }, { + "type": "reference", + "argument": "updateHeader", + "category": "full", + "description": " header of update" + }, { + "type": "reference", + "argument": "update", + "category": "compact", + "description": " The update" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": "int32", + "id": 3, + "name": "updateHeader" + }, { + "type": "bytes", + "id": 4, + "name": "update" + }] + } + }, { + "type": "update_box", + "content": { + "name": "FatSeqUpdate", + "header": 73, + "doc": [ + "Fat sequence update with additional data", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number of update" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Sequence state of update" + }, { + "type": "reference", + "argument": "updateHeader", + "category": "full", + "description": " header of update" + }, { + "type": "reference", + "argument": "update", + "category": "compact", + "description": " The update" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Users that are referenced in update" + }, { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Groups that are referenced in update" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": "int32", + "id": 3, + "name": "updateHeader" + }, { + "type": "bytes", + "id": 4, + "name": "update" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 5, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 6, + "name": "groups" + }] + } + }, { + "type": "update_box", + "content": { + "name": "WeakUpdate", + "header": 26, + "doc": [ + "Out of sequence update (for typing and online statuses)", { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of update" + }, { + "type": "reference", + "argument": "updateHeader", + "category": "full", + "description": " Header of update" + }, { + "type": "reference", + "argument": "update", + "category": "compact", + "description": " The update" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "date" + }, { + "type": "int32", + "id": 2, + "name": "updateHeader" + }, { + "type": "bytes", + "id": 3, + "name": "update" + }] + } + }, { + "type": "update_box", + "content": { + "name": "WeakFatUpdate", + "header": 2673, + "doc": [ + "Fat Weak Update", { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of update" + }, { + "type": "reference", + "argument": "updateHeader", + "category": "full", + "description": " Header of update" + }, { + "type": "reference", + "argument": "update", + "category": "full", + "description": " The update" + }, { + "type": "reference", + "argument": "users", + "category": "full", + "description": " Users that are referenced in update" + }, { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " Groups that are referenced in update" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "date" + }, { + "type": "int32", + "id": 2, + "name": "updateHeader" + }, { + "type": "bytes", + "id": 3, + "name": "update" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 4, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 5, + "name": "groups" + }] + } + }, { + "type": "update_box", + "content": { + "name": "SeqUpdateTooLong", + "header": 25, + "doc": [ + "Notification about requiring performing manual GetDifference" + ], + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "UpdateContainer", + "doc": [ + "Update container", { + "type": "reference", + "argument": "updateHeader", + "category": "full", + "description": " Header of update" + }, { + "type": "reference", + "argument": "update", + "category": "compact", + "description": " The updatre" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "updateHeader" + }, { + "type": "bytes", + "id": 2, + "name": "update" + }] + } + }, { + "type": "update_box", + "content": { + "name": "CombinedUpdate", + "header": 2625, + "doc": [ + "Combined update", { + "type": "reference", + "argument": "seqStart", + "category": "full", + "description": " Sequence number start" + }, { + "type": "reference", + "argument": "seqEnd", + "category": "full", + "description": " Sequence number end" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " Sequence state" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Update's users" + }, { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Update's groups" + }, { + "type": "reference", + "argument": "updates", + "category": "full", + "description": " Updates (can be empty)" + }, { + "type": "reference", + "argument": "messages", + "category": "full", + "description": " New messages" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seqStart" + }, { + "type": "int32", + "id": 2, + "name": "seqEnd" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 4, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 5, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UpdateContainer" + } + }, + "id": 6, + "name": "updates" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageContainer" + } + }, + "id": 7, + "name": "messages" + }] + } + }, { + "type": "enum", + "content": { + "name": "UpdateOptimization", + "values": [{ + "name": "NONE", + "id": 1 + }, { + "name": "STRIP_ENTITIES", + "id": 2 + }, { + "name": "ENABLE_COMBINED", + "id": 3 + }, { + "name": "FASTER_MESSAGES", + "id": 4 + }, { + "name": "STRIP_COUNTERS", + "id": 5 + }, { + "name": "COMPACT_USERS", + "id": 6 + }, { + "name": "GROUPS_V2", + "id": 7 + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetState", + "header": 9, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Get main sequence state", { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 1, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetDifference", + "header": 11, + "response": { + "type": "anonymous", + "header": 12, + "doc": [{ + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Seq of LAST update in updates" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " State of LAST update in updates" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Users referenced in updates" + }, { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Groups referenced in updates" + }, { + "type": "reference", + "argument": "updates", + "category": "compact", + "description": " Updates" + }, { + "type": "reference", + "argument": "needMore", + "category": "full", + "description": " Need to perform other difference" + }, { + "type": "reference", + "argument": "usersRefs", + "category": "full", + "description": " Direct references of users" + }, { + "type": "reference", + "argument": "groupsRefs", + "category": "full", + "description": " Direct References of groups" + }], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 3, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 6, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UpdateContainer" + } + }, + "id": 4, + "name": "updates" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageContainer" + } + }, + "id": 7, + "name": "messages" + }, { + "type": "bool", + "id": 5, + "name": "needMore" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 8, + "name": "usersRefs" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 9, + "name": "groupsRefs" + }] + }, + "doc": [ + "Getting difference of sequence", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": "Sequence number" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": "Sequence state" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 3, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetReferencedEntitites", + "header": 2628, + "response": { + "type": "anonymous", + "header": 2629, + "doc": [{ + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Loaded users" + }, { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Loaded groups" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 1, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 2, + "name": "groups" + }] + }, + "doc": [ + "Loading referenced entities", { + "type": "reference", + "argument": "users", + "category": "compact", + "description": "Users to load" + }, { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": "Groups to load. Also returns all members of a group." + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 1, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 2, + "name": "groups" + }] + } + }, { + "type": "update", + "content": { + "name": "RawUpdate", + "header": 80, + "doc": [ + "Custom Raw Update", { + "type": "reference", + "argument": "type", + "category": "full", + "description": " Type of content" + }, { + "type": "reference", + "argument": "bytes", + "category": "full", + "description": " Raw data" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "type" + }, { + "type": "bytes", + "id": 2, + "name": "bytes" + }] + } + }, { + "type": "update", + "content": { + "name": "EmptyUpdate", + "header": 85, + "doc": [ + "Empty update" + ], + "attributes": [] + } + }, { + "type": "empty" + }, { + "type": "rpc", + "content": { + "name": "SubscribeToOnline", + "header": 32, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Subscribing for users online", { + "type": "reference", + "argument": "users", + "category": "compact", + "description": "Users for subscription" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 1, + "name": "users" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SubscribeFromOnline", + "header": 33, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Removing subscription for users online", { + "type": "reference", + "argument": "users", + "category": "compact", + "description": "Users of subscriptions" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 1, + "name": "users" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SubscribeToGroupOnline", + "header": 74, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Subscribing for groups online", { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": "Groups for subscription" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 1, + "name": "groups" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SubscribeFromGroupOnline", + "header": 75, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Removing subscription for groups online", { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": "Groups of subscriptions" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 1, + "name": "groups" + }] + } + }] + }, { + "title": "Counters", + "package": "counters", + "doc": [ + "Application Counters, used to display various counters in application" + ], + "items": [{ + "type": "struct", + "content": { + "name": "AppCounters", + "doc": [ + "Application counters", { + "type": "reference", + "argument": "globalCounter", + "category": "full", + "description": " Global unread counter" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 1, + "name": "globalCounter" + }] + } + }, { + "type": "update", + "content": { + "name": "CountersChanged", + "header": 215, + "doc": [ + "Update about counters changed", { + "type": "reference", + "argument": "counters", + "category": "full", + "description": " Current Application counters" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "AppCounters" + }, + "id": 1, + "name": "counters" + }] + } + }] + }, { + "title": "Miscellaneous", + "package": "misc", + "items": [{ + "type": "response", + "content": { + "name": "Void", + "header": 50, + "doc": [ + "Empty response" + ], + "attributes": [] + } + }, { + "type": "response", + "content": { + "name": "Seq", + "header": 72, + "doc": [ + "Sequence response. Methods that return this value must process response in particular order", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number of response" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " Sequence state of response" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }] + } + }, { + "type": "response", + "content": { + "name": "SeqDate", + "header": 102, + "doc": [ + "Sequence response with date. Methods that return this value must process response in particular order", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number of response" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " Sequence state of response" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of response" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }] + } + }, { + "type": "response", + "content": { + "name": "Bool", + "header": 209, + "doc": [ + "Boolean response", { + "type": "reference", + "argument": "value", + "category": "full", + "description": " Response value" + } + ], + "attributes": [{ + "type": "bool", + "id": 1, + "name": "value" + }] + } + }, { + "type": "struct", + "content": { + "name": "Config", + "doc": [ + "Configuration of system", { + "type": "reference", + "argument": "maxGroupSize", + "category": "full", + "description": " Current maximum group size" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "maxGroupSize" + }] + } + }, { + "type": "struct", + "content": { + "name": "Extension", + "doc": [ + "Extention", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Extension id" + }, { + "type": "reference", + "argument": "data", + "category": "full", + "description": " Extension data" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "bytes", + "id": 2, + "name": "data" + }] + } + }, { + "type": "update", + "content": { + "name": "Config", + "header": 42, + "doc": [ + "Update about config change", { + "type": "reference", + "argument": "config", + "category": "full", + "description": " new config" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Config" + }, + "id": 1, + "name": "config" + }] + } + }] + }, { + "title": "Device Info", + "package": "device", + "doc": [ + "Submiting various information about device for providing better experience.", + "For example, getting timezone or preffered languages" + ], + "items": [{ + "type": "rpc", + "content": { + "name": "NotifyAboutDeviceInfo", + "header": 229, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Notifying about device information", { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preferred languages" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": "Device Time Zone" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": "string" + }, + "id": 1, + "name": "preferredLanguages" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "timeZone" + }] + } + }] + }, { + "title": "Webactions", + "package": "webactions", + "doc": [ + "Web actions allow clients to visit some predefined web pages,", + "perform actions, and pass result on action completion" + ], + "items": [{ + "type": "rpc", + "content": { + "name": "InitWebaction", + "header": 116, + "response": { + "type": "anonymous", + "header": 117, + "doc": [{ + "type": "reference", + "argument": "uri", + "category": "full", + "description": " Web action uri" + }, { + "type": "reference", + "argument": "regexp", + "category": "full", + "description": " Regular expression. Required to match completion of web action" + }, { + "type": "reference", + "argument": "actionHash", + "category": "danger", + "description": " Identifier of current web action. Required to complete it" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "uri" + }, { + "type": "string", + "id": 2, + "name": "regexp" + }, { + "type": "string", + "id": 3, + "name": "actionHash" + }] + }, + "doc": [ + "Initialize start of web action", { + "type": "reference", + "argument": "actionName", + "category": "full", + "description": "Name of web action" + }, { + "type": "reference", + "argument": "params", + "category": "full", + "description": "Additional params required to make action's uri" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "actionName" + }, { + "type": { + "type": "struct", + "childType": "MapValue" + }, + "id": 2, + "name": "params" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CompleteWebaction", + "header": 123, + "response": { + "type": "anonymous", + "header": 124, + "doc": [{ + "type": "reference", + "argument": "result", + "category": "full", + "description": " Reslut of web action completion" + }], + "attributes": [{ + "type": { + "type": "struct", + "childType": "MapValue" + }, + "id": 1, + "name": "result" + }] + }, + "doc": [ + "Complete started web action", { + "type": "reference", + "argument": "actionHash", + "category": "danger", + "description": "Identifier of given web action" + }, { + "type": "reference", + "argument": "completeUri", + "category": "full", + "description": "Final uri of web action" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "actionHash" + }, { + "type": "string", + "id": 2, + "name": "completeUri" + }] + } + }] + }, { + "title": "Collections", + "package": "collections", + "doc": [ + "Flexible raw collections without structure" + ], + "items": [{ + "type": "trait", + "content": { + "isContainer": "true", + "name": "RawValue", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "StringValue", + "doc": [ + "Text value" + ], + "trait": { + "name": "RawValue", + "key": 1 + }, + "attributes": [{ + "type": "string", + "id": 1, + "name": "text" + }] + } + }, { + "type": "struct", + "content": { + "name": "Int32Value", + "doc": [ + "Int32 value" + ], + "trait": { + "name": "RawValue", + "key": 2 + }, + "attributes": [{ + "type": "int32", + "id": 1, + "name": "value" + }] + } + }, { + "type": "struct", + "content": { + "name": "Int64Value", + "doc": [ + "Int64 value" + ], + "trait": { + "name": "RawValue", + "key": 3 + }, + "attributes": [{ + "type": "int64", + "id": 1, + "name": "value" + }] + } + }, { + "type": "struct", + "content": { + "name": "DoubleValue", + "doc": [ + "Double value" + ], + "trait": { + "name": "RawValue", + "key": 4 + }, + "attributes": [{ + "type": "double", + "id": 1, + "name": "value" + }] + } + }, { + "type": "struct", + "content": { + "name": "ArrayValue", + "doc": [ + "Array value" + ], + "trait": { + "name": "RawValue", + "key": 5 + }, + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "trait", + "childType": "RawValue" + } + }, + "id": 1, + "name": "array" + }] + } + }, { + "type": "struct", + "content": { + "name": "MapValueItem", + "doc": [ + "Item of Map" + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "key" + }, { + "type": { + "type": "trait", + "childType": "RawValue" + }, + "id": 2, + "name": "value" + }] + } + }, { + "type": "struct", + "content": { + "name": "MapValue", + "doc": [ + "Map Value" + ], + "trait": { + "name": "RawValue", + "key": 6 + }, + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MapValueItem" + } + }, + "id": 1, + "name": "items" + }] + } + }] + }, { + "title": "Surveys", + "package": "surveys", + "doc": [ + "Surveys implementation for messages" + ], + "items": [{ + "type": "struct", + "content": { + "name": "Survey", + "doc": [ + "Main Survey Struct" + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "id" + }, { + "type": "string", + "id": 2, + "name": "titulo" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "uf" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "creationTime" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 5, + "name": "endTime" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 6, + "name": "ownerId" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 7, + "name": "answers" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CreateSurvey", + "header": 139, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Criar uma nova enquete" + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Survey" + }, + "id": 1, + "name": "survey" + }] + } + }] + }] +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index f6b4815a7d..601b24f1c3 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -85,8 +85,8 @@ public void onConfigureActorSDK() { "canalxloto" }); - ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.3:9070"}); - // ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); + ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); +// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); ActorSDK.sharedActor().setAuthType(AuthActivity.AUTH_TYPE_PHONE); // ActorSDK.sharedActor().setTwitter(""); diff --git a/actor-sdk/sdk-core/core/core-android/src/main/java/im/actor/core/AndroidMessenger.java b/actor-sdk/sdk-core/core/core-android/src/main/java/im/actor/core/AndroidMessenger.java index 91b4c1bdd4..db9a1d1bfe 100644 --- a/actor-sdk/sdk-core/core/core-android/src/main/java/im/actor/core/AndroidMessenger.java +++ b/actor-sdk/sdk-core/core/core-android/src/main/java/im/actor/core/AndroidMessenger.java @@ -41,6 +41,7 @@ import im.actor.core.viewmodel.AppStateVM; import im.actor.core.viewmodel.Command; import im.actor.core.viewmodel.GalleryVM; +import im.actor.runtime.Log; import im.actor.runtime.Runtime; import im.actor.runtime.actors.Actor; import im.actor.runtime.actors.ActorCreator; @@ -483,7 +484,9 @@ public void onScrolledToEnd() { @Override public void onItemTouched(Dialog item) { - + Log.d(AndroidMessenger.class.getName(), "Title"+item.getDialogTitle()); + Log.d(AndroidMessenger.class.getName(), "IsBot"+item.isBot()); + Log.d(AndroidMessenger.class.getName(), "IsChannel"+item.isChannel()); } }); } @@ -560,7 +563,5 @@ public void startImport() { @Override public void onLoggedIn() { super.onLoggedIn(); - - get } } \ No newline at end of file diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index 49d5695dab..c9ce0603d7 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -2,4268 +2,18619 @@ "version": "1.6", "scala-package": "im.actor.api.rpc", "java-package": "im.actor.core.api", - "aliases": [ - { - "type": "bytes", - "alias": "seq_state" - }, - { - "type": "int64", - "alias": "date" - }, - { - "type": "int64", - "alias": "randomId" - }, - { - "type": "int64", - "alias": "msec" - }, - { - "type": "int32", - "alias": "sec" - }, - { - "type": "int32", - "alias": "userId" - }, - { - "type": "int32", - "alias": "groupId" - }, - { - "type": "int32", - "alias": "keyId" - }, - { - "type": "int32", - "alias": "keyGroupId" - }, - { - "type": "string", - "alias": "busId" - } - ], - "sections": [ - { - "title": "Authentication", - "package": "auth", - "doc": [ - "

Actor now support only one way for authentication - by SMS or phone call.

", - "

Authorization steps:", - "

    ", - "
  1. Request SMS Code by calling RequestAuthCode
  2. ", - "
  3. If SMS arrives than send Authorization code in SignIn/SignUp
  4. ", - "
  5. If sms doesn't arrive for a long time - request phone activation by", - "calling AuthCodeCall
  6. ", - "
", - "

", - "Some rules
", - "If RequestAuthCode return isRegistered = false than use SignUp method else SignIn.
", - "If on any step API return PHONE_CODE_EXPIRED than application MUST start", - "authorization process from begining.
" - ], - "items": [ - { - "type": "enum", - "content": { - "name": "PhoneActivationType", - "values": [ - { - "name": "CODE", - "id": 1 - }, - { - "name": "PASSWORD", - "id": 2 + "aliases": [{ + "type": "bytes", + "alias": "seq_state" + }, { + "type": "int64", + "alias": "date" + }, { + "type": "int64", + "alias": "randomId" + }, { + "type": "int64", + "alias": "msec" + }, { + "type": "int32", + "alias": "sec" + }, { + "type": "int32", + "alias": "userId" + }, { + "type": "int32", + "alias": "groupId" + }, { + "type": "int32", + "alias": "keyId" + }, { + "type": "int32", + "alias": "keyGroupId" + }, { + "type": "string", + "alias": "busId" + }], + "sections": [{ + "title": "Authentication", + "package": "auth", + "doc": [ + "

Actor now support only one way for authentication - by SMS or phone call.

", + "

Authorization steps:", + "

    ", + "
  1. Request SMS Code by calling RequestAuthCode
  2. ", + "
  3. If SMS arrives than send Authorization code in SignIn/SignUp
  4. ", + "
  5. If sms doesn't arrive for a long time - request phone activation by", + "calling AuthCodeCall
  6. ", + "
", + "

", + "Some rules
", + "If RequestAuthCode return isRegistered = false than use SignUp method else SignIn.
", + "If on any step API return PHONE_CODE_EXPIRED than application MUST start", + "authorization process from begining.
" + ], + "items": [{ + "type": "enum", + "content": { + "name": "PhoneActivationType", + "values": [{ + "name": "CODE", + "id": 1 + }, { + "name": "PASSWORD", + "id": 2 + }] + } + }, { + "type": "enum", + "content": { + "name": "EmailActivationType", + "values": [{ + "name": "CODE", + "id": 1 + }, { + "name": "OAUTH2", + "id": 2 + }, { + "name": "PASSWORD", + "id": 3 + }] + } + }, { + "type": "rpc", + "content": { + "name": "StartPhoneAuth", + "header": 191, + "response": { + "type": "anonymous", + "header": 193, + "doc": [ + "Phone Activation response", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": " Hash of transaction" + }, { + "type": "reference", + "argument": "isRegistered", + "category": "full", + "description": " Is User registered" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "bool", + "id": 2, + "name": "isRegistered" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "PhoneActivationType" } - ] - } - }, { - "type": "enum", - "content": { - "name": "EmailActivationType", - "values": [ - { - "name": "CODE", - "id": 1 - }, - { - "name": "OAUTH2", - "id": 2 - }, - { - "name": "PASSWORD", - "id": 3 + }, + "id": 3, + "name": "activationType" + }] + }, + "doc": [ + "Start Phone Activation", { + "type": "reference", + "argument": "phoneNumber", + "category": "full", + "description": "Phone number" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Appication Id" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device Title" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": "TimeZone of device" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preferred languages of device" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "phoneNumber" + }, { + "type": "int32", + "id": 2, + "name": "appId" + }, { + "type": "string", + "id": 3, + "name": "apiKey" + }, { + "type": "bytes", + "id": 4, + "name": "deviceHash" + }, { + "type": "string", + "id": 5, + "name": "deviceTitle" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 6, + "name": "timeZone" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 7, + "name": "preferredLanguages" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SendCodeByPhoneCall", + "header": 197, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Dial phone and dictate auth code", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": "Transaction hash" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }] + } + }, { + "type": "rpc", + "content": { + "name": "StartEmailAuth", + "header": 185, + "response": { + "type": "anonymous", + "header": 186, + "doc": [ + "Email Activation response", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": " Hash of activation transaction" + }, { + "type": "reference", + "argument": "isRegistered", + "category": "full", + "description": " true if user is registered" + }, { + "type": "reference", + "argument": "activationType", + "category": "full", + "description": " Email Activation type" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "bool", + "id": 2, + "name": "isRegistered" + }, { + "type": { + "type": "enum", + "childType": "EmailActivationType" + }, + "id": 3, + "name": "activationType" + }] + }, + "doc": [ + "Start EMail Activation", { + "type": "reference", + "argument": "email", + "category": "full", + "description": "Email" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application Id" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device Title" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": "TimeZone of device" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preferred languages" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "email" + }, { + "type": "int32", + "id": 2, + "name": "appId" + }, { + "type": "string", + "id": 3, + "name": "apiKey" + }, { + "type": "bytes", + "id": 4, + "name": "deviceHash" + }, { + "type": "string", + "id": 5, + "name": "deviceTitle" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 6, + "name": "timeZone" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 7, + "name": "preferredLanguages" + }] + } + }, { + "type": "rpc", + "content": { + "name": "StartAnonymousAuth", + "header": 198, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Starting Anonymous login", { + "type": "reference", + "argument": "name", + "category": "full", + "description": "Name of new user" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application Id" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device Title" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": "TimeZone of device" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preferred languages" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "name" + }, { + "type": "int32", + "id": 2, + "name": "appId" + }, { + "type": "string", + "id": 3, + "name": "apiKey" + }, { + "type": "bytes", + "id": 4, + "name": "deviceHash" + }, { + "type": "string", + "id": 5, + "name": "deviceTitle" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 6, + "name": "timeZone" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 7, + "name": "preferredLanguages" + }] + } + }, { + "type": "rpc", + "content": { + "name": "StartTokenAuth", + "header": 203, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Starting token-based login", { + "type": "reference", + "argument": "token", + "category": "full", + "description": "Token for authentication" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application Id" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device Title" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": "TimeZone of device" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preferred languages" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }, { + "type": "int32", + "id": 2, + "name": "appId" + }, { + "type": "string", + "id": 3, + "name": "apiKey" + }, { + "type": "bytes", + "id": 4, + "name": "deviceHash" + }, { + "type": "string", + "id": 5, + "name": "deviceTitle" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 6, + "name": "timeZone" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 7, + "name": "preferredLanguages" + }] + } + }, { + "type": "rpc", + "content": { + "name": "StartUsernameAuth", + "header": 2571, + "response": { + "type": "anonymous", + "header": 2572, + "doc": [ + "Result of login auth start. If is not registered move to signup.", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": " Authentication transaction hash" + }, { + "type": "reference", + "argument": "isRegistered", + "category": "full", + "description": " If user is registered with this username" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "bool", + "id": 2, + "name": "isRegistered" + }] + }, + "doc": [ + "Starting Login Authentication", { + "type": "reference", + "argument": "username", + "category": "full", + "description": "Username for signing in" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application id" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device Title" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": "Time Zone of device" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preferred languages of device" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "username" + }, { + "type": "int32", + "id": 2, + "name": "appId" + }, { + "type": "string", + "id": 3, + "name": "apiKey" + }, { + "type": "bytes", + "id": 4, + "name": "deviceHash" + }, { + "type": "string", + "id": 5, + "name": "deviceTitle" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 6, + "name": "timeZone" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 7, + "name": "preferredLanguages" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ValidateCode", + "header": 189, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Performing user sign in.", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": "Hash of transaction" + }, { + "type": "reference", + "argument": "code", + "category": "hidden", + "description": "Activation code" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "string", + "id": 2, + "name": "code" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ValidatePassword", + "header": 207, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Validation of account password", { + "type": "reference", + "argument": "transactionHash", + "category": "full", + "description": "Hash of transaction" + }, { + "type": "reference", + "argument": "password", + "category": "full", + "description": "Password for account" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "string", + "id": 2, + "name": "password" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetOAuth2Params", + "header": 194, + "response": { + "type": "anonymous", + "header": 195, + "doc": [{ + "type": "reference", + "argument": "authUrl", + "category": "hidden", + "description": " Authentication url" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "authUrl" + }] + }, + "doc": [ + "Loading OAuth2 Parameters", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": "Hash of transaction" + }, { + "type": "reference", + "argument": "redirectUrl", + "category": "full", + "description": "Redirect URL for Application" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "string", + "id": 2, + "name": "redirectUrl" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CompleteOAuth2", + "header": 196, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Complete OAuth2 Authentication", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": "Hash of transaction" + }, { + "type": "reference", + "argument": "code", + "category": "danger", + "description": "Authentication Code" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "string", + "id": 2, + "name": "code" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SignUp", + "header": 190, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Perform user SignUp", { + "type": "reference", + "argument": "transactionHash", + "category": "danger", + "description": "Hash of transaction" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": "User name" + }, { + "type": "reference", + "argument": "sex", + "category": "full", + "description": "Optional user sex" + }, { + "type": "reference", + "argument": "password", + "category": "full", + "description": "Password for password-based accounts" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "transactionHash" + }, { + "type": "string", + "id": 2, + "name": "name" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "Sex" + } + }, + "id": 3, + "name": "sex" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "password" + }] + } + }, { + "type": "response", + "content": { + "name": "Auth", + "header": 5, + "doc": [ + "Authentication result", { + "type": "reference", + "argument": "user", + "category": "compact", + "description": " The authenticated User" + }, { + "type": "reference", + "argument": "config", + "category": "full", + "description": " Current config of server" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "User" + }, + "id": 2, + "name": "user" + }, { + "type": { + "type": "struct", + "childType": "Config" + }, + "id": 3, + "name": "config" + }] + } + }, { + "type": "struct", + "content": { + "name": "AuthSession", + "doc": [ + "Authentication session", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Unuque ID of session" + }, { + "type": "reference", + "argument": "authHolder", + "category": "full", + "description": " holder of session. 0 - this device, 1 - other." + }, { + "type": "reference", + "argument": "appId", + "category": "full", + "description": " Application Id (user in SignIn/SignUp)" + }, { + "type": "reference", + "argument": "appTitle", + "category": "full", + "description": " Title of application" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": " Title of device" + }, { + "type": "reference", + "argument": "authTime", + "category": "full", + "description": " Time of session creating" + }, { + "type": "reference", + "argument": "authLocation", + "category": "hidden", + "description": " two-letter country code of session create" + }, { + "type": "reference", + "argument": "latitude", + "category": "hidden", + "description": " optional latitude of auth if available" + }, { + "type": "reference", + "argument": "longitude", + "category": "hidden", + "description": " optional longitude of auth if available" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": { + "type": "enum", + "childType": "AuthHolder" + }, + "id": 2, + "name": "authHolder" + }, { + "type": "int32", + "id": 3, + "name": "appId" + }, { + "type": "string", + "id": 4, + "name": "appTitle" + }, { + "type": "string", + "id": 5, + "name": "deviceTitle" + }, { + "type": "int32", + "id": 6, + "name": "authTime" + }, { + "type": "string", + "id": 7, + "name": "authLocation" + }, { + "type": { + "type": "opt", + "childType": "double" + }, + "id": 8, + "name": "latitude" + }, { + "type": { + "type": "opt", + "childType": "double" + }, + "id": 9, + "name": "longitude" + }] + } + }, { + "type": "enum", + "content": { + "name": "AuthHolder", + "values": [{ + "name": "ThisDevice", + "id": 1 + }, { + "name": "OtherDevice", + "id": 2 + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetAuthSessions", + "header": 80, + "response": { + "type": "anonymous", + "header": 81, + "doc": [ + "Current Auth sessions", { + "type": "reference", + "argument": "userAuths", + "category": "compact", + "description": " User authentications" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "AuthSession" } - ] - } - },{"type":"rpc","content":{ -"name":"StartPhoneAuth", -"header":191, -"response":{"type":"anonymous","header":193, "doc":[ -"Phone Activation response",{"type":"reference","argument":"transactionHash","category":"danger","description":" Hash of transaction"},{"type":"reference","argument":"isRegistered","category":"full","description":" Is User registered"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} -,{"type":"bool","id":2,"name":"isRegistered"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"PhoneActivationType"}},"id":3,"name":"activationType"} -]}, -"doc":[ -"Start Phone Activation",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number"},{"type":"reference","argument":"appId","category":"hidden","description":"Appication Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages of device"}],"attributes":[ -{"type":"int64","id":1,"name":"phoneNumber"} -,{"type":"int32","id":2,"name":"appId"} -,{"type":"string","id":3,"name":"apiKey"} -,{"type":"bytes","id":4,"name":"deviceHash"} -,{"type":"string","id":5,"name":"deviceTitle"} -,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} -,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} -]}},{"type":"rpc","content":{ -"name":"SendCodeByPhoneCall", -"header":197, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Dial phone and dictate auth code",{"type":"reference","argument":"transactionHash","category":"danger","description":"Transaction hash"}],"attributes":[ -{"type":"string","id":1,"name":"transactionHash"} -]}},{"type":"rpc","content":{ -"name":"StartEmailAuth", -"header":185, -"response":{"type":"anonymous","header":186, "doc":[ -"Email Activation response",{"type":"reference","argument":"transactionHash","category":"danger","description":" Hash of activation transaction"},{"type":"reference","argument":"isRegistered","category":"full","description":" true if user is registered"},{"type":"reference","argument":"activationType","category":"full","description":" Email Activation type"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} -,{"type":"bool","id":2,"name":"isRegistered"} -,{"type":{"type":"enum","childType":"EmailActivationType"},"id":3,"name":"activationType"} -]}, -"doc":[ -"Start EMail Activation",{"type":"reference","argument":"email","category":"full","description":"Email"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ -{"type":"string","id":1,"name":"email"} -,{"type":"int32","id":2,"name":"appId"} -,{"type":"string","id":3,"name":"apiKey"} -,{"type":"bytes","id":4,"name":"deviceHash"} -,{"type":"string","id":5,"name":"deviceTitle"} -,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} -,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} -]}},{"type":"rpc","content":{ -"name":"StartAnonymousAuth", -"header":198, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Starting Anonymous login",{"type":"reference","argument":"name","category":"full","description":"Name of new user"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ -{"type":"string","id":1,"name":"name"} -,{"type":"int32","id":2,"name":"appId"} -,{"type":"string","id":3,"name":"apiKey"} -,{"type":"bytes","id":4,"name":"deviceHash"} -,{"type":"string","id":5,"name":"deviceTitle"} -,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} -,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} -]}},{"type":"rpc","content":{ -"name":"StartTokenAuth", -"header":203, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Starting token-based login",{"type":"reference","argument":"token","category":"full","description":"Token for authentication"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -,{"type":"int32","id":2,"name":"appId"} -,{"type":"string","id":3,"name":"apiKey"} -,{"type":"bytes","id":4,"name":"deviceHash"} -,{"type":"string","id":5,"name":"deviceTitle"} -,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} -,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} -]}},{"type":"rpc","content":{ -"name":"StartUsernameAuth", -"header":2571, -"response":{"type":"anonymous","header":2572, "doc":[ -"Result of login auth start. If is not registered move to signup.",{"type":"reference","argument":"transactionHash","category":"danger","description":" Authentication transaction hash"},{"type":"reference","argument":"isRegistered","category":"full","description":" If user is registered with this username"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} -,{"type":"bool","id":2,"name":"isRegistered"} -]}, -"doc":[ -"Starting Login Authentication",{"type":"reference","argument":"username","category":"full","description":"Username for signing in"},{"type":"reference","argument":"appId","category":"hidden","description":"Application id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"Time Zone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages of device"}],"attributes":[ -{"type":"string","id":1,"name":"username"} -,{"type":"int32","id":2,"name":"appId"} -,{"type":"string","id":3,"name":"apiKey"} -,{"type":"bytes","id":4,"name":"deviceHash"} -,{"type":"string","id":5,"name":"deviceTitle"} -,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} -,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} -]}},{"type":"rpc","content":{ -"name":"ValidateCode", -"header":189, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Performing user sign in.",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"code","category":"hidden","description":"Activation code"}],"attributes":[ -{"type":"string","id":1,"name":"transactionHash"} -,{"type":"string","id":2,"name":"code"} -]}},{"type":"rpc","content":{ -"name":"ValidatePassword", -"header":207, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Validation of account password",{"type":"reference","argument":"transactionHash","category":"full","description":"Hash of transaction"},{"type":"reference","argument":"password","category":"full","description":"Password for account"}],"attributes":[ -{"type":"string","id":1,"name":"transactionHash"} -,{"type":"string","id":2,"name":"password"} -]}},{"type":"rpc","content":{ -"name":"GetOAuth2Params", -"header":194, -"response":{"type":"anonymous","header":195, "doc":[ -{"type":"reference","argument":"authUrl","category":"hidden","description":" Authentication url"}] ,"attributes":[{"type":"string","id":1,"name":"authUrl"} -]}, -"doc":[ -"Loading OAuth2 Parameters",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"redirectUrl","category":"full","description":"Redirect URL for Application"}],"attributes":[ -{"type":"string","id":1,"name":"transactionHash"} -,{"type":"string","id":2,"name":"redirectUrl"} -]}},{"type":"rpc","content":{ -"name":"CompleteOAuth2", -"header":196, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Complete OAuth2 Authentication",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"code","category":"danger","description":"Authentication Code"}],"attributes":[ -{"type":"string","id":1,"name":"transactionHash"} -,{"type":"string","id":2,"name":"code"} -]}},{"type":"rpc","content":{ -"name":"SignUp", -"header":190, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Perform user SignUp",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"name","category":"full","description":"User name"},{"type":"reference","argument":"sex","category":"full","description":"Optional user sex"},{"type":"reference","argument":"password","category":"full","description":"Password for password-based accounts"}],"attributes":[ -{"type":"string","id":1,"name":"transactionHash"} -,{"type":"string","id":2,"name":"name"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"Sex"}},"id":3,"name":"sex"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"password"} -]}},{"type":"response","content":{ -"name":"Auth", -"header":5, -"doc":[ -"Authentication result",{"type":"reference","argument":"user","category":"compact","description":" The authenticated User"},{"type":"reference","argument":"config","category":"full","description":" Current config of server"}],"attributes":[ -{"type":{"type":"struct","childType":"User"},"id":2,"name":"user"} -,{"type":{"type":"struct","childType":"Config"},"id":3,"name":"config"} -]}}, { - "type":"struct", - "content": { - "name":"AuthSession", -"doc":[ -"Authentication session",{"type":"reference","argument":"id","category":"full","description":" Unuque ID of session"},{"type":"reference","argument":"authHolder","category":"full","description":" holder of session. 0 - this device, 1 - other."},{"type":"reference","argument":"appId","category":"full","description":" Application Id (user in SignIn/SignUp)"},{"type":"reference","argument":"appTitle","category":"full","description":" Title of application"},{"type":"reference","argument":"deviceTitle","category":"full","description":" Title of device"},{"type":"reference","argument":"authTime","category":"full","description":" Time of session creating"},{"type":"reference","argument":"authLocation","category":"hidden","description":" two-letter country code of session create"},{"type":"reference","argument":"latitude","category":"hidden","description":" optional latitude of auth if available"},{"type":"reference","argument":"longitude","category":"hidden","description":" optional longitude of auth if available"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":{"type":"enum","childType":"AuthHolder"},"id":2,"name":"authHolder"} -,{"type":"int32","id":3,"name":"appId"} -,{"type":"string","id":4,"name":"appTitle"} -,{"type":"string","id":5,"name":"deviceTitle"} -,{"type":"int32","id":6,"name":"authTime"} -,{"type":"string","id":7,"name":"authLocation"} -,{"type":{"type":"opt","childType":"double"},"id":8,"name":"latitude"} -,{"type":{"type":"opt","childType":"double"},"id":9,"name":"longitude"} -]}}, { - "type": "enum", - "content": { - "name": "AuthHolder", - "values": [ - { - "name": "ThisDevice", - "id": 1 - }, - { - "name": "OtherDevice", - "id": 2 + }, + "id": 1, + "name": "userAuths" + }] + }, + "doc": [ + "Getting of all active user's authentication sessions" + ], + "attributes": [] + } + }, { + "type": "rpc", + "content": { + "name": "TerminateSession", + "header": 82, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "SignOut on specified user's session", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "id from AuthItem" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }] + } + }, { + "type": "rpc", + "content": { + "name": "TerminateAllSessions", + "header": 83, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "SignOut on all exept current sessions" + ], + "attributes": [] + } + }, { + "type": "rpc", + "content": { + "name": "SignOut", + "header": 84, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "SignOut current session" + ], + "attributes": [] + } + }, { + "type": "comment", + "content": "OBSOLETE METHODS" + }, { + "type": "rpc", + "content": { + "name": "SignInObsolete", + "header": 3, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Performing user signin", { + "type": "reference", + "argument": "phoneNumber", + "category": "danger", + "description": "Phone number in international format" + }, { + "type": "reference", + "argument": "smsHash", + "category": "danger", + "description": "Code request hash from RequestAuthCode" + }, { + "type": "reference", + "argument": "smsCode", + "category": "danger", + "description": "Confirmation code from SMS" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device title like 'Steven's iPhone'" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application ID" + }, { + "type": "reference", + "argument": "appKey", + "category": "hidden", + "description": "Application API key" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "phoneNumber" + }, { + "type": "string", + "id": 2, + "name": "smsHash" + }, { + "type": "string", + "id": 3, + "name": "smsCode" + }, { + "type": "bytes", + "id": 5, + "name": "deviceHash" + }, { + "type": "string", + "id": 6, + "name": "deviceTitle" + }, { + "type": "int32", + "id": 7, + "name": "appId" + }, { + "type": "string", + "id": 8, + "name": "appKey" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SignUpObsolete", + "header": 4, + "response": { + "type": "reference", + "name": "Auth" + }, + "doc": [ + "Performing user signup. If user perform signup on already registered user it just override previous", "profile information", { + "type": "reference", + "argument": "phoneNumber", + "category": "danger", + "description": "Phone number in international format" + }, { + "type": "reference", + "argument": "smsHash", + "category": "danger", + "description": "Code request hash from RequestAuthCode" + }, { + "type": "reference", + "argument": "smsCode", + "category": "danger", + "description": "Confirmation code from SMS" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": "User name" + }, { + "type": "reference", + "argument": "deviceHash", + "category": "full", + "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" + }, { + "type": "reference", + "argument": "deviceTitle", + "category": "full", + "description": "Device title like 'Steven's iPhone'" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application ID" + }, { + "type": "reference", + "argument": "appKey", + "category": "hidden", + "description": "pplication API key" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "phoneNumber" + }, { + "type": "string", + "id": 2, + "name": "smsHash" + }, { + "type": "string", + "id": 3, + "name": "smsCode" + }, { + "type": "string", + "id": 4, + "name": "name" + }, { + "type": "bytes", + "id": 7, + "name": "deviceHash" + }, { + "type": "string", + "id": 8, + "name": "deviceTitle" + }, { + "type": "int32", + "id": 9, + "name": "appId" + }, { + "type": "string", + "id": 10, + "name": "appKey" + }, { + "type": "bool", + "id": 11, + "name": "isSilent" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SendAuthCodeObsolete", + "header": 1, + "response": { + "type": "anonymous", + "header": 2, + "doc": [ + "Sms Request response", { + "type": "reference", + "argument": "smsHash", + "category": "danger", + "description": " Hash of SMS request" + }, { + "type": "reference", + "argument": "isRegistered", + "category": "full", + "description": " true if user is registered" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "smsHash" + }, { + "type": "bool", + "id": 2, + "name": "isRegistered" + }] + }, + "doc": [ + "Sending SMS with activation code", { + "type": "reference", + "argument": "phoneNumber", + "category": "full", + "description": "Phone number in international format" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application ID" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "phoneNumber" + }, { + "type": "int32", + "id": 2, + "name": "appId" + }, { + "type": "string", + "id": 3, + "name": "apiKey" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SendAuthCallObsolete", + "header": 90, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Requesting Phone activation", { + "type": "reference", + "argument": "phoneNumber", + "category": "full", + "description": "Phone number in international format" + }, { + "type": "reference", + "argument": "smsHash", + "category": "danger", + "description": "Code request hash from RequestAuthCode" + }, { + "type": "reference", + "argument": "appId", + "category": "hidden", + "description": "Application ID" + }, { + "type": "reference", + "argument": "apiKey", + "category": "hidden", + "description": "Application API key" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "phoneNumber" + }, { + "type": "string", + "id": 2, + "name": "smsHash" + }, { + "type": "int32", + "id": 3, + "name": "appId" + }, { + "type": "string", + "id": 4, + "name": "apiKey" + }] + } + }] + }, { + "title": "Users", + "package": "users", + "doc": [ + "Users are objects that secured by accessHash. You can't load user profile by it's id.", + "You can't send message to user without finding it's object in Updates or by calling", + "method for user search, contacts import or some other methods.", + "", + "Applications need to keep all Users information forever.", + "", + "Each User have optional localName - name of user that was set by current user and can be changed", + "any time by calling EditUserLocalName method." + ], + "items": [{ + "type": "enum", + "content": { + "name": "Sex", + "values": [{ + "name": "Unknown", + "id": 1 + }, { + "name": "Male", + "id": 2 + }, { + "name": "Female", + "id": 3 + }] + } + }, { + "type": "enum", + "content": { + "name": "ContactType", + "values": [{ + "name": "Phone", + "id": 1 + }, { + "name": "Email", + "id": 2 + }, { + "name": "Web", + "id": 3 + }, { + "name": "Social", + "id": 4 + }] + } + }, { + "type": "struct", + "content": { + "name": "ContactRecord", + "doc": [ + "Contact information record", { + "type": "reference", + "argument": "type", + "category": "full", + "description": " Record type" + }, { + "type": "reference", + "argument": "typeSpec", + "category": "hidden", + "description": " Value for specification type of contact, for example 'mobile/standalone/office' for phones or 'vk/fb/telegram' for extenrnal networks." + }, { + "type": "reference", + "argument": "stringValue", + "category": "full", + "description": " String value of record" + }, { + "type": "reference", + "argument": "longValue", + "category": "full", + "description": " Long value of record" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Title of record" + }, { + "type": "reference", + "argument": "subtitle", + "category": "hidden", + "description": " Subtitle of record" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "enum", + "childType": "ContactType" + }, + "id": 1, + "name": "type" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 6, + "name": "typeSpec" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "stringValue" + }, { + "type": { + "type": "opt", + "childType": "int64" + }, + "id": 3, + "name": "longValue" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "title" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 5, + "name": "subtitle" + }] + } + }, { + "type": "struct", + "content": { + "name": "User", + "doc": [ + "Main user object", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " uid" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " user's access hash" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " user's name" + }, { + "type": "reference", + "argument": "localName", + "category": "full", + "description": " user's local name" + }, { + "type": "reference", + "argument": "nick", + "category": "full", + "description": " User's nickname" + }, { + "type": "reference", + "argument": "sex", + "category": "full", + "description": " optional sex of user" + }, { + "type": "reference", + "argument": "avatar", + "category": "compact", + "description": " avatar of user" + }, { + "type": "reference", + "argument": "isBot", + "category": "full", + "description": " Is user actually bot. By default is false." + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " Extension values" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": " [DEPRECATED] User's about information" + }, { + "type": "reference", + "argument": "contactInfo", + "category": "compact", + "description": " [DEPRECATED] Contact information of user" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": " [DEPRECATED] Preferred user languages" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": " [DEPRECATED] Time Zone of user in TZ format" + }, { + "type": "reference", + "argument": "botCommands", + "category": "full", + "description": " [DEPRECATED] Available Bot Commands" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": "string", + "id": 3, + "name": "name" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "localName" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 13, + "name": "nick" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "Sex" + } + }, + "id": 5, + "name": "sex" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 8, + "name": "avatar" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 11, + "name": "isBot" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 20, + "name": "ext" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "ContactRecord" + } + }, + "id": 12, + "name": "contactInfo", + "deprecated": "true" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 14, + "name": "about", + "deprecated": "true" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 16, + "name": "preferredLanguages", + "deprecated": "true" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 17, + "name": "timeZone", + "deprecated": "true" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "BotCommand" + } + }, + "id": 19, + "name": "botCommands", + "deprecated": "true" + }] + } + }, { + "type": "struct", + "content": { + "name": "FullUser", + "doc": [ + "Full User representation", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " User's Id" + }, { + "type": "reference", + "argument": "contactInfo", + "category": "compact", + "description": " User's contact information" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": " User's about information" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": " Preferred user languages" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": " Time Zone of user in TZ format" + }, { + "type": "reference", + "argument": "botCommands", + "category": "full", + "description": " Available Commands for Bot" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " Extension values. NOTE: This values are not related to ext field in User object." + }, { + "type": "reference", + "argument": "isBlocked", + "category": "full", + "description": " Is user blocked. Default is false." + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "ContactRecord" + } + }, + "id": 2, + "name": "contactInfo" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "about" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 4, + "name": "preferredLanguages" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 5, + "name": "timeZone" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "BotCommand" + } + }, + "id": 6, + "name": "botCommands" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 7, + "name": "ext" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 8, + "name": "isBlocked" + }] + } + }, { + "type": "struct", + "content": { + "name": "BotCommand", + "doc": [ + "Available bot commands", { + "type": "reference", + "argument": "slashCommand", + "category": "full", + "description": " Slash command name (wihtout slash)" + }, { + "type": "reference", + "argument": "description", + "category": "full", + "description": " Slash command description" + }, { + "type": "reference", + "argument": "locKey", + "category": "full", + "description": " Optional Localization Key for i18n" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "slashCommand" + }, { + "type": "string", + "id": 2, + "name": "description" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "locKey" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditUserLocalName", + "header": 96, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Renaming of user's visible name", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": "target User's uid" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": "User's accessHash" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": "New user name" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": "string", + "id": 3, + "name": "name" + }] + } + }, { + "type": "update", + "content": { + "name": "UserAvatarChanged", + "header": 16, + "doc": [ + "Update about avatar changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " user's uid" + }, { + "type": "reference", + "argument": "avatar", + "category": "compact", + "description": " user's new avatar" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 2, + "name": "avatar" + }] + } + }, { + "type": "update", + "content": { + "name": "UserNameChanged", + "header": 32, + "doc": [ + "Update about name changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " user's uid" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " user's name" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": "string", + "id": 2, + "name": "name" + }] + } + }, { + "type": "update", + "content": { + "name": "UserLocalNameChanged", + "header": 51, + "doc": [ + "Update about local name changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " user's uid" + }, { + "type": "reference", + "argument": "localName", + "category": "full", + "description": " new user's local name" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "localName" + }] + } + }, { + "type": "update", + "content": { + "name": "UserContactsChanged", + "header": 134, + "doc": [ + "Update about contact information change", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " user's uid" + }, { + "type": "reference", + "argument": "contactRecords", + "category": "compact", + "description": " new phones list" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "ContactRecord" + } + }, + "id": 4, + "name": "contactRecords" + }] + } + }, { + "type": "update", + "content": { + "name": "UserNickChanged", + "header": 209, + "doc": [ + "Update about nick changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " user's uid" + }, { + "type": "reference", + "argument": "nickname", + "category": "full", + "description": " user's new nickname" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "nickname" + }] + } + }, { + "type": "update", + "content": { + "name": "UserAboutChanged", + "header": 210, + "doc": [ + "Update about user's about changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's uid" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": " User's about" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "about" + }] + } + }, { + "type": "update", + "content": { + "name": "UserPreferredLanguagesChanged", + "header": 212, + "doc": [ + "Update about user's preferred languages", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's uid" + }, { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": " User's preferred languages. Can be empty." + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 2, + "name": "preferredLanguages" + }] + } + }, { + "type": "update", + "content": { + "name": "UserTimeZoneChanged", + "header": 216, + "doc": [ + "User TimeZone changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's uid" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": " User's new time zone in TZ format" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "timeZone" + }] + } + }, { + "type": "update", + "content": { + "name": "UserBotCommandsChanged", + "header": 217, + "doc": [ + "Update about bot commands changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's Id" + }, { + "type": "reference", + "argument": "commands", + "category": "full", + "description": " New List of commands" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "BotCommand" + } + }, + "id": 2, + "name": "commands" + }] + } + }, { + "type": "update", + "content": { + "name": "UserExtChanged", + "header": 218, + "doc": [ + "Update about user ext changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " New Ext Value in User (NOT FullUser) object." + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 2, + "name": "ext" + }] + } + }, { + "type": "update", + "content": { + "name": "UserFullExtChanged", + "header": 219, + "doc": [ + "Update about user ext changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's Id" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " New Ext Value in FullUser (NOT User) object." + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 3, + "name": "ext" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadFullUsers", + "header": 2649, + "response": { + "type": "anonymous", + "header": 2650, + "doc": [{ + "type": "reference", + "argument": "fullUsers", + "category": "compact", + "description": " Loaded users" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "FullUser" } - ] - } - },{"type":"rpc","content":{ -"name":"GetAuthSessions", -"header":80, -"response":{"type":"anonymous","header":81, "doc":[ -"Current Auth sessions",{"type":"reference","argument":"userAuths","category":"compact","description":" User authentications"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"AuthSession"}},"id":1,"name":"userAuths"} -]}, -"doc":[ -"Getting of all active user's authentication sessions"],"attributes":[ -]}},{"type":"rpc","content":{ -"name":"TerminateSession", -"header":82, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"SignOut on specified user's session",{"type":"reference","argument":"id","category":"full","description":"id from AuthItem"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -]}},{"type":"rpc","content":{ -"name":"TerminateAllSessions", -"header":83, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"SignOut on all exept current sessions"],"attributes":[ -]}},{"type":"rpc","content":{ -"name":"SignOut", -"header":84, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"SignOut current session"],"attributes":[ -]}},{"type":"comment","content":"OBSOLETE METHODS"},{"type":"rpc","content":{ -"name":"SignInObsolete", -"header":3, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Performing user signin",{"type":"reference","argument":"phoneNumber","category":"danger","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"smsCode","category":"danger","description":"Confirmation code from SMS"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device title like 'Steven's iPhone'"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"appKey","category":"hidden","description":"Application API key"}],"attributes":[ -{"type":"int64","id":1,"name":"phoneNumber"} -,{"type":"string","id":2,"name":"smsHash"} -,{"type":"string","id":3,"name":"smsCode"} -,{"type":"bytes","id":5,"name":"deviceHash"} -,{"type":"string","id":6,"name":"deviceTitle"} -,{"type":"int32","id":7,"name":"appId"} -,{"type":"string","id":8,"name":"appKey"} -]}},{"type":"rpc","content":{ -"name":"SignUpObsolete", -"header":4, -"response":{"type":"reference","name":"Auth"}, -"doc":[ -"Performing user signup. If user perform signup on already registered user it just override previous","profile information",{"type":"reference","argument":"phoneNumber","category":"danger","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"smsCode","category":"danger","description":"Confirmation code from SMS"},{"type":"reference","argument":"name","category":"full","description":"User name"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device title like 'Steven's iPhone'"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"appKey","category":"hidden","description":"pplication API key"}],"attributes":[ -{"type":"int64","id":1,"name":"phoneNumber"} -,{"type":"string","id":2,"name":"smsHash"} -,{"type":"string","id":3,"name":"smsCode"} -,{"type":"string","id":4,"name":"name"} -,{"type":"bytes","id":7,"name":"deviceHash"} -,{"type":"string","id":8,"name":"deviceTitle"} -,{"type":"int32","id":9,"name":"appId"} -,{"type":"string","id":10,"name":"appKey"} -,{"type":"bool","id":11,"name":"isSilent"} -]}},{"type":"rpc","content":{ -"name":"SendAuthCodeObsolete", -"header":1, -"response":{"type":"anonymous","header":2, "doc":[ -"Sms Request response",{"type":"reference","argument":"smsHash","category":"danger","description":" Hash of SMS request"},{"type":"reference","argument":"isRegistered","category":"full","description":" true if user is registered"}] ,"attributes":[{"type":"string","id":1,"name":"smsHash"} -,{"type":"bool","id":2,"name":"isRegistered"} -]}, -"doc":[ -"Sending SMS with activation code",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number in international format"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"}],"attributes":[ -{"type":"int64","id":1,"name":"phoneNumber"} -,{"type":"int32","id":2,"name":"appId"} -,{"type":"string","id":3,"name":"apiKey"} -]}},{"type":"rpc","content":{ -"name":"SendAuthCallObsolete", -"header":90, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Requesting Phone activation",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"}],"attributes":[ -{"type":"int64","id":1,"name":"phoneNumber"} -,{"type":"string","id":2,"name":"smsHash"} -,{"type":"int32","id":3,"name":"appId"} -,{"type":"string","id":4,"name":"apiKey"} -]}}]}, { - "title": "Users", - "package": "users", - "doc": [ - "Users are objects that secured by accessHash. You can't load user profile by it's id.", - "You can't send message to user without finding it's object in Updates or by calling", - "method for user search, contacts import or some other methods.", - "", - "Applications need to keep all Users information forever.", - "", - "Each User have optional localName - name of user that was set by current user and can be changed", - "any time by calling EditUserLocalName method." - ], - "items": [ - { - "type": "enum", - "content": { - "name": "Sex", - "values": [ - { - "name": "Unknown", - "id": 1 - }, - { - "name": "Male", - "id": 2 - }, - { - "name": "Female", - "id": 3 + }, + "id": 1, + "name": "fullUsers" + }] + }, + "doc": [ + "Loading Full User information", { + "type": "reference", + "argument": "userPeers", + "category": "compact", + "description": "User's peers to load. Should be non-empy" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 1, + "name": "userPeers" + }] + } + }] + }, { + "title": "Profile", + "package": "profile", + "items": [{ + "type": "rpc", + "content": { + "name": "EditName", + "header": 53, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Changing account's name", { + "type": "reference", + "argument": "name", + "category": "full", + "description": "New name" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "name" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditNickName", + "header": 205, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Changing account's nickname", { + "type": "reference", + "argument": "nickname", + "category": "full", + "description": "New Nickname" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "nickname" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CheckNickName", + "header": 206, + "response": { + "type": "reference", + "name": "Bool" + }, + "doc": [ + "Checking availability of nickname", { + "type": "reference", + "argument": "nickname", + "category": "full", + "description": "Nickname for checking" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "nickname" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditAbout", + "header": 212, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Changing about information", { + "type": "reference", + "argument": "about", + "category": "full", + "description": "new about information" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "about" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditAvatar", + "header": 31, + "response": { + "type": "anonymous", + "header": 103, + "doc": [ + "Response for change account avatar", { + "type": "reference", + "argument": "avatar", + "category": "full", + "description": " New avatar" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Sequence state" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Avatar" + }, + "id": 1, + "name": "avatar" + }, { + "type": "int32", + "id": 2, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }] + }, + "doc": [ + "Changing account's avatar", { + "type": "reference", + "argument": "fileLocation", + "category": "compact", + "description": "File Location of uploaded unencrypted avatar" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 1, + "name": "fileLocation" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RemoveAvatar", + "header": 91, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Removing account's avatar" + ], + "attributes": [] + } + }, { + "type": "rpc", + "content": { + "name": "EditMyTimeZone", + "header": 144, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Updating user's time zone", { + "type": "reference", + "argument": "tz", + "category": "full", + "description": "New Time Zone" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "tz" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditMyPreferredLanguages", + "header": 145, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Changing preffered languages", { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preffered Languages" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": "string" + }, + "id": 1, + "name": "preferredLanguages" + }] + } + }] + }, { + "title": "Contacts", + "package": "contacts", + "doc": [ + "Before working with contact list is is useful to import contacts from phone first by calling", + "method ImportContacts#0x07.", + "", + "All phone numbers MUST be preprocessed before import by some library (like libphonenumber)", + "and build international phone number depending on current users phone and/or locale.", + "", + "For loading contact list from server use GetContacts#0x57.", + "If during this call there are some updates about contact list change", + "it is recommended to call it again. Also applications need to sync contacts on application start.", + "", + "For searching for users without adding to contacts list use method FindContacts#0x70.", + "", + "For adding/deleting contacts AddContact#0x72 and DeleteContact#0x59." + ], + "items": [{ + "type": "struct", + "content": { + "name": "PhoneToImport", + "doc": [ + "Phone for import", { + "type": "reference", + "argument": "phoneNumber", + "category": "full", + "description": " phone number for import in international format" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " optional name for contact" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "phoneNumber" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "name" + }] + } + }, { + "type": "struct", + "content": { + "name": "EmailToImport", + "doc": [ + "Email for import", { + "type": "reference", + "argument": "email", + "category": "full", + "description": " email for importing" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " optional name for contact" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "email" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "name" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ImportContacts", + "header": 7, + "response": { + "type": "anonymous", + "header": 8, + "doc": [ + "Imported contacts", { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Imported users" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number if users are imported" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Sequence state if users are imported" + }, { + "type": "reference", + "argument": "userPeers", + "category": "full", + "description": " Imported user peers" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" } - ] - } - }, { - "type": "enum", - "content": { - "name": "ContactType", - "values": [ - { - "name": "Phone", - "id": 1 - }, - { - "name": "Email", - "id": 2 - }, - { - "name": "Web", - "id": 3 - }, - { - "name": "Social", - "id": 4 + }, + "id": 1, + "name": "users" + }, { + "type": "int32", + "id": 2, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" } - ] - } - }, { - "type":"struct", - "content": { - "name":"ContactRecord", -"doc":[ -"Contact information record",{"type":"reference","argument":"type","category":"full","description":" Record type"},{"type":"reference","argument":"typeSpec","category":"hidden","description":" Value for specification type of contact, for example 'mobile/standalone/office' for phones or 'vk/fb/telegram' for extenrnal networks."},{"type":"reference","argument":"stringValue","category":"full","description":" String value of record"},{"type":"reference","argument":"longValue","category":"full","description":" Long value of record"},{"type":"reference","argument":"title","category":"full","description":" Title of record"},{"type":"reference","argument":"subtitle","category":"hidden","description":" Subtitle of record"}],"expandable":"true","attributes":[ -{"type":{"type":"enum","childType":"ContactType"},"id":1,"name":"type"} -,{"type":{"type":"opt","childType":"string"},"id":6,"name":"typeSpec"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"stringValue"} -,{"type":{"type":"opt","childType":"int64"},"id":3,"name":"longValue"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"title"} -,{"type":{"type":"opt","childType":"string"},"id":5,"name":"subtitle"} -]}}, { - "type":"struct", - "content": { - "name":"User", -"doc":[ -"Main user object",{"type":"reference","argument":"id","category":"full","description":" uid"},{"type":"reference","argument":"accessHash","category":"danger","description":" user's access hash"},{"type":"reference","argument":"name","category":"full","description":" user's name"},{"type":"reference","argument":"localName","category":"full","description":" user's local name"},{"type":"reference","argument":"nick","category":"full","description":" User's nickname"},{"type":"reference","argument":"sex","category":"full","description":" optional sex of user"},{"type":"reference","argument":"avatar","category":"compact","description":" avatar of user"},{"type":"reference","argument":"isBot","category":"full","description":" Is user actually bot. By default is false."},{"type":"reference","argument":"ext","category":"full","description":" Extension values"},{"type":"reference","argument":"about","category":"full","description":" [DEPRECATED] User's about information"},{"type":"reference","argument":"contactInfo","category":"compact","description":" [DEPRECATED] Contact information of user"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" [DEPRECATED] Preferred user languages"},{"type":"reference","argument":"timeZone","category":"full","description":" [DEPRECATED] Time Zone of user in TZ format"},{"type":"reference","argument":"botCommands","category":"full","description":" [DEPRECATED] Available Bot Commands"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":"string","id":3,"name":"name"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"localName"} -,{"type":{"type":"opt","childType":"string"},"id":13,"name":"nick"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"Sex"}},"id":5,"name":"sex"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":8,"name":"avatar"} -,{"type":{"type":"opt","childType":"bool"},"id":11,"name":"isBot"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":20,"name":"ext"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":12,"name":"contactInfo", "deprecated":"true"} -,{"type":{"type":"opt","childType":"string"},"id":14,"name":"about", "deprecated":"true"} -,{"type":{"type":"list","childType":"string"},"id":16,"name":"preferredLanguages", "deprecated":"true"} -,{"type":{"type":"opt","childType":"string"},"id":17,"name":"timeZone", "deprecated":"true"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":19,"name":"botCommands", "deprecated":"true"} -]}}, { - "type":"struct", - "content": { - "name":"FullUser", -"doc":[ -"Full User representation",{"type":"reference","argument":"id","category":"full","description":" User's Id"},{"type":"reference","argument":"contactInfo","category":"compact","description":" User's contact information"},{"type":"reference","argument":"about","category":"full","description":" User's about information"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" Preferred user languages"},{"type":"reference","argument":"timeZone","category":"full","description":" Time Zone of user in TZ format"},{"type":"reference","argument":"botCommands","category":"full","description":" Available Commands for Bot"},{"type":"reference","argument":"ext","category":"full","description":" Extension values. NOTE: This values are not related to ext field in User object."},{"type":"reference","argument":"isBlocked","category":"full","description":" Is user blocked. Default is false."}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"id"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":2,"name":"contactInfo"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} -,{"type":{"type":"list","childType":"string"},"id":4,"name":"preferredLanguages"} -,{"type":{"type":"opt","childType":"string"},"id":5,"name":"timeZone"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":6,"name":"botCommands"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":7,"name":"ext"} -,{"type":{"type":"opt","childType":"bool"},"id":8,"name":"isBlocked"} -]}}, { - "type":"struct", - "content": { - "name":"BotCommand", -"doc":[ -"Available bot commands",{"type":"reference","argument":"slashCommand","category":"full","description":" Slash command name (wihtout slash)"},{"type":"reference","argument":"description","category":"full","description":" Slash command description"},{"type":"reference","argument":"locKey","category":"full","description":" Optional Localization Key for i18n"}],"attributes":[ -{"type":"string","id":1,"name":"slashCommand"} -,{"type":"string","id":2,"name":"description"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"locKey"} -]}},{"type":"rpc","content":{ -"name":"EditUserLocalName", -"header":96, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Renaming of user's visible name",{"type":"reference","argument":"uid","category":"full","description":"target User's uid"},{"type":"reference","argument":"accessHash","category":"danger","description":"User's accessHash"},{"type":"reference","argument":"name","category":"full","description":"New user name"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":"string","id":3,"name":"name"} -]}},{"type":"update","content":{ -"name":"UserAvatarChanged", -"header":16, -"doc":[ -"Update about avatar changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"avatar","category":"compact","description":" user's new avatar"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":2,"name":"avatar"} -]}},{"type":"update","content":{ -"name":"UserNameChanged", -"header":32, -"doc":[ -"Update about name changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"name","category":"full","description":" user's name"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":"string","id":2,"name":"name"} -]}},{"type":"update","content":{ -"name":"UserLocalNameChanged", -"header":51, -"doc":[ -"Update about local name changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"localName","category":"full","description":" new user's local name"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"localName"} -]}},{"type":"update","content":{ -"name":"UserContactsChanged", -"header":134, -"doc":[ -"Update about contact information change",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"contactRecords","category":"compact","description":" new phones list"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":4,"name":"contactRecords"} -]}},{"type":"update","content":{ -"name":"UserNickChanged", -"header":209, -"doc":[ -"Update about nick changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"nickname","category":"full","description":" user's new nickname"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"nickname"} -]}},{"type":"update","content":{ -"name":"UserAboutChanged", -"header":210, -"doc":[ -"Update about user's about changed",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"about","category":"full","description":" User's about"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} -]}},{"type":"update","content":{ -"name":"UserPreferredLanguagesChanged", -"header":212, -"doc":[ -"Update about user's preferred languages",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" User's preferred languages. Can be empty."}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"list","childType":"string"},"id":2,"name":"preferredLanguages"} -]}},{"type":"update","content":{ -"name":"UserTimeZoneChanged", -"header":216, -"doc":[ -"User TimeZone changed",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"timeZone","category":"full","description":" User's new time zone in TZ format"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"timeZone"} -]}},{"type":"update","content":{ -"name":"UserBotCommandsChanged", -"header":217, -"doc":[ -"Update about bot commands changed",{"type":"reference","argument":"uid","category":"full","description":" User's Id"},{"type":"reference","argument":"commands","category":"full","description":" New List of commands"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":2,"name":"commands"} -]}},{"type":"update","content":{ -"name":"UserExtChanged", -"header":218, -"doc":[ -"Update about user ext changed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"ext","category":"full","description":" New Ext Value in User (NOT FullUser) object."}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} -]}},{"type":"update","content":{ -"name":"UserFullExtChanged", -"header":219, -"doc":[ -"Update about user ext changed",{"type":"reference","argument":"uid","category":"full","description":" User's Id"},{"type":"reference","argument":"ext","category":"full","description":" New Ext Value in FullUser (NOT User) object."}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":3,"name":"ext"} -]}},{"type":"rpc","content":{ -"name":"LoadFullUsers", -"header":2649, -"response":{"type":"anonymous","header":2650, "doc":[ -{"type":"reference","argument":"fullUsers","category":"compact","description":" Loaded users"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"FullUser"}},"id":1,"name":"fullUsers"} -]}, -"doc":[ -"Loading Full User information",{"type":"reference","argument":"userPeers","category":"compact","description":"User's peers to load. Should be non-empy"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"userPeers"} -]}}]}, { - "title": "Profile", - "package": "profile", - "items": [ -{"type":"rpc","content":{ -"name":"EditName", -"header":53, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Changing account's name",{"type":"reference","argument":"name","category":"full","description":"New name"}],"attributes":[ -{"type":"string","id":1,"name":"name"} -]}},{"type":"rpc","content":{ -"name":"EditNickName", -"header":205, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Changing account's nickname",{"type":"reference","argument":"nickname","category":"full","description":"New Nickname"}],"attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"nickname"} -]}},{"type":"rpc","content":{ -"name":"CheckNickName", -"header":206, -"response":{"type":"reference","name":"Bool"}, -"doc":[ -"Checking availability of nickname",{"type":"reference","argument":"nickname","category":"full","description":"Nickname for checking"}],"attributes":[ -{"type":"string","id":1,"name":"nickname"} -]}},{"type":"rpc","content":{ -"name":"EditAbout", -"header":212, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Changing about information",{"type":"reference","argument":"about","category":"full","description":"new about information"}],"attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"about"} -]}},{"type":"rpc","content":{ -"name":"EditAvatar", -"header":31, -"response":{"type":"anonymous","header":103, "doc":[ -"Response for change account avatar",{"type":"reference","argument":"avatar","category":"full","description":" New avatar"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"}] ,"attributes":[{"type":{"type":"struct","childType":"Avatar"},"id":1,"name":"avatar"} -,{"type":"int32","id":2,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -]}, -"doc":[ -"Changing account's avatar",{"type":"reference","argument":"fileLocation","category":"compact","description":"File Location of uploaded unencrypted avatar"}],"attributes":[ -{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} -]}},{"type":"rpc","content":{ -"name":"RemoveAvatar", -"header":91, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Removing account's avatar"],"attributes":[ -]}},{"type":"rpc","content":{ -"name":"EditMyTimeZone", -"header":144, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Updating user's time zone",{"type":"reference","argument":"tz","category":"full","description":"New Time Zone"}],"attributes":[ -{"type":"string","id":1,"name":"tz"} -]}},{"type":"rpc","content":{ -"name":"EditMyPreferredLanguages", -"header":145, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Changing preffered languages",{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preffered Languages"}],"attributes":[ -{"type":{"type":"list","childType":"string"},"id":1,"name":"preferredLanguages"} -]}}]}, { - "title": "Contacts", - "package": "contacts", - "doc": [ - "Before working with contact list is is useful to import contacts from phone first by calling", - "method ImportContacts#0x07.", - "", - "All phone numbers MUST be preprocessed before import by some library (like libphonenumber)", - "and build international phone number depending on current users phone and/or locale.", - "", - "For loading contact list from server use GetContacts#0x57.", - "If during this call there are some updates about contact list change", - "it is recommended to call it again. Also applications need to sync contacts on application start.", - "", - "For searching for users without adding to contacts list use method FindContacts#0x70.", - "", - "For adding/deleting contacts AddContact#0x72 and DeleteContact#0x59." - ], - "items": [ - { - "type":"struct", - "content": { - "name":"PhoneToImport", -"doc":[ -"Phone for import",{"type":"reference","argument":"phoneNumber","category":"full","description":" phone number for import in international format"},{"type":"reference","argument":"name","category":"full","description":" optional name for contact"}],"attributes":[ -{"type":"int64","id":1,"name":"phoneNumber"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} -]}}, { - "type":"struct", - "content": { - "name":"EmailToImport", -"doc":[ -"Email for import",{"type":"reference","argument":"email","category":"full","description":" email for importing"},{"type":"reference","argument":"name","category":"full","description":" optional name for contact"}],"attributes":[ -{"type":"string","id":1,"name":"email"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} -]}},{"type":"rpc","content":{ -"name":"ImportContacts", -"header":7, -"response":{"type":"anonymous","header":8, "doc":[ -"Imported contacts",{"type":"reference","argument":"users","category":"compact","description":" Imported users"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number if users are imported"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state if users are imported"},{"type":"reference","argument":"userPeers","category":"full","description":" Imported user peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} -,{"type":"int32","id":2,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} -]}, -"doc":[ -"Importing phones and emails for building contact list","Maximum amount of items for import per method call equals to 100.",{"type":"reference","argument":"phones","category":"compact","description":"Phones for import"},{"type":"reference","argument":"emails","category":"compact","description":"Emails for import"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"PhoneToImport"}},"id":1,"name":"phones"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EmailToImport"}},"id":2,"name":"emails"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} -]}},{"type":"empty"},{"type":"rpc","content":{ -"name":"GetContacts", -"header":87, -"response":{"type":"anonymous","header":88, "doc":[ -"Current contact list",{"type":"reference","argument":"users","category":"hidden","description":" User list if list is changed"},{"type":"reference","argument":"isNotChanged","category":"full","description":" is list changed"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} -,{"type":"bool","id":2,"name":"isNotChanged"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"userPeers"} -]}, -"doc":[ -"Getting current contact list","SHA256 hash of list of a comma-separated list of contact UIDs in ascending","order may be passed in contactsHash parameter.","If the contact list was not changed, isNotChanged will be true.",{"type":"reference","argument":"contactsHash","category":"full","description":"Hash of saved list in application"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":"string","id":1,"name":"contactsHash"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"RemoveContact", -"header":89, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Removing contact from contact list",{"type":"reference","argument":"uid","category":"full","description":"Contact's UID"},{"type":"reference","argument":"accessHash","category":"danger","description":"Contact's AccessHash"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":"int64","id":2,"name":"accessHash"} -]}},{"type":"rpc","content":{ -"name":"AddContact", -"header":114, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Adding contact to contact list",{"type":"reference","argument":"uid","category":"full","description":"Contact's UID"},{"type":"reference","argument":"accessHash","category":"danger","description":"Contact's AccessHash"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":"int64","id":2,"name":"accessHash"} -]}},{"type":"rpc","content":{ -"name":"SearchContacts", -"header":112, -"response":{"type":"anonymous","header":113, "doc":[ -"Founded users",{"type":"reference","argument":"users","category":"compact","description":" Founded users"},{"type":"reference","argument":"userPeers","category":"compact","description":" Founded users peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":2,"name":"userPeers"} -]}, -"doc":[ -"Searching contacts by user's query",{"type":"reference","argument":"request","category":"full","description":"Search query"}],"attributes":[ -{"type":"string","id":1,"name":"request"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} -]}},{"type":"empty"},{"type":"update","content":{ -"name":"ContactRegistered", -"header":5, -"doc":[ -"Update about contact registration",{"type":"reference","argument":"uid","category":"full","description":" contact's uid"},{"type":"reference","argument":"isSilent","category":"full","description":" is registration silent. If this value is true then don't show notification about registration"},{"type":"reference","argument":"date","category":"full","description":" date of registration"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":"bool","id":2,"name":"isSilent"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -]}},{"type":"update","content":{ -"name":"ContactsAdded", -"header":40, -"doc":[ -"Update about contacts added",{"type":"reference","argument":"uids","category":"compact","description":" added contacts"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"uids"} -]}},{"type":"update","content":{ -"name":"ContactsRemoved", -"header":41, -"doc":[ -"Update about contacts removed",{"type":"reference","argument":"uids","category":"compact","description":" removed contacts"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"uids"} -]}}]}, { - "title": "Privacy", - "package": "privacy", - "items": [ -{"type":"rpc","content":{ -"name":"BlockUser", -"header":2636, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Block User",{"type":"reference","argument":"peer","category":"full","description":"Peer for blocking"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"UnblockUser", -"header":2637, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Unblock User",{"type":"reference","argument":"peer","category":"full","description":"Peer for unblocking"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"LoadBlockedUsers", -"header":2638, -"response":{"type":"anonymous","header":2639, "doc":[ -{"type":"reference","argument":"userPeers","category":"full","description":" Blocked user peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"userPeers"} -]}, -"doc":[ -"Load Blocked Users"],"attributes":[ -]}},{"type":"update","content":{ -"name":"UserBlocked", -"header":2629, -"doc":[ -"Update about User Blocked",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -]}},{"type":"update","content":{ -"name":"UserUnblocked", -"header":2630, -"doc":[ -"Update about User Unblocked",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -]}}]}, { - "title": "Messaging", - "package": "messaging", - "doc": [ - "Actor can work with encrypted and plain messages in one conversation. For both types of messages API", - "contains a bit different methods. Also encrypted and plain messages have different schemes.", - "

Messages

", - "Message entity contains:", - "
    ", - "
  • PeerType - group chat or private
  • ", - "
  • PeerId - group or user id of conversation
  • ", - "
  • RandomId - unique id of message that generated by sender. In Encrypted messages random id is encrypted.
  • ", - "
  • Date - date of message (calculated on server)
  • ", - "
  • Content
  • ", - "
", - "

Message content

", - "Message can be one of three basic types of messages: Text Message, File Message and Service message.", - "All messages can contain extensions. For example we can send text message and add markdown extension with", - "formatted text in markdown and clients that support this extension will show markdown, and that clients that", - "not supported extension then show simple text. File messages can have photo, video or voice extensions.", - "Service message can have extensions extensions such as \"user added\", \"group created\", \"avatar changed\", etc.", - "

Send messages

", - "Sending messages looks same for encrypted and plain messages. Client MUST prepare all required data", - "before sending message (for example FastThumb for photo/video/documents) and call required methods.", - "Encrypted messages differs here only by a little different scheme and encryption.", - "

WRONG_KEYS and incorrect keys

", - "For sending encrypted messages client MUST send messages encrypted for all own and receivers keys.", - "If client send encryption with missing, old or incorrect keys it will receive WRONG_KEYS.", - "In WRONG_KEYS you need to deserialize relatedData from RpcError to WrongKeysErrorData", - "and get detailed information about keys. Sometimes there are some broken keys on server and client can't", - "encrypt messages with it than client MUST send empty encrypted key in request elsewhere API return WRONG_KEYS.", - "

Encrypted messages and New Devices

", - "When you send message to someone and when he registered with new device there are no way to receive old encrypted", - "messages on new device and because of this there are a problem about read/delivery statuses.", - "Alice send messages to Bob, but Bob lose his device and buy new iPhone and installed Actor.", - "Alice receive notification about new device and send another message. Bob open chat with Alice and", - "send read status with maximum message read date. Alice will mark all sent messages as read and one that", - "was not delivered. We can use status notifications per message, but in VERY heavy conversations it will be", - "a lot of unnecessary traffic. For resolving this small issue we have different ways of message statuses", - "for encrypted and plain messages. Also it is recomended to mark all undelivered messages on new device update as", - "not devered with warring sign.", - "

Message Read and Delivery

", - "There are two different ways for read and delivery statuses for encrypted and plain messages.", - "For encrypted messages used status change by RandomId and for plain messages used by maximum", - "date of read/delivered message." - ], - "items": [ - { - "type":"struct", - "content": { - "name":"MessageAttributes", -"doc":[ -"Message Attributes",{"type":"reference","argument":"isMentioned","category":"full","description":" Is mentioned. If set overrides built-in value."},{"type":"reference","argument":"isHighlighted","category":"full","description":" Is message highlighted. Default is false."},{"type":"reference","argument":"isNotified","category":"full","description":" Is notified. If set overrides built-in settings."},{"type":"reference","argument":"isOnlyForYou","category":"full","description":" If this message is only for you. Default is false"}],"attributes":[ -{"type":{"type":"opt","childType":"bool"},"id":1,"name":"isMentioned"} -,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isHighlighted"} -,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isNotified"} -,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isOnlyForYou"} -]}}, { - "type":"struct", - "content": { - "name":"QuotedMessage", -"doc":[ -"Quoted Message",{"type":"reference","argument":"messageId","category":"full","description":" Message Id if present"},{"type":"reference","argument":"publicGroupId","category":"full","description":" Public Group id if present"},{"type":"reference","argument":"senderUserId","category":"full","description":" Sender of message"},{"type":"reference","argument":"messageDate","category":"full","description":" Date of message"},{"type":"reference","argument":"quotedMessageContent","category":"full","description":" Optional Quoted Message Content. Can be empty if messageId is present and message is in current peer."}],"attributes":[ -{"type":{"type":"opt","childType":{"type":"alias","childType":"randomId"}},"id":1,"name":"messageId"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"groupId"}},"id":2,"name":"publicGroupId"} -,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"senderUserId"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"messageDate"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"Message"}},"id":5,"name":"quotedMessageContent"} -]}},{"type":"trait","content":{ -"isContainer":"true","name":"Message","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"TextMessage", -"doc":[ -"Text message",{"type":"reference","argument":"text","category":"danger","description":" the text"},{"type":"reference","argument":"mentions","category":"full","description":" User mentions in message"},{"type":"reference","argument":"ext","category":"full","description":" Optional bytes of extension"}],"trait":{"name":"Message","key":1},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"text"} -,{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"mentions"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"TextMessageEx"}},"id":3,"name":"ext"} -]}},{"type":"trait","content":{ -"isContainer":"true","name":"TextMessageEx","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"TextExMarkdown", -"doc":[ -"Markdown extension",{"type":"reference","argument":"markdown","category":"full","description":" Markdown text"}],"trait":{"name":"TextMessageEx","key":1},"expandable":"true","attributes":[ -{"type":"string","id":2,"name":"markdown"} -]}}, { - "type":"struct", - "content": { - "name":"TextModernMessage", -"doc":[ -"Modern text message",{"type":"reference","argument":"text","category":"full","description":" optional text of message"},{"type":"reference","argument":"senderNameOverride","category":"full","description":" optional overriding of sender"},{"type":"reference","argument":"senderPhotoOverride","category":"full","description":" optional overriding sender's photo"},{"type":"reference","argument":"style","category":"full","description":" optional paragraph style"},{"type":"reference","argument":"attaches","category":"full","description":" optional Attaches of message"}],"trait":{"name":"TextMessageEx","key":2},"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"text"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"senderNameOverride"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":3,"name":"senderPhotoOverride"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ParagraphStyle"}},"id":4,"name":"style"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"TextModernAttach"}},"id":5,"name":"attaches"} -]}}, { - "type":"struct", - "content": { - "name":"ParagraphStyle", -"doc":[ -"Paragraph style",{"type":"reference","argument":"showParagraph","category":"full","description":" Show quote-like paragraph?"},{"type":"reference","argument":"paragraphColor","category":"full","description":" Override paragraph color"},{"type":"reference","argument":"bgColor","category":"full","description":" Override background color"}],"attributes":[ -{"type":{"type":"opt","childType":"bool"},"id":1,"name":"showParagraph"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"Color"}},"id":2,"name":"paragraphColor"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"Color"}},"id":3,"name":"bgColor"} -]}}, { - "type":"struct", - "content": { - "name":"TextModernAttach", -"doc":[ -"Attaches to message",{"type":"reference","argument":"title","category":"full","description":" Attach of message"},{"type":"reference","argument":"titleUrl","category":"full","description":" Attach title url"},{"type":"reference","argument":"titleIcon","category":"full","description":" Attach title icon"},{"type":"reference","argument":"text","category":"full","description":" Attach text"},{"type":"reference","argument":"style","category":"full","description":" Attach style"}],"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"title"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"titleUrl"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":3,"name":"titleIcon"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"text"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ParagraphStyle"}},"id":5,"name":"style"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"TextModernField"}},"id":6,"name":"fields"} -]}}, { - "type":"struct", - "content": { - "name":"TextModernField", -"doc":[ -"Modern message fields",{"type":"reference","argument":"title","category":"full","description":" Field title"},{"type":"reference","argument":"value","category":"full","description":" Field value"},{"type":"reference","argument":"isShort","category":"full","description":" Is field can be shown in compact way (default is TRUE)"}],"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"title"} -,{"type":"string","id":2,"name":"value"} -,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isShort"} -]}}, { - "type":"struct", - "content": { - "name":"TextCommand", -"doc":[ -"Text Command Message for bots",{"type":"reference","argument":"command","category":"full","description":" Slash-Command For execution"},{"type":"reference","argument":"args","category":"full","description":" Arguments of slash command"}],"trait":{"name":"TextMessageEx","key":3},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"command"} -,{"type":"string","id":2,"name":"args"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceMessage", -"doc":[ -"Service message",{"type":"reference","argument":"text","category":"full","description":" service message text"},{"type":"reference","argument":"ext","category":"compact","description":" Extension"}],"trait":{"name":"Message","key":2},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"text"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"ServiceEx"}},"id":3,"name":"ext"} -]}},{"type":"trait","content":{ -"isContainer":"true","name":"ServiceEx","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"ServiceExUserInvited", -"doc":[ -"Service message about adding user to group",{"type":"reference","argument":"invitedUid","category":"full","description":" added user id"}],"trait":{"name":"ServiceEx","key":1},"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"invitedUid"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExUserJoined", -"doc":[ -"Service message about user join to group"],"trait":{"name":"ServiceEx","key":17},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"ServiceExUserKicked", -"doc":[ -"Service message about kicking user from group",{"type":"reference","argument":"kickedUid","category":"full","description":" kicked user id"}],"trait":{"name":"ServiceEx","key":2},"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"kickedUid"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExUserLeft", -"doc":[ -"Service message about user left group"],"trait":{"name":"ServiceEx","key":3},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"ServiceExGroupCreated", -"doc":[ -"Service message about group creating"],"trait":{"name":"ServiceEx","key":4},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"ServiceExChangedTitle", -"doc":[ -"Service message about group title change",{"type":"reference","argument":"title","category":"full","description":" New group title"}],"trait":{"name":"ServiceEx","key":5},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"title"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExChangedTopic", -"doc":[ -"Service message on group topic change",{"type":"reference","argument":"topic","category":"full","description":" New group topic"}],"trait":{"name":"ServiceEx","key":18},"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"topic"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExChangedAbout", -"doc":[ -"Service message on group about change",{"type":"reference","argument":"about","category":"full","description":" New group about"}],"trait":{"name":"ServiceEx","key":19},"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"about"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExChangedAvatar", -"doc":[ -"Service message about avatar change",{"type":"reference","argument":"avatar","category":"compact","description":" Updated avatar"}],"trait":{"name":"ServiceEx","key":6},"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":1,"name":"avatar"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExContactRegistered", -"doc":[ -"Service message about user registration",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"trait":{"name":"ServiceEx","key":8},"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExPhoneMissed", -"doc":[ -"Update about missing phone call"],"trait":{"name":"ServiceEx","key":9},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"ServiceExPhoneCall", -"doc":[ -"Update about phone call",{"type":"reference","argument":"duration","category":"full","description":" Duration of a phone call"}],"trait":{"name":"ServiceEx","key":16},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"duration"} -]}}, { - "type":"struct", - "content": { - "name":"ServiceExChatArchived", -"doc":[ -"Message about chat archived"],"trait":{"name":"ServiceEx","key":20},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"ServiceExChatRestored", -"doc":[ -"Message about chat restored"],"trait":{"name":"ServiceEx","key":21},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"DocumentMessage", -"doc":[ -"File message",{"type":"reference","argument":"fileId","category":"full","description":" file id"},{"type":"reference","argument":"accessHash","category":"danger","description":" file access hash"},{"type":"reference","argument":"fileSize","category":"full","description":" file size"},{"type":"reference","argument":"name","category":"full","description":" name of file"},{"type":"reference","argument":"mimeType","category":"full","description":" mimetype of file"},{"type":"reference","argument":"thumb","category":"compact","description":" optional thumb of file. JPEG less that 90x90 with 60-70 quality."},{"type":"reference","argument":"ext","category":"compact","description":" Extension"}],"trait":{"name":"Message","key":3},"expandable":"true","attributes":[ -{"type":"int64","id":1,"name":"fileId"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":"int32","id":3,"name":"fileSize"} -,{"type":"string","id":4,"name":"name"} -,{"type":"string","id":5,"name":"mimeType"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"FastThumb"}},"id":6,"name":"thumb"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"DocumentEx"}},"id":8,"name":"ext"} -]}},{"type":"trait","content":{ -"isContainer":"true","name":"DocumentEx","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"DocumentExPhoto", -"doc":[ -"File photo extension. Can be set ONLY for JPEG.",{"type":"reference","argument":"w","category":"full","description":" image width"},{"type":"reference","argument":"h","category":"full","description":" image height"}],"trait":{"name":"DocumentEx","key":1},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"w"} -,{"type":"int32","id":2,"name":"h"} -]}}, { - "type":"struct", - "content": { - "name":"DocumentExVideo", -"doc":[ -"File video extension",{"type":"reference","argument":"w","category":"full","description":" video width"},{"type":"reference","argument":"h","category":"full","description":" video height"},{"type":"reference","argument":"duration","category":"full","description":" video duration"}],"trait":{"name":"DocumentEx","key":2},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"w"} -,{"type":"int32","id":2,"name":"h"} -,{"type":"int32","id":3,"name":"duration"} -]}}, { - "type":"struct", - "content": { - "name":"DocumentExVoice", -"doc":[ -"File voice extension",{"type":"reference","argument":"duration","category":"full","description":" voice duration"}],"trait":{"name":"DocumentEx","key":3},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"duration"} -]}}, { - "type":"struct", - "content": { - "name":"DocumentExAnimation", -"doc":[ -"Animation extension. Can be set ONLY for GIF.",{"type":"reference","argument":"w","category":"full","description":" Animation width"},{"type":"reference","argument":"h","category":"full","description":" Animation height"}],"trait":{"name":"DocumentEx","key":6},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"w"} -,{"type":"int32","id":2,"name":"h"} -]}}, { - "type":"struct", - "content": { - "name":"DocumentExAnimationVid", -"doc":[ -"Animation video extension. More compact version of Animation with video codec instead of GIF.","Can be set ONLY for MP4.",{"type":"reference","argument":"w","category":"full","description":" Animation width"},{"type":"reference","argument":"h","category":"full","description":" Animation height"},{"type":"reference","argument":"duration","category":"full","description":" Animation duration"}],"trait":{"name":"DocumentEx","key":7},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"w"} -,{"type":"int32","id":2,"name":"h"} -,{"type":"int32","id":3,"name":"duration"} -]}}, { - "type":"struct", - "content": { - "name":"JsonMessage", -"doc":[ -"Custom-data JsonMessage",{"type":"reference","argument":"rawJson","category":"danger","description":" JSON object"}],"trait":{"name":"Message","key":4},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"rawJson"} -]}}, { - "type":"struct", - "content": { - "name":"UnsupportedMessage", -"doc":[ -"Explicit type for unsupported message"],"trait":{"name":"Message","key":5},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"StickerMessage", -"doc":[ -"Sticker message",{"type":"reference","argument":"stickerId","category":"full","description":" Optional Unique ID of sticker"},{"type":"reference","argument":"fastPreview","category":"full","description":" Optional Fast preview of sticker in webp format"},{"type":"reference","argument":"image512","category":"full","description":" Optional 512x512 sticker image in webp format"},{"type":"reference","argument":"image256","category":"full","description":" Optional 256x256 sticker image in webp format"},{"type":"reference","argument":"stickerCollectionId","category":"full","description":" Optional Collection ID"},{"type":"reference","argument":"stickerCollectionAccessHash","category":"full","description":" Optional Collection Access Hash"}],"trait":{"name":"Message","key":6},"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":"int32"},"id":1,"name":"stickerId"} -,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"fastPreview"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":3,"name":"image512"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":4,"name":"image256"} -,{"type":{"type":"opt","childType":"int32"},"id":5,"name":"stickerCollectionId"} -,{"type":{"type":"opt","childType":"int64"},"id":6,"name":"stickerCollectionAccessHash"} -]}}, { - "type":"struct", - "content": { - "name":"BinaryMessage", -"doc":[ -"Binary Message. Useful for implementing your own content types",{"type":"reference","argument":"contentTag","category":"full","description":" Content Tag"},{"type":"reference","argument":"msg","category":"compact","description":" Message contents"}],"trait":{"name":"Message","key":7},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"contentTag"} -,{"type":"bytes","id":2,"name":"msg"} -]}}, { - "type":"struct", - "content": { - "name":"EncryptedMessage", -"doc":[ -"Encrypted Message",{"type":"reference","argument":"box","category":"full","description":" Encrypted box"}],"trait":{"name":"Message","key":8},"expandable":"true","attributes":[ -{"type":{"type":"struct","childType":"EncryptedBox"},"id":1,"name":"box"} -]}}, { - "type":"struct", - "content": { - "name":"EmptyMessage", -"doc":[ -"Empty Message"],"trait":{"name":"Message","key":9},"expandable":"true","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"DialogShort", -"doc":[ -"Short Dialog from grouped conversation list",{"type":"reference","argument":"peer","category":"full","description":" Peer of conversation"},{"type":"reference","argument":"counter","category":"full","description":" Conversation unread count"},{"type":"reference","argument":"date","category":"full","description":" Conversation top message date"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":"int32","id":2,"name":"counter"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}}, { - "type":"struct", - "content": { - "name":"DialogGroup", -"doc":[ -"Grouped dialog list",{"type":"reference","argument":"title","category":"full","description":" Title of group"},{"type":"reference","argument":"key","category":"full","description":" Key of group"},{"type":"reference","argument":"dialogs","category":"full","description":" Conversations in group"}],"attributes":[ -{"type":"string","id":1,"name":"title"} -,{"type":"string","id":2,"name":"key"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"DialogShort"}},"id":3,"name":"dialogs"} -]}}, { - "type":"struct", - "content": { - "name":"MessageReaction", -"doc":[ -"Reaction to message",{"type":"reference","argument":"users","category":"full","description":" User's reaction"},{"type":"reference","argument":"code","category":"full","description":" Reaction EMOJI code"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"users"} -,{"type":"string","id":2,"name":"code"} -]}}, { - "type":"struct", - "content": { - "name":"MessageOutReference", -"doc":[ -"Message Out Reference",{"type":"reference","argument":"peer","category":"full","description":" Out Peer of message"},{"type":"reference","argument":"rid","category":"full","description":" Message random id"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -]}},{"type":"rpc","content":{ -"name":"SendMessage", -"header":92, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Sending plain message",{"type":"reference","argument":"peer","category":"full","description":"Destination peer for message"},{"type":"reference","argument":"rid","category":"full","description":"Message random id (generated on client side)"},{"type":"reference","argument":"message","category":"full","description":"The message"},{"type":"reference","argument":"isOnlyForUser","category":"full","description":"If message is shown only for specific user"},{"type":"reference","argument":"quotedMessageReference","category":"full","description":"Quoted message if present"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"rid"} -,{"type":{"type":"trait","childType":"Message"},"id":4,"name":"message"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":5,"name":"isOnlyForUser"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageOutReference"}},"id":6,"name":"quotedMessageReference"} -]}},{"type":"rpc","content":{ -"name":"UpdateMessage", -"header":2658, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Changing Message content",{"type":"reference","argument":"peer","category":"full","description":"Destination Peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"updatedMessage","category":"full","description":"Updated Message content"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"trait","childType":"Message"},"id":3,"name":"updatedMessage"} -]}},{"type":"rpc","content":{ -"name":"MessageReceived", -"header":55, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Confirmation of plain message receive by device",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"date","category":"full","description":"Maximum date of received messages"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -]}},{"type":"rpc","content":{ -"name":"MessageRead", -"header":57, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Marking plain messages as read",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"date","category":"full","description":"Maximum date of read messages"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -]}},{"type":"rpc","content":{ -"name":"DeleteMessage", -"header":98, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Deleting messages",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rids","category":"full","description":"Message random id"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":3,"name":"rids"} -]}},{"type":"rpc","content":{ -"name":"ClearChat", -"header":99, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Clearing of conversation (without removing dialog from dialogs list)",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"DeleteChat", -"header":100, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Deleting of conversation (also leave group for group conversations)",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"ArchiveChat", -"header":2654, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Archiving chat",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"MessageSetReaction", -"header":210, -"response":{"type":"reference","name":"ReactionsResponse"}, -"doc":[ -"Setting Message reaction",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"code","category":"full","description":"Reaction code"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":"string","id":3,"name":"code"} -]}},{"type":"rpc","content":{ -"name":"MessageRemoveReaction", -"header":220, -"response":{"type":"reference","name":"ReactionsResponse"}, -"doc":[ -"Removing Message reaction",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"code","category":"full","description":"Reaction code"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":"string","id":3,"name":"code"} -]}},{"type":"response","content":{ -"name":"ReactionsResponse", -"header":219, -"doc":[ -"Response for reactions change"],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":3,"name":"reactions"} -]}},{"type":"update","content":{ -"name":"Message", -"header":55, -"doc":[ -"Update about plain message",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"senderUid","category":"full","description":" Sender of message"},{"type":"reference","argument":"date","category":"full","description":" date of message"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"message","category":"full","description":" message content"},{"type":"reference","argument":"attributes","category":"full","description":" optional message attributes"},{"type":"reference","argument":"quotedMessage","category":"full","description":" optional quoted message"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"senderUid"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"message"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":6,"name":"attributes"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":7,"name":"quotedMessage"} -]}},{"type":"update","content":{ -"name":"MessageContentChanged", -"header":162, -"doc":[ -"Update about message change",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"message","category":"full","description":" Message content"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"trait","childType":"Message"},"id":3,"name":"message"} -]}},{"type":"update","content":{ -"name":"MessageQuotedChanged", -"header":169, -"doc":[ -"Update about quoted message changed",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"quotedMessage","category":"full","description":" Quoted Message"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":3,"name":"quotedMessage"} -]}},{"type":"update","content":{ -"name":"MessageDateChanged", -"header":163, -"doc":[ -"Update about message date changed",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -]}},{"type":"update","content":{ -"name":"MessageSent", -"header":4, -"doc":[ -"Update about message sent",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -]}},{"type":"update","content":{ -"name":"MessageReceived", -"header":54, -"doc":[ -"Update about message received",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of received message"},{"type":"reference","argument":"receivedDate","category":"full","description":" Date of receive"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"receivedDate"} -]}},{"type":"update","content":{ -"name":"MessageRead", -"header":19, -"doc":[ -"Update about message read",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of read message"},{"type":"reference","argument":"readDate","category":"full","description":" Date of read"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"readDate"} -]}},{"type":"update","content":{ -"name":"MessageReadByMe", -"header":50, -"doc":[ -"Update about message read by me",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of read message"},{"type":"reference","argument":"unreadCounter","category":"full","description":" Optional unread counter in conversation"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} -,{"type":{"type":"opt","childType":"int32"},"id":3,"name":"unreadCounter"} -]}},{"type":"update","content":{ -"name":"MessageDelete", -"header":46, -"doc":[ -"Update about message delete",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rids","category":"full","description":" Deleted messages"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"rids"} -]}},{"type":"update","content":{ -"name":"ChatClear", -"header":47, -"doc":[ -"Update about chat clear",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -]}},{"type":"update","content":{ -"name":"ChatDelete", -"header":48, -"doc":[ -"Update about chat delete",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -]}},{"type":"update","content":{ -"name":"ChatArchive", -"header":94, -"doc":[ -"Update about chat archive",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -]}},{"type":"update","content":{ -"name":"ChatDropCache", -"header":2690, -"doc":[ -"Update about cache drop",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -]}},{"type":"update","content":{ -"name":"ChatGroupsChanged", -"header":1, -"doc":[ -"Update about chat groups changed. Called only when adding, removing and reordering of grouped dialog.",{"type":"reference","argument":"dialogs","category":"compact","description":" New dialgos list"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":1,"name":"dialogs"} -]}},{"type":"update","content":{ -"name":"ReactionsUpdate", -"header":222, -"doc":[ -"Update about reactions change",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Message random id"},{"type":"reference","argument":"reactions","category":"full","description":" New Reactions"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":3,"name":"reactions"} -]}}, { - "type": "enum", - "content": { - "name": "MessageState", - "values": [ - { - "name": "Sent", - "id": 1 - }, - { - "name": "Received", - "id": 2 - }, - { - "name": "Read", - "id": 3 + }, + "id": 4, + "name": "userPeers" + }] + }, + "doc": [ + "Importing phones and emails for building contact list", "Maximum amount of items for import per method call equals to 100.", { + "type": "reference", + "argument": "phones", + "category": "compact", + "description": "Phones for import" + }, { + "type": "reference", + "argument": "emails", + "category": "compact", + "description": "Emails for import" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "PhoneToImport" + } + }, + "id": 1, + "name": "phones" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EmailToImport" + } + }, + "id": 2, + "name": "emails" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 3, + "name": "optimizations" + }] + } + }, { + "type": "empty" + }, { + "type": "rpc", + "content": { + "name": "GetContacts", + "header": 87, + "response": { + "type": "anonymous", + "header": 88, + "doc": [ + "Current contact list", { + "type": "reference", + "argument": "users", + "category": "hidden", + "description": " User list if list is changed" + }, { + "type": "reference", + "argument": "isNotChanged", + "category": "full", + "description": " is list changed" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" } - ] - } - }, { - "type":"struct", - "content": { - "name":"MessageContainer", -"doc":[ -"Message from history",{"type":"reference","argument":"senderUid","category":"full","description":" Sender of mesasge"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"},{"type":"reference","argument":"message","category":"full","description":" Content of message"},{"type":"reference","argument":"reactions","category":"full","description":" Message reactions"},{"type":"reference","argument":"attribute","category":"full","description":" Optional message attributes"},{"type":"reference","argument":"quotedMessage","category":"full","description":" Optional quoted Message"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"senderUid"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"message"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"MessageState"}},"id":6,"name":"state"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":7,"name":"reactions"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":8,"name":"attribute"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":9,"name":"quotedMessage"} -]}}, { - "type": "enum", - "content": { - "name": "ListLoadMode", - "values": [ - { - "name": "Forward", - "id": 1 - }, - { - "name": "Backward", - "id": 2 - }, - { - "name": "Both", - "id": 3 + }, + "id": 1, + "name": "users" + }, { + "type": "bool", + "id": 2, + "name": "isNotChanged" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" } - ] - } - },{"type":"rpc","content":{ -"name":"LoadHistory", -"header":118, -"response":{"type":"anonymous","header":119, "doc":[ -"Loaded history",{"type":"reference","argument":"history","category":"compact","description":" Messages"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":1,"name":"history"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupPeers"} -]}, -"doc":[ -"Loading history of chat",{"type":"reference","argument":"peer","category":"full","description":"Peer of conversation"},{"type":"reference","argument":"date","category":"full","description":"start date of messages for loading or 0 for loading from start"},{"type":"reference","argument":"loadMode","category":"full","description":"Loading mode: Forward loading, backward or both ways"},{"type":"reference","argument":"limit","category":"full","description":"maximum amount of messages (max is 100)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"ListLoadMode"}},"id":5,"name":"loadMode"} -,{"type":"int32","id":4,"name":"limit"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":6,"name":"optimizations"} -]}}, { - "type":"struct", - "content": { - "name":"Dialog", -"doc":[ -"Conversation from history",{"type":"reference","argument":"peer","category":"full","description":" Peer of conversation"},{"type":"reference","argument":"unreadCount","category":"full","description":" plain messages unread messages count"},{"type":"reference","argument":"sortDate","category":"full","description":" date of conversation for sorting"},{"type":"reference","argument":"senderUid","category":"full","description":" Sender of top message (may be zero)"},{"type":"reference","argument":"rid","category":"full","description":" Random ID of top message (may be zero)"},{"type":"reference","argument":"date","category":"full","description":" Date of top message (can't be zero)"},{"type":"reference","argument":"message","category":"full","description":" Content of message"},{"type":"reference","argument":"firstUnreadDate","category":"full","description":" Date of first unread message"},{"type":"reference","argument":"attributes","category":"full","description":" Optional top message attributes"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":"int32","id":3,"name":"unreadCount"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"sortDate"} -,{"type":{"type":"alias","childType":"userId"},"id":5,"name":"senderUid"} -,{"type":{"type":"alias","childType":"randomId"},"id":6,"name":"rid"} -,{"type":{"type":"alias","childType":"date"},"id":7,"name":"date"} -,{"type":{"type":"trait","childType":"Message"},"id":8,"name":"message"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"MessageState"}},"id":9,"name":"state"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"date"}},"id":10,"name":"firstUnreadDate"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":11,"name":"attributes"} -]}},{"type":"rpc","content":{ -"name":"LoadDialogs", -"header":104, -"response":{"type":"anonymous","header":105, "doc":[ -"Loaded dialogs",{"type":"reference","argument":"groups","category":"compact","description":" Loaded groups"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"dialogs","category":"compact","description":" Loaded dialogs"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Dialog"}},"id":3,"name":"dialogs"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":5,"name":"groupPeers"} -]}, -"doc":[ -"Loading conversation history",{"type":"reference","argument":"minDate","category":"full","description":"start date of conversation loading. Use 0 to load latest messages"},{"type":"reference","argument":"limit","category":"full","description":"limit maximum amount of messages (max is 100)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":{"type":"alias","childType":"date"},"id":1,"name":"minDate"} -,{"type":"int32","id":2,"name":"limit"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"LoadArchived", -"header":2651, -"response":{"type":"anonymous","header":2652, "doc":[ -"Archived dialogs",{"type":"reference","argument":"groups","category":"full","description":" Referenced groups"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"dialogs","category":"full","description":" Archived dialogs"},{"type":"reference","argument":"nextOffset","category":"compact","description":" Offset for next bunch"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Dialog"}},"id":3,"name":"dialogs"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupPeers"} -,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"nextOffset"} -]}, -"doc":[ -"Loading archived messages",{"type":"reference","argument":"nextOffset","category":"compact","description":"Optional next offset"},{"type":"reference","argument":"limit","category":"full","description":"Maximum number of elements"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":{"type":"opt","childType":"bytes"},"id":1,"name":"nextOffset"} -,{"type":"int32","id":2,"name":"limit"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"LoadGroupedDialogs", -"header":225, -"response":{"type":"anonymous","header":226, "doc":[ -"Loaded grouped dialogs",{"type":"reference","argument":"dialogs","category":"compact","description":" Loaded groups of dialogs"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"groups","category":"full","description":" Loaded groups"},{"type":"reference","argument":"showArchived","category":"full","description":" Show archived section"},{"type":"reference","argument":"showInvite","category":"full","description":" Show invite message"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":1,"name":"dialogs"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} -,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"showArchived"} -,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"showInvite"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":6,"name":"userPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":7,"name":"groupPeers"} -]}, -"doc":[ -"Load all dialogs from grouped list"],"attributes":[ -{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":1,"name":"optimizations"} -]}},{"type":"response","content":{ -"name":"DialogsOrder", -"header":235, -"doc":[ -"Dialogs order response",{"type":"reference","argument":"seq","category":"full","description":" update seq"},{"type":"reference","argument":"state","category":"full","description":" update state"},{"type":"reference","argument":"groups","category":"full","description":" Update groups"}],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":3,"name":"groups"} -]}},{"type":"rpc","content":{ -"name":"HideDialog", -"header":231, -"response":{"type":"reference","name":"DialogsOrder"}, -"doc":[ -"Hide Dialog from grouped list",{"type":"reference","argument":"peer","category":"full","description":"Dialog peer"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"ShowDialog", -"header":232, -"response":{"type":"reference","name":"DialogsOrder"}, -"doc":[ -"Show Dialog in grouped list"],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"FavouriteDialog", -"header":224, -"response":{"type":"reference","name":"DialogsOrder"}, -"doc":[ -"Marking dialog as favourite",{"type":"reference","argument":"peer","category":"full","description":"Peer for favouriting"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"UnfavouriteDialog", -"header":227, -"response":{"type":"reference","name":"DialogsOrder"}, -"doc":[ -"Making dialog as unfavourite",{"type":"reference","argument":"peer","category":"full","description":"Peer for favouriting"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"NotifyDialogOpened", -"header":2785, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Notifying about dialog open",{"type":"reference","argument":"peer","category":"full","description":"Peer that was opened"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}}]}, { - "title": "Groups", - "package": "groups", - "items": [ -{"type":"comment","content":"Entities"}, { - "type":"struct", - "content": { - "name":"Member", -"doc":[ -"Member information",{"type":"reference","argument":"uid","category":"full","description":" User id"},{"type":"reference","argument":"inviterUid","category":"full","description":" User inviter id"},{"type":"reference","argument":"date","category":"full","description":" Adding date"},{"type":"reference","argument":"isAdmin","category":"full","description":" is member admin of group"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"inviterUid"} -,{"type":"int64","id":3,"name":"date"} -,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isAdmin"} -]}}, { - "type": "enum", - "content": { - "name": "GroupType", - "values": [ - { - "name": "GROUP", - "id": 1 - }, - { - "name": "CHANNEL", - "id": 2 + }, + "id": 3, + "name": "userPeers" + }] + }, + "doc": [ + "Getting current contact list", "SHA256 hash of list of a comma-separated list of contact UIDs in ascending", "order may be passed in contactsHash parameter.", "If the contact list was not changed, isNotChanged will be true.", { + "type": "reference", + "argument": "contactsHash", + "category": "full", + "description": "Hash of saved list in application" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "contactsHash" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 2, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RemoveContact", + "header": 89, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Removing contact from contact list", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": "Contact's UID" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": "Contact's AccessHash" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "rpc", + "content": { + "name": "AddContact", + "header": 114, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Adding contact to contact list", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": "Contact's UID" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": "Contact's AccessHash" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SearchContacts", + "header": 112, + "response": { + "type": "anonymous", + "header": 113, + "doc": [ + "Founded users", { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Founded users" + }, { + "type": "reference", + "argument": "userPeers", + "category": "compact", + "description": " Founded users peers" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" } - ] - } - }, { - "type": "enum", - "content": { - "name": "GroupPermissions", - "values": [ - { - "name": "SEND_MESSAGE", - "id": 1 - }, - { - "name": "CLEAR", - "id": 2 - }, - { - "name": "LEAVE", - "id": 3 - }, - { - "name": "DELETE", - "id": 4 - }, - { - "name": "JOIN", - "id": 5 - }, - { - "name": "VIEW_INFO", - "id": 6 + }, + "id": 1, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" } - ] - } - }, { - "type": "enum", - "content": { - "name": "GroupFullPermissions", - "values": [ - { - "name": "EDIT_INFO", - "id": 1 - }, - { - "name": "VIEW_MEMBERS", - "id": 2 - }, - { - "name": "INVITE_MEMBERS", - "id": 3 - }, - { - "name": "INVITE_VIA_LINK", - "id": 4 - }, - { - "name": "CALL", - "id": 5 - }, - { - "name": "EDIT_ADMIN_SETTINGS", - "id": 6 - }, - { - "name": "VIEW_ADMINS", - "id": 7 - }, - { - "name": "EDIT_ADMINS", - "id": 8 - }, - { - "name": "KICK_INVITED", - "id": 9 - }, - { - "name": "KICK_ANYONE", - "id": 10 - }, - { - "name": "EDIT_FOREIGN", - "id": 11 - }, - { - "name": "DELETE_FOREIGN", - "id": 12 + }, + "id": 2, + "name": "userPeers" + }] + }, + "doc": [ + "Searching contacts by user's query", { + "type": "reference", + "argument": "request", + "category": "full", + "description": "Search query" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "request" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 2, + "name": "optimizations" + }] + } + }, { + "type": "empty" + }, { + "type": "update", + "content": { + "name": "ContactRegistered", + "header": 5, + "doc": [ + "Update about contact registration", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " contact's uid" + }, { + "type": "reference", + "argument": "isSilent", + "category": "full", + "description": " is registration silent. If this value is true then don't show notification about registration" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " date of registration" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": "bool", + "id": 2, + "name": "isSilent" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }] + } + }, { + "type": "update", + "content": { + "name": "ContactsAdded", + "header": 40, + "doc": [ + "Update about contacts added", { + "type": "reference", + "argument": "uids", + "category": "compact", + "description": " added contacts" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 1, + "name": "uids" + }] + } + }, { + "type": "update", + "content": { + "name": "ContactsRemoved", + "header": 41, + "doc": [ + "Update about contacts removed", { + "type": "reference", + "argument": "uids", + "category": "compact", + "description": " removed contacts" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 1, + "name": "uids" + }] + } + }] + }, { + "title": "Privacy", + "package": "privacy", + "items": [{ + "type": "rpc", + "content": { + "name": "BlockUser", + "header": 2636, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Block User", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Peer for blocking" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnblockUser", + "header": 2637, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Unblock User", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Peer for unblocking" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadBlockedUsers", + "header": 2638, + "response": { + "type": "anonymous", + "header": 2639, + "doc": [{ + "type": "reference", + "argument": "userPeers", + "category": "full", + "description": " Blocked user peers" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" } - ] - } - }, { - "type":"struct", - "content": { - "name":"Group", -"doc":[ -"Group information","","Permissions.","Permissions of this structure is about group messages operation, such as","ability to send messages, clear chat, leave group and so on. This operations","Can be held outside of the Group Info page.","","Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.","If default is TRUE then ONE == FALSE.","Bits:","0 - canSendMessage. Default is FALSE.","1 - canClear. Default is FALSE.","2 - canLeave. Default is FALSE.","3 - canDelete. Default is FALSE.","4 - canJoin. Default is FALSE.","5 - canViewInfo. Default is FALSE.","",{"type":"reference","argument":"id","category":"full","description":" group id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Access hash of group"},{"type":"reference","argument":"title","category":"full","description":" Title of group"},{"type":"reference","argument":"avatar","category":"compact","description":" Avatar of group"},{"type":"reference","argument":"membersCount","category":"full","description":" Number of members"},{"type":"reference","argument":"isHidden","category":"full","description":" Is group hidden (not showing it in recent list). Default is false."},{"type":"reference","argument":"isMember","category":"full","description":" Is current user a member of a group. Default is true."},{"type":"reference","argument":"groupType","category":"full","description":" Group Type. Used only for displaying information. Default is GROUP."},{"type":"reference","argument":"permissions","category":"full","description":" Permissions of group object"},{"type":"reference","argument":"isDeleted","category":"full","description":" Is this group deleted"},{"type":"reference","argument":"ext","category":"full","description":" Group extension Data"},{"type":"reference","argument":"isAdmin","category":"full","description":" [DEPRECATED] Is current user an admin of a group"},{"type":"reference","argument":"theme","category":"hidden","description":" [DEPRECATED] Theme of group"},{"type":"reference","argument":"about","category":"hidden","description":" [DEPRECATED] About of group"},{"type":"reference","argument":"creatorUid","category":"hidden","description":" [DEPRECATED] Group creator"},{"type":"reference","argument":"members","category":"compact","description":" [DEPRECATED] Members of group"},{"type":"reference","argument":"createDate","category":"full","description":" [DEPRECATED] Date of creation"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":"string","id":3,"name":"title"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":4,"name":"avatar"} -,{"type":{"type":"opt","childType":"int32"},"id":24,"name":"membersCount"} -,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isMember"} -,{"type":{"type":"opt","childType":"bool"},"id":20,"name":"isHidden"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"GroupType"}},"id":25,"name":"groupType"} -,{"type":{"type":"opt","childType":"int64"},"id":26,"name":"permissions"} -,{"type":{"type":"opt","childType":"bool"},"id":27,"name":"isDeleted"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":22,"name":"ext"} -,{"type":{"type":"opt","childType":"bool"},"id":16,"name":"isAdmin", "deprecated":"true"} -,{"type":{"type":"alias","childType":"userId"},"id":8,"name":"creatorUid", "deprecated":"true"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":9,"name":"members", "deprecated":"true"} -,{"type":{"type":"alias","childType":"date"},"id":10,"name":"createDate", "deprecated":"true"} -,{"type":{"type":"opt","childType":"string"},"id":17,"name":"theme", "deprecated":"true"} -,{"type":{"type":"opt","childType":"string"},"id":18,"name":"about", "deprecated":"true"} -]}}, { - "type":"struct", - "content": { - "name":"GroupFull", -"doc":[ -"Goup Full information","Permissions.","Idea of Group Full mermissions is about Group Info pages. This permissions","are usefull only when trying to view and update group settings and not related","to chat messages itself.","Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.","If default is TRUE then ONE == FALSE.","Bits:","0 - canEditInfo. Default is FALSE.","1 - canViewMembers. Default is FALSE.","2 - canInviteMembers. Default is FALSE.","3 - canInviteViaLink. Default is FALSE.","4 - canCall. Default is FALSE.","5 - canEditAdminSettings. Default is FALSE.","6 - canViewAdmins. Default is FALSE.","7 - canEditAdmins. Default is FALSE.","8 - canKickInvited. Default is FALSE.","9 - canKickAnyone. Default is FALSE.","10 - canEditForeign. Default is FALSE.","11 - canDeleteForeign. Default is FALSE.","",{"type":"reference","argument":"id","category":"full","description":" Group Id"},{"type":"reference","argument":"createDate","category":"full","description":" Date created"},{"type":"reference","argument":"ownerUid","category":"full","description":" Optional group owner"},{"type":"reference","argument":"members","category":"full","description":" Group members. Can be empty when isAsyncMembers enabled."},{"type":"reference","argument":"theme","category":"full","description":" Group Theme"},{"type":"reference","argument":"about","category":"full","description":" Group about"},{"type":"reference","argument":"isAsyncMembers","category":"full","description":" Is Members need to be loaded asynchronous. Default is false."},{"type":"reference","argument":"isSharedHistory","category":"full","description":" Is history shared among all users. Default is false."},{"type":"reference","argument":"shortName","category":"full","description":" Group's short name"},{"type":"reference","argument":"permissions","category":"full","description":" Group Permissions"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"id"} -,{"type":{"type":"alias","childType":"date"},"id":6,"name":"createDate"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":5,"name":"ownerUid"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":12,"name":"members"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"theme"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":7,"name":"ext"} -,{"type":{"type":"opt","childType":"bool"},"id":11,"name":"isAsyncMembers"} -,{"type":{"type":"opt","childType":"bool"},"id":10,"name":"isSharedHistory"} -,{"type":{"type":"opt","childType":"string"},"id":14,"name":"shortName"} -,{"type":{"type":"opt","childType":"int64"},"id":27,"name":"permissions"} -]}},{"type":"rpc","content":{ -"name":"LoadFullGroups", -"header":2782, -"response":{"type":"anonymous","header":2783, "doc":[ -{"type":"reference","argument":"groups","category":"compact","description":" Groups to load"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"GroupFull"}},"id":1,"name":"groups"} -]}, -"doc":[ -"Loading Full Groups",{"type":"reference","argument":"groups","category":"compact","description":"Groups to load"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} -]}},{"type":"rpc","content":{ -"name":"LoadMembers", -"header":2786, -"response":{"type":"anonymous","header":2787, "doc":[ -{"type":"reference","argument":"users","category":"full","description":" Group members"},{"type":"reference","argument":"next","category":"full","description":" Load more reference"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":3,"name":"members"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} -,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"next"} -]}, -"doc":[ -"Loading group members",{"type":"reference","argument":"group","category":"full","description":"Group peer"},{"type":"reference","argument":"limit","category":"full","description":"Limit members"},{"type":"reference","argument":"next","category":"full","description":"Load more reference"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"group"} -,{"type":"int32","id":2,"name":"limit"} -,{"type":{"type":"opt","childType":"bytes"},"id":3,"name":"next"} -]}},{"type":"comment","content":"Update"},{"type":"update","content":{ -"name":"GroupTitleChanged", -"header":2609, -"doc":[ -"Update about title changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"title","category":"full","description":" Group Title"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"string","id":2,"name":"title"} -]}},{"type":"update","content":{ -"name":"GroupAvatarChanged", -"header":2610, -"doc":[ -"Update about avatar changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"avatar","category":"full","description":" Group Avatar"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":2,"name":"avatar"} -]}},{"type":"update","content":{ -"name":"GroupTopicChanged", -"header":2616, -"doc":[ -"Update about topic changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"topic","category":"full","description":" Updated topic"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"topic"} -]}},{"type":"update","content":{ -"name":"GroupAboutChanged", -"header":2617, -"doc":[ -"Update about about changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"about","category":"full","description":" Updated about"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} -]}},{"type":"update","content":{ -"name":"GroupExtChanged", -"header":2613, -"doc":[ -"Update about ext changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"ext","category":"full","description":" Updated ext"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} -]}},{"type":"update","content":{ -"name":"GroupFullExtChanged", -"header":2618, -"doc":[ -"Update about full ext changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"ext","category":"full","description":" Updated ext"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} -]}},{"type":"update","content":{ -"name":"GroupShortNameChanged", -"header":2628, -"doc":[ -"Group's short name changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"shortName","category":"full","description":" Group short name"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"shortName"} -]}},{"type":"update","content":{ -"name":"GroupOwnerChanged", -"header":2619, -"doc":[ -"Update about owner changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"userId","category":"full","description":" New Owner"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"userId"} -]}},{"type":"update","content":{ -"name":"GroupHistoryShared", -"header":2620, -"doc":[ -"Update about history shared",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -]}},{"type":"update","content":{ -"name":"GroupDeleted", -"header":2658, -"doc":[ -"Update about group deleted",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -]}},{"type":"update","content":{ -"name":"GroupPermissionsChanged", -"header":2663, -"doc":[ -"Update about group permissions changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"permissions","category":"full","description":" New Permissions"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"int64","id":2,"name":"permissions"} -]}},{"type":"update","content":{ -"name":"GroupFullPermissionsChanged", -"header":2664, -"doc":[ -"Update about Full Group permissions changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"permissions","category":"full","description":" New Permissions"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"int64","id":2,"name":"permissions"} -]}},{"type":"comment","content":" "},{"type":"update","content":{ -"name":"GroupMemberChanged", -"header":2612, -"doc":[ -"Update about membership changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"isMember","category":"full","description":" Is current user a member"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"bool","id":2,"name":"isMember"} -]}},{"type":"update","content":{ -"name":"GroupMembersBecameAsync", -"header":2615, -"doc":[ -"Update about members became async",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -]}},{"type":"update","content":{ -"name":"GroupMembersUpdated", -"header":2614, -"doc":[ -"Update about members updated",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"members","category":"full","description":" Group Members"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":2,"name":"members"} -]}},{"type":"update","content":{ -"name":"GroupMemberDiff", -"header":2623, -"doc":[ -"Update about members changed",{"type":"reference","argument":"removedUsers","category":"full","description":" Removed Users"},{"type":"reference","argument":"addedMembers","category":"full","description":" Added members"},{"type":"reference","argument":"membersCount","category":"full","description":" Current Members count"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"removedUsers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":3,"name":"addedMembers"} -,{"type":"int32","id":4,"name":"membersCount"} -]}},{"type":"update","content":{ -"name":"GroupMembersCountChanged", -"header":2622, -"doc":[ -"Update about members count changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"membersCount","category":"full","description":" Members count"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"int32","id":2,"name":"membersCount"} -]}},{"type":"update","content":{ -"name":"GroupMemberAdminChanged", -"header":2627, -"doc":[ -"Update about member admin changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"userId","category":"full","description":" User Id"},{"type":"reference","argument":"isAdmin","category":"full","description":" Is Admin flag"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"userId"} -,{"type":"bool","id":3,"name":"isAdmin"} -]}},{"type":"comment","content":"Actions"},{"type":"rpc","content":{ -"name":"CreateGroup", -"header":230, -"response":{"type":"anonymous","header":216, "doc":[ -"Created group",{"type":"reference","argument":"seq","category":"full","description":" Update Seq"},{"type":"reference","argument":"state","category":"compact","description":" Update state"},{"type":"reference","argument":"group","category":"full","description":" Created group"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"userPeers","category":"full","description":" Referenced users"},{"type":"reference","argument":"date","category":"full","description":" Group creation date"}] ,"attributes":[{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} -,{"type":{"type":"struct","childType":"Group"},"id":3,"name":"group"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userPeers"} -]}, -"doc":[ -"Creating group chat",{"type":"reference","argument":"rid","category":"full","description":"Random Id for avoiding double create"},{"type":"reference","argument":"title","category":"full","description":"Group Title"},{"type":"reference","argument":"users","category":"hidden","description":"Members of group"},{"type":"reference","argument":"groupType","category":"full","description":"Group Type"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"rid"} -,{"type":"string","id":2,"name":"title"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"GroupType"}},"id":6,"name":"groupType"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":7,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"EditGroupTitle", -"header":85, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Changing group title",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"title","category":"full","description":"new group title"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":"string","id":3,"name":"title"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"EditGroupAvatar", -"header":86, -"response":{"type":"anonymous","header":115, "doc":[ -"Updated group avatar",{"type":"reference","argument":"avatar","category":"compact","description":" Changed avatar"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"},{"type":"reference","argument":"date","category":"full","description":" Avatar change date"}] ,"attributes":[{"type":{"type":"struct","childType":"Avatar"},"id":1,"name":"avatar"} -,{"type":"int32","id":2,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}, -"doc":[ -"Changing group avatar",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"fileLocation","category":"compact","description":"uploaded file for avatar"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":{"type":"struct","childType":"FileLocation"},"id":3,"name":"fileLocation"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"RemoveGroupAvatar", -"header":101, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Removing group avatar",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"EditGroupShortName", -"header":2793, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Edit Group Short Name",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"shortName","category":"full","description":"New group's short name"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"shortName"} -]}},{"type":"rpc","content":{ -"name":"EditGroupTopic", -"header":211, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Edit group topic",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random id of operation"},{"type":"reference","argument":"topic","category":"full","description":"New Topic"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"topic"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":4,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"EditGroupAbout", -"header":213, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Edit Group About",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random id of operation"},{"type":"reference","argument":"about","category":"full","description":"New About"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"InviteUser", -"header":69, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Inviting user to group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"user","category":"full","description":"Users for invitation"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":3,"name":"user"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"LeaveGroup", -"header":70, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Leaving group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"LeaveAndDelete", -"header":2721, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Leave group and Delete Chat",{"type":"reference","argument":"groupPeer","category":"full","description":"Group peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"KickUser", -"header":71, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Kicking user from group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"user","category":"full","description":"users for removing"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":3,"name":"user"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"JoinGroupByPeer", -"header":2722, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Join group by peer",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"JoinGroupByGroupId", -"header":44561, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Join group by peer without a necessity of invite",{"type":"reference","argument":"groupId","category":"hidden","description":"Groups peer"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -]}},{"type":"comment","content":"Administration"},{"type":"rpc","content":{ -"name":"MakeUserAdmin", -"header":2784, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Make user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} -]}},{"type":"rpc","content":{ -"name":"DismissUserAdmin", -"header":2791, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Dismissing user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} -]}},{"type":"rpc","content":{ -"name":"TransferOwnership", -"header":2789, -"response":{"type":"reference","name":"SeqDate"}, -"doc":[ -"Transfer ownership of group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"newOwner","category":"full","description":"New group's owner"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"newOwner"} -]}}, { - "type":"struct", - "content": { - "name":"AdminSettings", -"doc":[ -"Admin Settings",{"type":"reference","argument":"showAdminsToMembers","category":"full","description":" Show admins in member list"},{"type":"reference","argument":"canMembersInvite","category":"full","description":" Can members of a group invite people"},{"type":"reference","argument":"canMembersEditGroupInfo","category":"full","description":" Can members edit group info"},{"type":"reference","argument":"canAdminsEditGroupInfo","category":"full","description":" Can admins edit group info"},{"type":"reference","argument":"showJoinLeaveMessages","category":"full","description":" Should join and leave messages be visible to members"}],"expandable":"true","attributes":[ -{"type":"bool","id":1,"name":"showAdminsToMembers"} -,{"type":"bool","id":2,"name":"canMembersInvite"} -,{"type":"bool","id":3,"name":"canMembersEditGroupInfo"} -,{"type":"bool","id":4,"name":"canAdminsEditGroupInfo"} -,{"type":"bool","id":5,"name":"showJoinLeaveMessages"} -]}},{"type":"rpc","content":{ -"name":"LoadAdminSettings", -"header":2790, -"response":{"type":"anonymous","header":2794, "doc":[ -"Loaded settings",{"type":"reference","argument":"settings","category":"full","description":" Current group admin settings"}] ,"attributes":[{"type":{"type":"struct","childType":"AdminSettings"},"id":1,"name":"settings"} -]}, -"doc":[ -"Loading administration settings",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"SaveAdminSettings", -"header":2792, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Save administartion settings",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's Peer"},{"type":"reference","argument":"settings","category":"full","description":"Group's settings"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"struct","childType":"AdminSettings"},"id":2,"name":"settings"} -]}},{"type":"rpc","content":{ -"name":"DeleteGroup", -"header":2795, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Delete Group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"ShareHistory", -"header":2796, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Share History",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"comment","content":"Invite"},{"type":"response","content":{ -"name":"InviteUrl", -"header":178, -"doc":[ -"Response for invite url methods"],"attributes":[ -{"type":"string","id":1,"name":"url"} -]}},{"type":"rpc","content":{ -"name":"GetGroupInviteUrl", -"header":177, -"response":{"type":"reference","name":"InviteUrl"}, -"doc":[ -"Building invite url",{"type":"reference","argument":"groupPeer","category":"full","description":"Destination group peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"RevokeInviteUrl", -"header":179, -"response":{"type":"reference","name":"InviteUrl"}, -"doc":[ -"Revoking invite urls",{"type":"reference","argument":"groupPeer","category":"full","description":"Destination group peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"JoinGroup", -"header":180, -"response":{"type":"anonymous","header":181, "doc":[ -{"type":"reference","argument":"group","category":"hidden","description":" Joined group"},{"type":"reference","argument":"users","category":"hidden","description":" Users from members"},{"type":"reference","argument":"userPeers","category":"hidden","description":" User Peers"},{"type":"reference","argument":"rid","category":"full","description":" Random id"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"hidden","description":" State"},{"type":"reference","argument":"date","category":"full","description":" Date of join"}] ,"attributes":[{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":5,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":7,"name":"userPeers"} -,{"type":{"type":"alias","childType":"randomId"},"id":6,"name":"rid"} -,{"type":"int32","id":2,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}, -"doc":[ -"Join group method",{"type":"reference","argument":"token","category":"full","description":"Url or Token for joining to group"},{"type":"reference","argument":"optimizations","category":"hidden","description":"Enabled Optimizations"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} -]}},{"type":"comment","content":"Obsolete Actions"},{"type":"rpc","content":{ -"name":"CreateGroupObsolete", -"header":65, -"response":{"type":"anonymous","header":66, "doc":[ -"Created group",{"type":"reference","argument":"groupPeer","category":"full","description":" Peer of created group"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"},{"type":"reference","argument":"users","category":"compact","description":" Members of created group"},{"type":"reference","argument":"date","category":"full","description":" Group creation date"}] ,"attributes":[{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":"int32","id":3,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":4,"name":"state"} -,{"type":{"type":"list","childType":"int32"},"id":5,"name":"users"} -,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} -]}, -"doc":[ -"[OBSOLETE] Creating group chat",{"type":"reference","argument":"rid","category":"full","description":"Random Id for avoiding double create"},{"type":"reference","argument":"title","category":"full","description":"Title of new group"},{"type":"reference","argument":"users","category":"compact","description":"Members of new group"}],"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"rid"} -,{"type":"string","id":2,"name":"title"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} -]}},{"type":"rpc","content":{ -"name":"EnterGroupObsolete", -"header":199, -"response":{"type":"anonymous","header":200, "doc":[ -"Joined group",{"type":"reference","argument":"group","category":"full","description":" Joined group"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"rid","category":"full","description":" Rid of join message"},{"type":"reference","argument":"seq","category":"full","description":" Seq of Update"},{"type":"reference","argument":"state","category":"full","description":" State of Update"},{"type":"reference","argument":"date","category":"full","description":" Date of update"}] ,"attributes":[{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"rid"} -,{"type":"int32","id":4,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":5,"name":"state"} -,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} -]}, -"doc":[ -"[OBSOLETE] Join random group by peer id",{"type":"reference","argument":"peer","category":"full","description":"Public group peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"MakeUserAdminObsolete", -"header":214, -"response":{"type":"anonymous","header":215, "doc":[ -{"type":"reference","argument":"members","category":"full","description":" new members"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":1,"name":"members"} -,{"type":"int32","id":2,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -]}, -"doc":[ -"[OBSOLETE] Make user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} -]}},{"type":"comment","content":"Obsolete Updates"},{"type":"update","content":{ -"name":"GroupInviteObsolete", -"header":36, -"doc":[ -"Update about inviting current user to group",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"inviteUid","category":"full","description":" Inviter UID. If equals to current uid than group created by user."},{"type":"reference","argument":"date","category":"full","description":" Date of creating"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":9,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":5,"name":"inviteUid"} -,{"type":{"type":"alias","childType":"date"},"id":8,"name":"date"} -]}},{"type":"update","content":{ -"name":"GroupUserInvitedObsolete", -"header":21, -"doc":[ -"Update about inviting user to group",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Added user ID"},{"type":"reference","argument":"inviterUid","category":"full","description":" Inviter user ID"},{"type":"reference","argument":"date","category":"full","description":" Date of adding user to group"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"inviterUid"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}},{"type":"update","content":{ -"name":"GroupUserLeaveObsolete", -"header":23, -"doc":[ -"Update about leaving user",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" User's ID"},{"type":"reference","argument":"date","category":"full","description":" Date of user leave"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -]}},{"type":"update","content":{ -"name":"GroupUserKickObsolete", -"header":24, -"doc":[ -"Update about kicking user",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Kicked user's ID"},{"type":"reference","argument":"kickerUid","category":"full","description":" Kicker user's ID"},{"type":"reference","argument":"date","category":"full","description":" Date of user kick"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"kickerUid"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}},{"type":"update","content":{ -"name":"GroupMembersUpdateObsolete", -"header":44, -"doc":[ -"Silent group members update",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"members","category":"full","description":" New members list"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":2,"name":"members"} -]}},{"type":"update","content":{ -"name":"GroupTitleChangedObsolete", -"header":38, -"doc":[ -"Update about group title change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Changer UID"},{"type":"reference","argument":"title","category":"full","description":" New Title of group"},{"type":"reference","argument":"date","category":"full","description":" Date of title change"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":"string","id":3,"name":"title"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}},{"type":"update","content":{ -"name":"GroupTopicChangedObsolete", -"header":213, -"doc":[ -"Update about group topic change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Changer UID"},{"type":"reference","argument":"topic","category":"full","description":" New topic of group"},{"type":"reference","argument":"date","category":"full","description":" Date of theme change"},{"type":"reference","argument":"rid","category":"full","description":" Randomd Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"uid"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"topic"} -,{"type":{"type":"alias","childType":"date"},"id":5,"name":"date"} -]}},{"type":"update","content":{ -"name":"GroupAboutChangedObsolete", -"header":214, -"doc":[ -"Update about group about change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"about","category":"full","description":" Group about"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} -]}},{"type":"update","content":{ -"name":"GroupAvatarChangedObsolete", -"header":39, -"doc":[ -"Update about group avatar change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Avatar changer uid"},{"type":"reference","argument":"avatar","category":"compact","description":" New Avatar. If null then avatar is removed"},{"type":"reference","argument":"date","category":"full","description":" Date of avatar change"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":3,"name":"avatar"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} -]}}]}, { - "title": "Stickers", - "package": "stickers", - "doc": [ - "Stickers support in Actor" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"StickerDescriptor", -"doc":[ -"Descriptor of a Sticker",{"type":"reference","argument":"id","category":"full","description":" Sticker unique id"},{"type":"reference","argument":"emoji","category":"full","description":" Emoji code for sticker"},{"type":"reference","argument":"image128","category":"full","description":" Image of sticker 128x128 in WebP format"},{"type":"reference","argument":"image512","category":"full","description":" Image of sticker 512x512 in WebP format"},{"type":"reference","argument":"image256","category":"full","description":" Image of sticker 256x256 in WebP format"}],"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"emoji"} -,{"type":{"type":"struct","childType":"ImageLocation"},"id":3,"name":"image128"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":4,"name":"image512"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":5,"name":"image256"} -]}}, { - "type":"struct", - "content": { - "name":"StickerCollection", -"doc":[ -"Sticker collection",{"type":"reference","argument":"id","category":"full","description":" Unique id of a collection"},{"type":"reference","argument":"accessHash","category":"full","description":" Access Hash of a collection"},{"type":"reference","argument":"stickers","category":"compact","description":" Sticker list"}],"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"StickerDescriptor"}},"id":3,"name":"stickers"} -]}},{"type":"response","content":{ -"name":"StickersReponse", -"header":240, -"doc":[ -"Stickers response",{"type":"reference","argument":"collections","category":"full","description":" Sticker collections"},{"type":"reference","argument":"seq","category":"full","description":" Seq of update"},{"type":"reference","argument":"state","category":"full","description":" State of update"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} -,{"type":"int32","id":2,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -]}},{"type":"rpc","content":{ -"name":"LoadOwnStickers", -"header":238, -"response":{"type":"anonymous","header":239, "doc":[ -"Own Stickers collections",{"type":"reference","argument":"ownStickers","category":"hidden","description":" Own sticker collections"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"ownStickers"} -]}, -"doc":[ -"Loading own stickers"],"attributes":[ -]}},{"type":"update","content":{ -"name":"OwnStickersChanged", -"header":161, -"doc":[ -"Own Stickers changed",{"type":"reference","argument":"collections","category":"compact","description":" New own sticker collections"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} -]}},{"type":"update","content":{ -"name":"StickerCollectionsChanged", -"header":164, -"doc":[ -"Sticker collection changed",{"type":"reference","argument":"collections","category":"full","description":" Updated sticker collections"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} -]}},{"type":"rpc","content":{ -"name":"AddStickerCollection", -"header":244, -"response":{"type":"reference","name":"StickersReponse"}, -"doc":[ -"Adding sticker collection",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -]}},{"type":"rpc","content":{ -"name":"RemoveStickerCollection", -"header":245, -"response":{"type":"reference","name":"StickersReponse"}, -"doc":[ -"Removing sticker collection",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -]}},{"type":"rpc","content":{ -"name":"LoadStickerCollection", -"header":246, -"response":{"type":"anonymous","header":247, "doc":[ -"Loaded collection",{"type":"reference","argument":"collection","category":"full","description":" Collection of stickers"}] ,"attributes":[{"type":{"type":"struct","childType":"StickerCollection"},"id":1,"name":"collection"} -]}, -"doc":[ -"Loading stickers",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -]}}]}, { - "title": "Search", - "package": "search", - "doc": [ - "Searching API" - ], - "items": [ - { - "type": "enum", - "content": { - "name": "SearchPeerType", - "values": [ - { - "name": "Groups", - "id": 1 - }, - { - "name": "Contacts", - "id": 2 - }, - { - "name": "Public", - "id": 3 + }, + "id": 1, + "name": "userPeers" + }] + }, + "doc": [ + "Load Blocked Users" + ], + "attributes": [] + } + }, { + "type": "update", + "content": { + "name": "UserBlocked", + "header": 2629, + "doc": [ + "Update about User Blocked", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }] + } + }, { + "type": "update", + "content": { + "name": "UserUnblocked", + "header": 2630, + "doc": [ + "Update about User Unblocked", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }] + } + }] + }, { + "title": "Messaging", + "package": "messaging", + "doc": [ + "Actor can work with encrypted and plain messages in one conversation. For both types of messages API", + "contains a bit different methods. Also encrypted and plain messages have different schemes.", + "

Messages

", + "Message entity contains:", + "
    ", + "
  • PeerType - group chat or private
  • ", + "
  • PeerId - group or user id of conversation
  • ", + "
  • RandomId - unique id of message that generated by sender. In Encrypted messages random id is encrypted.
  • ", + "
  • Date - date of message (calculated on server)
  • ", + "
  • Content
  • ", + "
", + "

Message content

", + "Message can be one of three basic types of messages: Text Message, File Message and Service message.", + "All messages can contain extensions. For example we can send text message and add markdown extension with", + "formatted text in markdown and clients that support this extension will show markdown, and that clients that", + "not supported extension then show simple text. File messages can have photo, video or voice extensions.", + "Service message can have extensions extensions such as \"user added\", \"group created\", \"avatar changed\", etc.", + "

Send messages

", + "Sending messages looks same for encrypted and plain messages. Client MUST prepare all required data", + "before sending message (for example FastThumb for photo/video/documents) and call required methods.", + "Encrypted messages differs here only by a little different scheme and encryption.", + "

WRONG_KEYS and incorrect keys

", + "For sending encrypted messages client MUST send messages encrypted for all own and receivers keys.", + "If client send encryption with missing, old or incorrect keys it will receive WRONG_KEYS.", + "In WRONG_KEYS you need to deserialize relatedData from RpcError to WrongKeysErrorData", + "and get detailed information about keys. Sometimes there are some broken keys on server and client can't", + "encrypt messages with it than client MUST send empty encrypted key in request elsewhere API return WRONG_KEYS.", + "

Encrypted messages and New Devices

", + "When you send message to someone and when he registered with new device there are no way to receive old encrypted", + "messages on new device and because of this there are a problem about read/delivery statuses.", + "Alice send messages to Bob, but Bob lose his device and buy new iPhone and installed Actor.", + "Alice receive notification about new device and send another message. Bob open chat with Alice and", + "send read status with maximum message read date. Alice will mark all sent messages as read and one that", + "was not delivered. We can use status notifications per message, but in VERY heavy conversations it will be", + "a lot of unnecessary traffic. For resolving this small issue we have different ways of message statuses", + "for encrypted and plain messages. Also it is recomended to mark all undelivered messages on new device update as", + "not devered with warring sign.", + "

Message Read and Delivery

", + "There are two different ways for read and delivery statuses for encrypted and plain messages.", + "For encrypted messages used status change by RandomId and for plain messages used by maximum", + "date of read/delivered message." + ], + "items": [{ + "type": "struct", + "content": { + "name": "MessageAttributes", + "doc": [ + "Message Attributes", { + "type": "reference", + "argument": "isMentioned", + "category": "full", + "description": " Is mentioned. If set overrides built-in value." + }, { + "type": "reference", + "argument": "isHighlighted", + "category": "full", + "description": " Is message highlighted. Default is false." + }, { + "type": "reference", + "argument": "isNotified", + "category": "full", + "description": " Is notified. If set overrides built-in settings." + }, { + "type": "reference", + "argument": "isOnlyForYou", + "category": "full", + "description": " If this message is only for you. Default is false" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 1, + "name": "isMentioned" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 2, + "name": "isHighlighted" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 3, + "name": "isNotified" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 4, + "name": "isOnlyForYou" + }] + } + }, { + "type": "struct", + "content": { + "name": "QuotedMessage", + "doc": [ + "Quoted Message", { + "type": "reference", + "argument": "messageId", + "category": "full", + "description": " Message Id if present" + }, { + "type": "reference", + "argument": "publicGroupId", + "category": "full", + "description": " Public Group id if present" + }, { + "type": "reference", + "argument": "senderUserId", + "category": "full", + "description": " Sender of message" + }, { + "type": "reference", + "argument": "messageDate", + "category": "full", + "description": " Date of message" + }, { + "type": "reference", + "argument": "quotedMessageContent", + "category": "full", + "description": " Optional Quoted Message Content. Can be empty if messageId is present and message is in current peer." + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "randomId" + } + }, + "id": 1, + "name": "messageId" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "groupId" + } + }, + "id": 2, + "name": "publicGroupId" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 3, + "name": "senderUserId" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "messageDate" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "Message" + } + }, + "id": 5, + "name": "quotedMessageContent" + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "Message", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "TextMessage", + "doc": [ + "Text message", { + "type": "reference", + "argument": "text", + "category": "danger", + "description": " the text" + }, { + "type": "reference", + "argument": "mentions", + "category": "full", + "description": " User mentions in message" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " Optional bytes of extension" + } + ], + "trait": { + "name": "Message", + "key": 1 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "text" + }, { + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 2, + "name": "mentions" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "TextMessageEx" + } + }, + "id": 3, + "name": "ext" + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "TextMessageEx", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "TextExMarkdown", + "doc": [ + "Markdown extension", { + "type": "reference", + "argument": "markdown", + "category": "full", + "description": " Markdown text" + } + ], + "trait": { + "name": "TextMessageEx", + "key": 1 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 2, + "name": "markdown" + }] + } + }, { + "type": "struct", + "content": { + "name": "TextModernMessage", + "doc": [ + "Modern text message", { + "type": "reference", + "argument": "text", + "category": "full", + "description": " optional text of message" + }, { + "type": "reference", + "argument": "senderNameOverride", + "category": "full", + "description": " optional overriding of sender" + }, { + "type": "reference", + "argument": "senderPhotoOverride", + "category": "full", + "description": " optional overriding sender's photo" + }, { + "type": "reference", + "argument": "style", + "category": "full", + "description": " optional paragraph style" + }, { + "type": "reference", + "argument": "attaches", + "category": "full", + "description": " optional Attaches of message" + } + ], + "trait": { + "name": "TextMessageEx", + "key": 2 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "text" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "senderNameOverride" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 3, + "name": "senderPhotoOverride" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ParagraphStyle" + } + }, + "id": 4, + "name": "style" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "TextModernAttach" + } + }, + "id": 5, + "name": "attaches" + }] + } + }, { + "type": "struct", + "content": { + "name": "ParagraphStyle", + "doc": [ + "Paragraph style", { + "type": "reference", + "argument": "showParagraph", + "category": "full", + "description": " Show quote-like paragraph?" + }, { + "type": "reference", + "argument": "paragraphColor", + "category": "full", + "description": " Override paragraph color" + }, { + "type": "reference", + "argument": "bgColor", + "category": "full", + "description": " Override background color" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 1, + "name": "showParagraph" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "Color" + } + }, + "id": 2, + "name": "paragraphColor" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "Color" + } + }, + "id": 3, + "name": "bgColor" + }] + } + }, { + "type": "struct", + "content": { + "name": "TextModernAttach", + "doc": [ + "Attaches to message", { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Attach of message" + }, { + "type": "reference", + "argument": "titleUrl", + "category": "full", + "description": " Attach title url" + }, { + "type": "reference", + "argument": "titleIcon", + "category": "full", + "description": " Attach title icon" + }, { + "type": "reference", + "argument": "text", + "category": "full", + "description": " Attach text" + }, { + "type": "reference", + "argument": "style", + "category": "full", + "description": " Attach style" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "title" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "titleUrl" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ImageLocation" + } + }, + "id": 3, + "name": "titleIcon" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "text" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ParagraphStyle" + } + }, + "id": 5, + "name": "style" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "TextModernField" + } + }, + "id": 6, + "name": "fields" + }] + } + }, { + "type": "struct", + "content": { + "name": "TextModernField", + "doc": [ + "Modern message fields", { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Field title" + }, { + "type": "reference", + "argument": "value", + "category": "full", + "description": " Field value" + }, { + "type": "reference", + "argument": "isShort", + "category": "full", + "description": " Is field can be shown in compact way (default is TRUE)" + } + ], + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "title" + }, { + "type": "string", + "id": 2, + "name": "value" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 3, + "name": "isShort" + }] + } + }, { + "type": "struct", + "content": { + "name": "TextCommand", + "doc": [ + "Text Command Message for bots", { + "type": "reference", + "argument": "command", + "category": "full", + "description": " Slash-Command For execution" + }, { + "type": "reference", + "argument": "args", + "category": "full", + "description": " Arguments of slash command" + } + ], + "trait": { + "name": "TextMessageEx", + "key": 3 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "command" + }, { + "type": "string", + "id": 2, + "name": "args" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceMessage", + "doc": [ + "Service message", { + "type": "reference", + "argument": "text", + "category": "full", + "description": " service message text" + }, { + "type": "reference", + "argument": "ext", + "category": "compact", + "description": " Extension" + } + ], + "trait": { + "name": "Message", + "key": 2 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "text" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "ServiceEx" + } + }, + "id": 3, + "name": "ext" + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "ServiceEx", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExUserInvited", + "doc": [ + "Service message about adding user to group", { + "type": "reference", + "argument": "invitedUid", + "category": "full", + "description": " added user id" + } + ], + "trait": { + "name": "ServiceEx", + "key": 1 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "invitedUid" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExUserJoined", + "doc": [ + "Service message about user join to group" + ], + "trait": { + "name": "ServiceEx", + "key": 17 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExUserKicked", + "doc": [ + "Service message about kicking user from group", { + "type": "reference", + "argument": "kickedUid", + "category": "full", + "description": " kicked user id" + } + ], + "trait": { + "name": "ServiceEx", + "key": 2 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "kickedUid" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExUserLeft", + "doc": [ + "Service message about user left group" + ], + "trait": { + "name": "ServiceEx", + "key": 3 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExGroupCreated", + "doc": [ + "Service message about group creating" + ], + "trait": { + "name": "ServiceEx", + "key": 4 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExChangedTitle", + "doc": [ + "Service message about group title change", { + "type": "reference", + "argument": "title", + "category": "full", + "description": " New group title" + } + ], + "trait": { + "name": "ServiceEx", + "key": 5 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "title" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExChangedTopic", + "doc": [ + "Service message on group topic change", { + "type": "reference", + "argument": "topic", + "category": "full", + "description": " New group topic" + } + ], + "trait": { + "name": "ServiceEx", + "key": 18 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "topic" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExChangedAbout", + "doc": [ + "Service message on group about change", { + "type": "reference", + "argument": "about", + "category": "full", + "description": " New group about" + } + ], + "trait": { + "name": "ServiceEx", + "key": 19 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "about" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExChangedAvatar", + "doc": [ + "Service message about avatar change", { + "type": "reference", + "argument": "avatar", + "category": "compact", + "description": " Updated avatar" + } + ], + "trait": { + "name": "ServiceEx", + "key": 6 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 1, + "name": "avatar" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExContactRegistered", + "doc": [ + "Service message about user registration", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User Id" + } + ], + "trait": { + "name": "ServiceEx", + "key": 8 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExPhoneMissed", + "doc": [ + "Update about missing phone call" + ], + "trait": { + "name": "ServiceEx", + "key": 9 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExPhoneCall", + "doc": [ + "Update about phone call", { + "type": "reference", + "argument": "duration", + "category": "full", + "description": " Duration of a phone call" + } + ], + "trait": { + "name": "ServiceEx", + "key": 16 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "duration" + }] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExChatArchived", + "doc": [ + "Message about chat archived" + ], + "trait": { + "name": "ServiceEx", + "key": 20 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "ServiceExChatRestored", + "doc": [ + "Message about chat restored" + ], + "trait": { + "name": "ServiceEx", + "key": 21 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "DocumentMessage", + "doc": [ + "File message", { + "type": "reference", + "argument": "fileId", + "category": "full", + "description": " file id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " file access hash" + }, { + "type": "reference", + "argument": "fileSize", + "category": "full", + "description": " file size" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " name of file" + }, { + "type": "reference", + "argument": "mimeType", + "category": "full", + "description": " mimetype of file" + }, { + "type": "reference", + "argument": "thumb", + "category": "compact", + "description": " optional thumb of file. JPEG less that 90x90 with 60-70 quality." + }, { + "type": "reference", + "argument": "ext", + "category": "compact", + "description": " Extension" + } + ], + "trait": { + "name": "Message", + "key": 3 + }, + "expandable": "true", + "attributes": [{ + "type": "int64", + "id": 1, + "name": "fileId" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": "int32", + "id": 3, + "name": "fileSize" + }, { + "type": "string", + "id": 4, + "name": "name" + }, { + "type": "string", + "id": 5, + "name": "mimeType" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "FastThumb" + } + }, + "id": 6, + "name": "thumb" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "DocumentEx" + } + }, + "id": 8, + "name": "ext" + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "DocumentEx", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "DocumentExPhoto", + "doc": [ + "File photo extension. Can be set ONLY for JPEG.", { + "type": "reference", + "argument": "w", + "category": "full", + "description": " image width" + }, { + "type": "reference", + "argument": "h", + "category": "full", + "description": " image height" + } + ], + "trait": { + "name": "DocumentEx", + "key": 1 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "w" + }, { + "type": "int32", + "id": 2, + "name": "h" + }] + } + }, { + "type": "struct", + "content": { + "name": "DocumentExVideo", + "doc": [ + "File video extension", { + "type": "reference", + "argument": "w", + "category": "full", + "description": " video width" + }, { + "type": "reference", + "argument": "h", + "category": "full", + "description": " video height" + }, { + "type": "reference", + "argument": "duration", + "category": "full", + "description": " video duration" + } + ], + "trait": { + "name": "DocumentEx", + "key": 2 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "w" + }, { + "type": "int32", + "id": 2, + "name": "h" + }, { + "type": "int32", + "id": 3, + "name": "duration" + }] + } + }, { + "type": "struct", + "content": { + "name": "DocumentExVoice", + "doc": [ + "File voice extension", { + "type": "reference", + "argument": "duration", + "category": "full", + "description": " voice duration" + } + ], + "trait": { + "name": "DocumentEx", + "key": 3 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "duration" + }] + } + }, { + "type": "struct", + "content": { + "name": "DocumentExAnimation", + "doc": [ + "Animation extension. Can be set ONLY for GIF.", { + "type": "reference", + "argument": "w", + "category": "full", + "description": " Animation width" + }, { + "type": "reference", + "argument": "h", + "category": "full", + "description": " Animation height" + } + ], + "trait": { + "name": "DocumentEx", + "key": 6 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "w" + }, { + "type": "int32", + "id": 2, + "name": "h" + }] + } + }, { + "type": "struct", + "content": { + "name": "DocumentExAnimationVid", + "doc": [ + "Animation video extension. More compact version of Animation with video codec instead of GIF.", "Can be set ONLY for MP4.", { + "type": "reference", + "argument": "w", + "category": "full", + "description": " Animation width" + }, { + "type": "reference", + "argument": "h", + "category": "full", + "description": " Animation height" + }, { + "type": "reference", + "argument": "duration", + "category": "full", + "description": " Animation duration" + } + ], + "trait": { + "name": "DocumentEx", + "key": 7 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "w" + }, { + "type": "int32", + "id": 2, + "name": "h" + }, { + "type": "int32", + "id": 3, + "name": "duration" + }] + } + }, { + "type": "struct", + "content": { + "name": "JsonMessage", + "doc": [ + "Custom-data JsonMessage", { + "type": "reference", + "argument": "rawJson", + "category": "danger", + "description": " JSON object" + } + ], + "trait": { + "name": "Message", + "key": 4 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "rawJson" + }] + } + }, { + "type": "struct", + "content": { + "name": "UnsupportedMessage", + "doc": [ + "Explicit type for unsupported message" + ], + "trait": { + "name": "Message", + "key": 5 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "StickerMessage", + "doc": [ + "Sticker message", { + "type": "reference", + "argument": "stickerId", + "category": "full", + "description": " Optional Unique ID of sticker" + }, { + "type": "reference", + "argument": "fastPreview", + "category": "full", + "description": " Optional Fast preview of sticker in webp format" + }, { + "type": "reference", + "argument": "image512", + "category": "full", + "description": " Optional 512x512 sticker image in webp format" + }, { + "type": "reference", + "argument": "image256", + "category": "full", + "description": " Optional 256x256 sticker image in webp format" + }, { + "type": "reference", + "argument": "stickerCollectionId", + "category": "full", + "description": " Optional Collection ID" + }, { + "type": "reference", + "argument": "stickerCollectionAccessHash", + "category": "full", + "description": " Optional Collection Access Hash" + } + ], + "trait": { + "name": "Message", + "key": 6 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 1, + "name": "stickerId" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 2, + "name": "fastPreview" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ImageLocation" + } + }, + "id": 3, + "name": "image512" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ImageLocation" + } + }, + "id": 4, + "name": "image256" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 5, + "name": "stickerCollectionId" + }, { + "type": { + "type": "opt", + "childType": "int64" + }, + "id": 6, + "name": "stickerCollectionAccessHash" + }] + } + }, { + "type": "struct", + "content": { + "name": "BinaryMessage", + "doc": [ + "Binary Message. Useful for implementing your own content types", { + "type": "reference", + "argument": "contentTag", + "category": "full", + "description": " Content Tag" + }, { + "type": "reference", + "argument": "msg", + "category": "compact", + "description": " Message contents" + } + ], + "trait": { + "name": "Message", + "key": 7 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "contentTag" + }, { + "type": "bytes", + "id": 2, + "name": "msg" + }] + } + }, { + "type": "struct", + "content": { + "name": "EncryptedMessage", + "doc": [ + "Encrypted Message", { + "type": "reference", + "argument": "box", + "category": "full", + "description": " Encrypted box" + } + ], + "trait": { + "name": "Message", + "key": 8 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "struct", + "childType": "EncryptedBox" + }, + "id": 1, + "name": "box" + }] + } + }, { + "type": "struct", + "content": { + "name": "EmptyMessage", + "doc": [ + "Empty Message" + ], + "trait": { + "name": "Message", + "key": 9 + }, + "expandable": "true", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "DialogShort", + "doc": [ + "Short Dialog from grouped conversation list", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Peer of conversation" + }, { + "type": "reference", + "argument": "counter", + "category": "full", + "description": " Conversation unread count" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Conversation top message date" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": "int32", + "id": 2, + "name": "counter" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + } + }, { + "type": "struct", + "content": { + "name": "DialogGroup", + "doc": [ + "Grouped dialog list", { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Title of group" + }, { + "type": "reference", + "argument": "key", + "category": "full", + "description": " Key of group" + }, { + "type": "reference", + "argument": "dialogs", + "category": "full", + "description": " Conversations in group" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "title" + }, { + "type": "string", + "id": 2, + "name": "key" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "DialogShort" + } + }, + "id": 3, + "name": "dialogs" + }] + } + }, { + "type": "struct", + "content": { + "name": "MessageReaction", + "doc": [ + "Reaction to message", { + "type": "reference", + "argument": "users", + "category": "full", + "description": " User's reaction" + }, { + "type": "reference", + "argument": "code", + "category": "full", + "description": " Reaction EMOJI code" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 1, + "name": "users" + }, { + "type": "string", + "id": 2, + "name": "code" + }] + } + }, { + "type": "struct", + "content": { + "name": "MessageOutReference", + "doc": [ + "Message Out Reference", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Out Peer of message" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Message random id" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SendMessage", + "header": 92, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Sending plain message", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer for message" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Message random id (generated on client side)" + }, { + "type": "reference", + "argument": "message", + "category": "full", + "description": "The message" + }, { + "type": "reference", + "argument": "isOnlyForUser", + "category": "full", + "description": "If message is shown only for specific user" + }, { + "type": "reference", + "argument": "quotedMessageReference", + "category": "full", + "description": "Quoted message if present" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 3, + "name": "rid" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 4, + "name": "message" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 5, + "name": "isOnlyForUser" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MessageOutReference" + } + }, + "id": 6, + "name": "quotedMessageReference" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UpdateMessage", + "header": 2658, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Changing Message content", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination Peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Message random id" + }, { + "type": "reference", + "argument": "updatedMessage", + "category": "full", + "description": "Updated Message content" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 3, + "name": "updatedMessage" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MessageReceived", + "header": 55, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Confirmation of plain message receive by device", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": "Maximum date of received messages" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MessageRead", + "header": 57, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Marking plain messages as read", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": "Maximum date of read messages" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DeleteMessage", + "header": 98, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Deleting messages", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "rids", + "category": "full", + "description": "Message random id" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "randomId" + } + }, + "id": 3, + "name": "rids" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ClearChat", + "header": 99, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Clearing of conversation (without removing dialog from dialogs list)", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Conversation peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DeleteChat", + "header": 100, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Deleting of conversation (also leave group for group conversations)", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Conversation peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ArchiveChat", + "header": 2654, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Archiving chat", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Conversation peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MessageSetReaction", + "header": 210, + "response": { + "type": "reference", + "name": "ReactionsResponse" + }, + "doc": [ + "Setting Message reaction", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Message random id" + }, { + "type": "reference", + "argument": "code", + "category": "full", + "description": "Reaction code" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": "string", + "id": 3, + "name": "code" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MessageRemoveReaction", + "header": 220, + "response": { + "type": "reference", + "name": "ReactionsResponse" + }, + "doc": [ + "Removing Message reaction", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Message random id" + }, { + "type": "reference", + "argument": "code", + "category": "full", + "description": "Reaction code" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": "string", + "id": 3, + "name": "code" + }] + } + }, { + "type": "response", + "content": { + "name": "ReactionsResponse", + "header": 219, + "doc": [ + "Response for reactions change" + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageReaction" + } + }, + "id": 3, + "name": "reactions" + }] + } + }, { + "type": "update", + "content": { + "name": "Message", + "header": 55, + "doc": [ + "Update about plain message", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "senderUid", + "category": "full", + "description": " Sender of message" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " date of message" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Rid of message" + }, { + "type": "reference", + "argument": "message", + "category": "full", + "description": " message content" + }, { + "type": "reference", + "argument": "attributes", + "category": "full", + "description": " optional message attributes" + }, { + "type": "reference", + "argument": "quotedMessage", + "category": "full", + "description": " optional quoted message" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "senderUid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 5, + "name": "message" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MessageAttributes" + } + }, + "id": 6, + "name": "attributes" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "QuotedMessage" + } + }, + "id": 7, + "name": "quotedMessage" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageContentChanged", + "header": 162, + "doc": [ + "Update about message change", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Rid of message" + }, { + "type": "reference", + "argument": "message", + "category": "full", + "description": " Message content" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 3, + "name": "message" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageQuotedChanged", + "header": 169, + "doc": [ + "Update about quoted message changed", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Rid of message" + }, { + "type": "reference", + "argument": "quotedMessage", + "category": "full", + "description": " Quoted Message" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "QuotedMessage" + } + }, + "id": 3, + "name": "quotedMessage" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageDateChanged", + "header": 163, + "doc": [ + "Update about message date changed", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Rid of message" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of message" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageSent", + "header": 4, + "doc": [ + "Update about message sent", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Rid of message" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of message" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageReceived", + "header": 54, + "doc": [ + "Update about message received", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "startDate", + "category": "full", + "description": " Start date of received message" + }, { + "type": "reference", + "argument": "receivedDate", + "category": "full", + "description": " Date of receive" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 2, + "name": "startDate" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "receivedDate" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageRead", + "header": 19, + "doc": [ + "Update about message read", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "startDate", + "category": "full", + "description": " Start date of read message" + }, { + "type": "reference", + "argument": "readDate", + "category": "full", + "description": " Date of read" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 2, + "name": "startDate" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "readDate" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageReadByMe", + "header": 50, + "doc": [ + "Update about message read by me", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "startDate", + "category": "full", + "description": " Start date of read message" + }, { + "type": "reference", + "argument": "unreadCounter", + "category": "full", + "description": " Optional unread counter in conversation" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 2, + "name": "startDate" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 3, + "name": "unreadCounter" + }] + } + }, { + "type": "update", + "content": { + "name": "MessageDelete", + "header": 46, + "doc": [ + "Update about message delete", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "rids", + "category": "full", + "description": " Deleted messages" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "randomId" + } + }, + "id": 2, + "name": "rids" + }] + } + }, { + "type": "update", + "content": { + "name": "ChatClear", + "header": 47, + "doc": [ + "Update about chat clear", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "update", + "content": { + "name": "ChatDelete", + "header": 48, + "doc": [ + "Update about chat delete", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "update", + "content": { + "name": "ChatArchive", + "header": 94, + "doc": [ + "Update about chat archive", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "update", + "content": { + "name": "ChatDropCache", + "header": 2690, + "doc": [ + "Update about cache drop", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "update", + "content": { + "name": "ChatGroupsChanged", + "header": 1, + "doc": [ + "Update about chat groups changed. Called only when adding, removing and reordering of grouped dialog.", { + "type": "reference", + "argument": "dialogs", + "category": "compact", + "description": " New dialgos list" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "DialogGroup" + } + }, + "id": 1, + "name": "dialogs" + }] + } + }, { + "type": "update", + "content": { + "name": "ReactionsUpdate", + "header": 222, + "doc": [ + "Update about reactions change", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Message random id" + }, { + "type": "reference", + "argument": "reactions", + "category": "full", + "description": " New Reactions" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageReaction" + } + }, + "id": 3, + "name": "reactions" + }] + } + }, { + "type": "enum", + "content": { + "name": "MessageState", + "values": [{ + "name": "Sent", + "id": 1 + }, { + "name": "Received", + "id": 2 + }, { + "name": "Read", + "id": 3 + }] + } + }, { + "type": "struct", + "content": { + "name": "MessageContainer", + "doc": [ + "Message from history", { + "type": "reference", + "argument": "senderUid", + "category": "full", + "description": " Sender of mesasge" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of message" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of message" + }, { + "type": "reference", + "argument": "message", + "category": "full", + "description": " Content of message" + }, { + "type": "reference", + "argument": "reactions", + "category": "full", + "description": " Message reactions" + }, { + "type": "reference", + "argument": "attribute", + "category": "full", + "description": " Optional message attributes" + }, { + "type": "reference", + "argument": "quotedMessage", + "category": "full", + "description": " Optional quoted Message" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "senderUid" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 5, + "name": "message" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "MessageState" + } + }, + "id": 6, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageReaction" + } + }, + "id": 7, + "name": "reactions" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MessageAttributes" + } + }, + "id": 8, + "name": "attribute" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "QuotedMessage" + } + }, + "id": 9, + "name": "quotedMessage" + }] + } + }, { + "type": "enum", + "content": { + "name": "ListLoadMode", + "values": [{ + "name": "Forward", + "id": 1 + }, { + "name": "Backward", + "id": 2 + }, { + "name": "Both", + "id": 3 + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadHistory", + "header": 118, + "response": { + "type": "anonymous", + "header": 119, + "doc": [ + "Loaded history", { + "type": "reference", + "argument": "history", + "category": "compact", + "description": " Messages" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Loaded users" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageContainer" } - ] - } - }, { - "type": "enum", - "content": { - "name": "SearchContentType", - "values": [ - { - "name": "Any", - "id": 1 - }, - { - "name": "Text", - "id": 2 - }, - { - "name": "Links", - "id": 3 - }, - { - "name": "Documents", - "id": 4 - }, - { - "name": "Photos", - "id": 5 + }, + "id": 1, + "name": "history" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" } - ] - } - },{"type":"trait","content":{ -"isContainer":"true","name":"SearchCondition","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"SearchPeerTypeCondition", -"doc":[ -"Search peer type condition",{"type":"reference","argument":"peerType","category":"full","description":" Peer type for searching"}],"trait":{"name":"SearchCondition","key":1},"attributes":[ -{"type":{"type":"enum","childType":"SearchPeerType"},"id":1,"name":"peerType"} -]}}, { - "type":"struct", - "content": { - "name":"SearchPieceText", -"doc":[ -"Search peer name condition",{"type":"reference","argument":"query","category":"full","description":" Search query"}],"trait":{"name":"SearchCondition","key":2},"attributes":[ -{"type":"string","id":1,"name":"query"} -]}}, { - "type":"struct", - "content": { - "name":"SearchAndCondition", -"doc":[ -"Search AND condion",{"type":"reference","argument":"andQuery","category":"full","description":" And Query"}],"trait":{"name":"SearchCondition","key":3},"attributes":[ -{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":1,"name":"andQuery"} -]}}, { - "type":"struct", - "content": { - "name":"SearchOrCondition", -"doc":[ -"Search OR condition",{"type":"reference","argument":"orQuery","category":"full","description":" Or Query"}],"trait":{"name":"SearchCondition","key":4},"attributes":[ -{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":2,"name":"orQuery"} -]}}, { - "type":"struct", - "content": { - "name":"SearchPeerCondition", -"doc":[ -"Serch Peer condition",{"type":"reference","argument":"peer","category":"full","description":" Peer condition"}],"trait":{"name":"SearchCondition","key":5},"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -]}}, { - "type":"struct", - "content": { - "name":"SearchPeerContentType", -"doc":[ -"Search content type condition",{"type":"reference","argument":"contentType","category":"full","description":" Content Type"}],"trait":{"name":"SearchCondition","key":6},"attributes":[ -{"type":{"type":"enum","childType":"SearchContentType"},"id":1,"name":"contentType"} -]}}, { - "type":"struct", - "content": { - "name":"SearchSenderIdConfition", -"doc":[ -"Searching sender uid condition",{"type":"reference","argument":"senderId","category":"full","description":" sender UID"}],"trait":{"name":"SearchCondition","key":7},"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"senderId"} -]}}, { - "type":"struct", - "content": { - "name":"PeerSearchResult", -"doc":[ -"Peer search result",{"type":"reference","argument":"peer","category":"full","description":" Peer information"},{"type":"reference","argument":"optMatchString","category":"full","description":" Description"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"optMatchString"} -]}},{"type":"rpc","content":{ -"name":"PeerSearch", -"header":233, -"response":{"type":"anonymous","header":234, "doc":[ -"Found peers",{"type":"reference","argument":"searchResults","category":"full","description":" Search Results"},{"type":"reference","argument":"users","category":"full","description":" Related users"},{"type":"reference","argument":"groups","category":"full","description":" Related groups"},{"type":"reference","argument":"userPeers","category":"full","description":" Related user peers"},{"type":"reference","argument":"groupPeers","category":"full","description":" Related group peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"PeerSearchResult"}},"id":1,"name":"searchResults"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":5,"name":"groupPeers"} -]}, -"doc":[ -"Performing peer search",{"type":"reference","argument":"query","category":"full","description":"Search query. Warring not all combinations can be processed by server. (acts as OR)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":1,"name":"query"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} -]}}, { - "type":"struct", - "content": { - "name":"MessageSearchResult", -"doc":[ -"Message container",{"type":"reference","argument":"peer","category":"full","description":" Message Peer"},{"type":"reference","argument":"rid","category":"full","description":" Message Random Id"},{"type":"reference","argument":"date","category":"full","description":" Message Date"},{"type":"reference","argument":"senderId","category":"full","description":" Message sender UID"},{"type":"reference","argument":"content","category":"full","description":" Message content"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -,{"type":{"type":"alias","childType":"userId"},"id":4,"name":"senderId"} -,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"content"} -]}}, { - "type":"struct", - "content": { - "name":"MessageSearchItem", -"doc":[ -"Message Search result container"],"attributes":[ -{"type":{"type":"struct","childType":"MessageSearchResult"},"id":1,"name":"result"} -]}},{"type":"response","content":{ -"name":"MessageSearchResponse", -"header":218, -"doc":[ -"Search Result",{"type":"reference","argument":"searchResults","category":"full","description":" Search results"},{"type":"reference","argument":"users","category":"full","description":" Search users"},{"type":"reference","argument":"groups","category":"full","description":" Search groups"},{"type":"reference","argument":"loadMoreState","category":"hidden","description":" State for loading more results"},{"type":"reference","argument":"userOutPeers","category":"full","description":" Search user peers"},{"type":"reference","argument":"groupOutPeers","category":"full","description":" Search group peers"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"MessageSearchItem"}},"id":1,"name":"searchResults"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} -,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"loadMoreState"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userOutPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupOutPeers"} -]}},{"type":"rpc","content":{ -"name":"MessageSearch", -"header":217, -"response":{"type":"reference","name":"MessageSearchResponse"}, -"doc":[ -"Performing message search",{"type":"reference","argument":"query","category":"full","description":"Search query"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":{"type":"trait","childType":"SearchCondition"},"id":1,"name":"query"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"MessageSearchMore", -"header":222, -"response":{"type":"reference","name":"MessageSearchResponse"}, -"doc":[ -"Performing message search paging",{"type":"reference","argument":"loadMoreState","category":"hidden","description":"State for loading more results"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ -{"type":"bytes","id":1,"name":"loadMoreState"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} -]}}]}, { - "title": "Public Groups", - "package": "pubgroups", - "doc": [ - "Public group is easy way to find communities" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"PublicGroup", -"doc":[ -"Public Group description",{"type":"reference","argument":"id","category":"full","description":" Group id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Group Access hash"},{"type":"reference","argument":"title","category":"full","description":" Group title"},{"type":"reference","argument":"avatar","category":"full","description":" Group avatar"},{"type":"reference","argument":"membersCount","category":"full","description":" Members count in group"},{"type":"reference","argument":"friendsCount","category":"full","description":" Friends count int group"},{"type":"reference","argument":"description","category":"full","description":" Description of group"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":"string","id":3,"name":"title"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":7,"name":"avatar"} -,{"type":"int32","id":4,"name":"membersCount"} -,{"type":"int32","id":5,"name":"friendsCount"} -,{"type":"string","id":6,"name":"description"} -]}},{"type":"rpc","content":{ -"name":"GetPublicGroups", -"header":201, -"response":{"type":"anonymous","header":202, "doc":[ -"Loaded public groups",{"type":"reference","argument":"groups","category":"full","description":" All available groups"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"PublicGroup"}},"id":1,"name":"groups"} -]}, -"doc":[ -"Getting public groups"],"attributes":[ -]}}]}, { - "title": "Invites", - "package": "invites", - "doc": [ - "Invite mechanizm" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"InviteState", -"doc":[ -"Invite state",{"type":"reference","argument":"email","category":"full","description":" Email of invite"},{"type":"reference","argument":"name","category":"full","description":" Name of invited user"},{"type":"reference","argument":"uid","category":"full","description":" Uid of registered user"},{"type":"reference","argument":"tid","category":"full","description":" Team id of invite"}],"attributes":[ -{"type":"string","id":1,"name":"email"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} -,{"type":{"type":"opt","childType":"int32"},"id":3,"name":"uid"} -,{"type":{"type":"opt","childType":"int32"},"id":4,"name":"tid"} -]}},{"type":"response","content":{ -"name":"InviteList", -"header":2564, -"doc":[ -"Intites list",{"type":"reference","argument":"invites","category":"full","description":" Intvites"},{"type":"reference","argument":"relatedUsers","category":"full","description":" Related users in invites"},{"type":"reference","argument":"relatedGroups","category":"full","description":" Related groups in invites"},{"type":"reference","argument":"relatedTeams","category":"full","description":" Related teams in invites"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"InviteState"}},"id":1,"name":"invites"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"relatedUsers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"relatedGroups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":4,"name":"relatedTeams"} -]}},{"type":"rpc","content":{ -"name":"LoadOwnSentInvites", -"header":2563, -"response":{"type":"reference","name":"InviteList"}, -"doc":[ -"Loading current invite states"],"attributes":[ -]}},{"type":"rpc","content":{ -"name":"SendInvite", -"header":2565, -"response":{"type":"reference","name":"InviteList"}, -"doc":[ -"Sending an email invite",{"type":"reference","argument":"email","category":"full","description":"Email for invite"},{"type":"reference","argument":"name","category":"full","description":"Optional name for invite"},{"type":"reference","argument":"destTeam","category":"full","description":"Optional team for invite"}],"attributes":[ -{"type":"string","id":1,"name":"email"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"OutTeam"}},"id":3,"name":"destTeam"} -]}}]}, { - "title": "Teams", - "package": "teams", - "doc": [ - "Teams support for Actor" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"Team", -"doc":[ -"Team entity",{"type":"reference","argument":"id","category":"full","description":" Team Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Team Access Hash"},{"type":"reference","argument":"name","category":"full","description":" Team name"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -,{"type":"string","id":3,"name":"name"} -]}}, { - "type":"struct", - "content": { - "name":"OutTeam", -"doc":[ -"Reference to a team",{"type":"reference","argument":"id","category":"full","description":" Team Id"},{"type":"reference","argument":"accessHash","category":"full","description":" Team access hash"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"int64","id":2,"name":"accessHash"} -]}},{"type":"response","content":{ -"name":"TeamsList", -"header":2562, -"doc":[ -"Teams response",{"type":"reference","argument":"teams","category":"hidden","description":" Teams list"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":1,"name":"teams"} -]}},{"type":"rpc","content":{ -"name":"LoadOwnTeams", -"header":2561, -"response":{"type":"reference","name":"TeamsList"}, -"doc":[ -"Loading own teams"],"attributes":[ -]}},{"type":"update","content":{ -"name":"OwnTeamsChanged", -"header":165, -"doc":[ -"Update about own teams changed",{"type":"reference","argument":"ownTeams","category":"full","description":" Updated own teams list"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":1,"name":"ownTeams"} -]}},{"type":"rpc","content":{ -"name":"CreateTeam", -"header":2566, -"response":{"type":"anonymous","header":2567, "doc":[ -"Created team response",{"type":"reference","argument":"createdTeam","category":"full","description":" Created Team"}] ,"attributes":[{"type":{"type":"struct","childType":"Team"},"id":1,"name":"createdTeam"} -]}, -"doc":[ -"Creation of a Team",{"type":"reference","argument":"title","category":"full","description":"Title of a team"}],"attributes":[ -{"type":"string","id":1,"name":"title"} -]}},{"type":"rpc","content":{ -"name":"InviteToTeam", -"header":2568, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Inviting people to team",{"type":"reference","argument":"user","category":"full","description":"Dest user"},{"type":"reference","argument":"destTeam","category":"full","description":"Dest team"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"user"} -,{"type":{"type":"struct","childType":"OutTeam"},"id":3,"name":"destTeam"} -]}}]}, { - "title": "Integrations", - "package": "integrations", - "doc": [ - "Package contains methods for providing integration" - ], - "items": [ -{"type":"response","content":{ -"name":"IntegrationToken", -"header":183, -"doc":[ -"Group token response",{"type":"reference","argument":"token","category":"danger","description":" current group token"},{"type":"reference","argument":"url","category":"danger","description":" current group url"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -,{"type":"string","id":2,"name":"url"} -]}},{"type":"rpc","content":{ -"name":"GetIntegrationToken", -"header":182, -"response":{"type":"reference","name":"IntegrationToken"}, -"doc":[ -"Getting current group token",{"type":"reference","argument":"groupPeer","category":"full","description":"Peer"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"groupPeer"} -]}},{"type":"rpc","content":{ -"name":"RevokeIntegrationToken", -"header":184, -"response":{"type":"reference","name":"IntegrationToken"}, -"doc":[ -"Revoke group token",{"type":"reference","argument":"groupPeer","category":"full","description":"Peer"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"groupPeer"} -]}}]}, { - "title": "Typing and Online", - "package": "weak", - "items": [ - { - "type": "enum", - "content": { - "name": "TypingType", - "values": [ - { - "name": "Text", - "id": 0 + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" } - ] - } - },{"type":"rpc","content":{ -"name":"Typing", -"header":27, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Sending typing notification",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"typingType","category":"full","description":"typing type."}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} -]}},{"type":"rpc","content":{ -"name":"StopTyping", -"header":30, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Stop typing",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"typingType","category":"full","description":"typing type"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"enum","childType":"TypingType"},"id":2,"name":"typingType"} -]}}, { - "type": "enum", - "content": { - "name": "DeviceType", - "values": [ - { - "name": "GENERIC", - "id": 1 - }, - { - "name": "PC", - "id": 2 - }, - { - "name": "MOBILE", - "id": 3 - }, - { - "name": "TABLET", - "id": 4 - }, - { - "name": "WATCH", - "id": 5 - }, - { - "name": "MIRROR", - "id": 6 - }, - { - "name": "CAR", - "id": 7 - }, - { - "name": "TABLE", - "id": 8 + }, + "id": 4, + "name": "userPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" } - ] - } - },{"type":"rpc","content":{ -"name":"SetOnline", -"header":29, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Sending online state",{"type":"reference","argument":"isOnline","category":"full","description":"is user online"},{"type":"reference","argument":"timeout","category":"full","description":"timeout of online state in milliseconds"},{"type":"reference","argument":"deviceType","category":"full","description":"Optional device type"},{"type":"reference","argument":"deviceCategory","category":"full","description":"Optional device category, for example android or ios"}],"attributes":[ -{"type":"bool","id":1,"name":"isOnline"} -,{"type":{"type":"alias","childType":"msec"},"id":2,"name":"timeout"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":3,"name":"deviceType"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"deviceCategory"} -]}},{"type":"update","content":{ -"name":"PauseNotifications", -"header":166, -"doc":[ -"Update about pausing notifications",{"type":"reference","argument":"timeout","category":"full","description":" Timeout for notifications resume"}],"attributes":[ -{"type":{"type":"alias","childType":"sec"},"id":1,"name":"timeout"} -]}},{"type":"update","content":{ -"name":"RestoreNotifications", -"header":167, -"doc":[ -"Update about restoring notifications"],"attributes":[ -]}},{"type":"rpc","content":{ -"name":"PauseNotifications", -"header":2641, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Pause notifications",{"type":"reference","argument":"timeout","category":"hidden","description":"Timeout of pause"}],"attributes":[ -{"type":{"type":"alias","childType":"sec"},"id":1,"name":"timeout"} -]}},{"type":"rpc","content":{ -"name":"RestoreNotifications", -"header":2642, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Restoring notifications"],"attributes":[ -]}},{"type":"empty"},{"type":"update","content":{ -"name":"Typing", -"header":6, -"doc":[ -"Update about user's typing",{"type":"reference","argument":"peer","category":"full","description":" Conversation peer"},{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"typingType","category":"full","description":" Type of typing"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} -]}},{"type":"update","content":{ -"name":"TypingStop", -"header":81, -"doc":[ -"Update about user's typing stop",{"type":"reference","argument":"peer","category":"full","description":" Conversation peer"},{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"typingType","category":"hidden","description":" Type of typing"}],"attributes":[ -{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} -,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} -]}},{"type":"update","content":{ -"name":"UserOnline", -"header":7, -"doc":[ -"Update about user became online",{"type":"reference","argument":"uid","category":"full","description":" User's Id"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":2,"name":"deviceType"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"deviceCategory"} -]}},{"type":"update","content":{ -"name":"UserOffline", -"header":8, -"doc":[ -"Update about user became offline",{"type":"reference","argument":"uid","category":"full","description":" User's id"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":2,"name":"deviceType"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"deviceCategory"} -]}},{"type":"update","content":{ -"name":"UserLastSeen", -"header":9, -"doc":[ -"Update about user's last seen state",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"date","category":"full","description":" Last seen time"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"alias","childType":"date"},"id":2,"name":"date"} -,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":3,"name":"deviceType"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"deviceCategory"} -]}},{"type":"update","content":{ -"name":"GroupOnline", -"header":33, -"doc":[ -"Update about group online change",{"type":"reference","argument":"groupId","category":"full","description":" Group id"},{"type":"reference","argument":"count","category":"full","description":" current online user's count"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"int32","id":2,"name":"count"} -]}}]}, { - "title": "Media and Files", - "package": "files", - "items": [ - { - "type":"struct", - "content": { - "name":"FileLocation", -"doc":[ -"Location of file on server",{"type":"reference","argument":"fileId","category":"full","description":" Unique Id of file"},{"type":"reference","argument":"accessHash","category":"danger","description":" Access hash of file"}],"expandable":"true","attributes":[ -{"type":"int64","id":1,"name":"fileId"} -,{"type":"int64","id":2,"name":"accessHash"} -]}}, { - "type":"struct", - "content": { - "name":"ImageLocation", -"doc":[ -"Image location",{"type":"reference","argument":"fileLocation","category":"full","description":" Location of file"},{"type":"reference","argument":"width","category":"full","description":" Width of avatar image"},{"type":"reference","argument":"height","category":"full","description":" Height of avatar image"},{"type":"reference","argument":"fileSize","category":"full","description":" Size of file"}],"expandable":"true","attributes":[ -{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} -,{"type":"int32","id":2,"name":"width"} -,{"type":"int32","id":3,"name":"height"} -,{"type":"int32","id":4,"name":"fileSize"} -]}}, { - "type":"struct", - "content": { - "name":"AvatarImage", -"doc":[ -"Avatar Image",{"type":"reference","argument":"fileLocation","category":"full","description":" Location of file"},{"type":"reference","argument":"width","category":"full","description":" Width of avatar image"},{"type":"reference","argument":"height","category":"full","description":" Height of avatar image"},{"type":"reference","argument":"fileSize","category":"full","description":" Size of file"}],"expandable":"true","attributes":[ -{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} -,{"type":"int32","id":2,"name":"width"} -,{"type":"int32","id":3,"name":"height"} -,{"type":"int32","id":4,"name":"fileSize"} -]}}, { - "type":"struct", - "content": { - "name":"Avatar", -"doc":[ -"Avatar of User or Group",{"type":"reference","argument":"smallImage","category":"compact","description":" Optional small image of avatar box in 100x100"},{"type":"reference","argument":"largeImage","category":"compact","description":" Optional large image of avatar box in 200x200"},{"type":"reference","argument":"fullImage","category":"compact","description":" Optional full screen image of avatar"}],"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":1,"name":"smallImage"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":2,"name":"largeImage"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":3,"name":"fullImage"} -]}}, { - "type":"struct", - "content": { - "name":"FastThumb", -"doc":[ -"Fast thumb of media messages. Less than 90x90 and compressed by JPEG with low quality",{"type":"reference","argument":"w","category":"full","description":" Width of thumb"},{"type":"reference","argument":"h","category":"full","description":" Height of thump"},{"type":"reference","argument":"thumb","category":"compact","description":" compressed image data"}],"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"w"} -,{"type":"int32","id":2,"name":"h"} -,{"type":"bytes","id":3,"name":"thumb"} -]}}, { - "type": "enum", - "content": { - "name": "Colors", - "values": [ - { - "name": "red", - "id": 1 - }, - { - "name": "yellow", - "id": 2 - }, - { - "name": "green", - "id": 3 + }, + "id": 5, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" } - ] - } - },{"type":"trait","content":{ -"isContainer":"true","name":"Color","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"RgbColor", -"doc":[ -"RGB Color",{"type":"reference","argument":"rgb","category":"full","description":" RGB color value"}],"trait":{"name":"Color","key":1},"expandable":"true","attributes":[ -{"type":"int32","id":1,"name":"rgb"} -]}}, { - "type":"struct", - "content": { - "name":"PredefinedColor", -"doc":[ -"Predefined color",{"type":"reference","argument":"color","category":"hidden","description":" Predefined color value"}],"trait":{"name":"Color","key":2},"expandable":"true","attributes":[ -{"type":{"type":"enum","childType":"Colors"},"id":1,"name":"color"} -]}},{"type":"empty"}, { - "type":"struct", - "content": { - "name":"HTTPHeader", -"doc":[ -"HTTP Header record",{"type":"reference","argument":"key","category":"full","description":" HTTP Header name"},{"type":"reference","argument":"value","category":"full","description":" HTTP Header value"}],"attributes":[ -{"type":"string","id":1,"name":"key"} -,{"type":"string","id":2,"name":"value"} -]}}, { - "type":"struct", - "content": { - "name":"FileUrlDescription", -"doc":[ -"File url description",{"type":"reference","argument":"fileId","category":"full","description":" File id of url"},{"type":"reference","argument":"url","category":"full","description":" Url for downloading"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url"},{"type":"reference","argument":"unsignedUrl","category":"hidden","description":" Unsigned URL (used to honor web caches)"},{"type":"reference","argument":"unsignedUrlHeaders","category":"hidden","description":" Headers that is required to download files with unsigned url"}],"attributes":[ -{"type":"int64","id":1,"name":"fileId"} -,{"type":"string","id":2,"name":"url"} -,{"type":{"type":"alias","childType":"sec"},"id":3,"name":"timeout"} -,{"type":{"type":"opt","childType":"string"},"id":4,"name":"unsignedUrl"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"HTTPHeader"}},"id":5,"name":"unsignedUrlHeaders"} -]}},{"type":"rpc","content":{ -"name":"GetFileUrl", -"header":77, -"response":{"type":"anonymous","header":78, "doc":[ -{"type":"reference","argument":"url","category":"full","description":" Url for downloading"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url"},{"type":"reference","argument":"unsignedUrl","category":"full","description":" Unsigned URL (used to honor web caches)"},{"type":"reference","argument":"unsignedUrlHeaders","category":"full","description":" Headers that is required to download files with unsigned url"}] ,"attributes":[{"type":"string","id":1,"name":"url"} -,{"type":{"type":"alias","childType":"sec"},"id":2,"name":"timeout"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"unsignedUrl"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"HTTPHeader"}},"id":4,"name":"unsignedUrlHeaders"} -]}, -"doc":[ -"Requesting file URL for downloading",{"type":"reference","argument":"file","category":"full","description":"file's location"}],"attributes":[ -{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"file"} -]}},{"type":"rpc","content":{ -"name":"GetFileUrls", -"header":2573, -"response":{"type":"anonymous","header":2574, "doc":[ -{"type":"reference","argument":"fileUrls","category":"full","description":" File urls"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"FileUrlDescription"}},"id":1,"name":"fileUrls"} -]}, -"doc":[ -"Requesting multiple fle URL for downloading",{"type":"reference","argument":"files","category":"hidden","description":"File locations to load urls"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"FileLocation"}},"id":1,"name":"files"} -]}},{"type":"rpc","content":{ -"name":"GetFileUrlBuilder", -"header":2579, -"response":{"type":"anonymous","header":2580, "doc":[ -{"type":"reference","argument":"baseUrl","category":"full","description":" Base Url for files"},{"type":"reference","argument":"algo","category":"full","description":" Signature algorithm"},{"type":"reference","argument":"seed","category":"full","description":" Public-visible seed of signature"},{"type":"reference","argument":"signatureSecret","category":"full","description":" Signature Secret"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url builder"}] ,"attributes":[{"type":"string","id":1,"name":"baseUrl"} -,{"type":"string","id":2,"name":"algo"} -,{"type":"string","id":5,"name":"seed"} -,{"type":"bytes","id":3,"name":"signatureSecret"} -,{"type":{"type":"alias","childType":"sec"},"id":4,"name":"timeout"} -]}, -"doc":[ -"Get File URL Builder that allows to build file urls from client side",{"type":"reference","argument":"supportedSignatureAlgorithms","category":"hidden","description":"Supported signature algorithms by client"}],"attributes":[ -{"type":{"type":"list","childType":"string"},"id":1,"name":"supportedSignatureAlgorithms"} -]}},{"type":"rpc","content":{ -"name":"GetFileUploadUrl", -"header":97, -"response":{"type":"anonymous","header":121, "doc":[ -{"type":"reference","argument":"url","category":"full","description":" Url for uploading"},{"type":"reference","argument":"uploadKey","category":"compact","description":" Upload key for upload"}] ,"attributes":[{"type":"string","id":1,"name":"url"} -,{"type":"bytes","id":2,"name":"uploadKey"} -]}, -"doc":[ -"Requesting pload url",{"type":"reference","argument":"expectedSize","category":"full","description":"Expected size of uploading file. May be inaccurate. Used for size allocation optimizations."}],"attributes":[ -{"type":"int32","id":1,"name":"expectedSize"} -]}},{"type":"rpc","content":{ -"name":"CommitFileUpload", -"header":122, -"response":{"type":"anonymous","header":138, "doc":[ -{"type":"reference","argument":"uploadedFileLocation","category":"hidden","description":" Result file location"}] ,"attributes":[{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"uploadedFileLocation"} -]}, -"doc":[ -"Comminting uploaded file to storage"],"attributes":[ -{"type":"bytes","id":1,"name":"uploadKey"} -,{"type":"string","id":2,"name":"fileName"} -]}},{"type":"rpc","content":{ -"name":"GetFileUploadPartUrl", -"header":142, -"response":{"type":"anonymous","header":141, "doc":[ -{"type":"reference","argument":"url","category":"full","description":" Upload file part url"}] ,"attributes":[{"type":"string","id":1,"name":"url"} -]}, -"doc":[ -"Upload file part",{"type":"reference","argument":"uploadKey","category":"compact","description":"Upload Key from requestFileUploadUrl"}],"attributes":[ -{"type":"int32","id":1,"name":"partNumber"} -,{"type":"int32","id":2,"name":"partSize"} -,{"type":"bytes","id":3,"name":"uploadKey"} -]}}]}, { - "title": "Features", - "package": "features", - "doc": [ - "Enable feature discovery. Currently available features:", - "* \"call\" - private audio calls" - ], - "items": [ -{"type":"rpc","content":{ -"name":"EnableFeature", -"header":2588, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Enabling feature on the device",{"type":"reference","argument":"featureName","category":"full","description":"Feature name"},{"type":"reference","argument":"args","category":"danger","description":"Optional arguments to a feature"}],"attributes":[ -{"type":"string","id":1,"name":"featureName"} -,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"args"} -]}},{"type":"rpc","content":{ -"name":"DisableFeature", -"header":2589, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Disabling feature on the device",{"type":"reference","argument":"featureName","category":"full","description":"Feature name"}],"attributes":[ -{"type":"string","id":1,"name":"featureName"} -]}},{"type":"rpc","content":{ -"name":"CheckFeatureEnabled", -"header":2590, -"response":{"type":"reference","name":"Bool"}, -"doc":[ -"Method for checking if feature is available to user"],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userOutPeer"} -,{"type":"string","id":2,"name":"featureName"} -]}}]}, { - "title": "EventBus", - "package": "eventbus", - "items": [ -{"type":"rpc","content":{ -"name":"CreateNewEventBus", -"header":2665, -"response":{"type":"anonymous","header":2666, "doc":[ -"Created new Event Bus",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Your Device Id"}] ,"attributes":[{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"deviceId"} -]}, -"doc":[ -"Create new Event Bus",{"type":"reference","argument":"timeout","category":"full","description":"Optional timeout of Event Bus"},{"type":"reference","argument":"isOwned","category":"full","description":"Is Event Bus owned by creator"}],"attributes":[ -{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":1,"name":"timeout"} -,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isOwned"} -]}},{"type":"rpc","content":{ -"name":"JoinEventBus", -"header":2668, -"response":{"type":"anonymous","header":2669, "doc":[ -{"type":"reference","argument":"deviceId","category":"full","description":" Your Device Id"},{"type":"reference","argument":"rejoinToken","category":"full","description":" Token that can be used for rejoining event bus with same device id"}] ,"attributes":[{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"deviceId"} -,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"rejoinToken"} -]}, -"doc":[ -"Joining Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"timeout","category":"full","description":"Join timeout"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} -]}},{"type":"rpc","content":{ -"name":"ReJoinEventBus", -"header":2675, -"response":{"type":"anonymous","header":2676, "doc":[ -{"type":"reference","argument":"deviceId","category":"hidden","description":" Your Device Id"}] ,"attributes":[{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"deviceId"} -]}, -"doc":[ -"Rejoining to event bus after session was disposed",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"rejoinToken","category":"full","description":"Rejoin Token"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":"bytes","id":2,"name":"rejoinToken"} -]}},{"type":"rpc","content":{ -"name":"KeepAliveEventBus", -"header":2670, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Keep Alive Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"timeout","category":"full","description":"Optional timeout for keep alive"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} -]}},{"type":"rpc","content":{ -"name":"DisposeEventBus", -"header":2667, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Dispose Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -]}},{"type":"rpc","content":{ -"name":"PostToEventBus", -"header":2671, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Event Bus Destination",{"type":"reference","argument":"id","category":"full","description":"Bus Id"},{"type":"reference","argument":"destinations","category":"full","description":"If Empty need to broadcase message to everyone"},{"type":"reference","argument":"message","category":"hidden","description":"Message"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"destinations"} -,{"type":"bytes","id":3,"name":"message"} -]}},{"type":"update","content":{ -"name":"EventBusDeviceConnected", -"header":2561, -"doc":[ -"Update about pubsub device connected",{"type":"reference","argument":"id","category":"full","description":" ID of Event Bus"},{"type":"reference","argument":"userId","category":"full","description":" Joined User Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Joined Device Unique Id"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"userId"} -,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} -]}},{"type":"update","content":{ -"name":"EventBusDeviceDisconnected", -"header":2563, -"doc":[ -"Update about device disconnected",{"type":"reference","argument":"id","category":"full","description":" ID of Event Bus"},{"type":"reference","argument":"userId","category":"full","description":" Joined User Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Disconnected Device unique Id"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"userId"} -,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} -]}},{"type":"update","content":{ -"name":"EventBusMessage", -"header":2562, -"doc":[ -"Event Bus Message",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"senderId","category":"full","description":" Sender of message"},{"type":"reference","argument":"senderDeviceId","category":"full","description":" Device Id of sender"},{"type":"reference","argument":"message","category":"hidden","description":" Message"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"senderId"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"randomId"}},"id":3,"name":"senderDeviceId"} -,{"type":"bytes","id":4,"name":"message"} -]}},{"type":"update","content":{ -"name":"EventBusDisposed", -"header":2564, -"doc":[ -"Event Bus dispose",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"}],"attributes":[ -{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} -]}}]}, { - "title": "Values", - "package": "values", - "doc": [ - "Synced Values" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"SyncedValue", -"doc":[ -"Synced Value container",{"type":"reference","argument":"id","category":"full","description":" Unique Id of a value. Unique in the scope of one named value."},{"type":"reference","argument":"value","category":"full","description":" Optional value"}],"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"id"} -,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"value"} -]}},{"type":"rpc","content":{ -"name":"LoadSyncedSet", -"header":2679, -"response":{"type":"anonymous","header":2680, "doc":[ -{"type":"reference","argument":"values","category":"full","description":" Current set values"},{"type":"reference","argument":"isStrong","category":"full","description":" Is this value strong and stored in sequence. By default is true."}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":1,"name":"values"} -,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isStrong"} -]}, -"doc":[ -"Loading synced set",{"type":"reference","argument":"setName","category":"hidden","description":"readable name of the set"}],"attributes":[ -{"type":"string","id":1,"name":"setName"} -]}},{"type":"update","content":{ -"name":"SynedSetUpdated", -"header":72, -"doc":[ -"Update about synced set update",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"syncedValues","category":"full","description":" Current set values"},{"type":"reference","argument":"isStrong","category":"full","description":" Is this value strong and need to be stored on disk"}],"attributes":[ -{"type":"string","id":1,"name":"setName"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":2,"name":"syncedValues"} -,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isStrong"} -]}},{"type":"update","content":{ -"name":"SyncedSetAddedOrUpdated", -"header":73, -"doc":[ -"Update about added or updated values in the synced set",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"addedOrUpdatedValues","category":"hidden","description":" Added or updated values"}],"attributes":[ -{"type":"string","id":1,"name":"setName"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":2,"name":"addedOrUpdatedValues"} -]}},{"type":"update","content":{ -"name":"SyncedSetRemoved", -"header":74, -"doc":[ -"Update about removed items from synced set",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"removedItems","category":"full","description":" Removed Items from the set"}],"attributes":[ -{"type":"string","id":1,"name":"setName"} -,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"removedItems"} -]}}]}, { - "title": "WebRTC", - "package": "webrtc", - "doc": [ - "WebRTC package that enables support to audio and video calls" - ], - "items": [ -{"type":"update","content":{ -"name":"IncomingCall", -"header":52, -"doc":[ -"Update about incoming call (Sent every 10 seconds)",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"attemptIndex","category":"full","description":" Optional attempt Index"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"opt","childType":"int32"},"id":2,"name":"attemptIndex"} -]}},{"type":"update","content":{ -"name":"CallHandled", -"header":53, -"doc":[ -"Update about incoming call handled",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"attemptIndex","category":"full","description":" Optional attempt Index"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"opt","childType":"int32"},"id":2,"name":"attemptIndex"} -]}},{"type":"update","content":{ -"name":"CallUpgraded", -"header":56, -"doc":[ -"Update about call moved to other peer",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"groupId","category":"full","description":" Upgraded group id"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupId"} -]}},{"type":"rpc","content":{ -"name":"GetCallInfo", -"header":2600, -"response":{"type":"anonymous","header":2606, "doc":[ -{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"groups","category":"compact","description":" Groups"},{"type":"reference","argument":"users","category":"compact","description":" Users"},{"type":"reference","argument":"eventBusId","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"isAudioOnlyCall","category":"full","description":" Is Audio Only Call. Default is true"},{"type":"reference","argument":"isVideoOnlyCall","category":"full","description":" Is Video Only Call. Default is false."},{"type":"reference","argument":"isVideoPreferred","category":"full","description":" Is Video preferred"}] ,"attributes":[{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":2,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} -,{"type":{"type":"alias","childType":"busId"},"id":4,"name":"eventBusId"} -,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"isAudioOnlyCall"} -,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isVideoOnlyCall"} -,{"type":{"type":"opt","childType":"bool"},"id":7,"name":"isVideoPreferred"} -]}, -"doc":[ -"Getting Call Information",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -]}},{"type":"rpc","content":{ -"name":"DoCall", -"header":2597, -"response":{"type":"anonymous","header":2598, "doc":[ -{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"eventBusId","category":"full","description":" Call Event Bus Id"}] ,"attributes":[{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"alias","childType":"busId"},"id":2,"name":"eventBusId"} -,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} -]}, -"doc":[ -"Do Call. Right after a call client need to start sending CallInProgress",{"type":"reference","argument":"peer","category":"full","description":"destination peer"},{"type":"reference","argument":"timeout","category":"full","description":"Initial timeout"},{"type":"reference","argument":"isAudioOnlyCall","category":"full","description":"Is Audio only call. Default is true."},{"type":"reference","argument":"isVideoOnlyCall","category":"full","description":"Is Video Only call. Default is false."},{"type":"reference","argument":"isVideoPreferred","category":"full","description":"Is Video preferred"}],"attributes":[ -{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} -,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} -,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isAudioOnlyCall"} -,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isVideoOnlyCall"} -,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isVideoPreferred"} -]}},{"type":"rpc","content":{ -"name":"UpgradeCall", -"header":2677, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Method for upgrading a call from private call to group call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"},{"type":"reference","argument":"peer","category":"full","description":"Destination peer for upgrading"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"struct","childType":"GroupOutPeer"},"id":2,"name":"peer"} -]}},{"type":"rpc","content":{ -"name":"DoCallAgain", -"header":2678, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Call again to user",{"type":"reference","argument":"callId","category":"full","description":"Call Id"},{"type":"reference","argument":"user","category":"full","description":"User to call again"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"user"} -]}},{"type":"rpc","content":{ -"name":"JoinCall", -"header":2683, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Joining Call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -]}},{"type":"rpc","content":{ -"name":"RejectCall", -"header":2684, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Rejecting Call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -]}},{"type":"rpc","content":{ -"name":"OptimizeSDP", -"header":2685, -"response":{"type":"anonymous","header":2686, "doc":[ -{"type":"reference","argument":"optimizedSDP","category":"hidden","description":" Optimized version of SDP"}] ,"attributes":[{"type":"string","id":1,"name":"optimizedSDP"} -]}, -"doc":[ -"Optimizing SDP",{"type":"reference","argument":"type","category":"full","description":"Type of SDP (offer or answer)"},{"type":"reference","argument":"sdp","category":"full","description":"SDP value"},{"type":"reference","argument":"ownSettings","category":"full","description":"Own Settings"},{"type":"reference","argument":"theirSettings","category":"full","description":"Their Settings"}],"attributes":[ -{"type":"string","id":1,"name":"type"} -,{"type":"string","id":2,"name":"sdp"} -,{"type":{"type":"struct","childType":"PeerSettings"},"id":3,"name":"ownSettings"} -,{"type":{"type":"struct","childType":"PeerSettings"},"id":4,"name":"theirSettings"} -]}}, { - "type":"struct", - "content": { - "name":"ICEServer", -"doc":[ -"ICE Server description",{"type":"reference","argument":"url","category":"full","description":" Url to server"},{"type":"reference","argument":"username","category":"full","description":" Optional username"},{"type":"reference","argument":"credential","category":"danger","description":" Optional credential"}],"attributes":[ -{"type":"string","id":1,"name":"url"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"username"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"credential"} -]}},{"type":"trait","content":{ -"isContainer":"true","name":"WebRTCSignaling","attributes":[ -]}},{"type":"comment","content":"Advertising"}, { - "type":"struct", - "content": { - "name":"AdvertiseSelf", -"doc":[ -"Advertizing self to a master mode",{"type":"reference","argument":"peerSettings","category":"full","description":" Optional peer Settings"}],"trait":{"name":"WebRTCSignaling","key":21},"attributes":[ -{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":1,"name":"peerSettings"} -]}}, { - "type":"struct", - "content": { - "name":"AdvertiseMaster", -"doc":[ -"Sent by master"],"trait":{"name":"WebRTCSignaling","key":26},"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"ICEServer"}},"id":1,"name":"server"} -]}},{"type":"comment","content":"Web RTC signaling"}, { - "type":"struct", - "content": { - "name":"Candidate", -"doc":[ -"Candidate signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of candidate"},{"type":"reference","argument":"index","category":"full","description":" Index of candidate"},{"type":"reference","argument":"id","category":"full","description":" Id of candidate"},{"type":"reference","argument":"sdp","category":"full","description":" SDP of candidate"}],"trait":{"name":"WebRTCSignaling","key":3},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} -,{"type":"int32","id":2,"name":"index"} -,{"type":"string","id":3,"name":"id"} -,{"type":"string","id":4,"name":"sdp"} -]}}, { - "type":"struct", - "content": { - "name":"Offer", -"doc":[ -"Offer signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of offer"},{"type":"reference","argument":"sdp","category":"full","description":" Offer SDP"},{"type":"reference","argument":"ownPeerSettings","category":"full","description":" Optional Own Peer settings"}],"trait":{"name":"WebRTCSignaling","key":4},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} -,{"type":"string","id":2,"name":"sdp"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":3,"name":"ownPeerSettings"} -]}}, { - "type":"struct", - "content": { - "name":"Answer", -"doc":[ -"Answer signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of answer"},{"type":"reference","argument":"sdp","category":"full","description":" Answer SDP"}],"trait":{"name":"WebRTCSignaling","key":5},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} -,{"type":"string","id":2,"name":"sdp"} -]}}, { - "type":"struct", - "content": { - "name":"MediaStreamsUpdated", -"doc":[ -"Update about media stream settings updated. Can be sent before offer/answer.",{"type":"reference","argument":"isAudioEnabled","category":"full","description":" Is Audio Enabled in current connection. True by default."},{"type":"reference","argument":"isVideoEnabled","category":"full","description":" Is Video Enabled in current connection. False by default."}],"trait":{"name":"WebRTCSignaling","key":28},"attributes":[ -{"type":{"type":"opt","childType":"bool"},"id":1,"name":"isAudioEnabled"} -,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isVideoEnabled"} -]}},{"type":"comment","content":"Call Controlling events"}, { - "type":"struct", - "content": { - "name":"NeedOffer", -"doc":[ -"Notification from master that offer is required",{"type":"reference","argument":"device","category":"full","description":" Destination Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"},{"type":"reference","argument":"peerSettings","category":"full","description":" Optional peer settings"}],"trait":{"name":"WebRTCSignaling","key":8},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} -,{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":3,"name":"peerSettings"} -]}}, { - "type":"struct", - "content": { - "name":"NegotinationSuccessful", -"doc":[ -"Notification about on negotiation is successful",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":24},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} -]}}, { - "type":"struct", - "content": { - "name":"EnableConnection", -"doc":[ -"Notification about enabling connection to peer",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":22},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} -]}}, { - "type":"struct", - "content": { - "name":"OnRenegotiationNeeded", -"doc":[ -"Need renegotiate session. For example when streams are changed.",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":25},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} -]}}, { - "type":"struct", - "content": { - "name":"CloseSession", -"doc":[ -"Close this session and be ready to",{"type":"reference","argument":"device","category":"hidden","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id for renegotiation"}],"trait":{"name":"WebRTCSignaling","key":6},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} -,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} -]}}, { - "type":"struct", - "content": { - "name":"NeedDisconnect", -"doc":[ -"Notification about requirement about required disconnection from peer",{"type":"reference","argument":"device","category":"hidden","description":" Device Id"}],"trait":{"name":"WebRTCSignaling","key":20},"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} -]}}, { - "type":"struct", - "content": { - "name":"ActiveCall", -"doc":[ -"Active Calls. Used in broadcasting states of current calls.",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"peer","category":"full","description":" Call's peer"},{"type":"reference","argument":"callMembers","category":"full","description":" Call Members"}],"attributes":[ -{"type":"int64","id":1,"name":"callId"} -,{"type":{"type":"struct","childType":"Peer"},"id":2,"name":"peer"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"CallMember"}},"id":3,"name":"callMembers"} -]}}, { - "type": "enum", - "content": { - "name": "CallMemberState", - "values": [ - { - "name": "RINGING", - "id": 1 - }, - { - "name": "RINGING_REACHED", - "id": 4 - }, - { - "name": "CONNECTING", - "id": 2 - }, - { - "name": "CONNECTED", - "id": 3 - }, - { - "name": "ENDED", - "id": 5 + }, + "id": 6, + "name": "groupPeers" + }] + }, + "doc": [ + "Loading history of chat", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Peer of conversation" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": "start date of messages for loading or 0 for loading from start" + }, { + "type": "reference", + "argument": "loadMode", + "category": "full", + "description": "Loading mode: Forward loading, backward or both ways" + }, { + "type": "reference", + "argument": "limit", + "category": "full", + "description": "maximum amount of messages (max is 100)" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "ListLoadMode" + } + }, + "id": 5, + "name": "loadMode" + }, { + "type": "int32", + "id": 4, + "name": "limit" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 6, + "name": "optimizations" + }] + } + }, { + "type": "struct", + "content": { + "name": "Dialog", + "doc": [ + "Conversation from history", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Peer of conversation" + }, { + "type": "reference", + "argument": "unreadCount", + "category": "full", + "description": " plain messages unread messages count" + }, { + "type": "reference", + "argument": "sortDate", + "category": "full", + "description": " date of conversation for sorting" + }, { + "type": "reference", + "argument": "senderUid", + "category": "full", + "description": " Sender of top message (may be zero)" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random ID of top message (may be zero)" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of top message (can't be zero)" + }, { + "type": "reference", + "argument": "message", + "category": "full", + "description": " Content of message" + }, { + "type": "reference", + "argument": "firstUnreadDate", + "category": "full", + "description": " Date of first unread message" + }, { + "type": "reference", + "argument": "attributes", + "category": "full", + "description": " Optional top message attributes" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": "int32", + "id": 3, + "name": "unreadCount" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "sortDate" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 5, + "name": "senderUid" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 6, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 7, + "name": "date" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 8, + "name": "message" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "MessageState" + } + }, + "id": 9, + "name": "state" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "date" + } + }, + "id": 10, + "name": "firstUnreadDate" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MessageAttributes" + } + }, + "id": 11, + "name": "attributes" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadDialogs", + "header": 104, + "response": { + "type": "anonymous", + "header": 105, + "doc": [ + "Loaded dialogs", { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Loaded groups" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Loaded users" + }, { + "type": "reference", + "argument": "dialogs", + "category": "compact", + "description": " Loaded dialogs" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" } - ] - } - }, { - "type":"struct", - "content": { - "name":"CallMemberStateHolder", -"doc":[ -"Call Member state holder",{"type":"reference","argument":"state","category":"full","description":" State Value"},{"type":"reference","argument":"fallbackIsRinging","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsConnected","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsConnecting","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsRingingReached","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsEnded","category":"full","description":" Fallback flag for future compatibility of state"}],"attributes":[ -{"type":{"type":"enum","childType":"CallMemberState"},"id":1,"name":"state"} -,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"fallbackIsRinging"} -,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"fallbackIsConnected"} -,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"fallbackIsConnecting"} -,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"fallbackIsRingingReached"} -,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"fallbackIsEnded"} -]}}, { - "type":"struct", - "content": { - "name":"CallMember", -"doc":[ -"Call Member",{"type":"reference","argument":"userId","category":"full","description":" Member User Id"},{"type":"reference","argument":"state","category":"full","description":" State of member"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"userId"} -,{"type":{"type":"struct","childType":"CallMemberStateHolder"},"id":3,"name":"state"} -]}}, { - "type":"struct", - "content": { - "name":"PeerSettings", -"doc":[ -"Peer Settings",{"type":"reference","argument":"is3DESSupported","category":"full","description":" Marking if 3DES supported. Default is false."},{"type":"reference","argument":"isMobile","category":"full","description":" Is Peer a mobile phone. Default is false."},{"type":"reference","argument":"canBeAudioRelay","category":"full","description":" If peer can audio relay. Default is false."},{"type":"reference","argument":"canPreConnect","category":"full","description":" If peer can preconnect before answer"}],"attributes":[ -{"type":{"type":"opt","childType":"bool"},"id":1,"name":"is3DESSupported"} -,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isMobile"} -,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"canBeAudioRelay"} -,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"canPreConnect"} -]}}]}, { - "title": "Config sync", - "package": "configs", - "doc": [ - "Parameter Syncronization across devices. Can be used for simple sync", - "across devices without rewriting server side code." - ], - "items": [ - { - "type":"struct", - "content": { - "name":"Parameter", -"doc":[ -"Syncing Parameter",{"type":"reference","argument":"key","category":"full","description":" Key of parameter"},{"type":"reference","argument":"value","category":"full","description":" Value of parameter"}],"attributes":[ -{"type":"string","id":1,"name":"key"} -,{"type":"string","id":2,"name":"value"} -]}},{"type":"rpc","content":{ -"name":"GetParameters", -"header":134, -"response":{"type":"anonymous","header":135, "doc":[ -{"type":"reference","argument":"parameters","category":"full","description":" Current parameters"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Parameter"}},"id":1,"name":"parameters"} -]}, -"doc":[ -"Getting Parameters"],"attributes":[ -]}},{"type":"rpc","content":{ -"name":"EditParameter", -"header":128, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Change parameter value",{"type":"reference","argument":"key","category":"full","description":"Key of parameter"},{"type":"reference","argument":"value","category":"full","description":"Value of parameter"}],"attributes":[ -{"type":"string","id":1,"name":"key"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"value"} -]}},{"type":"update","content":{ -"name":"ParameterChanged", -"header":131, -"doc":[ -"Update about parameter change",{"type":"reference","argument":"key","category":"full","description":" Key of parameter"},{"type":"reference","argument":"value","category":"full","description":" Value of parameter"}],"attributes":[ -{"type":"string","id":1,"name":"key"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"value"} -]}}]}, { - "title": "Stats", - "package": "stats", - "doc": [ - "Saving statistics information" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"EventRecord", -"doc":[ -"Record for stored event"],"attributes":[ -{"type":{"type":"alias","childType":"date"},"id":1,"name":"date"} -,{"type":{"type":"trait","childType":"Event"},"id":2,"name":"event"} -]}},{"type":"trait","content":{ -"isContainer":"true","name":"Event","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"UntypedEvent", -"doc":[ -"Untyped event",{"type":"reference","argument":"eventType","category":"full","description":" Event type"},{"type":"reference","argument":"params","category":"full","description":" optional params for event"}],"trait":{"name":"Event","key":1},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"eventType"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":2,"name":"params"} -]}}, { - "type":"struct", - "content": { - "name":"ContentViewChanged", -"doc":[ -"Content view event",{"type":"reference","argument":"contentType","category":"full","description":" unique content id"},{"type":"reference","argument":"visible","category":"full","description":" Is content visible"},{"type":"reference","argument":"params","category":"full","description":" optional params for content view"}],"trait":{"name":"Event","key":2},"expandable":"true","attributes":[ -{"type":"string","id":1,"name":"contentType"} -,{"type":"string","id":2,"name":"contentId"} -,{"type":"bool","id":3,"name":"visible"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":4,"name":"params"} -]}}, { - "type":"struct", - "content": { - "name":"AppVisibleChanged", -"doc":[ -"On App Visible event",{"type":"reference","argument":"visible","category":"full","description":" Is app visible"}],"trait":{"name":"Event","key":4},"expandable":"true","attributes":[ -{"type":"bool","id":1,"name":"visible"} -]}},{"type":"rpc","content":{ -"name":"StoreEvents", -"header":243, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Storing events on server",{"type":"reference","argument":"events","category":"full","description":"Events for storing"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"trait","childType":"Event"}},"id":1,"name":"events"} -]}}]}, { - "title": "Raw API", - "package": "raw", - "doc": [ - "Schema-less API that is useful for external integrations" - ], - "items": [ -{"type":"rpc","content":{ -"name":"RawRequest", -"header":2569, -"response":{"type":"anonymous","header":2570, "doc":[ -"Response of a raw request",{"type":"reference","argument":"result","category":"full","description":" Result of request"}] ,"attributes":[{"type":{"type":"trait","childType":"RawValue"},"id":1,"name":"result"} -]}, -"doc":[ -"Making raw request to external service via shema-less RPC request",{"type":"reference","argument":"service","category":"full","description":"Service name for RPC request"},{"type":"reference","argument":"method","category":"full","description":"Method for execution"},{"type":"reference","argument":"params","category":"full","description":"Optional params for the method"}],"attributes":[ -{"type":"string","id":1,"name":"service"} -,{"type":"string","id":2,"name":"method"} -,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":3,"name":"params"} -]}}]}, { - "title": "Wallpappers", - "package": "wallpappers", - "doc": [ - "Wallpappers support" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"Wallpapper", -"doc":[ -"Wallpapper structure",{"type":"reference","argument":"id","category":"full","description":" Wallpapper id"},{"type":"reference","argument":"w","category":"full","description":" Image width"},{"type":"reference","argument":"h","category":"full","description":" Image height"},{"type":"reference","argument":"fileSize","category":"full","description":" Image file size"},{"type":"reference","argument":"file","category":"full","description":" Image file reference"},{"type":"reference","argument":"thumb","category":"full","description":" Image thumb"}],"attributes":[ -{"type":"int32","id":7,"name":"id"} -,{"type":"int32","id":1,"name":"w"} -,{"type":"int32","id":2,"name":"h"} -,{"type":"int32","id":3,"name":"fileSize"} -,{"type":{"type":"struct","childType":"FileLocation"},"id":5,"name":"file"} -,{"type":{"type":"struct","childType":"FastThumb"},"id":6,"name":"thumb"} -]}},{"type":"rpc","content":{ -"name":"LoadWallpappers", -"header":241, -"response":{"type":"anonymous","header":242, "doc":[ -"Loaded Wallpappers",{"type":"reference","argument":"wallpappers","category":"full","description":" Available wallpapper list"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Wallpapper"}},"id":1,"name":"wallpappers"} -]}, -"doc":[ -"Load available wallpappers",{"type":"reference","argument":"maxWidth","category":"full","description":"Maximum width of wallpapper"},{"type":"reference","argument":"maxHeight","category":"full","description":"Maximum height of wallpapper"}],"attributes":[ -{"type":"int32","id":1,"name":"maxWidth"} -,{"type":"int32","id":2,"name":"maxHeight"} -]}}]}, { - "title": "Push", - "package": "push", - "doc": [ - "Vendor's pushes for receiving push notifications.", - "Push notification contains current sequence number of main sequence." - ], - "items": [ -{"type":"rpc","content":{ -"name":"RegisterGooglePush", -"header":51, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Registering push token on server",{"type":"reference","argument":"projectId","category":"hidden","description":"Project Id of token"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ -{"type":"int64","id":1,"name":"projectId"} -,{"type":"string","id":2,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"UnregisterGooglePush", -"header":2631, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Unregistering Google Push",{"type":"reference","argument":"token","category":"danger","description":"Token value"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"RegisterApplePush", -"header":76, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Registering apple push on server",{"type":"reference","argument":"apnsKey","category":"hidden","description":"apns key id"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ -{"type":"int32","id":1,"name":"apnsKey"} -,{"type":"string","id":2,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"UnregisterApplePush", -"header":2632, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Unregistering Apple Push",{"type":"reference","argument":"token","category":"full","description":"Token"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"RegisterApplePushKit", -"header":2576, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Registration of a new Apple's PushKit tokens",{"type":"reference","argument":"apnsKey","category":"hidden","description":"APNS key id"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ -{"type":"int32","id":1,"name":"apnsKey"} -,{"type":"string","id":2,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"UnregisterApplePushKit", -"header":2633, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Unregistering Apple Push Kit token",{"type":"reference","argument":"token","category":"hidden","description":"Token Value"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"RegisterApplePushToken", -"header":2593, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Registering Apple Push Token",{"type":"reference","argument":"bundleId","category":"full","description":"Bundle Id of app"},{"type":"reference","argument":"token","category":"full","description":"Push token"}],"attributes":[ -{"type":"string","id":1,"name":"bundleId"} -,{"type":"string","id":2,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"UnregisterApplePushToken", -"header":2634, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Unregister Apple Push token",{"type":"reference","argument":"token","category":"hidden","description":"Token value"}],"attributes":[ -{"type":"string","id":1,"name":"token"} -]}},{"type":"rpc","content":{ -"name":"RegisterActorPush", -"header":2575, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Register Actor Push endpoint",{"type":"reference","argument":"endpoint","category":"full","description":"Endpoint for push sending"},{"type":"reference","argument":"encryptionKeys","category":"full","description":"Push Encryption keys"}],"attributes":[ -{"type":"string","id":1,"name":"endpoint"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":2,"name":"encryptionKeys"} -]}},{"type":"rpc","content":{ -"name":"UnregisterActorPush", -"header":2635, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Unregister Actor Push endpoint",{"type":"reference","argument":"endpoint","category":"full","description":"Endpoint for unregistering"}],"attributes":[ -{"type":"string","id":1,"name":"endpoint"} -]}}]}, { - "title": "Encryption", - "package": "encryption", - "doc": [ - "Package that include encryption support", - "Key alg types:", - "* curve25519 - https://en.wikipedia.org/wiki/Curve25519", - "* rsa-2048", - "* rsa-4096", - "* aes-128", - "* kuznechik-128", - "", - "Signature alg types:", - "* Ed25519 - used curve25519 conveted to Ed255519 for signing and validataion" - ], - "items": [ -{"type":"comment","content":"Public Keys"}, { - "type":"struct", - "content": { - "name":"EncryptionKeyGroup", -"doc":[ -"Encryption Key Group",{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"identityKey","category":"full","description":" Key that is used as identity and for validation of Key Group changes"},{"type":"reference","argument":"supportedEncryption","category":"full","description":" Supported encryption methods by this key group"},{"type":"reference","argument":"keys","category":"compact","description":" keys of Key Group"},{"type":"reference","argument":"signatures","category":"compact","description":" Signatures of keys"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} -,{"type":{"type":"list","childType":"string"},"id":2,"name":"supportedEncryption"} -,{"type":{"type":"struct","childType":"EncryptionKey"},"id":3,"name":"identityKey"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":4,"name":"keys"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":5,"name":"signatures"} -]}}, { - "type":"struct", - "content": { - "name":"EncryptionKeySignature", -"doc":[ -"Signed Key. Usually used for public keys.",{"type":"reference","argument":"keyId","category":"full","description":" Key Id used for signature"},{"type":"reference","argument":"signatureAlg","category":"full","description":" Signature algorithm"},{"type":"reference","argument":"signature","category":"full","description":" Signature value"}],"attributes":[ -{"type":"int64","id":1,"name":"keyId"} -,{"type":"string","id":2,"name":"signatureAlg"} -,{"type":"bytes","id":3,"name":"signature"} -]}}, { - "type":"struct", - "content": { - "name":"EncryptionKey", -"doc":[ -"Encryption Key",{"type":"reference","argument":"keyId","category":"full","description":" Key Id"},{"type":"reference","argument":"keyAlg","category":"full","description":" Key Algorithm"},{"type":"reference","argument":"keyMaterial","category":"compact","description":" Public key material. Can be null, but always not null for LoadPublicKey"},{"type":"reference","argument":"keyHash","category":"hidden","description":" If keyMaterial is null, pass keyHash - SHA256 of key"}],"expandable":"true","attributes":[ -{"type":"int64","id":1,"name":"keyId"} -,{"type":"string","id":2,"name":"keyAlg"} -,{"type":{"type":"opt","childType":"bytes"},"id":3,"name":"keyMaterial"} -,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"keyHash"} -]}},{"type":"response","content":{ -"name":"PublicKeys", -"header":2602, -"doc":[ -"Public Keys response",{"type":"reference","argument":"publicKey","category":"full","description":" Public keys"},{"type":"reference","argument":"signatures","category":"full","description":" Signatures of public keys"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":1,"name":"publicKey"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":2,"name":"signatures"} -]}},{"type":"response","content":{ -"name":"PublicKeyGroups", -"header":2604, -"doc":[ -"Public key groups response"],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeyGroup"}},"id":1,"name":"publicKeyGroups"} -]}},{"type":"rpc","content":{ -"name":"LoadPublicKeyGroups", -"header":2601, -"response":{"type":"reference","name":"PublicKeyGroups"}, -"doc":[ -"Loading Public key groups",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} -]}},{"type":"rpc","content":{ -"name":"LoadPublicKey", -"header":2605, -"response":{"type":"reference","name":"PublicKeys"}, -"doc":[ -"Loading public key explictly",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"},{"type":"reference","argument":"keyGroupId","category":"full","description":"Key group's id"},{"type":"reference","argument":"keyIds","category":"full","description":"Key ids for loading"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} -,{"type":"int32","id":2,"name":"keyGroupId"} -,{"type":{"type":"list","childType":"int64"},"id":3,"name":"keyIds"} -]}},{"type":"rpc","content":{ -"name":"LoadPrePublicKeys", -"header":2603, -"response":{"type":"reference","name":"PublicKeys"}, -"doc":[ -"Loading SOME of ephermal public keys",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"},{"type":"reference","argument":"keyGroupId","category":"full","description":"User's key group id"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} -,{"type":"int32","id":2,"name":"keyGroupId"} -]}},{"type":"update","content":{ -"name":"PublicKeyGroupChanged", -"header":103, -"doc":[ -"Update about public key group changed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Updated Key Group"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} -]}},{"type":"update","content":{ -"name":"KeysAdded", -"header":112, -"doc":[ -"Update about keys added to Key Group",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"keys","category":"compact","description":" Added keys"},{"type":"reference","argument":"signatures","category":"compact","description":" Signatures of a public key"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":3,"name":"keys"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":4,"name":"signatures"} -]}},{"type":"update","content":{ -"name":"KeysRemoved", -"header":113, -"doc":[ -"Update about keys removed from Key Group",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"keyIds","category":"full","description":" Removed keys"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} -,{"type":{"type":"list","childType":"int64"},"id":3,"name":"keyIds"} -]}},{"type":"update","content":{ -"name":"PublicKeyGroupAdded", -"header":104, -"doc":[ -"Update about public key group added",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Added Key Group"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} -]}},{"type":"update","content":{ -"name":"PublicKeyGroupRemoved", -"header":105, -"doc":[ -"Update about public key group removed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Removed Key Group Id"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} -]}},{"type":"comment","content":"Device Side"},{"type":"rpc","content":{ -"name":"CreateNewKeyGroup", -"header":2609, -"response":{"type":"anonymous","header":2610, "doc":[ -{"type":"reference","argument":"keyGroupId","category":"full","description":" Created Key Group id"}] ,"attributes":[{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} -]}, -"doc":[ -"Creation of a new Key Group",{"type":"reference","argument":"identityKey","category":"full","description":"Identity Key of a new group"},{"type":"reference","argument":"supportedEncryptions","category":"full","description":"Supported encryption methods"},{"type":"reference","argument":"keys","category":"full","description":"keys of current group"},{"type":"reference","argument":"signatures","category":"full","description":"signatures of keys"}],"attributes":[ -{"type":{"type":"struct","childType":"EncryptionKey"},"id":1,"name":"identityKey"} -,{"type":{"type":"list","childType":"string"},"id":2,"name":"supportedEncryptions"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":3,"name":"keys"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":4,"name":"signatures"} -]}},{"type":"rpc","content":{ -"name":"DeleteKeyGroup", -"header":2611, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Deletion of a Key Group",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for deletion"}],"attributes":[ -{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} -]}},{"type":"rpc","content":{ -"name":"DisconnectKeyGroup", -"header":2613, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Disconnect Key Group from device",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for disconnection"}],"attributes":[ -{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} -]}},{"type":"rpc","content":{ -"name":"ConnectKeyGroup", -"header":2614, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Connectiong Key Group to device",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for connection"}],"attributes":[ -{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} -]}},{"type":"rpc","content":{ -"name":"UploadPreKey", -"header":2612, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Uploading Ephermal Keys",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id"},{"type":"reference","argument":"keys","category":"compact","description":"Encryprion keys"},{"type":"reference","argument":"signatures","category":"compact","description":"Key signatures"}],"attributes":[ -{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":2,"name":"keys"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":3,"name":"signatures"} -]}},{"type":"comment","content":"Encrypted Packages"}, { - "type":"struct", - "content": { - "name":"EncryptedBox", -"doc":[ -"Encrypted package that is encrypted for multiple keys",{"type":"reference","argument":"keys","category":"full","description":" Encrypted encryption keys"},{"type":"reference","argument":"algType","category":"full","description":" Package encryption type"},{"type":"reference","argument":"encPackage","category":"full","description":" Encrypted package"},{"type":"reference","argument":"senderKeyGroupId","category":"full","description":" Sender key group"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"keyGroupId"},"id":4,"name":"senderKeyGroupId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncyptedBoxKey"}},"id":1,"name":"keys"} -,{"type":"string","id":2,"name":"algType"} -,{"type":"bytes","id":3,"name":"encPackage"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptedBoxSignature"}},"id":5,"name":"signatures"} -]}}, { - "type":"struct", - "content": { - "name":"EncryptedBoxSignature", -"doc":[ -"Signature for encrypted package",{"type":"reference","argument":"algType","category":"full","description":" Alg Type"},{"type":"reference","argument":"signature","category":"full","description":" Signature of encrypted package"}],"attributes":[ -{"type":"string","id":1,"name":"algType"} -,{"type":"bytes","id":2,"name":"signature"} -]}}, { - "type":"struct", - "content": { - "name":"EncyptedBoxKey", -"doc":[ -"Encrypted package encryption key",{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"algType","category":"full","description":" Key encryption algorithm"},{"type":"reference","argument":"encryptedKey","category":"hidden","description":" Encrypted encryption key"}],"expandable":"true","attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"usersId"} -,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} -,{"type":"string","id":3,"name":"algType"} -,{"type":"bytes","id":4,"name":"encryptedKey"} -]}}, { - "type":"struct", - "content": { - "name":"KeyGroupId", -"doc":[ -"References to key groups",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} -]}}, { - "type":"struct", - "content": { - "name":"KeyGroupHolder", -"doc":[ -"Key Group Holder",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Key Group"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} -]}},{"type":"rpc","content":{ -"name":"SendEncryptedPackage", -"header":2657, -"response":{"type":"anonymous","header":2664, "doc":[ -{"type":"reference","argument":"date","category":"full","description":" date"},{"type":"reference","argument":"obsoleteKeyGroups","category":"full","description":" obsolete key group ids"},{"type":"reference","argument":"missedKeyGroups","category":"full","description":" missed key groups"}] ,"attributes":[{"type":{"type":"opt","childType":{"type":"alias","childType":"date"}},"id":1,"name":"date"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupId"}},"id":2,"name":"obsoleteKeyGroups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupHolder"}},"id":3,"name":"missedKeyGroups"} -]}, -"doc":[ -"Sending encrypted package",{"type":"reference","argument":"randomId","category":"hidden","description":"Random id"}],"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"randomId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":2,"name":"destPeers"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupId"}},"id":3,"name":"ignoredKeyGroups"} -,{"type":{"type":"struct","childType":"EncryptedBox"},"id":4,"name":"encryptedBox"} -]}},{"type":"update","content":{ -"name":"EncryptedPackage", -"header":177, -"doc":[ -"Update about encrypted package",{"type":"reference","argument":"randomId","category":"full","description":" Random Id of package"},{"type":"reference","argument":"date","category":"full","description":" Sending date of package"},{"type":"reference","argument":"senderId","category":"full","description":" Sender id of package"},{"type":"reference","argument":"encryptedBox","category":"full","description":" Encrypted box"}],"attributes":[ -{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"randomId"} -,{"type":{"type":"alias","childType":"date"},"id":2,"name":"date"} -,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"senderId"} -,{"type":{"type":"struct","childType":"EncryptedBox"},"id":4,"name":"encryptedBox"} -]}}]}, { - "title": "Storage", - "package": "storage", - "items": [ -{"type":"rpc","content":{ -"name":"UploadSharedBlob", -"header":2660, -"response":{"type":"anonymous","header":2661, "doc":[ -{"type":"reference","argument":"sharedObjectId","category":"full","description":" Id of shared object"}] ,"attributes":[{"type":"int32","id":1,"name":"sharedObjectId"} -]}, -"doc":[ -"Upload shared blob with user",{"type":"reference","argument":"destPeer","category":"full","description":"Destination peer"},{"type":"reference","argument":"bucket","category":"full","description":"Bucked name"},{"type":"reference","argument":"blob","category":"full","description":"Blob data"},{"type":"reference","argument":"randomId","category":"full","description":"Random id for protecting from double upload"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"destPeer"} -,{"type":"string","id":2,"name":"bucket"} -,{"type":"bytes","id":3,"name":"blob"} -,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"randomId"} -]}},{"type":"rpc","content":{ -"name":"DownloadSharedBlob", -"header":2662, -"response":{"type":"anonymous","header":2663, "doc":[ -{"type":"reference","argument":"blob","category":"full","description":" Blob contents"}] ,"attributes":[{"type":"bytes","id":1,"name":"blob"} -]}, -"doc":[ -"Download shared blob",{"type":"reference","argument":"destPeer","category":"full","description":"Destination peer"},{"type":"reference","argument":"bucket","category":"full","description":"Bucket name"},{"type":"reference","argument":"objectId","category":"full","description":"Object Id"}],"attributes":[ -{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"destPeer"} -,{"type":"string","id":2,"name":"bucket"} -,{"type":"int32","id":3,"name":"objectId"} -]}}]}, { - "title": "Peers", - "package": "peers", - "doc": [ - "Peer is an identificator of specific conversation." - ], - "items": [ - { - "type": "enum", - "content": { - "name": "PeerType", - "values": [ - { - "name": "Private", - "id": 1 - }, - { - "name": "Group", - "id": 2 - }, - { - "name": "EncryptedPrivate", - "id": 3 + }, + "id": 1, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" } - ] - } - }, { - "type":"struct", - "content": { - "name":"Peer", -"doc":[ -"Peer",{"type":"reference","argument":"type","category":"full","description":" Peer Type"},{"type":"reference","argument":"id","category":"full","description":" Peer Id"}],"attributes":[ -{"type":{"type":"enum","childType":"PeerType"},"id":1,"name":"type"} -,{"type":"int32","id":2,"name":"id"} -]}}, { - "type":"struct", - "content": { - "name":"OutPeer", -"doc":[ -"Out peer with access hash",{"type":"reference","argument":"type","category":"full","description":" Peer Type"},{"type":"reference","argument":"id","category":"full","description":" Peer Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Peer access hash"}],"attributes":[ -{"type":{"type":"enum","childType":"PeerType"},"id":1,"name":"type"} -,{"type":"int32","id":2,"name":"id"} -,{"type":"int64","id":3,"name":"accessHash"} -]}}, { - "type":"struct", - "content": { - "name":"UserOutPeer", -"doc":[ -"User's out peer",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"accessHash","category":"danger","description":" User's access hash"}],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} -,{"type":"int64","id":2,"name":"accessHash"} -]}}, { - "type":"struct", - "content": { - "name":"GroupOutPeer", -"doc":[ -"Group's out peer",{"type":"reference","argument":"groupId","category":"full","description":" Group's Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Group's access hash"}],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":"int64","id":2,"name":"accessHash"} -]}}]}, { - "title": "Sequence and Updates", - "package": "sequence", - "doc": [ - "Each device has it's own update sequence. At the begining application request initial sequence state by", - "calling GetState. On each application restart or NewSessionCreated application calls GetDifference for receiving", - "updates in update sequence.", - "GetState and GetDifference automatically subscribes session to receiving updates in session.", - "Each update has seq and state. Seq is sequental index of updated and used for detecting of holes in update sequence", - "(because of server failure or session die) on client side.", - "All updates needed to be processed in partucular order according to seq values.", - "In some updates there can be references to users that are not available at client yer. In this case application need", - "to ignore such update and init getting difference." - ], - "items": [ -{"type":"update_box","content":{ -"name":"SeqUpdate", -"header":13, -"doc":[ -"Sequence update",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of update"},{"type":"reference","argument":"state","category":"compact","description":" Sequece state of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"}],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":"int32","id":3,"name":"updateHeader"} -,{"type":"bytes","id":4,"name":"update"} -]}},{"type":"update_box","content":{ -"name":"FatSeqUpdate", -"header":73, -"doc":[ -"Fat sequence update with additional data",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of update"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"},{"type":"reference","argument":"users","category":"compact","description":" Users that are referenced in update"},{"type":"reference","argument":"groups","category":"compact","description":" Groups that are referenced in update"}],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":"int32","id":3,"name":"updateHeader"} -,{"type":"bytes","id":4,"name":"update"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":5,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":6,"name":"groups"} -]}},{"type":"update_box","content":{ -"name":"WeakUpdate", -"header":26, -"doc":[ -"Out of sequence update (for typing and online statuses)",{"type":"reference","argument":"date","category":"full","description":" Date of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"}],"attributes":[ -{"type":"int64","id":1,"name":"date"} -,{"type":"int32","id":2,"name":"updateHeader"} -,{"type":"bytes","id":3,"name":"update"} -]}},{"type":"update_box","content":{ -"name":"WeakFatUpdate", -"header":2673, -"doc":[ -"Fat Weak Update",{"type":"reference","argument":"date","category":"full","description":" Date of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"full","description":" The update"},{"type":"reference","argument":"users","category":"full","description":" Users that are referenced in update"},{"type":"reference","argument":"groups","category":"full","description":" Groups that are referenced in update"}],"attributes":[ -{"type":"int64","id":1,"name":"date"} -,{"type":"int32","id":2,"name":"updateHeader"} -,{"type":"bytes","id":3,"name":"update"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} -]}},{"type":"update_box","content":{ -"name":"SeqUpdateTooLong", -"header":25, -"doc":[ -"Notification about requiring performing manual GetDifference"],"attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"UpdateContainer", -"doc":[ -"Update container",{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"compact","description":" The updatre"}],"attributes":[ -{"type":"int32","id":1,"name":"updateHeader"} -,{"type":"bytes","id":2,"name":"update"} -]}},{"type":"update_box","content":{ -"name":"CombinedUpdate", -"header":2625, -"doc":[ -"Combined update",{"type":"reference","argument":"seqStart","category":"full","description":" Sequence number start"},{"type":"reference","argument":"seqEnd","category":"full","description":" Sequence number end"},{"type":"reference","argument":"state","category":"full","description":" Sequence state"},{"type":"reference","argument":"users","category":"compact","description":" Update's users"},{"type":"reference","argument":"groups","category":"compact","description":" Update's groups"},{"type":"reference","argument":"updates","category":"full","description":" Updates (can be empty)"},{"type":"reference","argument":"messages","category":"full","description":" New messages"}],"attributes":[ -{"type":"int32","id":1,"name":"seqStart"} -,{"type":"int32","id":2,"name":"seqEnd"} -,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UpdateContainer"}},"id":6,"name":"updates"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":7,"name":"messages"} -]}}, { - "type": "enum", - "content": { - "name": "UpdateOptimization", - "values": [ - { - "name": "NONE", - "id": 1 - }, - { - "name": "STRIP_ENTITIES", - "id": 2 - }, - { - "name": "ENABLE_COMBINED", - "id": 3 - }, - { - "name": "FASTER_MESSAGES", - "id": 4 - }, - { - "name": "STRIP_COUNTERS", - "id": 5 - }, - { - "name": "COMPACT_USERS", - "id": 6 - }, - { - "name": "GROUPS_V2", - "id": 7 + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Dialog" } - ] - } - },{"type":"rpc","content":{ -"name":"GetState", -"header":9, -"response":{"type":"reference","name":"Seq"}, -"doc":[ -"Get main sequence state",{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":1,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"GetDifference", -"header":11, -"response":{"type":"anonymous","header":12, "doc":[ -{"type":"reference","argument":"seq","category":"full","description":" Seq of LAST update in updates"},{"type":"reference","argument":"state","category":"full","description":" State of LAST update in updates"},{"type":"reference","argument":"users","category":"compact","description":" Users referenced in updates"},{"type":"reference","argument":"groups","category":"compact","description":" Groups referenced in updates"},{"type":"reference","argument":"updates","category":"compact","description":" Updates"},{"type":"reference","argument":"needMore","category":"full","description":" Need to perform other difference"},{"type":"reference","argument":"usersRefs","category":"full","description":" Direct references of users"},{"type":"reference","argument":"groupsRefs","category":"full","description":" Direct References of groups"}] ,"attributes":[{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":3,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":6,"name":"groups"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UpdateContainer"}},"id":4,"name":"updates"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":7,"name":"messages"} -,{"type":"bool","id":5,"name":"needMore"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":8,"name":"usersRefs"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":9,"name":"groupsRefs"} -]}, -"doc":[ -"Getting difference of sequence",{"type":"reference","argument":"seq","category":"full","description":"Sequence number"},{"type":"reference","argument":"state","category":"compact","description":"Sequence state"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} -]}},{"type":"rpc","content":{ -"name":"GetReferencedEntitites", -"header":2628, -"response":{"type":"anonymous","header":2629, "doc":[ -{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"groups","category":"compact","description":" Loaded groups"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":2,"name":"groups"} -]}, -"doc":[ -"Loading referenced entities",{"type":"reference","argument":"users","category":"compact","description":"Users to load"},{"type":"reference","argument":"groups","category":"compact","description":"Groups to load. Also returns all members of a group."}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":2,"name":"groups"} -]}},{"type":"update","content":{ -"name":"RawUpdate", -"header":80, -"doc":[ -"Custom Raw Update",{"type":"reference","argument":"type","category":"full","description":" Type of content"},{"type":"reference","argument":"bytes","category":"full","description":" Raw data"}],"attributes":[ -{"type":{"type":"opt","childType":"string"},"id":1,"name":"type"} -,{"type":"bytes","id":2,"name":"bytes"} -]}},{"type":"update","content":{ -"name":"EmptyUpdate", -"header":85, -"doc":[ -"Empty update"],"attributes":[ -]}},{"type":"empty"},{"type":"rpc","content":{ -"name":"SubscribeToOnline", -"header":32, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Subscribing for users online",{"type":"reference","argument":"users","category":"compact","description":"Users for subscription"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} -]}},{"type":"rpc","content":{ -"name":"SubscribeFromOnline", -"header":33, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Removing subscription for users online",{"type":"reference","argument":"users","category":"compact","description":"Users of subscriptions"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} -]}},{"type":"rpc","content":{ -"name":"SubscribeToGroupOnline", -"header":74, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Subscribing for groups online",{"type":"reference","argument":"groups","category":"compact","description":"Groups for subscription"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} -]}},{"type":"rpc","content":{ -"name":"SubscribeFromGroupOnline", -"header":75, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Removing subscription for groups online",{"type":"reference","argument":"groups","category":"compact","description":"Groups of subscriptions"}],"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} -]}}]}, { - "title": "Counters", - "package": "counters", - "doc": [ - "Application Counters, used to display various counters in application" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"AppCounters", -"doc":[ -"Application counters",{"type":"reference","argument":"globalCounter","category":"full","description":" Global unread counter"}],"expandable":"true","attributes":[ -{"type":{"type":"opt","childType":"int32"},"id":1,"name":"globalCounter"} -]}},{"type":"update","content":{ -"name":"CountersChanged", -"header":215, -"doc":[ -"Update about counters changed",{"type":"reference","argument":"counters","category":"full","description":" Current Application counters"}],"attributes":[ -{"type":{"type":"struct","childType":"AppCounters"},"id":1,"name":"counters"} -]}}]}, { - "title": "Miscellaneous", - "package": "misc", - "items": [ -{"type":"response","content":{ -"name":"Void", -"header":50, -"doc":[ -"Empty response"],"attributes":[ -]}},{"type":"response","content":{ -"name":"Seq", -"header":72, -"doc":[ -"Sequence response. Methods that return this value must process response in particular order",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of response"},{"type":"reference","argument":"state","category":"full","description":" Sequence state of response"}],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -]}},{"type":"response","content":{ -"name":"SeqDate", -"header":102, -"doc":[ -"Sequence response with date. Methods that return this value must process response in particular order",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of response"},{"type":"reference","argument":"state","category":"full","description":" Sequence state of response"},{"type":"reference","argument":"date","category":"full","description":" Date of response"}],"attributes":[ -{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} -]}},{"type":"response","content":{ -"name":"Bool", -"header":209, -"doc":[ -"Boolean response",{"type":"reference","argument":"value","category":"full","description":" Response value"}],"attributes":[ -{"type":"bool","id":1,"name":"value"} -]}}, { - "type":"struct", - "content": { - "name":"Config", -"doc":[ -"Configuration of system",{"type":"reference","argument":"maxGroupSize","category":"full","description":" Current maximum group size"}],"attributes":[ -{"type":"int32","id":1,"name":"maxGroupSize"} -]}}, { - "type":"struct", - "content": { - "name":"Extension", -"doc":[ -"Extention",{"type":"reference","argument":"id","category":"full","description":" Extension id"},{"type":"reference","argument":"data","category":"full","description":" Extension data"}],"attributes":[ -{"type":"int32","id":1,"name":"id"} -,{"type":"bytes","id":2,"name":"data"} -]}},{"type":"update","content":{ -"name":"Config", -"header":42, -"doc":[ -"Update about config change",{"type":"reference","argument":"config","category":"full","description":" new config"}],"attributes":[ -{"type":{"type":"struct","childType":"Config"},"id":1,"name":"config"} -]}}]}, { - "title": "Device Info", - "package": "device", - "doc": [ - "Submiting various information about device for providing better experience.", - "For example, getting timezone or preffered languages" - ], - "items": [ -{"type":"rpc","content":{ -"name":"NotifyAboutDeviceInfo", -"header":229, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Notifying about device information",{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"},{"type":"reference","argument":"timeZone","category":"full","description":"Device Time Zone"}],"attributes":[ -{"type":{"type":"list","childType":"string"},"id":1,"name":"preferredLanguages"} -,{"type":{"type":"opt","childType":"string"},"id":2,"name":"timeZone"} -]}}]}, { - "title": "Webactions", - "package": "webactions", - "doc": [ - "Web actions allow clients to visit some predefined web pages,", - "perform actions, and pass result on action completion" - ], - "items": [ -{"type":"rpc","content":{ -"name":"InitWebaction", -"header":116, -"response":{"type":"anonymous","header":117, "doc":[ -{"type":"reference","argument":"uri","category":"full","description":" Web action uri"},{"type":"reference","argument":"regexp","category":"full","description":" Regular expression. Required to match completion of web action"},{"type":"reference","argument":"actionHash","category":"danger","description":" Identifier of current web action. Required to complete it"}] ,"attributes":[{"type":"string","id":1,"name":"uri"} -,{"type":"string","id":2,"name":"regexp"} -,{"type":"string","id":3,"name":"actionHash"} -]}, -"doc":[ -"Initialize start of web action",{"type":"reference","argument":"actionName","category":"full","description":"Name of web action"},{"type":"reference","argument":"params","category":"full","description":"Additional params required to make action's uri"}],"attributes":[ -{"type":"string","id":1,"name":"actionName"} -,{"type":{"type":"struct","childType":"MapValue"},"id":2,"name":"params"} -]}},{"type":"rpc","content":{ -"name":"CompleteWebaction", -"header":123, -"response":{"type":"anonymous","header":124, "doc":[ -{"type":"reference","argument":"result","category":"full","description":" Reslut of web action completion"}] ,"attributes":[{"type":{"type":"struct","childType":"MapValue"},"id":1,"name":"result"} -]}, -"doc":[ -"Complete started web action",{"type":"reference","argument":"actionHash","category":"danger","description":"Identifier of given web action"},{"type":"reference","argument":"completeUri","category":"full","description":"Final uri of web action"}],"attributes":[ -{"type":"string","id":1,"name":"actionHash"} -,{"type":"string","id":2,"name":"completeUri"} -]}}]}, { - "title": "Collections", - "package": "collections", - "doc": [ - "Flexible raw collections without structure" - ], - "items": [ -{"type":"trait","content":{ -"isContainer":"true","name":"RawValue","attributes":[ -]}}, { - "type":"struct", - "content": { - "name":"StringValue", -"doc":[ -"Text value"],"trait":{"name":"RawValue","key":1},"attributes":[ -{"type":"string","id":1,"name":"text"} -]}}, { - "type":"struct", - "content": { - "name":"Int32Value", -"doc":[ -"Int32 value"],"trait":{"name":"RawValue","key":2},"attributes":[ -{"type":"int32","id":1,"name":"value"} -]}}, { - "type":"struct", - "content": { - "name":"Int64Value", -"doc":[ -"Int64 value"],"trait":{"name":"RawValue","key":3},"attributes":[ -{"type":"int64","id":1,"name":"value"} -]}}, { - "type":"struct", - "content": { - "name":"DoubleValue", -"doc":[ -"Double value"],"trait":{"name":"RawValue","key":4},"attributes":[ -{"type":"double","id":1,"name":"value"} -]}}, { - "type":"struct", - "content": { - "name":"ArrayValue", -"doc":[ -"Array value"],"trait":{"name":"RawValue","key":5},"attributes":[ -{"type":{"type":"list","childType":{"type":"trait","childType":"RawValue"}},"id":1,"name":"array"} -]}}, { - "type":"struct", - "content": { - "name":"MapValueItem", -"doc":[ -"Item of Map"],"attributes":[ -{"type":"string","id":1,"name":"key"} -,{"type":{"type":"trait","childType":"RawValue"},"id":2,"name":"value"} -]}}, { - "type":"struct", - "content": { - "name":"MapValue", -"doc":[ -"Map Value"],"trait":{"name":"RawValue","key":6},"attributes":[ -{"type":{"type":"list","childType":{"type":"struct","childType":"MapValueItem"}},"id":1,"name":"items"} -]}}]}, { - "title": "Surveys", - "package": "surveys", - "doc": [ - "Surveys implementation for messages" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"Survey", -"doc":[ -"Main Survey Struct"],"attributes":[ -{"type":"int64","id":1,"name":"id"} -,{"type":"string","id":2,"name":"titulo"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"uf"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"creationTime"} -,{"type":{"type":"alias","childType":"date"},"id":5,"name":"endTime"} -,{"type":{"type":"alias","childType":"userId"},"id":6,"name":"ownerId"} -,{"type":{"type":"list","childType":"string"},"id":7,"name":"answers"} -]}},{"type":"rpc","content":{ -"name":"CreateSurvey", -"header":139, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Criar uma nova enquete"],"attributes":[ -{"type":{"type":"struct","childType":"Survey"},"id":1,"name":"survey"} -]}}]}]} \ No newline at end of file + }, + "id": 3, + "name": "dialogs" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 4, + "name": "userPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 5, + "name": "groupPeers" + }] + }, + "doc": [ + "Loading conversation history", { + "type": "reference", + "argument": "minDate", + "category": "full", + "description": "start date of conversation loading. Use 0 to load latest messages" + }, { + "type": "reference", + "argument": "limit", + "category": "full", + "description": "limit maximum amount of messages (max is 100)" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "date" + }, + "id": 1, + "name": "minDate" + }, { + "type": "int32", + "id": 2, + "name": "limit" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 3, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadArchived", + "header": 2651, + "response": { + "type": "anonymous", + "header": 2652, + "doc": [ + "Archived dialogs", { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " Referenced groups" + }, { + "type": "reference", + "argument": "users", + "category": "full", + "description": " Referenced users" + }, { + "type": "reference", + "argument": "dialogs", + "category": "full", + "description": " Archived dialogs" + }, { + "type": "reference", + "argument": "nextOffset", + "category": "compact", + "description": " Offset for next bunch" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 1, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Dialog" + } + }, + "id": 3, + "name": "dialogs" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 5, + "name": "userPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 6, + "name": "groupPeers" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 4, + "name": "nextOffset" + }] + }, + "doc": [ + "Loading archived messages", { + "type": "reference", + "argument": "nextOffset", + "category": "compact", + "description": "Optional next offset" + }, { + "type": "reference", + "argument": "limit", + "category": "full", + "description": "Maximum number of elements" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 1, + "name": "nextOffset" + }, { + "type": "int32", + "id": 2, + "name": "limit" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 3, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadGroupedDialogs", + "header": 225, + "response": { + "type": "anonymous", + "header": 226, + "doc": [ + "Loaded grouped dialogs", { + "type": "reference", + "argument": "dialogs", + "category": "compact", + "description": " Loaded groups of dialogs" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Loaded users" + }, { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " Loaded groups" + }, { + "type": "reference", + "argument": "showArchived", + "category": "full", + "description": " Show archived section" + }, { + "type": "reference", + "argument": "showInvite", + "category": "full", + "description": " Show invite message" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "DialogGroup" + } + }, + "id": 1, + "name": "dialogs" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 3, + "name": "groups" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 4, + "name": "showArchived" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 5, + "name": "showInvite" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 6, + "name": "userPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 7, + "name": "groupPeers" + }] + }, + "doc": [ + "Load all dialogs from grouped list" + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 1, + "name": "optimizations" + }] + } + }, { + "type": "response", + "content": { + "name": "DialogsOrder", + "header": 235, + "doc": [ + "Dialogs order response", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " update seq" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " update state" + }, { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " Update groups" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "DialogGroup" + } + }, + "id": 3, + "name": "groups" + }] + } + }, { + "type": "rpc", + "content": { + "name": "HideDialog", + "header": 231, + "response": { + "type": "reference", + "name": "DialogsOrder" + }, + "doc": [ + "Hide Dialog from grouped list", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Dialog peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ShowDialog", + "header": 232, + "response": { + "type": "reference", + "name": "DialogsOrder" + }, + "doc": [ + "Show Dialog in grouped list" + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "FavouriteDialog", + "header": 224, + "response": { + "type": "reference", + "name": "DialogsOrder" + }, + "doc": [ + "Marking dialog as favourite", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Peer for favouriting" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnfavouriteDialog", + "header": 227, + "response": { + "type": "reference", + "name": "DialogsOrder" + }, + "doc": [ + "Making dialog as unfavourite", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Peer for favouriting" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "NotifyDialogOpened", + "header": 2785, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Notifying about dialog open", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Peer that was opened" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }] + }, { + "title": "Groups", + "package": "groups", + "items": [{ + "type": "comment", + "content": "Entities" + }, { + "type": "struct", + "content": { + "name": "Member", + "doc": [ + "Member information", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User id" + }, { + "type": "reference", + "argument": "inviterUid", + "category": "full", + "description": " User inviter id" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Adding date" + }, { + "type": "reference", + "argument": "isAdmin", + "category": "full", + "description": " is member admin of group" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "inviterUid" + }, { + "type": "int64", + "id": 3, + "name": "date" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 4, + "name": "isAdmin" + }] + } + }, { + "type": "enum", + "content": { + "name": "GroupType", + "values": [{ + "name": "GROUP", + "id": 1 + }, { + "name": "CHANNEL", + "id": 2 + }] + } + }, { + "type": "enum", + "content": { + "name": "GroupPermissions", + "values": [{ + "name": "SEND_MESSAGE", + "id": 1 + }, { + "name": "CLEAR", + "id": 2 + }, { + "name": "LEAVE", + "id": 3 + }, { + "name": "DELETE", + "id": 4 + }, { + "name": "JOIN", + "id": 5 + }, { + "name": "VIEW_INFO", + "id": 6 + }] + } + }, { + "type": "enum", + "content": { + "name": "GroupFullPermissions", + "values": [{ + "name": "EDIT_INFO", + "id": 1 + }, { + "name": "VIEW_MEMBERS", + "id": 2 + }, { + "name": "INVITE_MEMBERS", + "id": 3 + }, { + "name": "INVITE_VIA_LINK", + "id": 4 + }, { + "name": "CALL", + "id": 5 + }, { + "name": "EDIT_ADMIN_SETTINGS", + "id": 6 + }, { + "name": "VIEW_ADMINS", + "id": 7 + }, { + "name": "EDIT_ADMINS", + "id": 8 + }, { + "name": "KICK_INVITED", + "id": 9 + }, { + "name": "KICK_ANYONE", + "id": 10 + }, { + "name": "EDIT_FOREIGN", + "id": 11 + }, { + "name": "DELETE_FOREIGN", + "id": 12 + }] + } + }, { + "type": "struct", + "content": { + "name": "Group", + "doc": [ + "Group information", "", "Permissions.", "Permissions of this structure is about group messages operation, such as", "ability to send messages, clear chat, leave group and so on. This operations", "Can be held outside of the Group Info page.", "", "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", "If default is TRUE then ONE == FALSE.", "Bits:", "0 - canSendMessage. Default is FALSE.", "1 - canClear. Default is FALSE.", "2 - canLeave. Default is FALSE.", "3 - canDelete. Default is FALSE.", "4 - canJoin. Default is FALSE.", "5 - canViewInfo. Default is FALSE.", "", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " group id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " Access hash of group" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Title of group" + }, { + "type": "reference", + "argument": "avatar", + "category": "compact", + "description": " Avatar of group" + }, { + "type": "reference", + "argument": "membersCount", + "category": "full", + "description": " Number of members" + }, { + "type": "reference", + "argument": "isHidden", + "category": "full", + "description": " Is group hidden (not showing it in recent list). Default is false." + }, { + "type": "reference", + "argument": "isMember", + "category": "full", + "description": " Is current user a member of a group. Default is true." + }, { + "type": "reference", + "argument": "groupType", + "category": "full", + "description": " Group Type. Used only for displaying information. Default is GROUP." + }, { + "type": "reference", + "argument": "permissions", + "category": "full", + "description": " Permissions of group object" + }, { + "type": "reference", + "argument": "isDeleted", + "category": "full", + "description": " Is this group deleted" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " Group extension Data" + }, { + "type": "reference", + "argument": "isAdmin", + "category": "full", + "description": " [DEPRECATED] Is current user an admin of a group" + }, { + "type": "reference", + "argument": "theme", + "category": "hidden", + "description": " [DEPRECATED] Theme of group" + }, { + "type": "reference", + "argument": "about", + "category": "hidden", + "description": " [DEPRECATED] About of group" + }, { + "type": "reference", + "argument": "creatorUid", + "category": "hidden", + "description": " [DEPRECATED] Group creator" + }, { + "type": "reference", + "argument": "members", + "category": "compact", + "description": " [DEPRECATED] Members of group" + }, { + "type": "reference", + "argument": "createDate", + "category": "full", + "description": " [DEPRECATED] Date of creation" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": "string", + "id": 3, + "name": "title" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 4, + "name": "avatar" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 24, + "name": "membersCount" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 6, + "name": "isMember" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 20, + "name": "isHidden" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "GroupType" + } + }, + "id": 25, + "name": "groupType" + }, { + "type": { + "type": "opt", + "childType": "int64" + }, + "id": 26, + "name": "permissions" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 27, + "name": "isDeleted" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 22, + "name": "ext" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 16, + "name": "isAdmin", + "deprecated": "true" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 8, + "name": "creatorUid", + "deprecated": "true" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 9, + "name": "members", + "deprecated": "true" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 10, + "name": "createDate", + "deprecated": "true" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 17, + "name": "theme", + "deprecated": "true" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 18, + "name": "about", + "deprecated": "true" + }] + } + }, { + "type": "struct", + "content": { + "name": "GroupFull", + "doc": [ + "Goup Full information", "Permissions.", "Idea of Group Full mermissions is about Group Info pages. This permissions", "are usefull only when trying to view and update group settings and not related", "to chat messages itself.", "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", "If default is TRUE then ONE == FALSE.", "Bits:", "0 - canEditInfo. Default is FALSE.", "1 - canViewMembers. Default is FALSE.", "2 - canInviteMembers. Default is FALSE.", "3 - canInviteViaLink. Default is FALSE.", "4 - canCall. Default is FALSE.", "5 - canEditAdminSettings. Default is FALSE.", "6 - canViewAdmins. Default is FALSE.", "7 - canEditAdmins. Default is FALSE.", "8 - canKickInvited. Default is FALSE.", "9 - canKickAnyone. Default is FALSE.", "10 - canEditForeign. Default is FALSE.", "11 - canDeleteForeign. Default is FALSE.", "", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "createDate", + "category": "full", + "description": " Date created" + }, { + "type": "reference", + "argument": "ownerUid", + "category": "full", + "description": " Optional group owner" + }, { + "type": "reference", + "argument": "members", + "category": "full", + "description": " Group members. Can be empty when isAsyncMembers enabled." + }, { + "type": "reference", + "argument": "theme", + "category": "full", + "description": " Group Theme" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": " Group about" + }, { + "type": "reference", + "argument": "isAsyncMembers", + "category": "full", + "description": " Is Members need to be loaded asynchronous. Default is false." + }, { + "type": "reference", + "argument": "isSharedHistory", + "category": "full", + "description": " Is history shared among all users. Default is false." + }, { + "type": "reference", + "argument": "shortName", + "category": "full", + "description": " Group's short name" + }, { + "type": "reference", + "argument": "permissions", + "category": "full", + "description": " Group Permissions" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 6, + "name": "createDate" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 5, + "name": "ownerUid" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 12, + "name": "members" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "theme" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "about" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 7, + "name": "ext" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 11, + "name": "isAsyncMembers" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 10, + "name": "isSharedHistory" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 14, + "name": "shortName" + }, { + "type": { + "type": "opt", + "childType": "int64" + }, + "id": 27, + "name": "permissions" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadFullGroups", + "header": 2782, + "response": { + "type": "anonymous", + "header": 2783, + "doc": [{ + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Groups to load" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupFull" + } + }, + "id": 1, + "name": "groups" + }] + }, + "doc": [ + "Loading Full Groups", { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": "Groups to load" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 1, + "name": "groups" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadMembers", + "header": 2786, + "response": { + "type": "anonymous", + "header": 2787, + "doc": [{ + "type": "reference", + "argument": "users", + "category": "full", + "description": " Group members" + }, { + "type": "reference", + "argument": "next", + "category": "full", + "description": " Load more reference" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 3, + "name": "members" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 1, + "name": "users" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 2, + "name": "next" + }] + }, + "doc": [ + "Loading group members", { + "type": "reference", + "argument": "group", + "category": "full", + "description": "Group peer" + }, { + "type": "reference", + "argument": "limit", + "category": "full", + "description": "Limit members" + }, { + "type": "reference", + "argument": "next", + "category": "full", + "description": "Load more reference" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "group" + }, { + "type": "int32", + "id": 2, + "name": "limit" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 3, + "name": "next" + }] + } + }, { + "type": "comment", + "content": "Update" + }, { + "type": "update", + "content": { + "name": "GroupTitleChanged", + "header": 2609, + "doc": [ + "Update about title changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Group Title" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "string", + "id": 2, + "name": "title" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupAvatarChanged", + "header": 2610, + "doc": [ + "Update about avatar changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "avatar", + "category": "full", + "description": " Group Avatar" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 2, + "name": "avatar" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupTopicChanged", + "header": 2616, + "doc": [ + "Update about topic changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "topic", + "category": "full", + "description": " Updated topic" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "topic" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupAboutChanged", + "header": 2617, + "doc": [ + "Update about about changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": " Updated about" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "about" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupExtChanged", + "header": 2613, + "doc": [ + "Update about ext changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " Updated ext" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 2, + "name": "ext" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupFullExtChanged", + "header": 2618, + "doc": [ + "Update about full ext changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "ext", + "category": "full", + "description": " Updated ext" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "MapValue" + } + }, + "id": 2, + "name": "ext" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupShortNameChanged", + "header": 2628, + "doc": [ + "Group's short name changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "shortName", + "category": "full", + "description": " Group short name" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "shortName" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupOwnerChanged", + "header": 2619, + "doc": [ + "Update about owner changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "userId", + "category": "full", + "description": " New Owner" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "userId" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupHistoryShared", + "header": 2620, + "doc": [ + "Update about history shared", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupDeleted", + "header": 2658, + "doc": [ + "Update about group deleted", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupPermissionsChanged", + "header": 2663, + "doc": [ + "Update about group permissions changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "permissions", + "category": "full", + "description": " New Permissions" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "int64", + "id": 2, + "name": "permissions" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupFullPermissionsChanged", + "header": 2664, + "doc": [ + "Update about Full Group permissions changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "permissions", + "category": "full", + "description": " New Permissions" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "int64", + "id": 2, + "name": "permissions" + }] + } + }, { + "type": "comment", + "content": " " + }, { + "type": "update", + "content": { + "name": "GroupMemberChanged", + "header": 2612, + "doc": [ + "Update about membership changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "isMember", + "category": "full", + "description": " Is current user a member" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "bool", + "id": 2, + "name": "isMember" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupMembersBecameAsync", + "header": 2615, + "doc": [ + "Update about members became async", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupMembersUpdated", + "header": 2614, + "doc": [ + "Update about members updated", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "members", + "category": "full", + "description": " Group Members" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 2, + "name": "members" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupMemberDiff", + "header": 2623, + "doc": [ + "Update about members changed", { + "type": "reference", + "argument": "removedUsers", + "category": "full", + "description": " Removed Users" + }, { + "type": "reference", + "argument": "addedMembers", + "category": "full", + "description": " Added members" + }, { + "type": "reference", + "argument": "membersCount", + "category": "full", + "description": " Current Members count" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 2, + "name": "removedUsers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 3, + "name": "addedMembers" + }, { + "type": "int32", + "id": 4, + "name": "membersCount" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupMembersCountChanged", + "header": 2622, + "doc": [ + "Update about members count changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "membersCount", + "category": "full", + "description": " Members count" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "int32", + "id": 2, + "name": "membersCount" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupMemberAdminChanged", + "header": 2627, + "doc": [ + "Update about member admin changed", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "userId", + "category": "full", + "description": " User Id" + }, { + "type": "reference", + "argument": "isAdmin", + "category": "full", + "description": " Is Admin flag" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "userId" + }, { + "type": "bool", + "id": 3, + "name": "isAdmin" + }] + } + }, { + "type": "comment", + "content": "Actions" + }, { + "type": "rpc", + "content": { + "name": "CreateGroup", + "header": 230, + "response": { + "type": "anonymous", + "header": 216, + "doc": [ + "Created group", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Update Seq" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Update state" + }, { + "type": "reference", + "argument": "group", + "category": "full", + "description": " Created group" + }, { + "type": "reference", + "argument": "users", + "category": "full", + "description": " Referenced users" + }, { + "type": "reference", + "argument": "userPeers", + "category": "full", + "description": " Referenced users" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Group creation date" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 6, + "name": "date" + }, { + "type": { + "type": "struct", + "childType": "Group" + }, + "id": 3, + "name": "group" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 4, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 5, + "name": "userPeers" + }] + }, + "doc": [ + "Creating group chat", { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id for avoiding double create" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": "Group Title" + }, { + "type": "reference", + "argument": "users", + "category": "hidden", + "description": "Members of group" + }, { + "type": "reference", + "argument": "groupType", + "category": "full", + "description": "Group Type" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "rid" + }, { + "type": "string", + "id": 2, + "name": "title" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 3, + "name": "users" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "GroupType" + } + }, + "id": 6, + "name": "groupType" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 7, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditGroupTitle", + "header": 85, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Changing group title", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": "new group title" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id of operation" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": "string", + "id": 3, + "name": "title" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 5, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditGroupAvatar", + "header": 86, + "response": { + "type": "anonymous", + "header": 115, + "doc": [ + "Updated group avatar", { + "type": "reference", + "argument": "avatar", + "category": "compact", + "description": " Changed avatar" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Sequence state" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Avatar change date" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Avatar" + }, + "id": 1, + "name": "avatar" + }, { + "type": "int32", + "id": 2, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + }, + "doc": [ + "Changing group avatar", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "fileLocation", + "category": "compact", + "description": "uploaded file for avatar" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id of operation" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 3, + "name": "fileLocation" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 5, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RemoveGroupAvatar", + "header": 101, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Removing group avatar", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id of operation" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 5, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditGroupShortName", + "header": 2793, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Edit Group Short Name", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "shortName", + "category": "full", + "description": "New group's short name" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "shortName" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditGroupTopic", + "header": 211, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Edit group topic", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random id of operation" + }, { + "type": "reference", + "argument": "topic", + "category": "full", + "description": "New Topic" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "topic" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 4, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EditGroupAbout", + "header": 213, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Edit Group About", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random id of operation" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": "New About" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "about" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 5, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "InviteUser", + "header": 69, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Inviting user to group", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "user", + "category": "full", + "description": "Users for invitation" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id of operation" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 3, + "name": "user" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 5, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LeaveGroup", + "header": 70, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Leaving group", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id of operation" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 3, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LeaveAndDelete", + "header": 2721, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Leave group and Delete Chat", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "KickUser", + "header": 71, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Kicking user from group", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "user", + "category": "full", + "description": "users for removing" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id of operation" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 3, + "name": "user" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 5, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "JoinGroupByPeer", + "header": 2722, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Join group by peer", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "JoinGroupByGroupId", + "header": 44561, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Join group by peer without a necessity of invite", { + "type": "reference", + "argument": "groupId", + "category": "hidden", + "description": "Groups peer" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }] + } + }, { + "type": "comment", + "content": "Administration" + }, { + "type": "rpc", + "content": { + "name": "MakeUserAdmin", + "header": 2784, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Make user admin", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 2, + "name": "userPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DismissUserAdmin", + "header": 2791, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Dismissing user admin", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 2, + "name": "userPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "TransferOwnership", + "header": 2789, + "response": { + "type": "reference", + "name": "SeqDate" + }, + "doc": [ + "Transfer ownership of group", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "newOwner", + "category": "full", + "description": "New group's owner" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 2, + "name": "newOwner" + }] + } + }, { + "type": "struct", + "content": { + "name": "AdminSettings", + "doc": [ + "Admin Settings", { + "type": "reference", + "argument": "showAdminsToMembers", + "category": "full", + "description": " Show admins in member list" + }, { + "type": "reference", + "argument": "canMembersInvite", + "category": "full", + "description": " Can members of a group invite people" + }, { + "type": "reference", + "argument": "canMembersEditGroupInfo", + "category": "full", + "description": " Can members edit group info" + }, { + "type": "reference", + "argument": "canAdminsEditGroupInfo", + "category": "full", + "description": " Can admins edit group info" + }, { + "type": "reference", + "argument": "showJoinLeaveMessages", + "category": "full", + "description": " Should join and leave messages be visible to members" + } + ], + "expandable": "true", + "attributes": [{ + "type": "bool", + "id": 1, + "name": "showAdminsToMembers" + }, { + "type": "bool", + "id": 2, + "name": "canMembersInvite" + }, { + "type": "bool", + "id": 3, + "name": "canMembersEditGroupInfo" + }, { + "type": "bool", + "id": 4, + "name": "canAdminsEditGroupInfo" + }, { + "type": "bool", + "id": 5, + "name": "showJoinLeaveMessages" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadAdminSettings", + "header": 2790, + "response": { + "type": "anonymous", + "header": 2794, + "doc": [ + "Loaded settings", { + "type": "reference", + "argument": "settings", + "category": "full", + "description": " Current group admin settings" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "AdminSettings" + }, + "id": 1, + "name": "settings" + }] + }, + "doc": [ + "Loading administration settings", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SaveAdminSettings", + "header": 2792, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Save administartion settings", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's Peer" + }, { + "type": "reference", + "argument": "settings", + "category": "full", + "description": "Group's settings" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "struct", + "childType": "AdminSettings" + }, + "id": 2, + "name": "settings" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DeleteGroup", + "header": 2795, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Delete Group", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ShareHistory", + "header": 2796, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Share History", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "comment", + "content": "Invite" + }, { + "type": "response", + "content": { + "name": "InviteUrl", + "header": 178, + "doc": [ + "Response for invite url methods" + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "url" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetGroupInviteUrl", + "header": 177, + "response": { + "type": "reference", + "name": "InviteUrl" + }, + "doc": [ + "Building invite url", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Destination group peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RevokeInviteUrl", + "header": 179, + "response": { + "type": "reference", + "name": "InviteUrl" + }, + "doc": [ + "Revoking invite urls", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Destination group peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "JoinGroup", + "header": 180, + "response": { + "type": "anonymous", + "header": 181, + "doc": [{ + "type": "reference", + "argument": "group", + "category": "hidden", + "description": " Joined group" + }, { + "type": "reference", + "argument": "users", + "category": "hidden", + "description": " Users from members" + }, { + "type": "reference", + "argument": "userPeers", + "category": "hidden", + "description": " User Peers" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random id" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number" + }, { + "type": "reference", + "argument": "state", + "category": "hidden", + "description": " State" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of join" + }], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Group" + }, + "id": 1, + "name": "group" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 5, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 7, + "name": "userPeers" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 6, + "name": "rid" + }, { + "type": "int32", + "id": 2, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + }, + "doc": [ + "Join group method", { + "type": "reference", + "argument": "token", + "category": "full", + "description": "Url or Token for joining to group" + }, { + "type": "reference", + "argument": "optimizations", + "category": "hidden", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 2, + "name": "optimizations" + }] + } + }, { + "type": "comment", + "content": "Obsolete Actions" + }, { + "type": "rpc", + "content": { + "name": "CreateGroupObsolete", + "header": 65, + "response": { + "type": "anonymous", + "header": 66, + "doc": [ + "Created group", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": " Peer of created group" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Sequence state" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Members of created group" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Group creation date" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": "int32", + "id": 3, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 4, + "name": "state" + }, { + "type": { + "type": "list", + "childType": "int32" + }, + "id": 5, + "name": "users" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 6, + "name": "date" + }] + }, + "doc": [ + "[OBSOLETE] Creating group chat", { + "type": "reference", + "argument": "rid", + "category": "full", + "description": "Random Id for avoiding double create" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": "Title of new group" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": "Members of new group" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "rid" + }, { + "type": "string", + "id": 2, + "name": "title" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 3, + "name": "users" + }] + } + }, { + "type": "rpc", + "content": { + "name": "EnterGroupObsolete", + "header": 199, + "response": { + "type": "anonymous", + "header": 200, + "doc": [ + "Joined group", { + "type": "reference", + "argument": "group", + "category": "full", + "description": " Joined group" + }, { + "type": "reference", + "argument": "users", + "category": "full", + "description": " Referenced users" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Rid of join message" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Seq of Update" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " State of Update" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of update" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Group" + }, + "id": 1, + "name": "group" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 3, + "name": "rid" + }, { + "type": "int32", + "id": 4, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 5, + "name": "state" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 6, + "name": "date" + }] + }, + "doc": [ + "[OBSOLETE] Join random group by peer id", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Public group peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MakeUserAdminObsolete", + "header": 214, + "response": { + "type": "anonymous", + "header": 215, + "doc": [{ + "type": "reference", + "argument": "members", + "category": "full", + "description": " new members" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 1, + "name": "members" + }, { + "type": "int32", + "id": 2, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }] + }, + "doc": [ + "[OBSOLETE] Make user admin", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Group's peer" + }, { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 1, + "name": "groupPeer" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 2, + "name": "userPeer" + }] + } + }, { + "type": "comment", + "content": "Obsolete Updates" + }, { + "type": "update", + "content": { + "name": "GroupInviteObsolete", + "header": 36, + "doc": [ + "Update about inviting current user to group", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "inviteUid", + "category": "full", + "description": " Inviter UID. If equals to current uid than group created by user." + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of creating" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 9, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 5, + "name": "inviteUid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 8, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupUserInvitedObsolete", + "header": 21, + "doc": [ + "Update about inviting user to group", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " Added user ID" + }, { + "type": "reference", + "argument": "inviterUid", + "category": "full", + "description": " Inviter user ID" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of adding user to group" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 5, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 3, + "name": "inviterUid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupUserLeaveObsolete", + "header": 23, + "doc": [ + "Update about leaving user", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's ID" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of user leave" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupUserKickObsolete", + "header": 24, + "doc": [ + "Update about kicking user", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " Kicked user's ID" + }, { + "type": "reference", + "argument": "kickerUid", + "category": "full", + "description": " Kicker user's ID" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of user kick" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 5, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 3, + "name": "kickerUid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupMembersUpdateObsolete", + "header": 44, + "doc": [ + "Silent group members update", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "members", + "category": "full", + "description": " New members list" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Member" + } + }, + "id": 2, + "name": "members" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupTitleChangedObsolete", + "header": 38, + "doc": [ + "Update about group title change", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " Changer UID" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": " New Title of group" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of title change" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 5, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": "string", + "id": 3, + "name": "title" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupTopicChangedObsolete", + "header": 213, + "doc": [ + "Update about group topic change", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " Changer UID" + }, { + "type": "reference", + "argument": "topic", + "category": "full", + "description": " New topic of group" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of theme change" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Randomd Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 3, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "topic" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 5, + "name": "date" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupAboutChangedObsolete", + "header": 214, + "doc": [ + "Update about group about change", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "about", + "category": "full", + "description": " Group about" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "about" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupAvatarChangedObsolete", + "header": 39, + "doc": [ + "Update about group avatar change", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group Id" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " Avatar changer uid" + }, { + "type": "reference", + "argument": "avatar", + "category": "compact", + "description": " New Avatar. If null then avatar is removed" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of avatar change" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Random Id of operation" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 5, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 3, + "name": "avatar" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "date" + }] + } + }] + }, { + "title": "Stickers", + "package": "stickers", + "doc": [ + "Stickers support in Actor" + ], + "items": [{ + "type": "struct", + "content": { + "name": "StickerDescriptor", + "doc": [ + "Descriptor of a Sticker", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Sticker unique id" + }, { + "type": "reference", + "argument": "emoji", + "category": "full", + "description": " Emoji code for sticker" + }, { + "type": "reference", + "argument": "image128", + "category": "full", + "description": " Image of sticker 128x128 in WebP format" + }, { + "type": "reference", + "argument": "image512", + "category": "full", + "description": " Image of sticker 512x512 in WebP format" + }, { + "type": "reference", + "argument": "image256", + "category": "full", + "description": " Image of sticker 256x256 in WebP format" + } + ], + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "emoji" + }, { + "type": { + "type": "struct", + "childType": "ImageLocation" + }, + "id": 3, + "name": "image128" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ImageLocation" + } + }, + "id": 4, + "name": "image512" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "ImageLocation" + } + }, + "id": 5, + "name": "image256" + }] + } + }, { + "type": "struct", + "content": { + "name": "StickerCollection", + "doc": [ + "Sticker collection", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Unique id of a collection" + }, { + "type": "reference", + "argument": "accessHash", + "category": "full", + "description": " Access Hash of a collection" + }, { + "type": "reference", + "argument": "stickers", + "category": "compact", + "description": " Sticker list" + } + ], + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "StickerDescriptor" + } + }, + "id": 3, + "name": "stickers" + }] + } + }, { + "type": "response", + "content": { + "name": "StickersReponse", + "header": 240, + "doc": [ + "Stickers response", { + "type": "reference", + "argument": "collections", + "category": "full", + "description": " Sticker collections" + }, { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Seq of update" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " State of update" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "StickerCollection" + } + }, + "id": 1, + "name": "collections" + }, { + "type": "int32", + "id": 2, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadOwnStickers", + "header": 238, + "response": { + "type": "anonymous", + "header": 239, + "doc": [ + "Own Stickers collections", { + "type": "reference", + "argument": "ownStickers", + "category": "hidden", + "description": " Own sticker collections" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "StickerCollection" + } + }, + "id": 1, + "name": "ownStickers" + }] + }, + "doc": [ + "Loading own stickers" + ], + "attributes": [] + } + }, { + "type": "update", + "content": { + "name": "OwnStickersChanged", + "header": 161, + "doc": [ + "Own Stickers changed", { + "type": "reference", + "argument": "collections", + "category": "compact", + "description": " New own sticker collections" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "StickerCollection" + } + }, + "id": 1, + "name": "collections" + }] + } + }, { + "type": "update", + "content": { + "name": "StickerCollectionsChanged", + "header": 164, + "doc": [ + "Sticker collection changed", { + "type": "reference", + "argument": "collections", + "category": "full", + "description": " Updated sticker collections" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "StickerCollection" + } + }, + "id": 1, + "name": "collections" + }] + } + }, { + "type": "rpc", + "content": { + "name": "AddStickerCollection", + "header": 244, + "response": { + "type": "reference", + "name": "StickersReponse" + }, + "doc": [ + "Adding sticker collection", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Collection id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "full", + "description": "Collection access hash" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RemoveStickerCollection", + "header": 245, + "response": { + "type": "reference", + "name": "StickersReponse" + }, + "doc": [ + "Removing sticker collection", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Collection id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "full", + "description": "Collection access hash" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadStickerCollection", + "header": 246, + "response": { + "type": "anonymous", + "header": 247, + "doc": [ + "Loaded collection", { + "type": "reference", + "argument": "collection", + "category": "full", + "description": " Collection of stickers" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "StickerCollection" + }, + "id": 1, + "name": "collection" + }] + }, + "doc": [ + "Loading stickers", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Collection id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "full", + "description": "Collection access hash" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }] + }, { + "title": "Search", + "package": "search", + "doc": [ + "Searching API" + ], + "items": [{ + "type": "enum", + "content": { + "name": "SearchPeerType", + "values": [{ + "name": "Groups", + "id": 1 + }, { + "name": "Contacts", + "id": 2 + }, { + "name": "Public", + "id": 3 + }] + } + }, { + "type": "enum", + "content": { + "name": "SearchContentType", + "values": [{ + "name": "Any", + "id": 1 + }, { + "name": "Text", + "id": 2 + }, { + "name": "Links", + "id": 3 + }, { + "name": "Documents", + "id": 4 + }, { + "name": "Photos", + "id": 5 + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "SearchCondition", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "SearchPeerTypeCondition", + "doc": [ + "Search peer type condition", { + "type": "reference", + "argument": "peerType", + "category": "full", + "description": " Peer type for searching" + } + ], + "trait": { + "name": "SearchCondition", + "key": 1 + }, + "attributes": [{ + "type": { + "type": "enum", + "childType": "SearchPeerType" + }, + "id": 1, + "name": "peerType" + }] + } + }, { + "type": "struct", + "content": { + "name": "SearchPieceText", + "doc": [ + "Search peer name condition", { + "type": "reference", + "argument": "query", + "category": "full", + "description": " Search query" + } + ], + "trait": { + "name": "SearchCondition", + "key": 2 + }, + "attributes": [{ + "type": "string", + "id": 1, + "name": "query" + }] + } + }, { + "type": "struct", + "content": { + "name": "SearchAndCondition", + "doc": [ + "Search AND condion", { + "type": "reference", + "argument": "andQuery", + "category": "full", + "description": " And Query" + } + ], + "trait": { + "name": "SearchCondition", + "key": 3 + }, + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "trait", + "childType": "SearchCondition" + } + }, + "id": 1, + "name": "andQuery" + }] + } + }, { + "type": "struct", + "content": { + "name": "SearchOrCondition", + "doc": [ + "Search OR condition", { + "type": "reference", + "argument": "orQuery", + "category": "full", + "description": " Or Query" + } + ], + "trait": { + "name": "SearchCondition", + "key": 4 + }, + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "trait", + "childType": "SearchCondition" + } + }, + "id": 2, + "name": "orQuery" + }] + } + }, { + "type": "struct", + "content": { + "name": "SearchPeerCondition", + "doc": [ + "Serch Peer condition", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Peer condition" + } + ], + "trait": { + "name": "SearchCondition", + "key": 5 + }, + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }] + } + }, { + "type": "struct", + "content": { + "name": "SearchPeerContentType", + "doc": [ + "Search content type condition", { + "type": "reference", + "argument": "contentType", + "category": "full", + "description": " Content Type" + } + ], + "trait": { + "name": "SearchCondition", + "key": 6 + }, + "attributes": [{ + "type": { + "type": "enum", + "childType": "SearchContentType" + }, + "id": 1, + "name": "contentType" + }] + } + }, { + "type": "struct", + "content": { + "name": "SearchSenderIdConfition", + "doc": [ + "Searching sender uid condition", { + "type": "reference", + "argument": "senderId", + "category": "full", + "description": " sender UID" + } + ], + "trait": { + "name": "SearchCondition", + "key": 7 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "senderId" + }] + } + }, { + "type": "struct", + "content": { + "name": "PeerSearchResult", + "doc": [ + "Peer search result", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Peer information" + }, { + "type": "reference", + "argument": "optMatchString", + "category": "full", + "description": " Description" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "optMatchString" + }] + } + }, { + "type": "rpc", + "content": { + "name": "PeerSearch", + "header": 233, + "response": { + "type": "anonymous", + "header": 234, + "doc": [ + "Found peers", { + "type": "reference", + "argument": "searchResults", + "category": "full", + "description": " Search Results" + }, { + "type": "reference", + "argument": "users", + "category": "full", + "description": " Related users" + }, { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " Related groups" + }, { + "type": "reference", + "argument": "userPeers", + "category": "full", + "description": " Related user peers" + }, { + "type": "reference", + "argument": "groupPeers", + "category": "full", + "description": " Related group peers" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "PeerSearchResult" + } + }, + "id": 1, + "name": "searchResults" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 3, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 4, + "name": "userPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 5, + "name": "groupPeers" + }] + }, + "doc": [ + "Performing peer search", { + "type": "reference", + "argument": "query", + "category": "full", + "description": "Search query. Warring not all combinations can be processed by server. (acts as OR)" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "trait", + "childType": "SearchCondition" + } + }, + "id": 1, + "name": "query" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 2, + "name": "optimizations" + }] + } + }, { + "type": "struct", + "content": { + "name": "MessageSearchResult", + "doc": [ + "Message container", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Message Peer" + }, { + "type": "reference", + "argument": "rid", + "category": "full", + "description": " Message Random Id" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Message Date" + }, { + "type": "reference", + "argument": "senderId", + "category": "full", + "description": " Message sender UID" + }, { + "type": "reference", + "argument": "content", + "category": "full", + "description": " Message content" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "rid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 4, + "name": "senderId" + }, { + "type": { + "type": "trait", + "childType": "Message" + }, + "id": 5, + "name": "content" + }] + } + }, { + "type": "struct", + "content": { + "name": "MessageSearchItem", + "doc": [ + "Message Search result container" + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "MessageSearchResult" + }, + "id": 1, + "name": "result" + }] + } + }, { + "type": "response", + "content": { + "name": "MessageSearchResponse", + "header": 218, + "doc": [ + "Search Result", { + "type": "reference", + "argument": "searchResults", + "category": "full", + "description": " Search results" + }, { + "type": "reference", + "argument": "users", + "category": "full", + "description": " Search users" + }, { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " Search groups" + }, { + "type": "reference", + "argument": "loadMoreState", + "category": "hidden", + "description": " State for loading more results" + }, { + "type": "reference", + "argument": "userOutPeers", + "category": "full", + "description": " Search user peers" + }, { + "type": "reference", + "argument": "groupOutPeers", + "category": "full", + "description": " Search group peers" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageSearchItem" + } + }, + "id": 1, + "name": "searchResults" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 2, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 3, + "name": "groups" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 4, + "name": "loadMoreState" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 5, + "name": "userOutPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 6, + "name": "groupOutPeers" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MessageSearch", + "header": 217, + "response": { + "type": "reference", + "name": "MessageSearchResponse" + }, + "doc": [ + "Performing message search", { + "type": "reference", + "argument": "query", + "category": "full", + "description": "Search query" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": { + "type": "trait", + "childType": "SearchCondition" + }, + "id": 1, + "name": "query" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 2, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "MessageSearchMore", + "header": 222, + "response": { + "type": "reference", + "name": "MessageSearchResponse" + }, + "doc": [ + "Performing message search paging", { + "type": "reference", + "argument": "loadMoreState", + "category": "hidden", + "description": "State for loading more results" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled Optimizations" + } + ], + "attributes": [{ + "type": "bytes", + "id": 1, + "name": "loadMoreState" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 2, + "name": "optimizations" + }] + } + }] + }, { + "title": "Public Groups", + "package": "pubgroups", + "doc": [ + "Public group is easy way to find communities" + ], + "items": [{ + "type": "struct", + "content": { + "name": "PublicGroup", + "doc": [ + "Public Group description", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Group id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " Group Access hash" + }, { + "type": "reference", + "argument": "title", + "category": "full", + "description": " Group title" + }, { + "type": "reference", + "argument": "avatar", + "category": "full", + "description": " Group avatar" + }, { + "type": "reference", + "argument": "membersCount", + "category": "full", + "description": " Members count in group" + }, { + "type": "reference", + "argument": "friendsCount", + "category": "full", + "description": " Friends count int group" + }, { + "type": "reference", + "argument": "description", + "category": "full", + "description": " Description of group" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": "string", + "id": 3, + "name": "title" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "Avatar" + } + }, + "id": 7, + "name": "avatar" + }, { + "type": "int32", + "id": 4, + "name": "membersCount" + }, { + "type": "int32", + "id": 5, + "name": "friendsCount" + }, { + "type": "string", + "id": 6, + "name": "description" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetPublicGroups", + "header": 201, + "response": { + "type": "anonymous", + "header": 202, + "doc": [ + "Loaded public groups", { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " All available groups" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "PublicGroup" + } + }, + "id": 1, + "name": "groups" + }] + }, + "doc": [ + "Getting public groups" + ], + "attributes": [] + } + }] + }, { + "title": "Invites", + "package": "invites", + "doc": [ + "Invite mechanizm" + ], + "items": [{ + "type": "struct", + "content": { + "name": "InviteState", + "doc": [ + "Invite state", { + "type": "reference", + "argument": "email", + "category": "full", + "description": " Email of invite" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " Name of invited user" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " Uid of registered user" + }, { + "type": "reference", + "argument": "tid", + "category": "full", + "description": " Team id of invite" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "email" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "name" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 3, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 4, + "name": "tid" + }] + } + }, { + "type": "response", + "content": { + "name": "InviteList", + "header": 2564, + "doc": [ + "Intites list", { + "type": "reference", + "argument": "invites", + "category": "full", + "description": " Intvites" + }, { + "type": "reference", + "argument": "relatedUsers", + "category": "full", + "description": " Related users in invites" + }, { + "type": "reference", + "argument": "relatedGroups", + "category": "full", + "description": " Related groups in invites" + }, { + "type": "reference", + "argument": "relatedTeams", + "category": "full", + "description": " Related teams in invites" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "InviteState" + } + }, + "id": 1, + "name": "invites" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 2, + "name": "relatedUsers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 3, + "name": "relatedGroups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Team" + } + }, + "id": 4, + "name": "relatedTeams" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadOwnSentInvites", + "header": 2563, + "response": { + "type": "reference", + "name": "InviteList" + }, + "doc": [ + "Loading current invite states" + ], + "attributes": [] + } + }, { + "type": "rpc", + "content": { + "name": "SendInvite", + "header": 2565, + "response": { + "type": "reference", + "name": "InviteList" + }, + "doc": [ + "Sending an email invite", { + "type": "reference", + "argument": "email", + "category": "full", + "description": "Email for invite" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": "Optional name for invite" + }, { + "type": "reference", + "argument": "destTeam", + "category": "full", + "description": "Optional team for invite" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "email" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "name" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "OutTeam" + } + }, + "id": 3, + "name": "destTeam" + }] + } + }] + }, { + "title": "Teams", + "package": "teams", + "doc": [ + "Teams support for Actor" + ], + "items": [{ + "type": "struct", + "content": { + "name": "Team", + "doc": [ + "Team entity", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Team Id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " Team Access Hash" + }, { + "type": "reference", + "argument": "name", + "category": "full", + "description": " Team name" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }, { + "type": "string", + "id": 3, + "name": "name" + }] + } + }, { + "type": "struct", + "content": { + "name": "OutTeam", + "doc": [ + "Reference to a team", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Team Id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "full", + "description": " Team access hash" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "response", + "content": { + "name": "TeamsList", + "header": 2562, + "doc": [ + "Teams response", { + "type": "reference", + "argument": "teams", + "category": "hidden", + "description": " Teams list" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Team" + } + }, + "id": 1, + "name": "teams" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadOwnTeams", + "header": 2561, + "response": { + "type": "reference", + "name": "TeamsList" + }, + "doc": [ + "Loading own teams" + ], + "attributes": [] + } + }, { + "type": "update", + "content": { + "name": "OwnTeamsChanged", + "header": 165, + "doc": [ + "Update about own teams changed", { + "type": "reference", + "argument": "ownTeams", + "category": "full", + "description": " Updated own teams list" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Team" + } + }, + "id": 1, + "name": "ownTeams" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CreateTeam", + "header": 2566, + "response": { + "type": "anonymous", + "header": 2567, + "doc": [ + "Created team response", { + "type": "reference", + "argument": "createdTeam", + "category": "full", + "description": " Created Team" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Team" + }, + "id": 1, + "name": "createdTeam" + }] + }, + "doc": [ + "Creation of a Team", { + "type": "reference", + "argument": "title", + "category": "full", + "description": "Title of a team" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "title" + }] + } + }, { + "type": "rpc", + "content": { + "name": "InviteToTeam", + "header": 2568, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Inviting people to team", { + "type": "reference", + "argument": "user", + "category": "full", + "description": "Dest user" + }, { + "type": "reference", + "argument": "destTeam", + "category": "full", + "description": "Dest team" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "user" + }, { + "type": { + "type": "struct", + "childType": "OutTeam" + }, + "id": 3, + "name": "destTeam" + }] + } + }] + }, { + "title": "Integrations", + "package": "integrations", + "doc": [ + "Package contains methods for providing integration" + ], + "items": [{ + "type": "response", + "content": { + "name": "IntegrationToken", + "header": 183, + "doc": [ + "Group token response", { + "type": "reference", + "argument": "token", + "category": "danger", + "description": " current group token" + }, { + "type": "reference", + "argument": "url", + "category": "danger", + "description": " current group url" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }, { + "type": "string", + "id": 2, + "name": "url" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetIntegrationToken", + "header": 182, + "response": { + "type": "reference", + "name": "IntegrationToken" + }, + "doc": [ + "Getting current group token", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RevokeIntegrationToken", + "header": 184, + "response": { + "type": "reference", + "name": "IntegrationToken" + }, + "doc": [ + "Revoke group token", { + "type": "reference", + "argument": "groupPeer", + "category": "full", + "description": "Peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "groupPeer" + }] + } + }] + }, { + "title": "Typing and Online", + "package": "weak", + "items": [{ + "type": "enum", + "content": { + "name": "TypingType", + "values": [{ + "name": "Text", + "id": 0 + }] + } + }, { + "type": "rpc", + "content": { + "name": "Typing", + "header": 27, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Sending typing notification", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "typingType", + "category": "full", + "description": "typing type." + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "enum", + "childType": "TypingType" + }, + "id": 3, + "name": "typingType" + }] + } + }, { + "type": "rpc", + "content": { + "name": "StopTyping", + "header": 30, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Stop typing", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "typingType", + "category": "full", + "description": "typing type" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "enum", + "childType": "TypingType" + }, + "id": 2, + "name": "typingType" + }] + } + }, { + "type": "enum", + "content": { + "name": "DeviceType", + "values": [{ + "name": "GENERIC", + "id": 1 + }, { + "name": "PC", + "id": 2 + }, { + "name": "MOBILE", + "id": 3 + }, { + "name": "TABLET", + "id": 4 + }, { + "name": "WATCH", + "id": 5 + }, { + "name": "MIRROR", + "id": 6 + }, { + "name": "CAR", + "id": 7 + }, { + "name": "TABLE", + "id": 8 + }] + } + }, { + "type": "rpc", + "content": { + "name": "SetOnline", + "header": 29, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Sending online state", { + "type": "reference", + "argument": "isOnline", + "category": "full", + "description": "is user online" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": "timeout of online state in milliseconds" + }, { + "type": "reference", + "argument": "deviceType", + "category": "full", + "description": "Optional device type" + }, { + "type": "reference", + "argument": "deviceCategory", + "category": "full", + "description": "Optional device category, for example android or ios" + } + ], + "attributes": [{ + "type": "bool", + "id": 1, + "name": "isOnline" + }, { + "type": { + "type": "alias", + "childType": "msec" + }, + "id": 2, + "name": "timeout" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "DeviceType" + } + }, + "id": 3, + "name": "deviceType" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "deviceCategory" + }] + } + }, { + "type": "update", + "content": { + "name": "PauseNotifications", + "header": 166, + "doc": [ + "Update about pausing notifications", { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": " Timeout for notifications resume" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "sec" + }, + "id": 1, + "name": "timeout" + }] + } + }, { + "type": "update", + "content": { + "name": "RestoreNotifications", + "header": 167, + "doc": [ + "Update about restoring notifications" + ], + "attributes": [] + } + }, { + "type": "rpc", + "content": { + "name": "PauseNotifications", + "header": 2641, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Pause notifications", { + "type": "reference", + "argument": "timeout", + "category": "hidden", + "description": "Timeout of pause" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "sec" + }, + "id": 1, + "name": "timeout" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RestoreNotifications", + "header": 2642, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Restoring notifications" + ], + "attributes": [] + } + }, { + "type": "empty" + }, { + "type": "update", + "content": { + "name": "Typing", + "header": 6, + "doc": [ + "Update about user's typing", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Conversation peer" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "typingType", + "category": "full", + "description": " Type of typing" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": { + "type": "enum", + "childType": "TypingType" + }, + "id": 3, + "name": "typingType" + }] + } + }, { + "type": "update", + "content": { + "name": "TypingStop", + "header": 81, + "doc": [ + "Update about user's typing stop", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Conversation peer" + }, { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "typingType", + "category": "hidden", + "description": " Type of typing" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 2, + "name": "uid" + }, { + "type": { + "type": "enum", + "childType": "TypingType" + }, + "id": 3, + "name": "typingType" + }] + } + }, { + "type": "update", + "content": { + "name": "UserOnline", + "header": 7, + "doc": [ + "Update about user became online", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "DeviceType" + } + }, + "id": 2, + "name": "deviceType" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "deviceCategory" + }] + } + }, { + "type": "update", + "content": { + "name": "UserOffline", + "header": 8, + "doc": [ + "Update about user became offline", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "DeviceType" + } + }, + "id": 2, + "name": "deviceType" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "deviceCategory" + }] + } + }, { + "type": "update", + "content": { + "name": "UserLastSeen", + "header": 9, + "doc": [ + "Update about user's last seen state", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Last seen time" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 2, + "name": "date" + }, { + "type": { + "type": "opt", + "childType": { + "type": "enum", + "childType": "DeviceType" + } + }, + "id": 3, + "name": "deviceType" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "deviceCategory" + }] + } + }, { + "type": "update", + "content": { + "name": "GroupOnline", + "header": 33, + "doc": [ + "Update about group online change", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group id" + }, { + "type": "reference", + "argument": "count", + "category": "full", + "description": " current online user's count" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "int32", + "id": 2, + "name": "count" + }] + } + }] + }, { + "title": "Media and Files", + "package": "files", + "items": [{ + "type": "struct", + "content": { + "name": "FileLocation", + "doc": [ + "Location of file on server", { + "type": "reference", + "argument": "fileId", + "category": "full", + "description": " Unique Id of file" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " Access hash of file" + } + ], + "expandable": "true", + "attributes": [{ + "type": "int64", + "id": 1, + "name": "fileId" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "struct", + "content": { + "name": "ImageLocation", + "doc": [ + "Image location", { + "type": "reference", + "argument": "fileLocation", + "category": "full", + "description": " Location of file" + }, { + "type": "reference", + "argument": "width", + "category": "full", + "description": " Width of avatar image" + }, { + "type": "reference", + "argument": "height", + "category": "full", + "description": " Height of avatar image" + }, { + "type": "reference", + "argument": "fileSize", + "category": "full", + "description": " Size of file" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 1, + "name": "fileLocation" + }, { + "type": "int32", + "id": 2, + "name": "width" + }, { + "type": "int32", + "id": 3, + "name": "height" + }, { + "type": "int32", + "id": 4, + "name": "fileSize" + }] + } + }, { + "type": "struct", + "content": { + "name": "AvatarImage", + "doc": [ + "Avatar Image", { + "type": "reference", + "argument": "fileLocation", + "category": "full", + "description": " Location of file" + }, { + "type": "reference", + "argument": "width", + "category": "full", + "description": " Width of avatar image" + }, { + "type": "reference", + "argument": "height", + "category": "full", + "description": " Height of avatar image" + }, { + "type": "reference", + "argument": "fileSize", + "category": "full", + "description": " Size of file" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 1, + "name": "fileLocation" + }, { + "type": "int32", + "id": 2, + "name": "width" + }, { + "type": "int32", + "id": 3, + "name": "height" + }, { + "type": "int32", + "id": 4, + "name": "fileSize" + }] + } + }, { + "type": "struct", + "content": { + "name": "Avatar", + "doc": [ + "Avatar of User or Group", { + "type": "reference", + "argument": "smallImage", + "category": "compact", + "description": " Optional small image of avatar box in 100x100" + }, { + "type": "reference", + "argument": "largeImage", + "category": "compact", + "description": " Optional large image of avatar box in 200x200" + }, { + "type": "reference", + "argument": "fullImage", + "category": "compact", + "description": " Optional full screen image of avatar" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "AvatarImage" + } + }, + "id": 1, + "name": "smallImage" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "AvatarImage" + } + }, + "id": 2, + "name": "largeImage" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "AvatarImage" + } + }, + "id": 3, + "name": "fullImage" + }] + } + }, { + "type": "struct", + "content": { + "name": "FastThumb", + "doc": [ + "Fast thumb of media messages. Less than 90x90 and compressed by JPEG with low quality", { + "type": "reference", + "argument": "w", + "category": "full", + "description": " Width of thumb" + }, { + "type": "reference", + "argument": "h", + "category": "full", + "description": " Height of thump" + }, { + "type": "reference", + "argument": "thumb", + "category": "compact", + "description": " compressed image data" + } + ], + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "w" + }, { + "type": "int32", + "id": 2, + "name": "h" + }, { + "type": "bytes", + "id": 3, + "name": "thumb" + }] + } + }, { + "type": "enum", + "content": { + "name": "Colors", + "values": [{ + "name": "red", + "id": 1 + }, { + "name": "yellow", + "id": 2 + }, { + "name": "green", + "id": 3 + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "Color", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "RgbColor", + "doc": [ + "RGB Color", { + "type": "reference", + "argument": "rgb", + "category": "full", + "description": " RGB color value" + } + ], + "trait": { + "name": "Color", + "key": 1 + }, + "expandable": "true", + "attributes": [{ + "type": "int32", + "id": 1, + "name": "rgb" + }] + } + }, { + "type": "struct", + "content": { + "name": "PredefinedColor", + "doc": [ + "Predefined color", { + "type": "reference", + "argument": "color", + "category": "hidden", + "description": " Predefined color value" + } + ], + "trait": { + "name": "Color", + "key": 2 + }, + "expandable": "true", + "attributes": [{ + "type": { + "type": "enum", + "childType": "Colors" + }, + "id": 1, + "name": "color" + }] + } + }, { + "type": "empty" + }, { + "type": "struct", + "content": { + "name": "HTTPHeader", + "doc": [ + "HTTP Header record", { + "type": "reference", + "argument": "key", + "category": "full", + "description": " HTTP Header name" + }, { + "type": "reference", + "argument": "value", + "category": "full", + "description": " HTTP Header value" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "key" + }, { + "type": "string", + "id": 2, + "name": "value" + }] + } + }, { + "type": "struct", + "content": { + "name": "FileUrlDescription", + "doc": [ + "File url description", { + "type": "reference", + "argument": "fileId", + "category": "full", + "description": " File id of url" + }, { + "type": "reference", + "argument": "url", + "category": "full", + "description": " Url for downloading" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": " Timeout of url" + }, { + "type": "reference", + "argument": "unsignedUrl", + "category": "hidden", + "description": " Unsigned URL (used to honor web caches)" + }, { + "type": "reference", + "argument": "unsignedUrlHeaders", + "category": "hidden", + "description": " Headers that is required to download files with unsigned url" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "fileId" + }, { + "type": "string", + "id": 2, + "name": "url" + }, { + "type": { + "type": "alias", + "childType": "sec" + }, + "id": 3, + "name": "timeout" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 4, + "name": "unsignedUrl" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "HTTPHeader" + } + }, + "id": 5, + "name": "unsignedUrlHeaders" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetFileUrl", + "header": 77, + "response": { + "type": "anonymous", + "header": 78, + "doc": [{ + "type": "reference", + "argument": "url", + "category": "full", + "description": " Url for downloading" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": " Timeout of url" + }, { + "type": "reference", + "argument": "unsignedUrl", + "category": "full", + "description": " Unsigned URL (used to honor web caches)" + }, { + "type": "reference", + "argument": "unsignedUrlHeaders", + "category": "full", + "description": " Headers that is required to download files with unsigned url" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "url" + }, { + "type": { + "type": "alias", + "childType": "sec" + }, + "id": 2, + "name": "timeout" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "unsignedUrl" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "HTTPHeader" + } + }, + "id": 4, + "name": "unsignedUrlHeaders" + }] + }, + "doc": [ + "Requesting file URL for downloading", { + "type": "reference", + "argument": "file", + "category": "full", + "description": "file's location" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 1, + "name": "file" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetFileUrls", + "header": 2573, + "response": { + "type": "anonymous", + "header": 2574, + "doc": [{ + "type": "reference", + "argument": "fileUrls", + "category": "full", + "description": " File urls" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "FileUrlDescription" + } + }, + "id": 1, + "name": "fileUrls" + }] + }, + "doc": [ + "Requesting multiple fle URL for downloading", { + "type": "reference", + "argument": "files", + "category": "hidden", + "description": "File locations to load urls" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "FileLocation" + } + }, + "id": 1, + "name": "files" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetFileUrlBuilder", + "header": 2579, + "response": { + "type": "anonymous", + "header": 2580, + "doc": [{ + "type": "reference", + "argument": "baseUrl", + "category": "full", + "description": " Base Url for files" + }, { + "type": "reference", + "argument": "algo", + "category": "full", + "description": " Signature algorithm" + }, { + "type": "reference", + "argument": "seed", + "category": "full", + "description": " Public-visible seed of signature" + }, { + "type": "reference", + "argument": "signatureSecret", + "category": "full", + "description": " Signature Secret" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": " Timeout of url builder" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "baseUrl" + }, { + "type": "string", + "id": 2, + "name": "algo" + }, { + "type": "string", + "id": 5, + "name": "seed" + }, { + "type": "bytes", + "id": 3, + "name": "signatureSecret" + }, { + "type": { + "type": "alias", + "childType": "sec" + }, + "id": 4, + "name": "timeout" + }] + }, + "doc": [ + "Get File URL Builder that allows to build file urls from client side", { + "type": "reference", + "argument": "supportedSignatureAlgorithms", + "category": "hidden", + "description": "Supported signature algorithms by client" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": "string" + }, + "id": 1, + "name": "supportedSignatureAlgorithms" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetFileUploadUrl", + "header": 97, + "response": { + "type": "anonymous", + "header": 121, + "doc": [{ + "type": "reference", + "argument": "url", + "category": "full", + "description": " Url for uploading" + }, { + "type": "reference", + "argument": "uploadKey", + "category": "compact", + "description": " Upload key for upload" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "url" + }, { + "type": "bytes", + "id": 2, + "name": "uploadKey" + }] + }, + "doc": [ + "Requesting pload url", { + "type": "reference", + "argument": "expectedSize", + "category": "full", + "description": "Expected size of uploading file. May be inaccurate. Used for size allocation optimizations." + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "expectedSize" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CommitFileUpload", + "header": 122, + "response": { + "type": "anonymous", + "header": 138, + "doc": [{ + "type": "reference", + "argument": "uploadedFileLocation", + "category": "hidden", + "description": " Result file location" + }], + "attributes": [{ + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 1, + "name": "uploadedFileLocation" + }] + }, + "doc": [ + "Comminting uploaded file to storage" + ], + "attributes": [{ + "type": "bytes", + "id": 1, + "name": "uploadKey" + }, { + "type": "string", + "id": 2, + "name": "fileName" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetFileUploadPartUrl", + "header": 142, + "response": { + "type": "anonymous", + "header": 141, + "doc": [{ + "type": "reference", + "argument": "url", + "category": "full", + "description": " Upload file part url" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "url" + }] + }, + "doc": [ + "Upload file part", { + "type": "reference", + "argument": "uploadKey", + "category": "compact", + "description": "Upload Key from requestFileUploadUrl" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "partNumber" + }, { + "type": "int32", + "id": 2, + "name": "partSize" + }, { + "type": "bytes", + "id": 3, + "name": "uploadKey" + }] + } + }] + }, { + "title": "Features", + "package": "features", + "doc": [ + "Enable feature discovery. Currently available features:", + "* \"call\" - private audio calls" + ], + "items": [{ + "type": "rpc", + "content": { + "name": "EnableFeature", + "header": 2588, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Enabling feature on the device", { + "type": "reference", + "argument": "featureName", + "category": "full", + "description": "Feature name" + }, { + "type": "reference", + "argument": "args", + "category": "danger", + "description": "Optional arguments to a feature" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "featureName" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 2, + "name": "args" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DisableFeature", + "header": 2589, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Disabling feature on the device", { + "type": "reference", + "argument": "featureName", + "category": "full", + "description": "Feature name" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "featureName" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CheckFeatureEnabled", + "header": 2590, + "response": { + "type": "reference", + "name": "Bool" + }, + "doc": [ + "Method for checking if feature is available to user" + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "userOutPeer" + }, { + "type": "string", + "id": 2, + "name": "featureName" + }] + } + }] + }, { + "title": "EventBus", + "package": "eventbus", + "items": [{ + "type": "rpc", + "content": { + "name": "CreateNewEventBus", + "header": 2665, + "response": { + "type": "anonymous", + "header": 2666, + "doc": [ + "Created new Event Bus", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Event Bus Id" + }, { + "type": "reference", + "argument": "deviceId", + "category": "full", + "description": " Your Device Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "deviceId" + }] + }, + "doc": [ + "Create new Event Bus", { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": "Optional timeout of Event Bus" + }, { + "type": "reference", + "argument": "isOwned", + "category": "full", + "description": "Is Event Bus owned by creator" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "msec" + } + }, + "id": 1, + "name": "timeout" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 2, + "name": "isOwned" + }] + } + }, { + "type": "rpc", + "content": { + "name": "JoinEventBus", + "header": 2668, + "response": { + "type": "anonymous", + "header": 2669, + "doc": [{ + "type": "reference", + "argument": "deviceId", + "category": "full", + "description": " Your Device Id" + }, { + "type": "reference", + "argument": "rejoinToken", + "category": "full", + "description": " Token that can be used for rejoining event bus with same device id" + }], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "deviceId" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 2, + "name": "rejoinToken" + }] + }, + "doc": [ + "Joining Event Bus", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Event Bus Id" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": "Join timeout" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "msec" + } + }, + "id": 2, + "name": "timeout" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ReJoinEventBus", + "header": 2675, + "response": { + "type": "anonymous", + "header": 2676, + "doc": [{ + "type": "reference", + "argument": "deviceId", + "category": "hidden", + "description": " Your Device Id" + }], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "deviceId" + }] + }, + "doc": [ + "Rejoining to event bus after session was disposed", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Event Bus Id" + }, { + "type": "reference", + "argument": "rejoinToken", + "category": "full", + "description": "Rejoin Token" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": "bytes", + "id": 2, + "name": "rejoinToken" + }] + } + }, { + "type": "rpc", + "content": { + "name": "KeepAliveEventBus", + "header": 2670, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Keep Alive Event Bus", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Event Bus Id" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": "Optional timeout for keep alive" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "msec" + } + }, + "id": 2, + "name": "timeout" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DisposeEventBus", + "header": 2667, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Dispose Event Bus", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Event Bus Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }] + } + }, { + "type": "rpc", + "content": { + "name": "PostToEventBus", + "header": 2671, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Event Bus Destination", { + "type": "reference", + "argument": "id", + "category": "full", + "description": "Bus Id" + }, { + "type": "reference", + "argument": "destinations", + "category": "full", + "description": "If Empty need to broadcase message to everyone" + }, { + "type": "reference", + "argument": "message", + "category": "hidden", + "description": "Message" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "randomId" + } + }, + "id": 2, + "name": "destinations" + }, { + "type": "bytes", + "id": 3, + "name": "message" + }] + } + }, { + "type": "update", + "content": { + "name": "EventBusDeviceConnected", + "header": 2561, + "doc": [ + "Update about pubsub device connected", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " ID of Event Bus" + }, { + "type": "reference", + "argument": "userId", + "category": "full", + "description": " Joined User Id" + }, { + "type": "reference", + "argument": "deviceId", + "category": "full", + "description": " Joined Device Unique Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 2, + "name": "userId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 3, + "name": "deviceId" + }] + } + }, { + "type": "update", + "content": { + "name": "EventBusDeviceDisconnected", + "header": 2563, + "doc": [ + "Update about device disconnected", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " ID of Event Bus" + }, { + "type": "reference", + "argument": "userId", + "category": "full", + "description": " Joined User Id" + }, { + "type": "reference", + "argument": "deviceId", + "category": "full", + "description": " Disconnected Device unique Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 2, + "name": "userId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 3, + "name": "deviceId" + }] + } + }, { + "type": "update", + "content": { + "name": "EventBusMessage", + "header": 2562, + "doc": [ + "Event Bus Message", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Event Bus Id" + }, { + "type": "reference", + "argument": "senderId", + "category": "full", + "description": " Sender of message" + }, { + "type": "reference", + "argument": "senderDeviceId", + "category": "full", + "description": " Device Id of sender" + }, { + "type": "reference", + "argument": "message", + "category": "hidden", + "description": " Message" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "userId" + } + }, + "id": 2, + "name": "senderId" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "randomId" + } + }, + "id": 3, + "name": "senderDeviceId" + }, { + "type": "bytes", + "id": 4, + "name": "message" + }] + } + }, { + "type": "update", + "content": { + "name": "EventBusDisposed", + "header": 2564, + "doc": [ + "Event Bus dispose", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Event Bus Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 1, + "name": "id" + }] + } + }] + }, { + "title": "Values", + "package": "values", + "doc": [ + "Synced Values" + ], + "items": [{ + "type": "struct", + "content": { + "name": "SyncedValue", + "doc": [ + "Synced Value container", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Unique Id of a value. Unique in the scope of one named value." + }, { + "type": "reference", + "argument": "value", + "category": "full", + "description": " Optional value" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "id" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 2, + "name": "value" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadSyncedSet", + "header": 2679, + "response": { + "type": "anonymous", + "header": 2680, + "doc": [{ + "type": "reference", + "argument": "values", + "category": "full", + "description": " Current set values" + }, { + "type": "reference", + "argument": "isStrong", + "category": "full", + "description": " Is this value strong and stored in sequence. By default is true." + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "SyncedValue" + } + }, + "id": 1, + "name": "values" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 2, + "name": "isStrong" + }] + }, + "doc": [ + "Loading synced set", { + "type": "reference", + "argument": "setName", + "category": "hidden", + "description": "readable name of the set" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "setName" + }] + } + }, { + "type": "update", + "content": { + "name": "SynedSetUpdated", + "header": 72, + "doc": [ + "Update about synced set update", { + "type": "reference", + "argument": "setName", + "category": "full", + "description": " Set Name" + }, { + "type": "reference", + "argument": "syncedValues", + "category": "full", + "description": " Current set values" + }, { + "type": "reference", + "argument": "isStrong", + "category": "full", + "description": " Is this value strong and need to be stored on disk" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "setName" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "SyncedValue" + } + }, + "id": 2, + "name": "syncedValues" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 3, + "name": "isStrong" + }] + } + }, { + "type": "update", + "content": { + "name": "SyncedSetAddedOrUpdated", + "header": 73, + "doc": [ + "Update about added or updated values in the synced set", { + "type": "reference", + "argument": "setName", + "category": "full", + "description": " Set Name" + }, { + "type": "reference", + "argument": "addedOrUpdatedValues", + "category": "hidden", + "description": " Added or updated values" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "setName" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "SyncedValue" + } + }, + "id": 2, + "name": "addedOrUpdatedValues" + }] + } + }, { + "type": "update", + "content": { + "name": "SyncedSetRemoved", + "header": 74, + "doc": [ + "Update about removed items from synced set", { + "type": "reference", + "argument": "setName", + "category": "full", + "description": " Set Name" + }, { + "type": "reference", + "argument": "removedItems", + "category": "full", + "description": " Removed Items from the set" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "setName" + }, { + "type": { + "type": "list", + "childType": { + "type": "alias", + "childType": "randomId" + } + }, + "id": 2, + "name": "removedItems" + }] + } + }] + }, { + "title": "WebRTC", + "package": "webrtc", + "doc": [ + "WebRTC package that enables support to audio and video calls" + ], + "items": [{ + "type": "update", + "content": { + "name": "IncomingCall", + "header": 52, + "doc": [ + "Update about incoming call (Sent every 10 seconds)", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": " Call Id" + }, { + "type": "reference", + "argument": "attemptIndex", + "category": "full", + "description": " Optional attempt Index" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 2, + "name": "attemptIndex" + }] + } + }, { + "type": "update", + "content": { + "name": "CallHandled", + "header": 53, + "doc": [ + "Update about incoming call handled", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": " Call Id" + }, { + "type": "reference", + "argument": "attemptIndex", + "category": "full", + "description": " Optional attempt Index" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 2, + "name": "attemptIndex" + }] + } + }, { + "type": "update", + "content": { + "name": "CallUpgraded", + "header": 56, + "doc": [ + "Update about call moved to other peer", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": " Call Id" + }, { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Upgraded group id" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 2, + "name": "groupId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetCallInfo", + "header": 2600, + "response": { + "type": "anonymous", + "header": 2606, + "doc": [{ + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Destination peer" + }, { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Groups" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Users" + }, { + "type": "reference", + "argument": "eventBusId", + "category": "full", + "description": " Event Bus Id" + }, { + "type": "reference", + "argument": "isAudioOnlyCall", + "category": "full", + "description": " Is Audio Only Call. Default is true" + }, { + "type": "reference", + "argument": "isVideoOnlyCall", + "category": "full", + "description": " Is Video Only Call. Default is false." + }, { + "type": "reference", + "argument": "isVideoPreferred", + "category": "full", + "description": " Is Video preferred" + }], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 2, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 3, + "name": "users" + }, { + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 4, + "name": "eventBusId" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 5, + "name": "isAudioOnlyCall" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 6, + "name": "isVideoOnlyCall" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 7, + "name": "isVideoPreferred" + }] + }, + "doc": [ + "Getting Call Information", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": "Call Id" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DoCall", + "header": 2597, + "response": { + "type": "anonymous", + "header": 2598, + "doc": [{ + "type": "reference", + "argument": "callId", + "category": "full", + "description": " Call Id" + }, { + "type": "reference", + "argument": "eventBusId", + "category": "full", + "description": " Call Event Bus Id" + }], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "alias", + "childType": "busId" + }, + "id": 2, + "name": "eventBusId" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 3, + "name": "deviceId" + }] + }, + "doc": [ + "Do Call. Right after a call client need to start sending CallInProgress", { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "destination peer" + }, { + "type": "reference", + "argument": "timeout", + "category": "full", + "description": "Initial timeout" + }, { + "type": "reference", + "argument": "isAudioOnlyCall", + "category": "full", + "description": "Is Audio only call. Default is true." + }, { + "type": "reference", + "argument": "isVideoOnlyCall", + "category": "full", + "description": "Is Video Only call. Default is false." + }, { + "type": "reference", + "argument": "isVideoPreferred", + "category": "full", + "description": "Is Video preferred" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "OutPeer" + }, + "id": 1, + "name": "peer" + }, { + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "msec" + } + }, + "id": 2, + "name": "timeout" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 3, + "name": "isAudioOnlyCall" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 4, + "name": "isVideoOnlyCall" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 6, + "name": "isVideoPreferred" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UpgradeCall", + "header": 2677, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Method for upgrading a call from private call to group call", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": "Call Id" + }, { + "type": "reference", + "argument": "peer", + "category": "full", + "description": "Destination peer for upgrading" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "struct", + "childType": "GroupOutPeer" + }, + "id": 2, + "name": "peer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DoCallAgain", + "header": 2678, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Call again to user", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": "Call Id" + }, { + "type": "reference", + "argument": "user", + "category": "full", + "description": "User to call again" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 2, + "name": "user" + }] + } + }, { + "type": "rpc", + "content": { + "name": "JoinCall", + "header": 2683, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Joining Call", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": "Call Id" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RejectCall", + "header": 2684, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Rejecting Call", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": "Call Id" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "OptimizeSDP", + "header": 2685, + "response": { + "type": "anonymous", + "header": 2686, + "doc": [{ + "type": "reference", + "argument": "optimizedSDP", + "category": "hidden", + "description": " Optimized version of SDP" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "optimizedSDP" + }] + }, + "doc": [ + "Optimizing SDP", { + "type": "reference", + "argument": "type", + "category": "full", + "description": "Type of SDP (offer or answer)" + }, { + "type": "reference", + "argument": "sdp", + "category": "full", + "description": "SDP value" + }, { + "type": "reference", + "argument": "ownSettings", + "category": "full", + "description": "Own Settings" + }, { + "type": "reference", + "argument": "theirSettings", + "category": "full", + "description": "Their Settings" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "type" + }, { + "type": "string", + "id": 2, + "name": "sdp" + }, { + "type": { + "type": "struct", + "childType": "PeerSettings" + }, + "id": 3, + "name": "ownSettings" + }, { + "type": { + "type": "struct", + "childType": "PeerSettings" + }, + "id": 4, + "name": "theirSettings" + }] + } + }, { + "type": "struct", + "content": { + "name": "ICEServer", + "doc": [ + "ICE Server description", { + "type": "reference", + "argument": "url", + "category": "full", + "description": " Url to server" + }, { + "type": "reference", + "argument": "username", + "category": "full", + "description": " Optional username" + }, { + "type": "reference", + "argument": "credential", + "category": "danger", + "description": " Optional credential" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "url" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "username" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "credential" + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "WebRTCSignaling", + "attributes": [] + } + }, { + "type": "comment", + "content": "Advertising" + }, { + "type": "struct", + "content": { + "name": "AdvertiseSelf", + "doc": [ + "Advertizing self to a master mode", { + "type": "reference", + "argument": "peerSettings", + "category": "full", + "description": " Optional peer Settings" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 21 + }, + "attributes": [{ + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "PeerSettings" + } + }, + "id": 1, + "name": "peerSettings" + }] + } + }, { + "type": "struct", + "content": { + "name": "AdvertiseMaster", + "doc": [ + "Sent by master" + ], + "trait": { + "name": "WebRTCSignaling", + "key": 26 + }, + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "ICEServer" + } + }, + "id": 1, + "name": "server" + }] + } + }, { + "type": "comment", + "content": "Web RTC signaling" + }, { + "type": "struct", + "content": { + "name": "Candidate", + "doc": [ + "Candidate signal", { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id of candidate" + }, { + "type": "reference", + "argument": "index", + "category": "full", + "description": " Index of candidate" + }, { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Id of candidate" + }, { + "type": "reference", + "argument": "sdp", + "category": "full", + "description": " SDP of candidate" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 3 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "sessionId" + }, { + "type": "int32", + "id": 2, + "name": "index" + }, { + "type": "string", + "id": 3, + "name": "id" + }, { + "type": "string", + "id": 4, + "name": "sdp" + }] + } + }, { + "type": "struct", + "content": { + "name": "Offer", + "doc": [ + "Offer signal", { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id of offer" + }, { + "type": "reference", + "argument": "sdp", + "category": "full", + "description": " Offer SDP" + }, { + "type": "reference", + "argument": "ownPeerSettings", + "category": "full", + "description": " Optional Own Peer settings" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 4 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "sessionId" + }, { + "type": "string", + "id": 2, + "name": "sdp" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "PeerSettings" + } + }, + "id": 3, + "name": "ownPeerSettings" + }] + } + }, { + "type": "struct", + "content": { + "name": "Answer", + "doc": [ + "Answer signal", { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id of answer" + }, { + "type": "reference", + "argument": "sdp", + "category": "full", + "description": " Answer SDP" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 5 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "sessionId" + }, { + "type": "string", + "id": 2, + "name": "sdp" + }] + } + }, { + "type": "struct", + "content": { + "name": "MediaStreamsUpdated", + "doc": [ + "Update about media stream settings updated. Can be sent before offer/answer.", { + "type": "reference", + "argument": "isAudioEnabled", + "category": "full", + "description": " Is Audio Enabled in current connection. True by default." + }, { + "type": "reference", + "argument": "isVideoEnabled", + "category": "full", + "description": " Is Video Enabled in current connection. False by default." + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 28 + }, + "attributes": [{ + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 1, + "name": "isAudioEnabled" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 2, + "name": "isVideoEnabled" + }] + } + }, { + "type": "comment", + "content": "Call Controlling events" + }, { + "type": "struct", + "content": { + "name": "NeedOffer", + "doc": [ + "Notification from master that offer is required", { + "type": "reference", + "argument": "device", + "category": "full", + "description": " Destination Device Id" + }, { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id" + }, { + "type": "reference", + "argument": "peerSettings", + "category": "full", + "description": " Optional peer settings" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 8 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "device" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "sessionId" + }, { + "type": { + "type": "opt", + "childType": { + "type": "struct", + "childType": "PeerSettings" + } + }, + "id": 3, + "name": "peerSettings" + }] + } + }, { + "type": "struct", + "content": { + "name": "NegotinationSuccessful", + "doc": [ + "Notification about on negotiation is successful", { + "type": "reference", + "argument": "device", + "category": "full", + "description": " Device Id" + }, { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 24 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "device" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "sessionId" + }] + } + }, { + "type": "struct", + "content": { + "name": "EnableConnection", + "doc": [ + "Notification about enabling connection to peer", { + "type": "reference", + "argument": "device", + "category": "full", + "description": " Device Id" + }, { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 22 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "device" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "sessionId" + }] + } + }, { + "type": "struct", + "content": { + "name": "OnRenegotiationNeeded", + "doc": [ + "Need renegotiate session. For example when streams are changed.", { + "type": "reference", + "argument": "device", + "category": "full", + "description": " Device Id" + }, { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 25 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "device" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "sessionId" + }] + } + }, { + "type": "struct", + "content": { + "name": "CloseSession", + "doc": [ + "Close this session and be ready to", { + "type": "reference", + "argument": "device", + "category": "hidden", + "description": " Device Id" + }, { + "type": "reference", + "argument": "sessionId", + "category": "full", + "description": " Session Id for renegotiation" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 6 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "device" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 2, + "name": "sessionId" + }] + } + }, { + "type": "struct", + "content": { + "name": "NeedDisconnect", + "doc": [ + "Notification about requirement about required disconnection from peer", { + "type": "reference", + "argument": "device", + "category": "hidden", + "description": " Device Id" + } + ], + "trait": { + "name": "WebRTCSignaling", + "key": 20 + }, + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "device" + }] + } + }, { + "type": "struct", + "content": { + "name": "ActiveCall", + "doc": [ + "Active Calls. Used in broadcasting states of current calls.", { + "type": "reference", + "argument": "callId", + "category": "full", + "description": " Call Id" + }, { + "type": "reference", + "argument": "peer", + "category": "full", + "description": " Call's peer" + }, { + "type": "reference", + "argument": "callMembers", + "category": "full", + "description": " Call Members" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "callId" + }, { + "type": { + "type": "struct", + "childType": "Peer" + }, + "id": 2, + "name": "peer" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "CallMember" + } + }, + "id": 3, + "name": "callMembers" + }] + } + }, { + "type": "enum", + "content": { + "name": "CallMemberState", + "values": [{ + "name": "RINGING", + "id": 1 + }, { + "name": "RINGING_REACHED", + "id": 4 + }, { + "name": "CONNECTING", + "id": 2 + }, { + "name": "CONNECTED", + "id": 3 + }, { + "name": "ENDED", + "id": 5 + }] + } + }, { + "type": "struct", + "content": { + "name": "CallMemberStateHolder", + "doc": [ + "Call Member state holder", { + "type": "reference", + "argument": "state", + "category": "full", + "description": " State Value" + }, { + "type": "reference", + "argument": "fallbackIsRinging", + "category": "full", + "description": " Fallback flag for future compatibility of state" + }, { + "type": "reference", + "argument": "fallbackIsConnected", + "category": "full", + "description": " Fallback flag for future compatibility of state" + }, { + "type": "reference", + "argument": "fallbackIsConnecting", + "category": "full", + "description": " Fallback flag for future compatibility of state" + }, { + "type": "reference", + "argument": "fallbackIsRingingReached", + "category": "full", + "description": " Fallback flag for future compatibility of state" + }, { + "type": "reference", + "argument": "fallbackIsEnded", + "category": "full", + "description": " Fallback flag for future compatibility of state" + } + ], + "attributes": [{ + "type": { + "type": "enum", + "childType": "CallMemberState" + }, + "id": 1, + "name": "state" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 2, + "name": "fallbackIsRinging" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 3, + "name": "fallbackIsConnected" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 4, + "name": "fallbackIsConnecting" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 5, + "name": "fallbackIsRingingReached" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 6, + "name": "fallbackIsEnded" + }] + } + }, { + "type": "struct", + "content": { + "name": "CallMember", + "doc": [ + "Call Member", { + "type": "reference", + "argument": "userId", + "category": "full", + "description": " Member User Id" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " State of member" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "userId" + }, { + "type": { + "type": "struct", + "childType": "CallMemberStateHolder" + }, + "id": 3, + "name": "state" + }] + } + }, { + "type": "struct", + "content": { + "name": "PeerSettings", + "doc": [ + "Peer Settings", { + "type": "reference", + "argument": "is3DESSupported", + "category": "full", + "description": " Marking if 3DES supported. Default is false." + }, { + "type": "reference", + "argument": "isMobile", + "category": "full", + "description": " Is Peer a mobile phone. Default is false." + }, { + "type": "reference", + "argument": "canBeAudioRelay", + "category": "full", + "description": " If peer can audio relay. Default is false." + }, { + "type": "reference", + "argument": "canPreConnect", + "category": "full", + "description": " If peer can preconnect before answer" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 1, + "name": "is3DESSupported" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 2, + "name": "isMobile" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 3, + "name": "canBeAudioRelay" + }, { + "type": { + "type": "opt", + "childType": "bool" + }, + "id": 4, + "name": "canPreConnect" + }] + } + }] + }, { + "title": "Config sync", + "package": "configs", + "doc": [ + "Parameter Syncronization across devices. Can be used for simple sync", + "across devices without rewriting server side code." + ], + "items": [{ + "type": "struct", + "content": { + "name": "Parameter", + "doc": [ + "Syncing Parameter", { + "type": "reference", + "argument": "key", + "category": "full", + "description": " Key of parameter" + }, { + "type": "reference", + "argument": "value", + "category": "full", + "description": " Value of parameter" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "key" + }, { + "type": "string", + "id": 2, + "name": "value" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetParameters", + "header": 134, + "response": { + "type": "anonymous", + "header": 135, + "doc": [{ + "type": "reference", + "argument": "parameters", + "category": "full", + "description": " Current parameters" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Parameter" + } + }, + "id": 1, + "name": "parameters" + }] + }, + "doc": [ + "Getting Parameters" + ], + "attributes": [] + } + }, { + "type": "rpc", + "content": { + "name": "EditParameter", + "header": 128, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Change parameter value", { + "type": "reference", + "argument": "key", + "category": "full", + "description": "Key of parameter" + }, { + "type": "reference", + "argument": "value", + "category": "full", + "description": "Value of parameter" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "key" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "value" + }] + } + }, { + "type": "update", + "content": { + "name": "ParameterChanged", + "header": 131, + "doc": [ + "Update about parameter change", { + "type": "reference", + "argument": "key", + "category": "full", + "description": " Key of parameter" + }, { + "type": "reference", + "argument": "value", + "category": "full", + "description": " Value of parameter" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "key" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "value" + }] + } + }] + }, { + "title": "Stats", + "package": "stats", + "doc": [ + "Saving statistics information" + ], + "items": [{ + "type": "struct", + "content": { + "name": "EventRecord", + "doc": [ + "Record for stored event" + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "date" + }, + "id": 1, + "name": "date" + }, { + "type": { + "type": "trait", + "childType": "Event" + }, + "id": 2, + "name": "event" + }] + } + }, { + "type": "trait", + "content": { + "isContainer": "true", + "name": "Event", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "UntypedEvent", + "doc": [ + "Untyped event", { + "type": "reference", + "argument": "eventType", + "category": "full", + "description": " Event type" + }, { + "type": "reference", + "argument": "params", + "category": "full", + "description": " optional params for event" + } + ], + "trait": { + "name": "Event", + "key": 1 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "eventType" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "RawValue" + } + }, + "id": 2, + "name": "params" + }] + } + }, { + "type": "struct", + "content": { + "name": "ContentViewChanged", + "doc": [ + "Content view event", { + "type": "reference", + "argument": "contentType", + "category": "full", + "description": " unique content id" + }, { + "type": "reference", + "argument": "visible", + "category": "full", + "description": " Is content visible" + }, { + "type": "reference", + "argument": "params", + "category": "full", + "description": " optional params for content view" + } + ], + "trait": { + "name": "Event", + "key": 2 + }, + "expandable": "true", + "attributes": [{ + "type": "string", + "id": 1, + "name": "contentType" + }, { + "type": "string", + "id": 2, + "name": "contentId" + }, { + "type": "bool", + "id": 3, + "name": "visible" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "RawValue" + } + }, + "id": 4, + "name": "params" + }] + } + }, { + "type": "struct", + "content": { + "name": "AppVisibleChanged", + "doc": [ + "On App Visible event", { + "type": "reference", + "argument": "visible", + "category": "full", + "description": " Is app visible" + } + ], + "trait": { + "name": "Event", + "key": 4 + }, + "expandable": "true", + "attributes": [{ + "type": "bool", + "id": 1, + "name": "visible" + }] + } + }, { + "type": "rpc", + "content": { + "name": "StoreEvents", + "header": 243, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Storing events on server", { + "type": "reference", + "argument": "events", + "category": "full", + "description": "Events for storing" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "trait", + "childType": "Event" + } + }, + "id": 1, + "name": "events" + }] + } + }] + }, { + "title": "Raw API", + "package": "raw", + "doc": [ + "Schema-less API that is useful for external integrations" + ], + "items": [{ + "type": "rpc", + "content": { + "name": "RawRequest", + "header": 2569, + "response": { + "type": "anonymous", + "header": 2570, + "doc": [ + "Response of a raw request", { + "type": "reference", + "argument": "result", + "category": "full", + "description": " Result of request" + } + ], + "attributes": [{ + "type": { + "type": "trait", + "childType": "RawValue" + }, + "id": 1, + "name": "result" + }] + }, + "doc": [ + "Making raw request to external service via shema-less RPC request", { + "type": "reference", + "argument": "service", + "category": "full", + "description": "Service name for RPC request" + }, { + "type": "reference", + "argument": "method", + "category": "full", + "description": "Method for execution" + }, { + "type": "reference", + "argument": "params", + "category": "full", + "description": "Optional params for the method" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "service" + }, { + "type": "string", + "id": 2, + "name": "method" + }, { + "type": { + "type": "opt", + "childType": { + "type": "trait", + "childType": "RawValue" + } + }, + "id": 3, + "name": "params" + }] + } + }] + }, { + "title": "Wallpappers", + "package": "wallpappers", + "doc": [ + "Wallpappers support" + ], + "items": [{ + "type": "struct", + "content": { + "name": "Wallpapper", + "doc": [ + "Wallpapper structure", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Wallpapper id" + }, { + "type": "reference", + "argument": "w", + "category": "full", + "description": " Image width" + }, { + "type": "reference", + "argument": "h", + "category": "full", + "description": " Image height" + }, { + "type": "reference", + "argument": "fileSize", + "category": "full", + "description": " Image file size" + }, { + "type": "reference", + "argument": "file", + "category": "full", + "description": " Image file reference" + }, { + "type": "reference", + "argument": "thumb", + "category": "full", + "description": " Image thumb" + } + ], + "attributes": [{ + "type": "int32", + "id": 7, + "name": "id" + }, { + "type": "int32", + "id": 1, + "name": "w" + }, { + "type": "int32", + "id": 2, + "name": "h" + }, { + "type": "int32", + "id": 3, + "name": "fileSize" + }, { + "type": { + "type": "struct", + "childType": "FileLocation" + }, + "id": 5, + "name": "file" + }, { + "type": { + "type": "struct", + "childType": "FastThumb" + }, + "id": 6, + "name": "thumb" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadWallpappers", + "header": 241, + "response": { + "type": "anonymous", + "header": 242, + "doc": [ + "Loaded Wallpappers", { + "type": "reference", + "argument": "wallpappers", + "category": "full", + "description": " Available wallpapper list" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Wallpapper" + } + }, + "id": 1, + "name": "wallpappers" + }] + }, + "doc": [ + "Load available wallpappers", { + "type": "reference", + "argument": "maxWidth", + "category": "full", + "description": "Maximum width of wallpapper" + }, { + "type": "reference", + "argument": "maxHeight", + "category": "full", + "description": "Maximum height of wallpapper" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "maxWidth" + }, { + "type": "int32", + "id": 2, + "name": "maxHeight" + }] + } + }] + }, { + "title": "Push", + "package": "push", + "doc": [ + "Vendor's pushes for receiving push notifications.", + "Push notification contains current sequence number of main sequence." + ], + "items": [{ + "type": "rpc", + "content": { + "name": "RegisterGooglePush", + "header": 51, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Registering push token on server", { + "type": "reference", + "argument": "projectId", + "category": "hidden", + "description": "Project Id of token" + }, { + "type": "reference", + "argument": "token", + "category": "danger", + "description": "token value" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "projectId" + }, { + "type": "string", + "id": 2, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnregisterGooglePush", + "header": 2631, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Unregistering Google Push", { + "type": "reference", + "argument": "token", + "category": "danger", + "description": "Token value" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RegisterApplePush", + "header": 76, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Registering apple push on server", { + "type": "reference", + "argument": "apnsKey", + "category": "hidden", + "description": "apns key id" + }, { + "type": "reference", + "argument": "token", + "category": "danger", + "description": "token value" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "apnsKey" + }, { + "type": "string", + "id": 2, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnregisterApplePush", + "header": 2632, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Unregistering Apple Push", { + "type": "reference", + "argument": "token", + "category": "full", + "description": "Token" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RegisterApplePushKit", + "header": 2576, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Registration of a new Apple's PushKit tokens", { + "type": "reference", + "argument": "apnsKey", + "category": "hidden", + "description": "APNS key id" + }, { + "type": "reference", + "argument": "token", + "category": "danger", + "description": "token value" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "apnsKey" + }, { + "type": "string", + "id": 2, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnregisterApplePushKit", + "header": 2633, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Unregistering Apple Push Kit token", { + "type": "reference", + "argument": "token", + "category": "hidden", + "description": "Token Value" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RegisterApplePushToken", + "header": 2593, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Registering Apple Push Token", { + "type": "reference", + "argument": "bundleId", + "category": "full", + "description": "Bundle Id of app" + }, { + "type": "reference", + "argument": "token", + "category": "full", + "description": "Push token" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "bundleId" + }, { + "type": "string", + "id": 2, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnregisterApplePushToken", + "header": 2634, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Unregister Apple Push token", { + "type": "reference", + "argument": "token", + "category": "hidden", + "description": "Token value" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "token" + }] + } + }, { + "type": "rpc", + "content": { + "name": "RegisterActorPush", + "header": 2575, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Register Actor Push endpoint", { + "type": "reference", + "argument": "endpoint", + "category": "full", + "description": "Endpoint for push sending" + }, { + "type": "reference", + "argument": "encryptionKeys", + "category": "full", + "description": "Push Encryption keys" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "endpoint" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKey" + } + }, + "id": 2, + "name": "encryptionKeys" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UnregisterActorPush", + "header": 2635, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Unregister Actor Push endpoint", { + "type": "reference", + "argument": "endpoint", + "category": "full", + "description": "Endpoint for unregistering" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "endpoint" + }] + } + }] + }, { + "title": "Encryption", + "package": "encryption", + "doc": [ + "Package that include encryption support", + "Key alg types:", + "* curve25519 - https://en.wikipedia.org/wiki/Curve25519", + "* rsa-2048", + "* rsa-4096", + "* aes-128", + "* kuznechik-128", + "", + "Signature alg types:", + "* Ed25519 - used curve25519 conveted to Ed255519 for signing and validataion" + ], + "items": [{ + "type": "comment", + "content": "Public Keys" + }, { + "type": "struct", + "content": { + "name": "EncryptionKeyGroup", + "doc": [ + "Encryption Key Group", { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Key Group Id" + }, { + "type": "reference", + "argument": "identityKey", + "category": "full", + "description": " Key that is used as identity and for validation of Key Group changes" + }, { + "type": "reference", + "argument": "supportedEncryption", + "category": "full", + "description": " Supported encryption methods by this key group" + }, { + "type": "reference", + "argument": "keys", + "category": "compact", + "description": " keys of Key Group" + }, { + "type": "reference", + "argument": "signatures", + "category": "compact", + "description": " Signatures of keys" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 1, + "name": "keyGroupId" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 2, + "name": "supportedEncryption" + }, { + "type": { + "type": "struct", + "childType": "EncryptionKey" + }, + "id": 3, + "name": "identityKey" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKey" + } + }, + "id": 4, + "name": "keys" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKeySignature" + } + }, + "id": 5, + "name": "signatures" + }] + } + }, { + "type": "struct", + "content": { + "name": "EncryptionKeySignature", + "doc": [ + "Signed Key. Usually used for public keys.", { + "type": "reference", + "argument": "keyId", + "category": "full", + "description": " Key Id used for signature" + }, { + "type": "reference", + "argument": "signatureAlg", + "category": "full", + "description": " Signature algorithm" + }, { + "type": "reference", + "argument": "signature", + "category": "full", + "description": " Signature value" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "keyId" + }, { + "type": "string", + "id": 2, + "name": "signatureAlg" + }, { + "type": "bytes", + "id": 3, + "name": "signature" + }] + } + }, { + "type": "struct", + "content": { + "name": "EncryptionKey", + "doc": [ + "Encryption Key", { + "type": "reference", + "argument": "keyId", + "category": "full", + "description": " Key Id" + }, { + "type": "reference", + "argument": "keyAlg", + "category": "full", + "description": " Key Algorithm" + }, { + "type": "reference", + "argument": "keyMaterial", + "category": "compact", + "description": " Public key material. Can be null, but always not null for LoadPublicKey" + }, { + "type": "reference", + "argument": "keyHash", + "category": "hidden", + "description": " If keyMaterial is null, pass keyHash - SHA256 of key" + } + ], + "expandable": "true", + "attributes": [{ + "type": "int64", + "id": 1, + "name": "keyId" + }, { + "type": "string", + "id": 2, + "name": "keyAlg" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 3, + "name": "keyMaterial" + }, { + "type": { + "type": "opt", + "childType": "bytes" + }, + "id": 4, + "name": "keyHash" + }] + } + }, { + "type": "response", + "content": { + "name": "PublicKeys", + "header": 2602, + "doc": [ + "Public Keys response", { + "type": "reference", + "argument": "publicKey", + "category": "full", + "description": " Public keys" + }, { + "type": "reference", + "argument": "signatures", + "category": "full", + "description": " Signatures of public keys" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKey" + } + }, + "id": 1, + "name": "publicKey" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKeySignature" + } + }, + "id": 2, + "name": "signatures" + }] + } + }, { + "type": "response", + "content": { + "name": "PublicKeyGroups", + "header": 2604, + "doc": [ + "Public key groups response" + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKeyGroup" + } + }, + "id": 1, + "name": "publicKeyGroups" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadPublicKeyGroups", + "header": 2601, + "response": { + "type": "reference", + "name": "PublicKeyGroups" + }, + "doc": [ + "Loading Public key groups", { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "userPeer" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadPublicKey", + "header": 2605, + "response": { + "type": "reference", + "name": "PublicKeys" + }, + "doc": [ + "Loading public key explictly", { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + }, { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": "Key group's id" + }, { + "type": "reference", + "argument": "keyIds", + "category": "full", + "description": "Key ids for loading" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "userPeer" + }, { + "type": "int32", + "id": 2, + "name": "keyGroupId" + }, { + "type": { + "type": "list", + "childType": "int64" + }, + "id": 3, + "name": "keyIds" + }] + } + }, { + "type": "rpc", + "content": { + "name": "LoadPrePublicKeys", + "header": 2603, + "response": { + "type": "reference", + "name": "PublicKeys" + }, + "doc": [ + "Loading SOME of ephermal public keys", { + "type": "reference", + "argument": "userPeer", + "category": "full", + "description": "User's peer" + }, { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": "User's key group id" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "userPeer" + }, { + "type": "int32", + "id": 2, + "name": "keyGroupId" + }] + } + }, { + "type": "update", + "content": { + "name": "PublicKeyGroupChanged", + "header": 103, + "doc": [ + "Update about public key group changed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroup", + "category": "full", + "description": " Updated Key Group" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "struct", + "childType": "EncryptionKeyGroup" + }, + "id": 2, + "name": "keyGroup" + }] + } + }, { + "type": "update", + "content": { + "name": "KeysAdded", + "header": 112, + "doc": [ + "Update about keys added to Key Group", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Key Group Id" + }, { + "type": "reference", + "argument": "keys", + "category": "compact", + "description": " Added keys" + }, { + "type": "reference", + "argument": "signatures", + "category": "compact", + "description": " Signatures of a public key" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 2, + "name": "keyGroupId" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKey" + } + }, + "id": 3, + "name": "keys" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKeySignature" + } + }, + "id": 4, + "name": "signatures" + }] + } + }, { + "type": "update", + "content": { + "name": "KeysRemoved", + "header": 113, + "doc": [ + "Update about keys removed from Key Group", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Key Group Id" + }, { + "type": "reference", + "argument": "keyIds", + "category": "full", + "description": " Removed keys" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 2, + "name": "keyGroupId" + }, { + "type": { + "type": "list", + "childType": "int64" + }, + "id": 3, + "name": "keyIds" + }] + } + }, { + "type": "update", + "content": { + "name": "PublicKeyGroupAdded", + "header": 104, + "doc": [ + "Update about public key group added", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroup", + "category": "full", + "description": " Added Key Group" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "struct", + "childType": "EncryptionKeyGroup" + }, + "id": 2, + "name": "keyGroup" + }] + } + }, { + "type": "update", + "content": { + "name": "PublicKeyGroupRemoved", + "header": 105, + "doc": [ + "Update about public key group removed", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Removed Key Group Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 2, + "name": "keyGroupId" + }] + } + }, { + "type": "comment", + "content": "Device Side" + }, { + "type": "rpc", + "content": { + "name": "CreateNewKeyGroup", + "header": 2609, + "response": { + "type": "anonymous", + "header": 2610, + "doc": [{ + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Created Key Group id" + }], + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 1, + "name": "keyGroupId" + }] + }, + "doc": [ + "Creation of a new Key Group", { + "type": "reference", + "argument": "identityKey", + "category": "full", + "description": "Identity Key of a new group" + }, { + "type": "reference", + "argument": "supportedEncryptions", + "category": "full", + "description": "Supported encryption methods" + }, { + "type": "reference", + "argument": "keys", + "category": "full", + "description": "keys of current group" + }, { + "type": "reference", + "argument": "signatures", + "category": "full", + "description": "signatures of keys" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "EncryptionKey" + }, + "id": 1, + "name": "identityKey" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 2, + "name": "supportedEncryptions" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKey" + } + }, + "id": 3, + "name": "keys" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKeySignature" + } + }, + "id": 4, + "name": "signatures" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DeleteKeyGroup", + "header": 2611, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Deletion of a Key Group", { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": "Key Group Id for deletion" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 1, + "name": "keyGroupId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DisconnectKeyGroup", + "header": 2613, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Disconnect Key Group from device", { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": "Key Group Id for disconnection" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 1, + "name": "keyGroupId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "ConnectKeyGroup", + "header": 2614, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Connectiong Key Group to device", { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": "Key Group Id for connection" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 1, + "name": "keyGroupId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "UploadPreKey", + "header": 2612, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Uploading Ephermal Keys", { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": "Key Group Id" + }, { + "type": "reference", + "argument": "keys", + "category": "compact", + "description": "Encryprion keys" + }, { + "type": "reference", + "argument": "signatures", + "category": "compact", + "description": "Key signatures" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 1, + "name": "keyGroupId" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKey" + } + }, + "id": 2, + "name": "keys" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptionKeySignature" + } + }, + "id": 3, + "name": "signatures" + }] + } + }, { + "type": "comment", + "content": "Encrypted Packages" + }, { + "type": "struct", + "content": { + "name": "EncryptedBox", + "doc": [ + "Encrypted package that is encrypted for multiple keys", { + "type": "reference", + "argument": "keys", + "category": "full", + "description": " Encrypted encryption keys" + }, { + "type": "reference", + "argument": "algType", + "category": "full", + "description": " Package encryption type" + }, { + "type": "reference", + "argument": "encPackage", + "category": "full", + "description": " Encrypted package" + }, { + "type": "reference", + "argument": "senderKeyGroupId", + "category": "full", + "description": " Sender key group" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 4, + "name": "senderKeyGroupId" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncyptedBoxKey" + } + }, + "id": 1, + "name": "keys" + }, { + "type": "string", + "id": 2, + "name": "algType" + }, { + "type": "bytes", + "id": 3, + "name": "encPackage" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "EncryptedBoxSignature" + } + }, + "id": 5, + "name": "signatures" + }] + } + }, { + "type": "struct", + "content": { + "name": "EncryptedBoxSignature", + "doc": [ + "Signature for encrypted package", { + "type": "reference", + "argument": "algType", + "category": "full", + "description": " Alg Type" + }, { + "type": "reference", + "argument": "signature", + "category": "full", + "description": " Signature of encrypted package" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "algType" + }, { + "type": "bytes", + "id": 2, + "name": "signature" + }] + } + }, { + "type": "struct", + "content": { + "name": "EncyptedBoxKey", + "doc": [ + "Encrypted package encryption key", { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Key Group Id" + }, { + "type": "reference", + "argument": "algType", + "category": "full", + "description": " Key encryption algorithm" + }, { + "type": "reference", + "argument": "encryptedKey", + "category": "hidden", + "description": " Encrypted encryption key" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "usersId" + }, { + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 2, + "name": "keyGroupId" + }, { + "type": "string", + "id": 3, + "name": "algType" + }, { + "type": "bytes", + "id": 4, + "name": "encryptedKey" + }] + } + }, { + "type": "struct", + "content": { + "name": "KeyGroupId", + "doc": [ + "References to key groups", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroupId", + "category": "full", + "description": " Key Group Id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "alias", + "childType": "keyGroupId" + }, + "id": 2, + "name": "keyGroupId" + }] + } + }, { + "type": "struct", + "content": { + "name": "KeyGroupHolder", + "doc": [ + "Key Group Holder", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "keyGroup", + "category": "full", + "description": " Key Group" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": { + "type": "struct", + "childType": "EncryptionKeyGroup" + }, + "id": 2, + "name": "keyGroup" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SendEncryptedPackage", + "header": 2657, + "response": { + "type": "anonymous", + "header": 2664, + "doc": [{ + "type": "reference", + "argument": "date", + "category": "full", + "description": " date" + }, { + "type": "reference", + "argument": "obsoleteKeyGroups", + "category": "full", + "description": " obsolete key group ids" + }, { + "type": "reference", + "argument": "missedKeyGroups", + "category": "full", + "description": " missed key groups" + }], + "attributes": [{ + "type": { + "type": "opt", + "childType": { + "type": "alias", + "childType": "date" + } + }, + "id": 1, + "name": "date" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "KeyGroupId" + } + }, + "id": 2, + "name": "obsoleteKeyGroups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "KeyGroupHolder" + } + }, + "id": 3, + "name": "missedKeyGroups" + }] + }, + "doc": [ + "Sending encrypted package", { + "type": "reference", + "argument": "randomId", + "category": "hidden", + "description": "Random id" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "randomId" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 2, + "name": "destPeers" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "KeyGroupId" + } + }, + "id": 3, + "name": "ignoredKeyGroups" + }, { + "type": { + "type": "struct", + "childType": "EncryptedBox" + }, + "id": 4, + "name": "encryptedBox" + }] + } + }, { + "type": "update", + "content": { + "name": "EncryptedPackage", + "header": 177, + "doc": [ + "Update about encrypted package", { + "type": "reference", + "argument": "randomId", + "category": "full", + "description": " Random Id of package" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Sending date of package" + }, { + "type": "reference", + "argument": "senderId", + "category": "full", + "description": " Sender id of package" + }, { + "type": "reference", + "argument": "encryptedBox", + "category": "full", + "description": " Encrypted box" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 1, + "name": "randomId" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 2, + "name": "date" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 3, + "name": "senderId" + }, { + "type": { + "type": "struct", + "childType": "EncryptedBox" + }, + "id": 4, + "name": "encryptedBox" + }] + } + }] + }, { + "title": "Storage", + "package": "storage", + "items": [{ + "type": "rpc", + "content": { + "name": "UploadSharedBlob", + "header": 2660, + "response": { + "type": "anonymous", + "header": 2661, + "doc": [{ + "type": "reference", + "argument": "sharedObjectId", + "category": "full", + "description": " Id of shared object" + }], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "sharedObjectId" + }] + }, + "doc": [ + "Upload shared blob with user", { + "type": "reference", + "argument": "destPeer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "bucket", + "category": "full", + "description": "Bucked name" + }, { + "type": "reference", + "argument": "blob", + "category": "full", + "description": "Blob data" + }, { + "type": "reference", + "argument": "randomId", + "category": "full", + "description": "Random id for protecting from double upload" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "destPeer" + }, { + "type": "string", + "id": 2, + "name": "bucket" + }, { + "type": "bytes", + "id": 3, + "name": "blob" + }, { + "type": { + "type": "alias", + "childType": "randomId" + }, + "id": 4, + "name": "randomId" + }] + } + }, { + "type": "rpc", + "content": { + "name": "DownloadSharedBlob", + "header": 2662, + "response": { + "type": "anonymous", + "header": 2663, + "doc": [{ + "type": "reference", + "argument": "blob", + "category": "full", + "description": " Blob contents" + }], + "attributes": [{ + "type": "bytes", + "id": 1, + "name": "blob" + }] + }, + "doc": [ + "Download shared blob", { + "type": "reference", + "argument": "destPeer", + "category": "full", + "description": "Destination peer" + }, { + "type": "reference", + "argument": "bucket", + "category": "full", + "description": "Bucket name" + }, { + "type": "reference", + "argument": "objectId", + "category": "full", + "description": "Object Id" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "UserOutPeer" + }, + "id": 1, + "name": "destPeer" + }, { + "type": "string", + "id": 2, + "name": "bucket" + }, { + "type": "int32", + "id": 3, + "name": "objectId" + }] + } + }] + }, { + "title": "Peers", + "package": "peers", + "doc": [ + "Peer is an identificator of specific conversation." + ], + "items": [{ + "type": "enum", + "content": { + "name": "PeerType", + "values": [{ + "name": "Private", + "id": 1 + }, { + "name": "Group", + "id": 2 + }, { + "name": "EncryptedPrivate", + "id": 3 + }] + } + }, { + "type": "struct", + "content": { + "name": "Peer", + "doc": [ + "Peer", { + "type": "reference", + "argument": "type", + "category": "full", + "description": " Peer Type" + }, { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Peer Id" + } + ], + "attributes": [{ + "type": { + "type": "enum", + "childType": "PeerType" + }, + "id": 1, + "name": "type" + }, { + "type": "int32", + "id": 2, + "name": "id" + }] + } + }, { + "type": "struct", + "content": { + "name": "OutPeer", + "doc": [ + "Out peer with access hash", { + "type": "reference", + "argument": "type", + "category": "full", + "description": " Peer Type" + }, { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Peer Id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " Peer access hash" + } + ], + "attributes": [{ + "type": { + "type": "enum", + "childType": "PeerType" + }, + "id": 1, + "name": "type" + }, { + "type": "int32", + "id": 2, + "name": "id" + }, { + "type": "int64", + "id": 3, + "name": "accessHash" + }] + } + }, { + "type": "struct", + "content": { + "name": "UserOutPeer", + "doc": [ + "User's out peer", { + "type": "reference", + "argument": "uid", + "category": "full", + "description": " User's id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " User's access hash" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 1, + "name": "uid" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }, { + "type": "struct", + "content": { + "name": "GroupOutPeer", + "doc": [ + "Group's out peer", { + "type": "reference", + "argument": "groupId", + "category": "full", + "description": " Group's Id" + }, { + "type": "reference", + "argument": "accessHash", + "category": "danger", + "description": " Group's access hash" + } + ], + "attributes": [{ + "type": { + "type": "alias", + "childType": "groupId" + }, + "id": 1, + "name": "groupId" + }, { + "type": "int64", + "id": 2, + "name": "accessHash" + }] + } + }] + }, { + "title": "Sequence and Updates", + "package": "sequence", + "doc": [ + "Each device has it's own update sequence. At the begining application request initial sequence state by", + "calling GetState. On each application restart or NewSessionCreated application calls GetDifference for receiving", + "updates in update sequence.", + "GetState and GetDifference automatically subscribes session to receiving updates in session.", + "Each update has seq and state. Seq is sequental index of updated and used for detecting of holes in update sequence", + "(because of server failure or session die) on client side.", + "All updates needed to be processed in partucular order according to seq values.", + "In some updates there can be references to users that are not available at client yer. In this case application need", + "to ignore such update and init getting difference." + ], + "items": [{ + "type": "update_box", + "content": { + "name": "SeqUpdate", + "header": 13, + "doc": [ + "Sequence update", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number of update" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Sequece state of update" + }, { + "type": "reference", + "argument": "updateHeader", + "category": "full", + "description": " header of update" + }, { + "type": "reference", + "argument": "update", + "category": "compact", + "description": " The update" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": "int32", + "id": 3, + "name": "updateHeader" + }, { + "type": "bytes", + "id": 4, + "name": "update" + }] + } + }, { + "type": "update_box", + "content": { + "name": "FatSeqUpdate", + "header": 73, + "doc": [ + "Fat sequence update with additional data", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number of update" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": " Sequence state of update" + }, { + "type": "reference", + "argument": "updateHeader", + "category": "full", + "description": " header of update" + }, { + "type": "reference", + "argument": "update", + "category": "compact", + "description": " The update" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Users that are referenced in update" + }, { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Groups that are referenced in update" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": "int32", + "id": 3, + "name": "updateHeader" + }, { + "type": "bytes", + "id": 4, + "name": "update" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 5, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 6, + "name": "groups" + }] + } + }, { + "type": "update_box", + "content": { + "name": "WeakUpdate", + "header": 26, + "doc": [ + "Out of sequence update (for typing and online statuses)", { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of update" + }, { + "type": "reference", + "argument": "updateHeader", + "category": "full", + "description": " Header of update" + }, { + "type": "reference", + "argument": "update", + "category": "compact", + "description": " The update" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "date" + }, { + "type": "int32", + "id": 2, + "name": "updateHeader" + }, { + "type": "bytes", + "id": 3, + "name": "update" + }] + } + }, { + "type": "update_box", + "content": { + "name": "WeakFatUpdate", + "header": 2673, + "doc": [ + "Fat Weak Update", { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of update" + }, { + "type": "reference", + "argument": "updateHeader", + "category": "full", + "description": " Header of update" + }, { + "type": "reference", + "argument": "update", + "category": "full", + "description": " The update" + }, { + "type": "reference", + "argument": "users", + "category": "full", + "description": " Users that are referenced in update" + }, { + "type": "reference", + "argument": "groups", + "category": "full", + "description": " Groups that are referenced in update" + } + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "date" + }, { + "type": "int32", + "id": 2, + "name": "updateHeader" + }, { + "type": "bytes", + "id": 3, + "name": "update" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 4, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 5, + "name": "groups" + }] + } + }, { + "type": "update_box", + "content": { + "name": "SeqUpdateTooLong", + "header": 25, + "doc": [ + "Notification about requiring performing manual GetDifference" + ], + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "UpdateContainer", + "doc": [ + "Update container", { + "type": "reference", + "argument": "updateHeader", + "category": "full", + "description": " Header of update" + }, { + "type": "reference", + "argument": "update", + "category": "compact", + "description": " The updatre" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "updateHeader" + }, { + "type": "bytes", + "id": 2, + "name": "update" + }] + } + }, { + "type": "update_box", + "content": { + "name": "CombinedUpdate", + "header": 2625, + "doc": [ + "Combined update", { + "type": "reference", + "argument": "seqStart", + "category": "full", + "description": " Sequence number start" + }, { + "type": "reference", + "argument": "seqEnd", + "category": "full", + "description": " Sequence number end" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " Sequence state" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Update's users" + }, { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Update's groups" + }, { + "type": "reference", + "argument": "updates", + "category": "full", + "description": " Updates (can be empty)" + }, { + "type": "reference", + "argument": "messages", + "category": "full", + "description": " New messages" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seqStart" + }, { + "type": "int32", + "id": 2, + "name": "seqEnd" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 3, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 4, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 5, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UpdateContainer" + } + }, + "id": 6, + "name": "updates" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageContainer" + } + }, + "id": 7, + "name": "messages" + }] + } + }, { + "type": "enum", + "content": { + "name": "UpdateOptimization", + "values": [{ + "name": "NONE", + "id": 1 + }, { + "name": "STRIP_ENTITIES", + "id": 2 + }, { + "name": "ENABLE_COMBINED", + "id": 3 + }, { + "name": "FASTER_MESSAGES", + "id": 4 + }, { + "name": "STRIP_COUNTERS", + "id": 5 + }, { + "name": "COMPACT_USERS", + "id": 6 + }, { + "name": "GROUPS_V2", + "id": 7 + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetState", + "header": 9, + "response": { + "type": "reference", + "name": "Seq" + }, + "doc": [ + "Get main sequence state", { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 1, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetDifference", + "header": 11, + "response": { + "type": "anonymous", + "header": 12, + "doc": [{ + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Seq of LAST update in updates" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " State of LAST update in updates" + }, { + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Users referenced in updates" + }, { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Groups referenced in updates" + }, { + "type": "reference", + "argument": "updates", + "category": "compact", + "description": " Updates" + }, { + "type": "reference", + "argument": "needMore", + "category": "full", + "description": " Need to perform other difference" + }, { + "type": "reference", + "argument": "usersRefs", + "category": "full", + "description": " Direct references of users" + }, { + "type": "reference", + "argument": "groupsRefs", + "category": "full", + "description": " Direct References of groups" + }], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 3, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 6, + "name": "groups" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UpdateContainer" + } + }, + "id": 4, + "name": "updates" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MessageContainer" + } + }, + "id": 7, + "name": "messages" + }, { + "type": "bool", + "id": 5, + "name": "needMore" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 8, + "name": "usersRefs" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 9, + "name": "groupsRefs" + }] + }, + "doc": [ + "Getting difference of sequence", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": "Sequence number" + }, { + "type": "reference", + "argument": "state", + "category": "compact", + "description": "Sequence state" + }, { + "type": "reference", + "argument": "optimizations", + "category": "full", + "description": "Enabled optimizations" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": { + "type": "list", + "childType": { + "type": "enum", + "childType": "UpdateOptimization" + } + }, + "id": 3, + "name": "optimizations" + }] + } + }, { + "type": "rpc", + "content": { + "name": "GetReferencedEntitites", + "header": 2628, + "response": { + "type": "anonymous", + "header": 2629, + "doc": [{ + "type": "reference", + "argument": "users", + "category": "compact", + "description": " Loaded users" + }, { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": " Loaded groups" + }], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "User" + } + }, + "id": 1, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "Group" + } + }, + "id": 2, + "name": "groups" + }] + }, + "doc": [ + "Loading referenced entities", { + "type": "reference", + "argument": "users", + "category": "compact", + "description": "Users to load" + }, { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": "Groups to load. Also returns all members of a group." + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 1, + "name": "users" + }, { + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 2, + "name": "groups" + }] + } + }, { + "type": "update", + "content": { + "name": "RawUpdate", + "header": 80, + "doc": [ + "Custom Raw Update", { + "type": "reference", + "argument": "type", + "category": "full", + "description": " Type of content" + }, { + "type": "reference", + "argument": "bytes", + "category": "full", + "description": " Raw data" + } + ], + "attributes": [{ + "type": { + "type": "opt", + "childType": "string" + }, + "id": 1, + "name": "type" + }, { + "type": "bytes", + "id": 2, + "name": "bytes" + }] + } + }, { + "type": "update", + "content": { + "name": "EmptyUpdate", + "header": 85, + "doc": [ + "Empty update" + ], + "attributes": [] + } + }, { + "type": "empty" + }, { + "type": "rpc", + "content": { + "name": "SubscribeToOnline", + "header": 32, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Subscribing for users online", { + "type": "reference", + "argument": "users", + "category": "compact", + "description": "Users for subscription" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 1, + "name": "users" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SubscribeFromOnline", + "header": 33, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Removing subscription for users online", { + "type": "reference", + "argument": "users", + "category": "compact", + "description": "Users of subscriptions" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "UserOutPeer" + } + }, + "id": 1, + "name": "users" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SubscribeToGroupOnline", + "header": 74, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Subscribing for groups online", { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": "Groups for subscription" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 1, + "name": "groups" + }] + } + }, { + "type": "rpc", + "content": { + "name": "SubscribeFromGroupOnline", + "header": 75, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Removing subscription for groups online", { + "type": "reference", + "argument": "groups", + "category": "compact", + "description": "Groups of subscriptions" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "GroupOutPeer" + } + }, + "id": 1, + "name": "groups" + }] + } + }] + }, { + "title": "Counters", + "package": "counters", + "doc": [ + "Application Counters, used to display various counters in application" + ], + "items": [{ + "type": "struct", + "content": { + "name": "AppCounters", + "doc": [ + "Application counters", { + "type": "reference", + "argument": "globalCounter", + "category": "full", + "description": " Global unread counter" + } + ], + "expandable": "true", + "attributes": [{ + "type": { + "type": "opt", + "childType": "int32" + }, + "id": 1, + "name": "globalCounter" + }] + } + }, { + "type": "update", + "content": { + "name": "CountersChanged", + "header": 215, + "doc": [ + "Update about counters changed", { + "type": "reference", + "argument": "counters", + "category": "full", + "description": " Current Application counters" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "AppCounters" + }, + "id": 1, + "name": "counters" + }] + } + }] + }, { + "title": "Miscellaneous", + "package": "misc", + "items": [{ + "type": "response", + "content": { + "name": "Void", + "header": 50, + "doc": [ + "Empty response" + ], + "attributes": [] + } + }, { + "type": "response", + "content": { + "name": "Seq", + "header": 72, + "doc": [ + "Sequence response. Methods that return this value must process response in particular order", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number of response" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " Sequence state of response" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }] + } + }, { + "type": "response", + "content": { + "name": "SeqDate", + "header": 102, + "doc": [ + "Sequence response with date. Methods that return this value must process response in particular order", { + "type": "reference", + "argument": "seq", + "category": "full", + "description": " Sequence number of response" + }, { + "type": "reference", + "argument": "state", + "category": "full", + "description": " Sequence state of response" + }, { + "type": "reference", + "argument": "date", + "category": "full", + "description": " Date of response" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "seq" + }, { + "type": { + "type": "alias", + "childType": "seq_state" + }, + "id": 2, + "name": "state" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 3, + "name": "date" + }] + } + }, { + "type": "response", + "content": { + "name": "Bool", + "header": 209, + "doc": [ + "Boolean response", { + "type": "reference", + "argument": "value", + "category": "full", + "description": " Response value" + } + ], + "attributes": [{ + "type": "bool", + "id": 1, + "name": "value" + }] + } + }, { + "type": "struct", + "content": { + "name": "Config", + "doc": [ + "Configuration of system", { + "type": "reference", + "argument": "maxGroupSize", + "category": "full", + "description": " Current maximum group size" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "maxGroupSize" + }] + } + }, { + "type": "struct", + "content": { + "name": "Extension", + "doc": [ + "Extention", { + "type": "reference", + "argument": "id", + "category": "full", + "description": " Extension id" + }, { + "type": "reference", + "argument": "data", + "category": "full", + "description": " Extension data" + } + ], + "attributes": [{ + "type": "int32", + "id": 1, + "name": "id" + }, { + "type": "bytes", + "id": 2, + "name": "data" + }] + } + }, { + "type": "update", + "content": { + "name": "Config", + "header": 42, + "doc": [ + "Update about config change", { + "type": "reference", + "argument": "config", + "category": "full", + "description": " new config" + } + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Config" + }, + "id": 1, + "name": "config" + }] + } + }] + }, { + "title": "Device Info", + "package": "device", + "doc": [ + "Submiting various information about device for providing better experience.", + "For example, getting timezone or preffered languages" + ], + "items": [{ + "type": "rpc", + "content": { + "name": "NotifyAboutDeviceInfo", + "header": 229, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Notifying about device information", { + "type": "reference", + "argument": "preferredLanguages", + "category": "full", + "description": "Preferred languages" + }, { + "type": "reference", + "argument": "timeZone", + "category": "full", + "description": "Device Time Zone" + } + ], + "attributes": [{ + "type": { + "type": "list", + "childType": "string" + }, + "id": 1, + "name": "preferredLanguages" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 2, + "name": "timeZone" + }] + } + }] + }, { + "title": "Webactions", + "package": "webactions", + "doc": [ + "Web actions allow clients to visit some predefined web pages,", + "perform actions, and pass result on action completion" + ], + "items": [{ + "type": "rpc", + "content": { + "name": "InitWebaction", + "header": 116, + "response": { + "type": "anonymous", + "header": 117, + "doc": [{ + "type": "reference", + "argument": "uri", + "category": "full", + "description": " Web action uri" + }, { + "type": "reference", + "argument": "regexp", + "category": "full", + "description": " Regular expression. Required to match completion of web action" + }, { + "type": "reference", + "argument": "actionHash", + "category": "danger", + "description": " Identifier of current web action. Required to complete it" + }], + "attributes": [{ + "type": "string", + "id": 1, + "name": "uri" + }, { + "type": "string", + "id": 2, + "name": "regexp" + }, { + "type": "string", + "id": 3, + "name": "actionHash" + }] + }, + "doc": [ + "Initialize start of web action", { + "type": "reference", + "argument": "actionName", + "category": "full", + "description": "Name of web action" + }, { + "type": "reference", + "argument": "params", + "category": "full", + "description": "Additional params required to make action's uri" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "actionName" + }, { + "type": { + "type": "struct", + "childType": "MapValue" + }, + "id": 2, + "name": "params" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CompleteWebaction", + "header": 123, + "response": { + "type": "anonymous", + "header": 124, + "doc": [{ + "type": "reference", + "argument": "result", + "category": "full", + "description": " Reslut of web action completion" + }], + "attributes": [{ + "type": { + "type": "struct", + "childType": "MapValue" + }, + "id": 1, + "name": "result" + }] + }, + "doc": [ + "Complete started web action", { + "type": "reference", + "argument": "actionHash", + "category": "danger", + "description": "Identifier of given web action" + }, { + "type": "reference", + "argument": "completeUri", + "category": "full", + "description": "Final uri of web action" + } + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "actionHash" + }, { + "type": "string", + "id": 2, + "name": "completeUri" + }] + } + }] + }, { + "title": "Collections", + "package": "collections", + "doc": [ + "Flexible raw collections without structure" + ], + "items": [{ + "type": "trait", + "content": { + "isContainer": "true", + "name": "RawValue", + "attributes": [] + } + }, { + "type": "struct", + "content": { + "name": "StringValue", + "doc": [ + "Text value" + ], + "trait": { + "name": "RawValue", + "key": 1 + }, + "attributes": [{ + "type": "string", + "id": 1, + "name": "text" + }] + } + }, { + "type": "struct", + "content": { + "name": "Int32Value", + "doc": [ + "Int32 value" + ], + "trait": { + "name": "RawValue", + "key": 2 + }, + "attributes": [{ + "type": "int32", + "id": 1, + "name": "value" + }] + } + }, { + "type": "struct", + "content": { + "name": "Int64Value", + "doc": [ + "Int64 value" + ], + "trait": { + "name": "RawValue", + "key": 3 + }, + "attributes": [{ + "type": "int64", + "id": 1, + "name": "value" + }] + } + }, { + "type": "struct", + "content": { + "name": "DoubleValue", + "doc": [ + "Double value" + ], + "trait": { + "name": "RawValue", + "key": 4 + }, + "attributes": [{ + "type": "double", + "id": 1, + "name": "value" + }] + } + }, { + "type": "struct", + "content": { + "name": "ArrayValue", + "doc": [ + "Array value" + ], + "trait": { + "name": "RawValue", + "key": 5 + }, + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "trait", + "childType": "RawValue" + } + }, + "id": 1, + "name": "array" + }] + } + }, { + "type": "struct", + "content": { + "name": "MapValueItem", + "doc": [ + "Item of Map" + ], + "attributes": [{ + "type": "string", + "id": 1, + "name": "key" + }, { + "type": { + "type": "trait", + "childType": "RawValue" + }, + "id": 2, + "name": "value" + }] + } + }, { + "type": "struct", + "content": { + "name": "MapValue", + "doc": [ + "Map Value" + ], + "trait": { + "name": "RawValue", + "key": 6 + }, + "attributes": [{ + "type": { + "type": "list", + "childType": { + "type": "struct", + "childType": "MapValueItem" + } + }, + "id": 1, + "name": "items" + }] + } + }] + }, { + "title": "Surveys", + "package": "surveys", + "doc": [ + "Surveys implementation for messages" + ], + "items": [{ + "type": "struct", + "content": { + "name": "Survey", + "doc": [ + "Main Survey Struct" + ], + "attributes": [{ + "type": "int64", + "id": 1, + "name": "id" + }, { + "type": "string", + "id": 2, + "name": "titulo" + }, { + "type": { + "type": "opt", + "childType": "string" + }, + "id": 3, + "name": "uf" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 4, + "name": "creationTime" + }, { + "type": { + "type": "alias", + "childType": "date" + }, + "id": 5, + "name": "endTime" + }, { + "type": { + "type": "alias", + "childType": "userId" + }, + "id": 6, + "name": "ownerId" + }, { + "type": { + "type": "list", + "childType": "string" + }, + "id": 7, + "name": "answers" + }] + } + }, { + "type": "rpc", + "content": { + "name": "CreateSurvey", + "header": 139, + "response": { + "type": "reference", + "name": "Void" + }, + "doc": [ + "Criar uma nova enquete" + ], + "attributes": [{ + "type": { + "type": "struct", + "childType": "Survey" + }, + "id": 1, + "name": "survey" + }] + } + }] + }] +} \ No newline at end of file From ed9ff7dc07063647d8ae268a509aee5a47dd9231 Mon Sep 17 00:00:00 2001 From: diego Date: Sat, 17 Dec 2016 13:47:59 -0200 Subject: [PATCH 189/253] alteracoes --- .../android-app/src/main/java/im/actor/Application.java | 4 ++-- .../java/im/actor/core/modules/groups/GroupsModule.java | 9 +++++++++ .../core/modules/messaging/dialogs/DialogsActor.java | 3 ++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index 601b24f1c3..3ff7cf35b8 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -85,8 +85,8 @@ public void onConfigureActorSDK() { "canalxloto" }); - ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); -// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); +// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); + ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); ActorSDK.sharedActor().setAuthType(AuthActivity.AUTH_TYPE_PHONE); // ActorSDK.sharedActor().setTwitter(""); diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/groups/GroupsModule.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/groups/GroupsModule.java index f04089ce16..91edba2fe0 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/groups/GroupsModule.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/groups/GroupsModule.java @@ -63,6 +63,7 @@ import im.actor.runtime.actors.messages.Void; import im.actor.runtime.eventbus.BusSubscriber; import im.actor.runtime.eventbus.Event; +import im.actor.runtime.function.Consumer; import im.actor.runtime.function.Function; import im.actor.runtime.mvvm.MVVMCollection; import im.actor.runtime.promise.Promise; @@ -144,6 +145,14 @@ private Promise createGroup(String title, String avatarDescriptor, int[ .map((Function>) ints -> { ArrayList peers = new ArrayList<>(); for (int u : uids) { + +// users().getValueAsync(u).then(new Consumer() { +// @Override +// public void apply(User user) { +// peers.add(new ApiUserOutPeer(u, user.getAccessHash())); +// } +// }); + User user = users().getValue(u); if (user != null) { peers.add(new ApiUserOutPeer(u, user.getAccessHash())); diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/messaging/dialogs/DialogsActor.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/messaging/dialogs/DialogsActor.java index ef3e642582..8fac3d4088 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/messaging/dialogs/DialogsActor.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/modules/messaging/dialogs/DialogsActor.java @@ -285,7 +285,8 @@ private Promise onHistoryLoaded(List history) { .setDialogTitle(peerDesc.getTitle()) .setDialogAvatar(peerDesc.getAvatar()) .setSortKey(dialogHistory.getSortDate()) - + .setIsChannel(peerDesc.isChannel()) + .setIsBot(peerDesc.isBot()) .setRid(dialogHistory.getRid()) .setTime(dialogHistory.getDate()) .setMessageType(description.getContentType()) From 580cc406087ded19e4bb946ea347c7e318481a9e Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sat, 24 Dec 2016 19:48:33 -0200 Subject: [PATCH 190/253] alteracoes --- actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../sdk-core-ios/ActorApp/AppDelegate.swift | 4 +-- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../ActorSDK.xcodeproj/project.pbxproj | 6 +++- .../Dialogs List/Cells/AADialogCell.swift | 27 +++++++++++++++--- .../Managed Runtime/ManagedCells.swift | 2 ++ .../Sources/SwiftExtensions/Strings.swift | 6 ++-- 7 files changed, 36 insertions(+), 11 deletions(-) diff --git a/actor-sdk/sdk-core-ios/.DS_Store b/actor-sdk/sdk-core-ios/.DS_Store index 6aff7c0114f692d110ad84f3a7fd8602ec548ed4..9f9fb88735f9393bd4fdb1837ca6a76a275a9603 100644 GIT binary patch delta 73 zcmZoEXerp>#?Htv`Jbxz<~Vi-DdrM4&&dlFO`){bqhhj4(CIC9F)oODFSa SYEAy9!Np{)wwX)w7ass>$rk|t delta 73 zcmZoEXerp>#?Ht%`Jbxz<~Vi-Ddyr_pUDdqO_@_Ql7O_<qhhj4(CIC9F)| WD<<=3YEAy9!Np`XZ!?$XFFpWr%omUV diff --git a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift index 7bb0b66873..e6e294c00e 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift @@ -32,9 +32,9 @@ open class AppDelegate : ActorApplicationDelegate { // ActorSDK.sharedActor().autoJoinGroups = ["canalxloto"] - // ActorSDK.sharedActor().endpoints = ["tcp://api-mtproto.im.xloto.com.br:9070"] + ActorSDK.sharedActor().endpoints = ["tcp://api-mtproto.im.xloto.com.br:9070"] - ActorSDK.sharedActor().endpoints = ["tcp://192.168.1.3:9070"] + //ActorSDK.sharedActor().endpoints = ["tcp://192.168.1.3:9070"] //AppCocoaHttpRuntime.getMethod("") diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index aee4c52633..d4494f1dd3 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.18" + s.version = "3.0.457.23" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj index 0351fac014..da05972545 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj @@ -340,6 +340,7 @@ 15F89F081C211FED00776ACD /* opus_multistream.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F041C211FED00776ACD /* opus_multistream.h */; }; 15F89F091C211FED00776ACD /* opus_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F051C211FED00776ACD /* opus_types.h */; }; 15F89F0A1C211FED00776ACD /* opus.h in Headers */ = {isa = PBXBuildFile; fileRef = 15F89F061C211FED00776ACD /* opus.h */; }; + 2616FB1E4FDE48780ABF5B46 /* Pods_ActorSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B29614BD032EB33B22B34279 /* Pods_ActorSDK.framework */; }; 9AA6A41F1D08568A00957A7F /* AASettingsMediaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AA6A41E1D08568A00957A7F /* AASettingsMediaViewController.swift */; }; 9AAE96481CF81F140092E366 /* AARingtonesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AAE96471CF81F140092E366 /* AARingtonesViewController.swift */; }; BE237C9D1C422FFA00060648 /* AAStickersKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE237C9C1C422FFA00060648 /* AAStickersKeyboard.swift */; }; @@ -724,6 +725,7 @@ 15F89F0F1C21317400776ACD /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; 9AA6A41E1D08568A00957A7F /* AASettingsMediaViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AASettingsMediaViewController.swift; sourceTree = ""; }; 9AAE96471CF81F140092E366 /* AARingtonesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AARingtonesViewController.swift; sourceTree = ""; }; + B29614BD032EB33B22B34279 /* Pods_ActorSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ActorSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BE237C9C1C422FFA00060648 /* AAStickersKeyboard.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAStickersKeyboard.swift; sourceTree = ""; }; BE2621561C4656D700A817AB /* AAConvActionSheet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAConvActionSheet.swift; sourceTree = ""; }; BE2621581C4656EE00A817AB /* AAThumbnailView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AAThumbnailView.swift; sourceTree = ""; }; @@ -775,6 +777,7 @@ 06CE898C1BD841C9005A5530 /* SystemConfiguration.framework in Frameworks */, BEAC2B311C42D683007F7A2F /* libopus.a in Frameworks */, 066A52001BC4E0B0000E606E /* libsqlite3.tbd in Frameworks */, + 2616FB1E4FDE48780ABF5B46 /* Pods_ActorSDK.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1673,6 +1676,7 @@ F15398CB1DF3A8C600C67C7D /* AGEmojiKeyboard.framework */, 06CE898B1BD841C9005A5530 /* SystemConfiguration.framework */, 066A51FF1BC4E0B0000E606E /* libsqlite3.tbd */, + B29614BD032EB33B22B34279 /* Pods_ActorSDK.framework */, ); name = Frameworks; sourceTree = ""; @@ -2016,7 +2020,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run \'pod install\' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; A2ED258362D73946D3AE7FB4 /* [CP] Copy Pods Resources */ = { diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift index 109980a7f8..768cdf2f51 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift @@ -42,12 +42,14 @@ final class AADialogCell: AATableViewCell, AABindedCell { open let avatarView = AAAvatarView() open let titleView = YYLabel() + open let dialogTypeView = UIImageView() open let messageView = YYLabel() open let dateView = YYLabel() open let statusView = UIImageView() open let counterView = YYLabel() open let counterViewBg = UIImageView() + // Binding Data @@ -84,6 +86,7 @@ final class AADialogCell: AATableViewCell, AABindedCell { self.contentView.addSubview(avatarView) self.contentView.addSubview(titleView) + self.contentView.addSubview(dialogTypeView) self.contentView.addSubview(messageView) self.contentView.addSubview(dateView) self.contentView.addSubview(statusView) @@ -191,11 +194,19 @@ final class AADialogCell: AATableViewCell, AABindedCell { open func addImageDialogType(_ image: UIImage!){ - let dialogTypeView = UIImageView(image:image) + dialogTypeView.image = image let dialogTypeFrame = CGRect(x: 76, y: 17, width: 18, height: 18) dialogTypeView.frame = dialogTypeFrame self.titleView.left = self.titleView.left+20 - self.contentView.addSubview(dialogTypeView) + + } + + open func removeImageDialogType(){ + dialogTypeView.image = UIImage() + let dialogTypeFrame = CGRect(x: 76, y: 17, width: 18, height: 18) + dialogTypeView.frame = dialogTypeFrame + self.titleView.left = 76 + } @@ -253,6 +264,11 @@ final class AADialogCell: AATableViewCell, AABindedCell { counterView.clearContentsBeforeAsynchronouslyDisplay = false } + + // + //Image Type + // + let isBot = binItem.isBot let isChannel = binItem.isChannel @@ -262,13 +278,16 @@ final class AADialogCell: AATableViewCell, AABindedCell { }else { addImageDialogType(UIImage.bundled("ic_group")) } - }else if(bindedItem?.peer.peerType == ACPeerType.private()){ + }else if(binItem.peer.peerType == ACPeerType.private()){ if(isBot){ addImageDialogType(UIImage.bundled("ic_robot")) + }else{ + removeImageDialogType() } + }else{ + removeImageDialogType() } - } } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/ManagedCells.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/ManagedCells.swift index c96c03b6d3..16cea715de 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/ManagedCells.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/ManagedCells.swift @@ -12,6 +12,7 @@ open class AAEditRow: AAManagedRow, UITextFieldDelegate { open var text: String? open var placeholder: String? open var returnKeyType = UIReturnKeyType.default + open var keyboardType = UIKeyboardType.default open var autocorrectionType = UITextAutocorrectionType.default open var autocapitalizationType = UITextAutocapitalizationType.sentences open var returnAction: (()->())? @@ -37,6 +38,7 @@ open class AAEditRow: AAManagedRow, UITextFieldDelegate { res.textField.delegate = self res.textField.removeTarget(nil, action: nil, for: .allEvents) res.textField.addTarget(self, action: #selector(AAEditRow.textFieldDidChange(_:)), for: .editingChanged) + res.textField.keyboardType = keyboardType if prefix != nil { res.textPrefix.text = prefix diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Strings.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Strings.swift index bc70feb3f2..f01e01e2d0 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Strings.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Strings.swift @@ -7,7 +7,7 @@ import j2objc public extension String { - public var isEmpty: Bool { return self.characters.isEmpty } + //public var isEmpty: Bool { return self.characters.isEmpty } public var length: Int { return self.characters.count } @@ -82,9 +82,9 @@ public extension String { return false } - public func contains(_ text: String) -> Bool { + /*public func contains(_ text: String) -> Bool { return self.range(of: text, options: NSString.CompareOptions.caseInsensitive, range: nil, locale: nil) != nil - } + }*/ public func startsWith(_ text: String) -> Bool { let range = self.range(of: text) From 95db410ad547bc7a54d24dee7d5c76123e147de2 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 27 Dec 2016 22:49:18 -0200 Subject: [PATCH 191/253] acerto do apns da apple --- .DS_Store | Bin 10244 -> 10244 bytes actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes .../android-sdk/src/main/res/.DS_Store | Bin 18436 -> 18436 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../ActorApp.xcodeproj/project.pbxproj | 8 +++-- .../sdk-core-ios/ActorApp/AppDelegate.swift | 9 ++--- .../ActorApp/Supporting Files/Info.plist | 12 +++---- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../ActorSDK.xcodeproj/project.pbxproj | 6 ++-- .../Sources/ActorApplicationDelegate.swift | 3 +- .../ActorSDK/Sources/ActorSDK.swift | 14 +++++--- .../Views/AARecordAudioController.swift | 2 +- .../ConversationViewController.swift | 32 +++++++++--------- actor-sdk/sdk-core-ios/Podfile | 2 +- actor-server/conf/server.conf | 21 ++++++------ 15 files changed, 62 insertions(+), 49 deletions(-) diff --git a/.DS_Store b/.DS_Store index 1424adab2b915462ab1fe54ca539923c32a1429a..1b8d6d9663c83484bdce5f1a839c77820d0f58cf 100644 GIT binary patch delta 55 zcmZn(XbIS$D=_(%Sc|BkrICq_f{B4)t&T#qxw!$5ZEQBVSlo2-6Jg=ayn;XZHnS`I KV%a3h%nShBq7a$@ delta 76 zcmZn(XbIS$E5LYivYtSLrbKnMsgZ$>f|03tt&T#qxjB$+Vr*Vp%gG_GYG~`3kXu<* fT~k{(bMg%VdB$0re+cmNZ)Q{Y&9a$El$jX-b;}nt diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index e954ab618f8482ee6907bafe634aad3821c3bf30..0e66d8a6164eac48f1ec9743622f0a0258bf6800 100644 GIT binary patch delta 1120 zcmbu7OH30%7{}*dUc0i$0Hwf+Y_SLk1zM>*BVZtcLE?jgAVes1F)PplE#M=9M0^B| zQCB?>4I1^JCWZ*=2~2z)JZOw0C~)E6!I)^gV4@d?E+!^$QRgs^??3a+H}m@sHV!t9 z21KZZ#!h|iMw{7avsjOsjYqPxEo`2dr4B{(CEaQ2Xj431i)98nKmUNhAdX)ZEQE+< z+sX_=d5zNSc2z2eWz`X%uI|_8lr~V>?U8rOZ4R%}BbPY5vZsND_b77jjt;Nlc6qAh zE)N?`MHb>~{JqstvGMCuGHkg8#Z#d)EL_kF26Z|{Vq9%^hw#JD@o<8L2o$R6tw^M0RWT#IN z<79$Nl2_y%nI-e&Gg%d%O3YC$1W0~tC^EiPdy2}2ssuY}_d82!s>yd^W_6Ip-` zK?q?KL`EPP>9C;yTTzB`Y)1vEQG>mxLp}Tc{ZMeghoHxYU;xK)0w)=W^SFphxQr_p zVHj@W7H;D{M)AN0WCBmjc#3Cuju&{1Y0WJ{r%JKp;! zN)M`9OeeS`_3)(8(ZaHl(p*zfak;vZnW|3d`%~s@9;d_W%g_IUh)7*jbPSbZ8H*+_ZUSqah_@Th5N+^2*vkJWoi}Z(>aSuFLjEj7w5TF(%1!$B@l2 zFy!!!a5JTWM4k}O(qxmw=jjo<)u-%n+a1RoianH()8ws`b_Mm?K}GbM%(lzf61UPe zuj7=WmB?jz68B1NCmpWv(gIdQxm`NswEAs|Q!7`>$|!G^+J}`vufy%q#9gd{CLmYp z=yUh?D=wc`lPz)$4{HQV-~bMz3rEq7J~+`2H#``IA7eO+bC|#tn6KgnCUFNd zxQ_>Th!=Q`4_L%U1n>>Z_=#2ZadbM?)Fpj-rpM-V+X#u6T;KR~Vf>cnOtn*29kxD0 zoirQ=Q(>$SeU&lU&v>M;M+ykPlZ#7OI*$@g(9pDeCu3YEtkSZTRU#WLJfVT)B-zO7 zSiO`W-U}!Hfg0w!E>V9N>07c$mITf<@&{1@Wum}nLMC!iib_~ei#qJaUhGFJ4x&v! z?12@w5J*=DkG3v=StNB{r; diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/.DS_Store b/actor-sdk/sdk-core-android/android-sdk/src/main/res/.DS_Store index 63676a97940c7d69495444d5db29012f6e81befc..7004ff5cabbab937eb7638383e09f1a291e4e4a9 100644 GIT binary patch delta 47 zcmZpfz}PZ@al>*&HVac71v87yYZU{TCMy_mY-Us03ua7aQ&FF6A(XW_Mty|>0AENB ALjV8( delta 43 xcmZpfz}PZ@al>*&HgiKA1yjS#YZU{TnCw4nQaKEwCaLI7wh+qN9HYKM0RTV24!i&W diff --git a/actor-sdk/sdk-core-ios/.DS_Store b/actor-sdk/sdk-core-ios/.DS_Store index 9f9fb88735f9393bd4fdb1837ca6a76a275a9603..f1b91fa3341853be229893c0cd2695f72d6632d0 100644 GIT binary patch delta 56 zcmZoEXero`smRnUF*#e&n7L!dqsA KV{?w?3_bu|j}*B8 delta 56 zcmV-80LTA?aD;HMX(0lFvXg5eGn3XKEwjrZ2nPYBlME>;ll~|P1A03qlL{#{1!vS= O005JmC@8aRDVPpS)e}wt diff --git a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj index 7f1bfa9529..782b3fa9e8 100644 --- a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj @@ -213,7 +213,7 @@ TargetAttributes = { EA6B7348F8364542DDD264F741AAAA19 = { CreatedOnToolsVersion = 6.4; - DevelopmentTeam = HVJR44Y5B6; + DevelopmentTeam = HA23Y6A5LW; LastSwiftMigration = 0800; SystemCapabilities = { com.apple.Maps.iOS = { @@ -446,6 +446,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = HA23Y6A5LW; EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; ENABLE_BITCODE = NO; FABRIC_BUILD_SECRET = ""; @@ -462,7 +463,7 @@ LIBRARY_SEARCH_PATHS = "$(inherited)"; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = im.actor.sdk.dev; + PRODUCT_BUNDLE_IDENTIFIER = br.com.diegosilva.xlotomessenger; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; SDK_PATH = "../actor-sdk"; @@ -525,6 +526,7 @@ CODE_SIGN_ENTITLEMENTS = "ActorApp/Supporting Files/ActorApp.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = HA23Y6A5LW; EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; ENABLE_BITCODE = NO; FABRIC_BUILD_SECRET = ""; @@ -540,7 +542,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = im.actor.sdk.dev; + PRODUCT_BUNDLE_IDENTIFIER = br.com.diegosilva.xlotomessenger; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; SDK_PATH = "../actor-sdk"; diff --git a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift index e6e294c00e..9442ad60ce 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift @@ -24,7 +24,8 @@ open class AppDelegate : ActorApplicationDelegate { ActorSDK.sharedActor().enableVideoCalls = false // Setting Development Push Id - //ActorSDK.sharedActor().apiPushId = 868547 + ActorSDK.sharedActor().apiPushId = 868547 + ActorSDK.sharedActor().autoPushMode = .fromStart ActorSDK.sharedActor().authStrategy = .phoneEmail @@ -32,9 +33,9 @@ open class AppDelegate : ActorApplicationDelegate { // ActorSDK.sharedActor().autoJoinGroups = ["canalxloto"] - ActorSDK.sharedActor().endpoints = ["tcp://api-mtproto.im.xloto.com.br:9070"] + //ActorSDK.sharedActor().endpoints = ["tcp://api-mtproto.im.xloto.com.br:9070"] - //ActorSDK.sharedActor().endpoints = ["tcp://192.168.1.3:9070"] + ActorSDK.sharedActor().endpoints = ["tcp://192.168.1.8:9070"] //AppCocoaHttpRuntime.getMethod("") @@ -56,7 +57,7 @@ open class AppDelegate : ActorApplicationDelegate { } open override func actorRootInitialControllerIndex() -> Int? { - return 0 + return 1 } open override func showStickersButton() -> Bool{ diff --git a/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist b/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist index 9748219882..2763e95b72 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist +++ b/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist @@ -2,10 +2,6 @@ - NSPhotoLibraryUsageDescription - $(PRODUCT_NAME) precisa acessar suas fotos - NSContactsUsageDescription - $(PRODUCT_NAME) precisa acessar seus contatos CFBundleDevelopmentRegion en CFBundleDisplayName @@ -21,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.9.0 + 0.0.1 CFBundleSignature ???? CFBundleURLTypes @@ -38,7 +34,7 @@ CFBundleVersion - 526 + 1 Fabric APIKey @@ -68,8 +64,12 @@ + NSContactsUsageDescription + $(PRODUCT_NAME) precisa acessar seus contatos NSLocationWhenInUseUsageDescription Sharing location + NSPhotoLibraryUsageDescription + $(PRODUCT_NAME) precisa acessar suas fotos UIBackgroundModes audio diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index d4494f1dd3..9e386afe96 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.23" + s.version = "3.0.457.24" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj index da05972545..83c70dea2b 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj @@ -1934,7 +1934,7 @@ TargetAttributes = { 066A50D11BC4AE63000E606E = { CreatedOnToolsVersion = 7.0; - DevelopmentTeam = HVJR44Y5B6; + DevelopmentTeam = HA23Y6A5LW; LastSwiftMigration = 0800; }; }; @@ -2020,7 +2020,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run \'pod install\' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; A2ED258362D73946D3AE7FB4 /* [CP] Copy Pods Resources */ = { @@ -2420,6 +2420,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = HA23Y6A5LW; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -2476,6 +2477,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = HA23Y6A5LW; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift index 491e627e6c..9ef4a4c7b8 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift @@ -46,7 +46,8 @@ open class ActorApplicationDelegate: ActorSDKDelegateDefault, UIApplicationDeleg } open func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { - let tokenString = "\(deviceToken)".replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "") + let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() + // let tokenString = "\(deviceToken)".replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "") ActorSDK.sharedActor().pushRegisterToken(tokenString) } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift index dc761a154d..2f969135e8 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift @@ -359,10 +359,16 @@ import ReachabilitySwift requestPush() } - var controller: UIViewController! = delegate.actorControllerAfterLogIn() - if controller == nil { - controller = delegate.actorControllerForStart() - } + self.showMainController() + } + + open func didLoggedInWithoutPush() { + self.showMainController() + } + + func showMainController(){ + var controller = delegate.actorControllerForStart() + if controller == nil { let tab = AARootTabViewController() diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Views/AARecordAudioController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Views/AARecordAudioController.swift index f048235081..21ae077bbf 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Views/AARecordAudioController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Conversation/Views/AARecordAudioController.swift @@ -226,7 +226,7 @@ class AARecordAudioController: UIViewController,UIViewControllerTransitioningDel self.sendRecord.isEnabled = true self.cleanRecord.isEnabled = true }) - + }) } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift index 8eb5686ebd..2c40bddc69 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift @@ -8,7 +8,7 @@ import MobileCoreServices import AddressBook import AddressBookUI import AVFoundation -import AGEmojiKeyboard +//import AGEmojiKeyboard final public class ConversationViewController: @@ -21,9 +21,11 @@ final public class ConversationViewController: ABPeoplePickerNavigationControllerDelegate, AAAudioRecorderDelegate, AAConvActionSheetDelegate, - //AAStickersKeyboardDelegate, - AGEmojiKeyboardViewDataSource, - AGEmojiKeyboardViewDelegate{ + AAStickersKeyboardDelegate + //, + //AGEmojiKeyboardViewDataSource, + // AGEmojiKeyboardViewDelegate + { // Data binder fileprivate let binder = AABinder() @@ -53,10 +55,10 @@ final public class ConversationViewController: // Stickers // - //fileprivate var stickersView: AAStickersKeyboard! + fileprivate var stickersView: AAStickersKeyboard! open var stickersButton : UIButton! fileprivate var stickersOpen = false - fileprivate var emojiKeyboar: AGEmojiKeyboardView! + //fileprivate var emojiKeyboar: AGEmojiKeyboardView! // @@ -284,12 +286,9 @@ final public class ConversationViewController: navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: nil, action: nil) let frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216) - // self.stickersView = AAStickersKeyboard(frame: frame) - //self.stickersView.delegate = self + self.stickersView = AAStickersKeyboard(frame: frame) + self.stickersView.delegate = self - self.emojiKeyboar = AGEmojiKeyboardView(frame:frame, dataSource: self) - self.emojiKeyboar.delegate = self - self.emojiKeyboar.autoresizingMask = UIViewAutoresizing.flexibleHeight //emojiKeyboar.frame = frame NotificationCenter.default.addObserver( @@ -476,8 +475,8 @@ final public class ConversationViewController: titleView.frame = CGRect(x: 0, y: 4, width: (navigationView.frame.width - 0), height: 20) subtitleView.frame = CGRect(x: 0, y: 22, width: (navigationView.frame.width - 0), height: 20) - //stickersView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216) - emojiKeyboar.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216) + stickersView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216) + //emojiKeyboar.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216) } override open func viewDidAppear(_ animated: Bool) { @@ -1075,8 +1074,8 @@ final public class ConversationViewController: if self.stickersOpen == false { //self.stickersView.loadStickers() - //self.textInputbar.textView.inputView = self.stickersView - self.textInputbar.textView.inputView = self.emojiKeyboar + self.textInputbar.textView.inputView = self.stickersView + //self.textInputbar.textView.inputView = self.emojiKeyboar self.textInputbar.textView.inputView?.isOpaque = false self.textInputbar.textView.inputView?.backgroundColor = UIColor.clear self.textInputbar.textView.refreshFirstResponder() @@ -1105,7 +1104,7 @@ final public class ConversationViewController: Actor.sendSticker(with: self.peer, with: sticker) } - + /* public func emojiKeyboardView(_ emojiKeyboardView: AGEmojiKeyboardView!, imageForSelectedCategory category: AGEmojiKeyboardViewCategoryImage) -> UIImage{ switch category { case .recent: @@ -1151,6 +1150,7 @@ final public class ConversationViewController: public func emojiKeyBoardViewDidPressBackSpace(_ emojiKeyBoardView: AGEmojiKeyboardView!){ self.textView.deleteBackward() } + */ } class AABarAvatarView : AAAvatarView { diff --git a/actor-sdk/sdk-core-ios/Podfile b/actor-sdk/sdk-core-ios/Podfile index fde45835d7..c4771d3279 100644 --- a/actor-sdk/sdk-core-ios/Podfile +++ b/actor-sdk/sdk-core-ios/Podfile @@ -62,7 +62,7 @@ target 'ActorSDK' do pod 'YYWebImage' pod 'YYCategories' pod 'DZNWebViewController' - pod 'AGEmojiKeyboard' + #pod 'AGEmojiKeyboard' # Small UI pod 'VBFPopFlatButton' diff --git a/actor-server/conf/server.conf b/actor-server/conf/server.conf index b065c79a02..ccb36b1773 100644 --- a/actor-server/conf/server.conf +++ b/actor-server/conf/server.conf @@ -72,20 +72,20 @@ modules { security { server-keys: [ { - public: "/home/diego/data/keys/actor-key-0.pub" - private: "/home/diego/data/keys/actor-key-0.key" + public: "/Users/diego/data/keys/actor-key-0.pub" + private: "/Users/diego/data/keys/actor-key-0.key" } { - public: "/home/diego/data/keys/actor-key-1.pub" - private: "/home/diego/data/keys/actor-key-1.key" + public: "/Users/diego/data/keys/actor-key-1.pub" + private: "/Users/diego/data/keys/actor-key-1.key" } { - public: "/home/diego/data/keys/actor-key-2.pub" - private: "/home/diego/data/keys/actor-key-2.key" + public: "/Users/diego/data/keys/actor-key-2.pub" + private: "/Users/diego/data/keys/actor-key-2.key" } { - public: "/home/diego/data/keys/actor-key-3.pub" - private: "/home/diego/data/keys/actor-key-3.key" + public: "/Users/diego/data/keys/actor-key-3.pub" + private: "/Users/diego/data/keys/actor-key-3.key" } ] } @@ -125,7 +125,7 @@ services { #For local file storage file-storage { # provide your own path to directory with read and write permissions for user `actor` - location: "/home/diego/data/files" + location: "/Users/diego/data/files" thread-pool-size: 20 } @@ -275,8 +275,9 @@ services { apple { push { certs = [{ + key: 868547 bundleId: "br.com.diegosilva.xlotomessenger" - path: "/home/diego/Dropbox/actor/apple/production/xloto_apns.p12" + path: "/Users/diego/Dropbox/actor/apple/production/xloto_apns.p12" password: "xlotoapns123" sandbox: false voip: false From 77c045b7f1db8c88f28e876b1d1f84ebf4d6d79b Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 29 Dec 2016 10:58:23 -0200 Subject: [PATCH 192/253] alteracoes --- .DS_Store | Bin 10244 -> 10244 bytes actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes .../sdk-core-ios/ActorApp/AppDelegate.swift | 4 ++-- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../ConversationViewController.swift | 12 ++++++++---- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.DS_Store b/.DS_Store index 1b8d6d9663c83484bdce5f1a839c77820d0f58cf..8a1d9c83a5921736e4e30978de196ade92c12a24 100644 GIT binary patch delta 22 dcmZn(XbIS`QGnCP)WlFn!O+5d^DY4|aR5|O2DtzL delta 22 dcmZn(XbIS`QGnCX(#S+d!NkCD^DY4|aR5|32C@JE diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index 0e66d8a6164eac48f1ec9743622f0a0258bf6800..8e8b1a28b62e888104fd9ad9fd87aa1fcea5b2ca 100644 GIT binary patch delta 1008 zcmbu6Ur19?9LLW$&7GSEJ=@G(YcuDv`Df&x%(6fitDI@AeM4Sp}xoJ(DU3*{higWPgt8wvcK7HWi9$!mrtK-YjL(|U6JrQ zZKuj1jpW$u&XV%V+WH1xBA1&j);z}a51HlhfFva>+?*>H$TKN-(YF3hZF|2K8%k|+ z6v}L~5{juSBZ{_FQx$%VN-0uYD9f9Y#Mh^aw?b)ZJjX4w_0eQ#D7~@5!`S+6Ev)dU zh)QNxRWmu*6Y5lZxDuC)bMxz%ykS7?i)xWDZ%GdqEoO3CSERRB4acHpc+%rWuPnDG zqgzAKSYVqP7T09Q2C@-gUW0EdW6mcyVNk1-csqrPbyjAHLC2DzcCZ86|L|6lJJE0~+B)Gge_W z)?h6*p#z=hf`VQ|(T@S_z+UXf0UX339K{)&#W|eE6^!TO4({R}9^w%mBY_uqi%ERc zkL0(T>`nfre753Op)-Cj^i_`0;`Dr5QAwFT!5w;h_5vyw%$R9+uvz-+JUJc|($ztl z6vs`86e_mQrot7csU>sUvnA1}!Q6HarF@D(D(%&hsE}tEtd`YLu1I{ULF?IKNz}MupzO!K!#+|};CF)bQeOQX+2ngeA zu?|7BV+%sUdN+E6^#}&BU6i(v;F5(g{V+3QkhMTyBaoolO rJjJt7f5H8%(P>2$CcWGi_y_BjU)DDaXi=@RM-A>6%`C0{kK;c9h%M}0 delta 1077 zcmb`EPe@cj9LMKtrt|8heB2!iy)#y&0&V$_dD~OneS($eWZQ- zvrf%0j#6vBCDUlh%~KCW#;dQ4$?Bv&R-KEiWKz|(D!o|Uq;$Gn^~yn6btGo1)|hI` zZl)Vl&ouxf>9jh6i(wT&fz>RU@VD4xQc7I zj$0VV?EsD`+{XjV;2|F28RjM`V`oApRvXhpRa;EOKLo$(NAL~GL~vT(e{A<1a?AkL diff --git a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift index 9442ad60ce..3fddc245cb 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift @@ -25,7 +25,7 @@ open class AppDelegate : ActorApplicationDelegate { // Setting Development Push Id ActorSDK.sharedActor().apiPushId = 868547 - ActorSDK.sharedActor().autoPushMode = .fromStart + ActorSDK.sharedActor().autoPushMode = .afterLogin ActorSDK.sharedActor().authStrategy = .phoneEmail @@ -61,7 +61,7 @@ open class AppDelegate : ActorApplicationDelegate { } open override func showStickersButton() -> Bool{ - return true + return false } open override func useOnClientPrivacy() -> Bool{ diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index 9e386afe96..32e6b4f5a3 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.24" + s.version = "3.0.457.26" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift index 2c40bddc69..0987b53cbd 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Conversation/ConversationViewController.swift @@ -75,6 +75,8 @@ final public class ConversationViewController: fileprivate var textMode:Bool! fileprivate var micOn: Bool! = true + open var removeExcedentControllers = true + //////////////////////////////////////////////////////////// @@ -482,10 +484,12 @@ final public class ConversationViewController: override open func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - if navigationController!.viewControllers.count > 2 { - let firstController = navigationController!.viewControllers[0] - let currentController = navigationController!.viewControllers[navigationController!.viewControllers.count - 1] - navigationController!.setViewControllers([firstController, currentController], animated: false) + if self.removeExcedentControllers { + if navigationController!.viewControllers.count > 2 { + let firstController = navigationController!.viewControllers[0] + let currentController = navigationController!.viewControllers[navigationController!.viewControllers.count - 1] + navigationController!.setViewControllers([firstController, currentController], animated: false) + } } if !AADevice.isiPad { From 9be8935b7fe4431bbe665a12642f615f3632d2c0 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 29 Dec 2016 13:45:24 -0200 Subject: [PATCH 193/253] alteracoes --- actor-server/project/Dependencies.scala | 4 ++-- actor-server/version.sbt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/actor-server/project/Dependencies.scala b/actor-server/project/Dependencies.scala index 518b663f9a..09d38e0871 100644 --- a/actor-server/project/Dependencies.scala +++ b/actor-server/project/Dependencies.scala @@ -108,9 +108,9 @@ object Dependencies { val guava = "com.google.guava" % "guava" % "19.0" val alpn = "org.eclipse.jetty.alpn" % "alpn-api" % "1.1.3.v20160715" % "runtime" - //val tcnative = "io.netty" % "netty-tcnative" % "1.1.33.Fork24" classifier "linux-x86_64" + val tcnative = "io.netty" % "netty-tcnative" % "1.1.33.Fork24" classifier "linux-x86_64" - val tcnative = "io.netty" % "netty-tcnative-boringssl-static" % "1.1.33.Fork24" + //val tcnative = "io.netty" % "netty-tcnative-boringssl-static" % "1.1.33.Fork24" val silencer = "com.github.ghik" % "silencer-lib" % "0.4" } diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 7788936bdc..290dd8b3b1 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.13-SNAPSHOT" +version in ThisBuild := "3.0.14-SNAPSHOT" From 60ac511df4e5f5bbf7145cfac3a65396d2d75a34 Mon Sep 17 00:00:00 2001 From: diego Date: Fri, 30 Dec 2016 00:13:02 -0200 Subject: [PATCH 194/253] alteracoes --- .../src/main/java/im/actor/Application.java | 4 ++-- actor-server/conf/server.conf | 20 +++++++++---------- actor-server/project/Dependencies.scala | 6 +++--- actor-server/version.sbt | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index 3ff7cf35b8..601b24f1c3 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -85,8 +85,8 @@ public void onConfigureActorSDK() { "canalxloto" }); -// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); - ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); + ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); +// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); ActorSDK.sharedActor().setAuthType(AuthActivity.AUTH_TYPE_PHONE); // ActorSDK.sharedActor().setTwitter(""); diff --git a/actor-server/conf/server.conf b/actor-server/conf/server.conf index ccb36b1773..7f3d99de5b 100644 --- a/actor-server/conf/server.conf +++ b/actor-server/conf/server.conf @@ -72,20 +72,20 @@ modules { security { server-keys: [ { - public: "/Users/diego/data/keys/actor-key-0.pub" - private: "/Users/diego/data/keys/actor-key-0.key" + public: "/home/diego/data/keys/actor-key-0.pub" + private: "/home/diego/data/keys/actor-key-0.key" } { - public: "/Users/diego/data/keys/actor-key-1.pub" - private: "/Users/diego/data/keys/actor-key-1.key" + public: "/home/diego/data/keys/actor-key-1.pub" + private: "/home/diego/data/keys/actor-key-1.key" } { - public: "/Users/diego/data/keys/actor-key-2.pub" - private: "/Users/diego/data/keys/actor-key-2.key" + public: "/home/diego/data/keys/actor-key-2.pub" + private: "/home/diego/data/keys/actor-key-2.key" } { - public: "/Users/diego/data/keys/actor-key-3.pub" - private: "/Users/diego/data/keys/actor-key-3.key" + public: "/home/diego/data/keys/actor-key-3.pub" + private: "/home/diego/data/keys/actor-key-3.key" } ] } @@ -125,7 +125,7 @@ services { #For local file storage file-storage { # provide your own path to directory with read and write permissions for user `actor` - location: "/Users/diego/data/files" + location: "/home/diego/data/files" thread-pool-size: 20 } @@ -277,7 +277,7 @@ services { certs = [{ key: 868547 bundleId: "br.com.diegosilva.xlotomessenger" - path: "/Users/diego/Dropbox/actor/apple/production/xloto_apns.p12" + path: "/home/diego/Dropbox/actor/apple/production/xloto_apns.p12" password: "xlotoapns123" sandbox: false voip: false diff --git a/actor-server/project/Dependencies.scala b/actor-server/project/Dependencies.scala index 09d38e0871..0cf5ecd85a 100644 --- a/actor-server/project/Dependencies.scala +++ b/actor-server/project/Dependencies.scala @@ -94,7 +94,7 @@ object Dependencies { val tyrex = "tyrex" % "tyrex" % "1.0.1" - val pushy = "com.relayrides" % "pushy" % "0.8.1" + val pushy = "com.relayrides" % "pushy" % "0.8.2" val logbackClassic = "ch.qos.logback" % "logback-classic" % "1.1.2" val scalaLogging = "com.typesafe.scala-logging" %% "scala-logging" % "3.1.0" @@ -108,9 +108,9 @@ object Dependencies { val guava = "com.google.guava" % "guava" % "19.0" val alpn = "org.eclipse.jetty.alpn" % "alpn-api" % "1.1.3.v20160715" % "runtime" - val tcnative = "io.netty" % "netty-tcnative" % "1.1.33.Fork24" classifier "linux-x86_64" + //val tcnative = "io.netty" % "netty-tcnative" % "1.1.33.Fork24" classifier "linux-x86_64" - //val tcnative = "io.netty" % "netty-tcnative-boringssl-static" % "1.1.33.Fork24" + val tcnative = "io.netty" % "netty-tcnative-boringssl-static" % "1.1.33.Fork24" val silencer = "com.github.ghik" % "silencer-lib" % "0.4" } diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 290dd8b3b1..8c06e68900 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.14-SNAPSHOT" +version in ThisBuild := "3.0.16-SNAPSHOT" From 92e309887be159cb0f9c95d547915e0ab3c44ec9 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Fri, 30 Dec 2016 12:48:59 -0200 Subject: [PATCH 195/253] alteracoes --- actor-server/project/Dependencies.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actor-server/project/Dependencies.scala b/actor-server/project/Dependencies.scala index 0cf5ecd85a..40aec16633 100644 --- a/actor-server/project/Dependencies.scala +++ b/actor-server/project/Dependencies.scala @@ -108,9 +108,9 @@ object Dependencies { val guava = "com.google.guava" % "guava" % "19.0" val alpn = "org.eclipse.jetty.alpn" % "alpn-api" % "1.1.3.v20160715" % "runtime" - //val tcnative = "io.netty" % "netty-tcnative" % "1.1.33.Fork24" classifier "linux-x86_64" + //val tcnative = "io.netty" % "netty-tcnative" % "1.1.33.Fork25" classifier "linux-x86_64" - val tcnative = "io.netty" % "netty-tcnative-boringssl-static" % "1.1.33.Fork24" + val tcnative = "io.netty" % "netty-tcnative-boringssl-static" % "1.1.33.Fork25" val silencer = "com.github.ghik" % "silencer-lib" % "0.4" } From 0ed29c572e283b76d638bc0b01dcaa044283116a Mon Sep 17 00:00:00 2001 From: diego Date: Fri, 30 Dec 2016 20:45:53 -0200 Subject: [PATCH 196/253] alteracoes --- actor-server/version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 8c06e68900..b72462a285 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.16-SNAPSHOT" +version in ThisBuild := "3.0.18-SNAPSHOT" From 3fd30226a1ba76c291522606eb332ad92c090fde Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Mon, 2 Jan 2017 12:40:36 -0200 Subject: [PATCH 197/253] improments --- actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../ActorApp.xcodeproj/project.pbxproj | 3 + .../sdk-core-ios/ActorApp/AppDelegate.swift | 35 +- .../Localizable/pt-BR.lproj/InfoPlist.strings | 19 + .../Supporting Files/ActorApp.entitlements | 2 + actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../ActorSDK.xcodeproj/project.pbxproj | 4 + actor-sdk/sdk-core-ios/ActorSDK/.DS_Store | Bin 8196 -> 8196 bytes .../sdk-core-ios/ActorSDK/Resources/.DS_Store | Bin 10244 -> 14340 bytes .../Resources/pt-BR.lproj/Localizable.strings | 726 ++++++++++++++++++ .../Sources/ActorApplicationDelegate.swift | 3 +- .../ActorSDK/Sources/ActorSDK.swift | 6 +- .../ActorSDK/Sources/ActorStyle.swift | 3 + .../Auth/AAAuthOTPViewController.swift | 16 +- .../Auth/AAAuthViewController.swift | 4 +- .../Controllers/Managed Runtime/Alerts.swift | 5 + 16 files changed, 814 insertions(+), 14 deletions(-) create mode 100644 actor-sdk/sdk-core-ios/ActorApp/Resources/Localizable/pt-BR.lproj/InfoPlist.strings create mode 100644 actor-sdk/sdk-core-ios/ActorSDK/Resources/pt-BR.lproj/Localizable.strings diff --git a/actor-sdk/sdk-core-ios/.DS_Store b/actor-sdk/sdk-core-ios/.DS_Store index f1b91fa3341853be229893c0cd2695f72d6632d0..344bdc6d583203f9dbfbeb1141fd55695dceb2c7 100644 GIT binary patch delta 1176 zcmds#T}V@57{{Og+1EMlsAtZtxhb2B*3O!1Ib9o3F4Ro3tgNd({K$(!t(k_>vK0<0 znnb-6R^CWN^hL&8*%w`OQ_)o_(nS*8c-aR*MG&1_MBPMm6ZF8#`@H;kcwT<|6VXI; zbX=Pk^g0%YLj7JxEF21Z9l`P-o07^|i7w0nhC;4RWG}5Ic4J`|8^||s64+aVNhBgD zM=4&PGVo?~$|Y8sxP-{sivy~p<~SQEK4E&?8tvHG-Q)L9gHx$BS{<(xi#T@J1ffZ? z#A1QqUu>`7kY>H!BG!;M5qC!XnSThxQxTO?71dKS?V%VA(h!Z%7~P~>^pKv?G`*l% zdQI=?1AU}V;Gjn~a*zuP3SdJaWRxO+GDJ{|I@DtgHefThU>lmyhED846kX`WK^(#W z5=g>%3a4=fXK@}^aShioiU)XvXPCewrZ9t9ykYl^P6k&Ylhr0c%(mC8sxjC8V$~o) zc%G9h8S;$zCi6VUe3{*G6|tH8zPR3H7o{{WOj-)8Hjm40mpGoEd-xV9L?yL+XMr-& zE@`ATAwxr9QIynDw~(1!wp^iFX|+Oa1y+k#DOL*xqy>q1XT~3qGvdy)KRJ#6PU;hy zpjV2}&md?OnMOrqF&3Z%OHhFos6sVXq5h5!XlzCcTG2kIayR<05Bt%N12~MM zIHu?vRBR3@HqT)g7jO}mBwWT7j3JG2+{RtpV_VHKi@O`SwX;l=J?x8HP$jdBEK4re zC^r!scDq@JT&vRgPBOp8o71_ws;X^o&vv58WR}2u9v^df^vck;ekrG0mumMM(WG?# YcWM?X@yGv7kbdOI`hNyV{^KBh1ulaNDF6Tf delta 538 zcmZoEXerpRgRMR#zuYOmG%uw%IyfW0JUBBYH7T)(lT+CtcL4(kaB^_Q3rJO08yOgy z>L?f)n%C+mR2v!?8|o;S8JX19a&kzj8wbT@HTKP#J!k2%^cv z9!*}TI8o|*QbA5;afyM!4Mrwr7FITP4o*&PPF_xa&dD3KgjE9)OEQ37h!>E7dL}$G zr6eOHHP1CCwJbHyzsM)CBz1D0fKv)RJUe-Uh6vPu=Xkbqa$eyT6PJ*bl9rwvz$&qM zxx`Aw$&)n%H^)l#Gcsb8`*N~^rWTKjOG;@;G6Tbvjv1FH%W0aj0%-<@ z$s05@CO2q$GBa#QojgHPhd(zTuF%H8pJ8&prY=w{1*RD$Hn~8Hmx + aps-environment + development com.apple.developer.icloud-container-identifiers iCloud.$(CFBundleIdentifier) diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index 32e6b4f5a3..9b84b676bd 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.26" + s.version = "3.0.457.30" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj index 83c70dea2b..bf1733dc8f 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj @@ -767,6 +767,7 @@ E30822B631D108159E8B306B /* Pods-ActorSDK.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorSDK.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK.debug.xcconfig"; sourceTree = ""; }; F076508E3899D309954904A3 /* Pods-ActorSDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorSDK.release.xcconfig"; path = "Pods/Target Support Files/Pods-ActorSDK/Pods-ActorSDK.release.xcconfig"; sourceTree = ""; }; F15398CB1DF3A8C600C67C7D /* AGEmojiKeyboard.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGEmojiKeyboard.framework; path = "../../../../../Library/Developer/Xcode/DerivedData/ActorSDK-hfpcbgrswlpuwlafdzjxrahnyfmr/Build/Products/Debug-iphonesimulator/AGEmojiKeyboard/AGEmojiKeyboard.framework"; sourceTree = ""; }; + F175DF891E168C69005BCF1A /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1949,6 +1950,8 @@ "zh-Hans", Base, es, + "pt-BR", + pt, ); mainGroup = 066A50C81BC4AE63000E606E; productRefGroup = 066A50D31BC4AE63000E606E /* Products */; @@ -2314,6 +2317,7 @@ 065975451BC7D34200B8C7DF /* pt */, 065975471BC7D34400B8C7DF /* ru */, 065975481BC7D34600B8C7DF /* zh-Hans */, + F175DF891E168C69005BCF1A /* pt-BR */, ); name = Localizable.strings; path = .; diff --git a/actor-sdk/sdk-core-ios/ActorSDK/.DS_Store b/actor-sdk/sdk-core-ios/ActorSDK/.DS_Store index a0d4e70b4a9036d547ba71bce6c71ed933029991..94d01b4a93349dfdd3654493b0e12a432ba1f3e2 100644 GIT binary patch literal 8196 zcmeHMTWl0n7(U;&lo>nFDIg58;6lZM)==6)gBV!41t}C;yDcpgS!Q=e7@5x0o!Ko| zG3%2=#Wyb?F)F}_#>nrNagJgSMtTVnjroM}_q@?wl3c1|+qn>qjg zpUXGjnc07qF@~0cv6?ZBF(%Q$QLUtEio)&um{ek6O9de)p0NVUvm7&-mmQkq9W_J@ zL<~d>L<~d>L=4;r4A4897wJ0hePNC2h=GWKX~_V8J|yVim<+KbFnDxO6{G-!<=u96=} zA8?1#zU~*i7Cqn3uR3-AKvvIZ)Ogx5Ogihe4F5p4>1?*mqUm(x+jZX*uHCL{lS2^J zt!H;y=1@kRmvS9nw;VGc^ey_>(`z|~JJjM99K#Fz!_H;7COPnOuqauQGpaT`yr!wS zF45S~c%&{d+}vDWmuPBSd*p~LEv#+q+WXMs&zyMiW}Gc z3R(;=XJ={N+;0lA?G;mkwb;2)*1jHN?WRg)mbSHR+gznRqs}SPdOHSv%XPe+X5J&r zs8t?O*p_ph&b-O(y*bw|3^-m!t{Z!CdMpX-**=15+R?%#w9=$$`hU9@NFE#Fs9=V^!0-4XKeTwR+Cn zd5W@|?t|l74_aovXNcd>UAmVu9m8_=_ZBVB%GzePqYs$X_)C^Y=BU+G+CpuSq}E7% zg{<{(!SW9WeJx(1DSHeWa))d1-VF7;BnOsdOEj&YTT*$GYD1EO=G$vErQ72((?iEQ z>lCH?An8H%Xed6x`qhfoW9wPdRt;H%ty!yRy+y&Qx;<>Xd%dFd<=lY*T8dYVy0Cd; zQq%VGk=u38?-(>4n$<-bK3K&PZHpxB;?_-uL9?n!ZY%M7&uWq@0%SD;NDej0`tV$0 zi&+C}W$kPqeGeOE$Jh((EIY^EVsEnx>@#+meZ#J@AK1_ASN0qG9Wj()1}abm4a-rB z6FUdfMLTG^iM+Fure?(h&%cA&V<<`;tFma#skYvq6 z64#wNQ+O|n-zJgNR4KSrYU7nM?FV72jn_$%8WWaP@zpYI0JTimnv}H?NnM>Gtm~BZ zGHnL6Tv#_KNr^PCRtRfK*(~#Isj`1TyqDM)?0XXKpI{`{O3Wp}E+w(9!n#1LDYRk> zI!LfxNTUaPk%3O4JqVjb>*5d&V;GO(F+33p_ZXhT^Ei$ZIEhm@jWc)yXK@ba@ebZ4 zA-|7L@HsBy$^_}QPmu0+Q%kp)&O5g2>?bQ1{Y;h~|B@U3G{3gL>2XyimZ|alfAjUf z|4$DxqE$u=Oj8C>-kNT0p~a8>Fqp^#&$SbD?4yGh?pG2RgisZvdCy2ZYW(-WDn?tqL*Tz2q$}(yOWH1GB2bE2NdCe-puG_DCo{kabedT zFe;?q`Uv<4tVMw5?hH=woE@x{`MW)zG^`|9uO;UV-F8}9zQaIK@s^TONs`K>a_Mw@ z*2={l#mU$)C4I^r>8h6W`XiQQEccb;-?q5Or0Ry&`v#}yE?iuAc=3@- zVtMGjBA{Z`axbsHR@F`!NxEAewhk1Ao$V7)1YRyc@qGab#>#?&M~03jWI1DNCp1HG z^sLseIGUZ1D{Mk&FlCv?(^{6+KbEqL%$!M<%9LWHGUTlF8b(~dsM+I=cHZH=N!v<0 zeXirUPO)54u?hBjg4ar2fD~wLfn;>YO8CiSPzRb{2aYig6oO5%Yq0JBDx%HewU*#Rzs_ zCvor~v9KQp@GuS%6XQ6FV>pfzm_(I$ID@lzj(C{CEaotekGgz(0-qy3zJM>{OT@@4 ztN1rqV4jfp*82R*#?z)@nKNYN%q@lZ$`fYgTUT7iZ#Nl%A~9bL&;Ji?{QZBE@5-Of zN5Ds5GZDbz{&;_kW-R=`SUoweQB6+Xw=-c{t}Ib@S$#Y&80C&-Cc$=Mv)aTaHpq_IO5LX2!FiGnNzJ=soT z!Xzz}{wUCvK&J^U6bf_*g~HH!S1;AH z0e#%~!f7QA%hmwh!J24*uNKh1p$R!sTH$<*bASATj4f10$+iL;c@sLJP$9x%kT=k4kzGO@CW!C{0rWP58ywj;Ut`bQ_+Sq za1PGJDx8On=))####Oiu*JB&D?}ks!4p~NofcE`}>+~wrqAFGZflNY|Aw*#S%H} zprbT|8yaC5Y=JI_Kpz?67BasKnqn(s*UlqAM!6fl*OOCqkAwq)Q5hAp}95L!Q=l!3*WkOJuvVFMBP z;2w=xxIRXm?Xu6%hJx1BiZZg@Fu(szk$ENKM{$w z7D>+Pz+#++Bu|=k~$gwpb(_jqIQ^c;VNiN=@Om0i!G2 z8I6YdiW!4xla-ryKqtgf>2YVDVY)fIl%U6NB_yt*TDd?kOAb?SpvKlHGG^UJS{Tg$6|swr}(k{>;;97 znX!rz$8X=I^Vyn8m zVjdI71i@9E3q_+OtVyb@x|40;sdY4vUu+U&OC#LJyNMWg&@G8ZaA zV_Jz#3;{8j2W22DEwR~BVT@J*?k=yeiNQQ5_qZ#C0x|jWb5C`Ru%+Zdxy$1fwgiaD zRe?JfEEKjRhN)$UyYu~Hd!1(6tQCopUIh=W-!&pzKUo=6YliPSKjs1rlOcp?$T zV=xnq!bimirwP$y7*CYhTZBea58)sH<1XtKD6d!5tl)=W_2kr~tM_B2rA?wRFw z>maCc&lPT~b+EXHd#b9f_7qU#u6mEvJ_OXbbN)oDJqc=5*~5K}i|zI_SteOFk1e5F zN~vezbif_&N{>n|C#62q!-zDKe>q_$G*BY99kx?x*Fh?4xtq#ao}z-5m*5RjWWR+! z!D&)tT+suh$0krQ%OqM*N@xj5RP}HoU^!Lv3{v487{Xn6EiD}TsGes(-avXRL4ohW z`|$yM5WkM!Pb#uE@hv=t$MGHfBff{H)Ey?5l-1@Pn+^V*cFykH39WW0yK@(lb5FL; z8ure8oJfq!X-%HuDw{p0wqa3o(j(H`V2GQhdgd8ZTmxL~R_wHvoEsdr$3_ zXY}GT`Y>0e{T@zZ0mTvu$#?DKw-r>0=Ajq@`|L_eUac`9Zwo~dxDstA`7V2IB6+1G zoC3Yu@etmLcjG;jz`Bq8m@CsB!^iOnd{enyeiFu-#)tsr!D3=(y=Lm z?8StiU#dJ6L0_%6hM`XivIZ}O4?WdY86m?jC}SjnFFj4gX{;QNn}9zm=*a8;p+0r7 zjz*~qRdM~_(%kj`7whNp*U4KTZ-HTG0UX)V*3wKjmZ&C3zeldMbJ2DUZT#W$4yaa6 xp)a!>PwsFjUIT5(4~_fyfZ7A9mDA{0P5aP_05kqCAg}-P`v0soIv+{>|6eqlwvqq< delta 210 zcmZoEXbF&DU|?W$DortDU{C-uIe-{M3-C-V6q~3gIoZI3MH0wo;09twpg04A9zza8 z0Yec(K10@KK@KsN%?cd7%$z_u5a8g3h^g^BWoG1_%%iZJ!^qM=N5Rm-c=K+BW2}>R z3rSDr6cL~NSD0gSj^uo{jSXv=1eqb46+o7_f-DCb@|}4yzlrB$e;y72CWyN +// + +/* + * Main Screen + */ + +"TabMessages" = "Mensagens"; + +"TabPeople" = "Contatos"; + +"TabSettings" = "Configurações"; + +"TabDiscover" = "Descobrir"; + +/* + * Contacts + */ + +"ContactsAddHeader" = "Adicionar Contato"; + +"ContactsAddHint" = "Por favor, insira o número de telefone"; + +"ContactsActionInvite" = "Avise seus amigos sobre o {appname}"; + +"ContactsActionAdd" = "Adicionar Amigo(a)"; + +"ContactsBack" = "Contatos"; + +/* + * Dialogs + */ + +"DialogsHint" = "Deslise para mais opções"; + +"DialogsBack" = "Chats"; + +/* + * Settings + */ + +"SettingsEdit" = "Editar"; + +"SettingsSetPhoto" = "Definir Foto do Perfil"; + +"SettingsChangeName" = "Alterar Seu Nome"; + + +"SettingsEditHeader" = "Your name"; + +"SettingsEditHint" = "Please, enter your real name to help people better understand who you are."; + +"SettingsEditFieldHint" = "Enter your name"; + + +"SettingsAboutNotSet" = "Set about me"; + +"SettingsChangeAboutTitle" = "About me"; + +"SettingsChangeAboutHint" = "Tell people anything you want about yourself"; + + +"SettingsUsernameNotSet" = "Set username"; + +"SettingsUsernameTitle" = "Username"; + +"SettingsUsernameHintField" = "Enter your Username"; + +"SettingsUsernameHint" = "You can choose a username in {appname}. If you do, other people will be able to find you by this username and contact you without sharing your phone number.\n\nYou can use a-z, 0-9 and underscores. Minumum length is 5 characters."; + + +"SettingsSecurity" = "Privacy and Security"; + +"SettingsWallpapers" = "Wallpapers"; + +"SettingsMedia" = "Media Settings"; + +"SettingsNotifications" = "Alertas e Sons"; + +"SettingsAskQuestion" = "Fazer uma pergunta"; + +"SettingsTwitter" = "App Twitter"; + +"SettingsAbout" = "App Homepage"; + +"SettingsVersion" = "Versão {version}"; + +"SettingsMobilePhone" = "Telefone Móvel"; + +"SettingsGroupChats" = "Groups"; + +"SettingsPrivateChats" = "Private Chats"; + +/* + * Notifications + */ + +"NotificationsTitle" = "Alertas e Sons"; + +"NotificationsEffectsTitle" = "Efeitos"; + +"NotificationsMobileTitle" = "Notificações do Aparelho"; + +"NotificationsInAppTitle" = "Notificações do Aplicativo"; + +"NotificationsNotificationHint" = "Você pode desativar as notificações para usuários e grupos nas suas páginas específicas de informação."; + +"NotificationsPrivacyTitle" = "Privacidade"; + +"NotificationsSoundEffects" = "Efeitos Sonoros"; + +"NotificationsEnable" = "Ativar"; + +"NotificationsSound" = "Som"; + +"NotificationsVibration" = "vibrar"; + +"NotificationsPreview" = "Visualizar Mensagem"; + +"NotificationsPreviewHint" = "Remover texto da mensagem da notificação."; + +"NotificationSecretMessage" = "Nova Mensagem"; + +"NotificationsGroups" = "Group Notifications"; + +"NotificationsOnlyMentions" = "Only Mentions"; + +"NotificationsOnlyMentionsHint" = "You can enable notifications only for messages that contains your mention"; + +/* + * Media + */ + +"MediaTitle" = "Media Settings"; + +"MediaPhotoDownloadHeader"= "Automatic Photo Download"; + +"MediaAudioDownloadHeader"= "Automatic Audio Download"; + +"MediaOtherHeader"= "Other"; + +"MediaAutoplayGif"= "Autoplay GIFs"; + +/* + * Privacy + */ + +"PrivacyTitle" = "Privacy and Security"; + + +"PrivacyHeader" = "Privacy"; + +"PrivacyLastSeen" = "Visto pela ultima vez"; + +"PrivacyLastSeenHint" = "Alterar quem pode ver o seu tempo Última atividade."; + +"PrivacyLastSeenEverybody" = "Todo mundo"; + +"PrivacyLastSeenContacts" = "Meus contatos"; + +"PrivacyLastSeenNone" = "Ninguém"; + + +"PrivacySecurityHeader" = "Security"; + +"PrivacyAllSessions" = "Active Sessions"; + +"PrivacyTerminate" = "Encerrar todas as sessões"; + +"PrivacyTerminateAlert" = "Terminate all sessions"; + +"PrivacyTerminateAlertSingle" = "Terminate session"; + +"PrivacyTerminateHint" = "Descredencia todos os demais dispositivos menos este."; + +/* + * Calls + */ + +"CallsStartAudio" = "Audio Call"; + +"CallsStartGroupAudio" = "Group Audio Call"; + +"CallsAnswer" = "answer"; + +"CallsDecline" = "decline"; + +"CallsMute" = "mute"; + +"CallsSpeaker" = "speaker"; + +"CallsVideo" = "video"; + +"CallStateRinging" = "Ringing..."; + +"CallStateConnecting" = "Connecting..."; + +"CallStateIncoming" = "Incoming call..."; + +"CallPrivateTitle" = "Private Call"; + +"CallPrivateText" = "Call from {name}"; + +"CallGroupTitle" = "Group Call"; + +"CallGroupText" = "Group call {name}"; + +/* + * Profile + */ + +"ProfileEditHeader" = "Alterar name"; + +"ProfileSendMessage" = "Enviar Mensagem"; + +"ProfileNotifications" = "Alertas"; + +"ProfileNotificationsWarring" = "Você tem certeza que quer desativar os alertas para esse contato? Talvez isso cause problemas no relacionamento."; + +"ProfileNotificationsWarringAction" = "Desativar"; + +"ProfileAddToContacts" = "Adicionar aos contatos"; + +"ProfileRemoveFromContacts" = "Remover dos contatos"; + +"ProfileRename" = "Renomear Contato"; + +"ProfileRenameMessage" = "Você pode renomear conttos para organizar sua lista. As alterações serão vistas somente por você."; + +"ProfileRenameAction" = "Renomear"; + +"ProfileAbout" = "about"; + +"ProfilePhone" = "phone"; + +"ProfileUsername" = "username"; + +"ProfileTitle" = "Info"; + +"ProfileBlockContact" = "Block User"; + +"ProfileUnblockContact" = "Unblock User"; + +"CallNumber" = "Chamar número"; + +"CopyNumber" = "Copiar número"; + +"NumberCopied" = "Número de telefone copiadio para a área de transferência"; + +/* + * Publics + */ + +"JoinAlertMessage" = "Você quer fazer parte deste grupo?"; + +/* + * Group + */ + +"GroupEditHeader" = "Theme"; + +"GroupEditHint" = "Enter group theme"; + +"GroupSetPhoto" = "Definir Foto do Grupo"; + +"GroupSetTitle" = "Definir Nome do Grupo"; + +"GroupEditConfirm" = "Você tem certeza que quer mudar o nome do grupo?"; + +"GroupEditConfirmAction" = "Alterar Tema"; + +"GroupNotifications" = "Alertas"; + +"GroupSettings" = "CONFIGURAÇÕES"; + +"GroupIntegrations" = "Integrações"; + +"GroupDescription" = "Description"; + + + +"GroupAdministration" = "Administration"; + +"GroupTypeTitle" = "Group Type"; + +"GroupTypeTitleChannel" = "Channel Type"; + +"GroupTypePublic" = "Public"; + +"GroupTypePrivate" = "Private"; + +"ChannelTypePublic" = "Public"; + +"ChannelTypePrivate" = "Private"; + +"GroupTypePublicFull" = "Public Group"; + +"GroupTypePrivateFull" = "Private Group"; + +"ChannelTypePublicFull" = "Public Channel"; + +"ChannelTypePrivateFull" = "Private Channel"; + +"GroupPermissionsHint" = "Control what is possible in this group"; + +"GroupPermissionsHintChannel" = "Control what is possible in this channel"; + +"GroupTypeHintPublic" = "Public groups can be found in search and anyone can join"; + +"GroupTypeHintPrivate" = "Private groups can be joined only via personal invitation"; + +"GroupTypeHintPublicChannel" = "Public channels can be found in search and anyone can join"; + +"GroupTypeHintPrivateChannel" = "Private channels can be joined only via personal invitation"; + +"GroupTypeLinkHint" = "People can share this link with others and find your group using search"; + +"GroupTypeLinkHintChannel" = "People can share this link with others and find your channel using search"; + +"GroupDeleteHint" = "You will lose all messages in this group"; + +"GroupDeleteHintChannel" = "You will lose all messages in this channel"; + + +"GroupShareTitle" = "Shared History"; + +"GroupShareEnabled" = "Shared"; + +"GroupShareHint" = "All members will see all messages"; + +"GroupShareMessage" = "Are you sure want to share all messages to all members? This action is irreversible."; + +"GroupShareAction" = "Share"; + + +"GroupEditTitle" = "Edit Group"; + +"GroupEditTitleChannel" = "Edit Channel"; + +"GroupEditName" = "Group Name"; + +"GroupEditNameChannel" = "Channel Name"; + +"GroupEditDescription" = "Description"; + + + +"GroupViewMembers" = "Membros"; + +"GroupMemberAdmin" = "admin"; + +"GroupMemberInfo" = "Perfil"; + +"GroupMemberMakeAdmin" = "Make Group admin"; + +"GroupMemberMakeMessage" = "Are you sure want to make {name} admin of this group?"; + +"GroupMemberMakeAction" = "Yes"; + +"GroupMemberKick" = "Remover do Grupo"; + +"GroupMemberKickMessage" = "Você tem certeza que quer remover {name} do grupo?"; + +"GroupMemberKickAction" = "Remover"; + +"GroupMemberWrite" = "Escrever Mensagem"; + +"GroupMemberCall" = "Chamada Telefônica"; + +"GroupMemberCallNoPhones" = "O usuário não tem número de telefone."; + +"GroupAddParticipant" = "Adicionar Participante..."; + +"GroupAddParticipantTitle" = "Contatos"; + +"GroupAddParticipantUrl" = "COnvidar para o grupo via Link"; + + + +"GroupInviteLinkPageTitle" = "Link de Convite"; + +"GroupInviteLinkTitle" = "LINK"; + +"GroupInviteLinkHint" = "Você pode convidar pessoas para este grupo enviando este link."; + +"GroupInviteLinkRevokeMessage" = "Você tem certeza que quer remover este link? Uma vez removido, mais ninguém sera capaz de entrar no grupo usando este link."; + +"GroupInviteLinkRevokeAction" = "Remover"; + +/* + * Compose + */ + +"ComposeTitle" = "Nova Mensagem"; + + +"CreateGroup" = "Criar Grupo"; + +"CreateChannel" = "Create Channel"; + + +"CreateGroupTitle" = "Criar Grupo"; + +"CreateGroupNamePlaceholder" = "Inserir nome do grupo"; + +"CreateGroupHint" = "Please provide group subject and optional group icon"; + + +"CreateChannelTitle" = "Create Channel"; + +"CreateChannelHint" = "Please provide the channel name and an optional channel icon"; + +"CreateChannelNamePlaceholder" = "Channel Name"; + + +"CreateGroupMembersTitle" = "Invite members"; + +"CreateGroupMembersPlaceholders" = "Enter Names"; + +"ChatDeleted" = "This chat was deleted by owner."; + +/* + * Location + */ + +"LocationTitle" = "Localização"; + + + +/* + * Wallpapers + */ + +"WallpapersTitle" = "Wallpapers"; + +"WallpapersPhoto" = "Photo Library"; + +/* + * Chat + */ + +"ChatPlaceholder" = "Insira texto..."; + +"ChatSend" = "Enviar"; + +"ChatNoGroupAccess" = "Você não é membro"; + +"ChatDeleted" = "This chat was deleted by owner."; + +"ChatJoin" = "Join"; + +/* + * Find + */ + +"FindTitle" = "Find People"; + +"FindFieldHint" = "phone number, email or nickname"; + +"FindHint" = "Enter phone number, email or nickname and press search"; + +"FindNotFound" = "Sorry, but we are unable to find person for this search query"; + +/* + * Placeholders + */ + +"Placeholder_Empty_Title" = "COnvide seus amigos"; + +"Placeholder_Empty_Message" = "Nenhum dos seus contatos usa {appname}. Use o botão abaixo para convidá-los."; + +"Placeholder_Empty_Action" = "AVISE UM(A) AMIGO(A)"; + +"Placeholder_Empty_Message2" = "ou adicione um contato manualmente"; + +"Placeholder_Empty_Action2" = "ADICIONAR CONTATO"; + +"Placeholder_Loading_Title" = "Sincronizando"; + +"Placeholder_Loading_Message" = "Por favor, espero um pouco enquanto habilitamos seu aplicativo."; + +"Placeholder_Contacts_Title" = "Convide seus amigos(as)"; + +"Placeholder_Contacts_Message" = "Nenhum dos seus contatos usa {appname}. Use o botão abaixo para convidá-los."; + +"Placeholder_Contacts_Action" = "AVISE UM(A) AMIGO(A)"; + +"Placeholder_Contacts_Message2" = "ou adicione um contato manualmente usando o botão de mais no canto superior direito"; + +"Placeholder_Dialogs_Title" = "Começar a conversar"; + +"Placeholder_Dialogs_Message" = "Escolha um contato da sua lista ou pessione o botão de escrita no canto superior direito para começar a conversas imediatamente."; + +"Placeholder_Group_Title" = "Não é membro"; + +"Placeholder_Group_Message" = "Infelizmente você não é menro desse grupo."; + +"Placeholder_Location_Title" = "Ativar localização"; + +"Placeholder_Location_Message" = "Ative os Serviços de Localização em configurações do dispositivo para partilhar a sua localização."; + + +/* + * Welcome + */ + +"WelcomeTitle" = "Bem vindo ao {app_name}!"; + +"WelcomeTagline" = "Mensageiro rápido e gratuido"; + +"WelcomeSignUp" = "Entrar"; + +"WelcomeLogIn" = "Entrar"; + + +/* + * Auth + */ + +"AuthUnsupported" = "Essa conta não é suportada nesta versão do {app_name}. Favor atualizar para logar nessa conta."; + +"AuthLoginTitle" = "Login no {app_name}"; + +"AuthLoginPhone" = "Fone"; + +"AuthLoginEmail" = "E-mail"; + +"AuthLoginPhoneEmail" = "Fone ou E-mail"; + +"AuthNameTitle" = "Olá! Qual o seu nome?"; + +"AuthNamePlaceholder" = "Nome completo"; + +"AuthPhoneTitle" = "Qual é o seu número de telefone?"; + +"AuthPhoneUseEmail" = "Use e-mail"; + +"AuthPhoneHint" = "Nós precisamos do seu número de telefone para garantir a segurança de seus dados pessoais."; + +"AuthPhonePlaceholder" = "Número do Telefone"; + +"AuthCountryTitle" = "Código do País"; + +"AuthEmailTitle" = "Qual é o seu e-mail?"; + +"AuthEmailHint" = "Nós não vamos te enviar spam."; + +"AuthEmailPlaceholder" = "Seu e-mail"; + +"AuthEmailUsePhone" = "Use o telefone"; + +"AuthDisclaimer" = "Ao registrar-se, você concorda com os Termos de Serviço e a Política de Privacidade."; + +"AuthDisclaimerTosOnly" = "Ao registrar-se, você concorda com os Termos de Serviço."; + +"AuthDisclaimerPrivacyOnly" = "Ao registrar-se, você concorda com a Política de Privacidade."; + +"AuthDisclaimerToS" = "Termos de Serviço"; + +"AuthDisclaimerPrivacy" = "Política de Privacidade"; + +"AuthOTPEmailTitle" = "Confirme seu e-mail"; + +"AuthOTPPhoneTitle" = "Confirme seu telefone"; + +"AuthOTPEmailHint" = "Nós lhe enviamos um código de confirmação.\nDigite ele abaixo."; + +"AuthOTPPhoneHint" = "Nós lhe enviamos um código de confirmação.\nDigite ele abaixo."; + +"AuthOTPPlaceholder" = "Código de Confirmação"; + +"AuthOTPNoCode" = "Não recebeu o código?"; + +"AuthOTPCallHint" = "{app_name} irá ligar para você em {time}"; + + + +/* + * Common Elements + */ + +"CurrentLocale" = "pt-BR"; + +"InviteText" = "Olá! Vamos mudar para o {appname}! {link}"; + +"PhotoRemove" = "Remover Foto"; + +"PhotoRemoveGroupMessage" = "Você tem certeza que quer to remover a foto do grupo? Alguns membros poderão não gostar."; + +"PhotoCamera" = "Tirar Foto ou Vídeo"; + +"PhotoLibrary" = "Biblioteca de Midias"; + +"ShareLocation" = "Localização"; + +"ShareContact" = "Compartilhar contato"; + +"SendDocument" = "Documento"; + +/* + * Navigation + */ + +"NavigationEdit" = "Editar"; + +"NavigationDone" = "Feito"; + +"NavigationCancel" = "Cancelar"; + +"NavigationBack" = ""; + +"NavigationNext" = "Próximo"; + +"NavigationSave" = "Salvar"; + +"NavigationFind" = "Find"; + +/* + * Alerts + */ + +"AlertCancel" = "Cancelar"; + +"AlertNext" = "Próximo"; + +"AlertSave" = "Salvar"; + +"AlertOk" = "OK"; + +"AlertSet" = "Set"; + +"AlertYes" = "Sim"; + +"AlertNo" = "Não"; + +"AlertError" = "Error"; + +"AlertTryAgain" = "Try Again"; + +"AlertInvite" = "Invite"; + +"UnsupportedContent" = "Mensagem não suportada nesta versão. Por favor espere por uma atualização para ver esta mensagem."; + +/* + * Actions + */ + +"ActionCopyLink" = "Copiar Link"; + +"ActionRevokeLink" = "Remover Link"; + +"ActionShareLink" = "Compartilhar Link"; + +"AlertLinkCopied" = "Link copiado para a área de transferência."; + +"ActionOpenLink" = "Link Aberto"; + +"ActionCancel" = "Cancelar"; + +"ActionAddPhoto1" = "adicionar"; + +"ActionAddPhoto2" = "foto"; + +"ActionOpenCode" = "View Code"; + +"ActionMute" = "Mute"; + +"ActionUnmute" = "Unmute"; + + +"ActionDelete" = "Delete"; + +"ActionDeleteMessage" = "Are you sure want to delete chat?"; + + +"ActionDeleteChannel" = "Delete Channel"; + +"ActionDeleteChannelMessage" = "Wait! Deleting this channel will remove all members and all messages will be lost. Delete the channel anyway?"; + +"ActionDeleteGroup" = "Delete Group"; + +"ActionDeleteGroupMessage" = "Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?"; + + +"ActionLeaveChannel" = "Leave Channel"; + +"ActionLeaveChannelMessage" = "Are you sure want to leave channel?"; + +"ActionLeaveChannelAction" = "Leave"; + + + +"ActionDeleteAndExit" = "Delete and Exit"; + +"ActionDeleteAndExitMessage" = "Are you sure want to exit group and delete all messages?"; + +"ActionDeleteAndExitAction" = "Exit"; + + + +"ActionClearHistory" = "Clear History"; + +"ActionClearHistoryMessage" = "Are you sure want to clear history?"; + +"ActionClearHistoryAction" = "Clear"; + +/* + * Network + */ + +"StatusConnecting" = "Conectar..."; + +"StatusSyncing" = "Sincronizando..."; + +/* + * Errors + */ + +"ErrorPhoneIncorrect" = "Número de telefone inválido. Por favor tente de novo."; + +"ErrorCodeExpired" = "Código expirou. Por favor reinicie a autenticação."; + +"ErrorUnableToJoin" = "Unable to join to group"; + +"ErrorUnableToCall" = "Unable to call this number"; diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift index 9ef4a4c7b8..a3cf144e30 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift @@ -47,8 +47,7 @@ open class ActorApplicationDelegate: ActorSDKDelegateDefault, UIApplicationDeleg open func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() - // let tokenString = "\(deviceToken)".replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "") - ActorSDK.sharedActor().pushRegisterToken(tokenString) + ActorSDK.sharedActor().pushRegisterToken(tokenString.replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "")) } open func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift index 2f969135e8..f91a10c236 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift @@ -145,6 +145,9 @@ import ReachabilitySwift /// Should perform auto join only after first message or contact open var autoJoinOnReady = true + // Use call to active app + open var enableCallToValidateCode = false + // // User Onlines // @@ -433,7 +436,8 @@ import ReachabilitySwift @objc open func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, forType type: PKPushType) { if (type == PKPushType.voIP) { - let tokenString = "\(credentials.token)".replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "") + let token = credentials.token.map { String(format: "%02.2hhx", $0) }.joined() + let tokenString = "\(token)".replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "") pushRegisterKitToken(tokenString) } } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorStyle.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorStyle.swift index 8c11051b85..62203e0f4e 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorStyle.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorStyle.swift @@ -45,6 +45,9 @@ open class ActorStyle { /// View Controller background color for settings open var vcBackyardColor = UIColor(rgb: 0xf0eff5) + + open var nextBarColor = UIColor(red: 94, green: 142, blue: 192) + // // UINavigationBar // diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Auth/AAAuthOTPViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Auth/AAAuthOTPViewController.swift index ae5022425b..791d415017 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Auth/AAAuthOTPViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Auth/AAAuthOTPViewController.swift @@ -126,7 +126,9 @@ open class AAAuthOTPViewController: AAAuthViewController, MFMailComposeViewContr scrollView.addSubview(hintLabel) scrollView.addSubview(codeField) scrollView.addSubview(codeFieldLine) - scrollView.addSubview(haventReceivedCode) + if(ActorSDK.sharedActor().enableCallToValidateCode){ + scrollView.addSubview(haventReceivedCode) + } view.addSubview(scrollView) super.viewDidLoad() @@ -226,14 +228,18 @@ open class AAAuthOTPViewController: AAAuthViewController, MFMailComposeViewContr open override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - if self.phone != nil { + if(ActorSDK.sharedActor().enableCallToValidateCode){ + if self.phone != nil { - updateTimerText() + updateTimerText() - if !dialed { - counterTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(AAAuthOTPViewController.updateTimer), userInfo: nil, repeats: true) + if !dialed { + counterTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(AAAuthOTPViewController.updateTimer), userInfo: nil, repeats: true) + } } } + + self.codeField.becomeFirstResponder() } func updateTimer() { diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Auth/AAAuthViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Auth/AAAuthViewController.swift index 071cbba13d..7f450036dc 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Auth/AAAuthViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Auth/AAAuthViewController.swift @@ -14,8 +14,8 @@ open class AAAuthViewController: AAViewController { nextBarButton.setTitle(AALocalized("NavigationNext"), for: UIControlState()) nextBarButton.setTitleColor(UIColor.white, for: UIControlState()) - nextBarButton.setBackgroundImage(Imaging.roundedImage(UIColor(red: 94, green: 142, blue: 192), radius: 4), for: UIControlState()) - nextBarButton.setBackgroundImage(Imaging.roundedImage(UIColor(red: 94, green: 142, blue: 192).alpha(0.7), radius: 4), for: .highlighted) + nextBarButton.setBackgroundImage(Imaging.roundedImage(ActorSDK.sharedActor().style.nextBarColor, radius: 4), for: UIControlState()) + nextBarButton.setBackgroundImage(Imaging.roundedImage(ActorSDK.sharedActor().style.nextBarColor.alpha(0.7), radius: 4), for: .highlighted) nextBarButton.addTarget(self, action: #selector(AAAuthViewController.nextDidTap), for: .touchUpInside) view.addSubview(nextBarButton) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/Alerts.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/Alerts.swift index c75fa6a442..e8e8bc9452 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/Alerts.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/Alerts.swift @@ -59,6 +59,11 @@ public extension UIViewController { let controller = UIAlertController(title: title, message: nil, preferredStyle: UIAlertControllerStyle.actionSheet) + if (AADevice.isiPad) { + controller.popoverPresentationController?.sourceView = sourceView + controller.popoverPresentationController?.sourceRect = sourceRect + } + if cancelButton != nil { controller.addAction(UIAlertAction(title: AALocalized(cancelButton!), style: UIAlertActionStyle.cancel, handler: { (alertView) -> () in tapClosure(-1) From 34de1c7437dfc16529be66663dcb7a20c346dda4 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Mon, 2 Jan 2017 12:41:13 -0200 Subject: [PATCH 198/253] improvments --- .DS_Store | Bin 10244 -> 10244 bytes actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/.DS_Store b/.DS_Store index 8a1d9c83a5921736e4e30978de196ade92c12a24..293725f7b8353a57347599953cb85db8c11bcc91 100644 GIT binary patch delta 58 zcmV-A0LA}=P=rvhEf4|8lP(Z|3mAKQHaRgYATu^Nle!Qc0hyE75FY`WllTxG0RgiY Q5%3PP1|a(cvjPAo>Kd6$1kYzY%Ky diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index 8e8b1a28b62e888104fd9ad9fd87aa1fcea5b2ca..42cd6ef534061b1957b93370d88970e58e337fc8 100644 GIT binary patch delta 908 zcmZvbOH30{7=?Rylsk5yQ|Rdz~c98 zT5g@;omDk%yVdD%PuZT*`o*Vf&1MQ5ZNIS%uRe{@(3M;wk%NJ&jgS7s1q zn~Kfkn_F6Q+E}`2^HR6ImdM7J}7qawu1v|v~Ml;VJjq448fDj;r*gQ3g z#Ikuxk}vY6P}n>Ug)&hvbjiTuE>-LDqbg(~3u+i(gb8^l#V$DEf(I>VMLRlh2)*b- zKaL@Q5d<-cF`U8$T*NeHa23~a19P~Adw7J$c!EW|!Wuqc9Wi{wCcfeue#k?lAURCO z@1f{>Wd?rIC0((3ZtI9G2bx=St^Y>M(^pLUCKu8t97$1mnMZLyLI)FtCUhAF_SUZz_8qtLP=)^%BMi;szumkYHkD&zI5Kdzf=P-ryxP;5N zA_2Z80lp~#zKuJ$j|X^&c`RTBt9XiMc#ao%gLl}#XF991;EMz^Z+Y4{rd(E8%Q9%G SzB&0@#F?E~PAjSUPy7YgzRw;2 delta 1069 zcmb7@+e=hI9LLYs>l{7h=!%}r<7RHUUKU(0t(u`LYhKc{yr5#JyPi`WTzA#8-m=mM zp{NYv&_#)$qDbr^Frn!76j%@SvVnvMJ=LrKL9>_WMUv)WF2C>0d}n^2nT5fH!52Fz z`f%<-YN_3B%__51T(V}(mY3UDztpZrTT1jF21(yE*i0+#QID$mZMN@-ijIkmizj?S zqOebFY-%(J&HA?4sjI0Kr2~{sXiB@{arxCrrOxG7v>tWH=j~80C=~qa{&eY3PC-#w zWwkSqM3Yktse&FzEu3rP`9KOyP7;k`2BBusGvQXpCRG1SXjZ046wb(Ovy(nqJ*z4* zT_=1<$u@~%Ur=$5E3B3Y359blqR^=YJzbHBg;qi699F$D)tFV#+Ey%xT^^TP@lbh= z53f677sT#KWn5EzUfLW99<36@o+01Jh~o8Y$*@MkH4ahi4_ddlG=JNu;$_F$VE&g z_9$Ibs_Z}C>(Yi4udI5{bukLcGzn&s#s@^>fea~II!svdCb z#LT&T6rnPdekbZsk2Z#&9UbUGKL+4p7>40t7<`z<3}$f=mvJS6Vi9+67fV>ieLTTa zJi`iB@e=EJh1U$tTYSV9d=0;eC`8^ybEFM5F&u}@;FnxmHjc&JnonO#%qoc2YtxVI QNh9GejkTD(;{RUs8@R{^TL1t6 From a4aa180734550fd97ee1ebb80e669a115f1a9be1 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 3 Jan 2017 08:29:58 -0200 Subject: [PATCH 199/253] fix fastshare meno --- .../src/main/java/im/actor/Application.java | 4 +- .../conversation/attach/AttachFragment.java | 109 +++++++++++------- 2 files changed, 70 insertions(+), 43 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index 601b24f1c3..3ff7cf35b8 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -85,8 +85,8 @@ public void onConfigureActorSDK() { "canalxloto" }); - ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); -// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); +// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); + ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); ActorSDK.sharedActor().setAuthType(AuthActivity.AUTH_TYPE_PHONE); // ActorSDK.sharedActor().setTwitter(""); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java index f6142b8b5a..be7c298660 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java @@ -15,6 +15,8 @@ import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutCompat; +import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Base64; import android.view.Gravity; @@ -63,9 +65,10 @@ public class AttachFragment extends AbsAttachFragment implements MediaPickerCall private boolean isLoaded = false; private RecyclerView fastShare; - private View bottomBackground; + private LinearLayout bottomBackground; private boolean isFastShareFullScreen; - private GridLayoutManager layoutManager; + //private GridLayoutManager layoutManager; + private LinearLayoutManager layoutManager; private int shareIconSize; private View hideClone; private int fastShareWidth; @@ -83,13 +86,13 @@ public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); hide(); if (layoutManager != null) { - layoutManager = getGridLayoutManager(); + layoutManager = getLinearLayoutManager(); } root.removeAllViews(); isLoaded = false; } - protected GridLayoutManager getLayoutManager() { + protected LinearLayoutManager getLayoutManager() { return layoutManager; } @@ -133,7 +136,7 @@ private void prepareView() { shareButtons = getLayoutInflater(null).inflate(R.layout.share_menu, root, false); fastShare = new RecyclerView(getActivity()); - fastShare.setOverScrollMode(View.OVER_SCROLL_NEVER); + //fastShare.setOverScrollMode(View.OVER_SCROLL_NEVER); shareButtons.findViewById(R.id.menu_bg).setBackgroundColor(style.getMainBackgroundColor()); shareButtons.findViewById(R.id.cancelField).setOnClickListener(view -> hide()); @@ -142,20 +145,20 @@ private void prepareView() { // Setup appearing hide button // isFastShareFullScreen = false; - fastShare.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - boolean visible = layoutManager.findFirstVisibleItemPosition() == 0; - if (isFastShareFullScreen == visible) { - isFastShareFullScreen = !visible; - if (visible) { - hideView(hideClone); - } else { - showView(hideClone); - } - } - } - }); +// fastShare.addOnScrollListener(new RecyclerView.OnScrollListener() { +// @Override +// public void onScrolled(RecyclerView recyclerView, int dx, int dy) { +// boolean visible = layoutManager.findFirstVisibleItemPosition() == 0; +// if (isFastShareFullScreen == visible) { +// isFastShareFullScreen = !visible; +// if (visible) { +// hideView(hideClone); +// } else { +// showView(hideClone); +// } +// } +// } +// }); // // Building Menu Fields @@ -237,16 +240,19 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { fastAttachAdapter = new FastAttachAdapter(getActivity(), () -> fastShareWidth + 1); HeaderViewRecyclerAdapter adapter = new HeaderViewRecyclerAdapter(fastAttachAdapter); - adapter.addHeaderView(shareButtons); - layoutManager = getGridLayoutManager(); + + //adapter.addHeaderView(shareButtons); + //adapter.addFooterView(shareButtons); + // layoutManager = getGridLayoutManager(); + layoutManager = getLinearLayoutManager(); fastShare.setAdapter(adapter); fastShare.setLayoutManager(layoutManager); - layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { - @Override - public int getSpanSize(int position) { - return position == 0 ? spanCount : 1; - } - }); +// layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { +// @Override +// public int getSpanSize(int position) { +// return position == 0 ? spanCount : 1; +// } +// }); StateListDrawable background = ShareMenuButtonFactory.get(style.getMainColor(), getActivity()); final View.OnClickListener finalDefaultSendOcl = defaultSendOcl; @@ -285,22 +291,39 @@ public int getSpanSize(int position) { shareButtons.getLayoutParams().height = root.getHeight() - Screen.dp(135); shareButtons.requestLayout(); + bottomBackground = new LinearLayout(getContext()); + bottomBackground.setOrientation(LinearLayout.VERTICAL); - bottomBackground = new View(getContext()); - FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Screen.dp(135), Gravity.BOTTOM); + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Screen.dp(275), Gravity.BOTTOM); bottomBackground.setBackgroundColor(ActorSDK.sharedActor().style.getMainBackgroundColor()); + + FrameLayout.LayoutParams params3 = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + bottomBackground.addView(fastShare, params3); + + FrameLayout.LayoutParams params4 = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + //params4.setMargins(0, 0, 0, Screen.dp(115)); + bottomBackground.addView(shareButtons, params4); + root.addView(bottomBackground, params); - root.addView(fastShare); - FrameLayout.LayoutParams params2 = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.RIGHT); - params2.setMargins(0, 0, Screen.dp(20), Screen.dp(20)); - root.addView(hideClone, params2); +// FrameLayout.LayoutParams params2 = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.RIGHT); +// params2.setMargins(0, 0, Screen.dp(20), Screen.dp(20)); +// root.addView(hideClone, params2); } - @NonNull - private GridLayoutManager getGridLayoutManager() { +// @NonNull +// private GridLayoutManager getGridLayoutManager() { +// spanCount = Screen.getWidth() / Screen.dp(88); +// fastShareWidth = Screen.getWidth() / spanCount; +// return new GridLayoutManager(getActivity(), spanCount); +// } + + private LinearLayoutManager getLinearLayoutManager(){ spanCount = Screen.getWidth() / Screen.dp(88); fastShareWidth = Screen.getWidth() / spanCount; - return new GridLayoutManager(getActivity(), spanCount); + + LinearLayoutManager llm = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false); + + return llm; } private View instantiateShareMenuItem(ShareMenuField f) { @@ -360,11 +383,12 @@ public void show() { onShown(); messenger().getGalleryScannerActor().send(new GalleryScannerActor.Show()); showView(root); - TranslateAnimation animation = new TranslateAnimation(0, 0, root.getHeight(), 0); - animation.setInterpolator(MaterialInterpolator.getInstance()); - animation.setDuration(200); -// fastShare.startAnimation(animation); +// TranslateAnimation animation = new TranslateAnimation(0, 0, root.getHeight(), 0); +// animation.setInterpolator(MaterialInterpolator.getInstance()); +// animation.setDuration(200); + //root.startAnimation(animation); // bottomBackground.startAnimation(animation); + /* shareButtons.post(new Runnable() { @Override public void run() { @@ -380,6 +404,7 @@ public void run() { } } }); + */ } } @@ -394,8 +419,9 @@ public void hide() { hideView(root); + /** if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP && !isFastShareFullScreen) { - View internal = fastShare; + View internal = shareButtons; int cx = internal.getWidth() - Screen.dp(56 + 56); int cy = internal.getHeight() - Screen.dp(56 / 2); float finalRadius = (float) Math.hypot(cx, cy); @@ -431,6 +457,7 @@ public void onAnimationRepeat(Animator animator) { fastShare.startAnimation(animation); bottomBackground.startAnimation(animation); } + **/ } } From bf622ed5d0f911bf2e556422a88f925f74b0be41 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 3 Jan 2017 13:35:22 -0200 Subject: [PATCH 200/253] fix inner class istantiation issue --- .../src/main/java/im/actor/Application.java | 88 +++++++++++-------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index 3ff7cf35b8..28ad4fa09c 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -175,46 +175,58 @@ public AbsAttachFragment fragmentForAttachMenu(Peer peer) { @Override public ActorIntentFragmentActivity getSettingsIntent() { - return new BaseActorSettingsActivity() { + + return new BaseActorSettingsActivity(){ @Override public BaseActorSettingsFragment getSettingsFragment() { - return new BaseActorSettingsFragment() { - CheckBox blablaCheckBox; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - blablaCheckBox = new CheckBox(getContext()); - return super.onCreateView(inflater, container, savedInstanceState); - } - - @Override - public ActorSettingsCategories getBeforeSettingsCategories() { - return new ActorSettingsCategories() - .addCategory(new ActorSettingsCategory("azaza") - .addField(new ActorSettingsField(R.id.terminateSessions) - .setName("blabla") - .setIconResourceId(R.drawable.ic_edit_black_24dp) - .setRightView(blablaCheckBox) - ) - ); - } - - @Override - public View.OnClickListener getMenuFieldOnClickListener() { - return new View.OnClickListener() { - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.terminateSessions: - Toast.makeText(v.getContext(), "hey", Toast.LENGTH_LONG).show(); - blablaCheckBox.toggle(); - break; - } - } - }; - } - - }; + return new MyBaseActorSettingsFragment(); + } + }; + } + } + + + public static class MyBaseActorSettingsActivity extends BaseActorSettingsActivity { + + @Override + public BaseActorSettingsFragment getSettingsFragment() { + return new MyBaseActorSettingsFragment(); + } + } + + + public static class MyBaseActorSettingsFragment extends BaseActorSettingsFragment { + CheckBox blablaCheckBox; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + blablaCheckBox = new CheckBox(getContext()); + return super.onCreateView(inflater, container, savedInstanceState); + } + + @Override + public ActorSettingsCategories getBeforeSettingsCategories() { + return new ActorSettingsCategories() + .addCategory(new ActorSettingsCategory("azaza") + .addField(new ActorSettingsField(R.id.terminateSessions) + .setName("blabla") + .setIconResourceId(R.drawable.ic_edit_black_24dp) + .setRightView(blablaCheckBox) + ) + ); + } + + @Override + public View.OnClickListener getMenuFieldOnClickListener() { + return new View.OnClickListener() { + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.terminateSessions: + Toast.makeText(v.getContext(), "hey", Toast.LENGTH_LONG).show(); + blablaCheckBox.toggle(); + break; + } } }; } From 57f411c496e2f1510c763721275d6fc5c4640f6b Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 4 Jan 2017 11:10:17 -0200 Subject: [PATCH 201/253] alteracoes --- .../im/actor/sdk/view/emoji/EmojiData.java | 334 ++++++++++++++++++ .../view/emoji/keyboard/emoji/EmojiView.java | 330 +++++++++++++++++ 2 files changed, 664 insertions(+) create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/EmojiData.java create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/EmojiData.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/EmojiData.java new file mode 100644 index 0000000000..e3c8a43dec --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/EmojiData.java @@ -0,0 +1,334 @@ +package im.actor.sdk.view.emoji; + +import java.util.HashMap; + +public class EmojiData { + + public static final char[] emojiToFE0F = { + 0x2B50, 0x2600, 0x26C5, 0x2601, 0x26A1, 0x2744, 0x26C4, 0x2614, 0x2708, 0x26F5, + 0x2693, 0x26FD, 0x26F2, 0x26FA, 0x26EA, 0x2615, 0x26BD, 0x26BE, 0x26F3, 0x231A, + 0x260E, 0x231B, 0x2709, 0x2702, 0x2712, 0x270F, 0x2648, 0x2649, 0x264A, 0x264B, + 0x264C, 0x264D, 0x264E, 0x264F, 0x2650, 0x2651, 0x2652, 0x2653, 0x2734, 0x3299, + 0x3297, 0x26D4, 0x2B55, 0x2668, 0x2757, 0x203C, 0x2049, 0x303D, 0x26A0, 0x267B, + 0x2747, 0x2733, 0x24C2, 0x267F, 0x25B6, 0x25C0, 0x27A1, 0x2B05, 0x2B06, 0x2B07, + 0x2197, 0x2198, 0x2199, 0x2196, 0x2195, 0x2194, 0x21AA, 0x21A9, 0x2934, 0x2935, + 0x2139, 0x2714, 0x2716, 0x2611, 0x26AA, 0x26AB, 0x25AA, 0x25AB, 0x2B1B, 0x2B1C, + 0x25FC, 0x25FB, 0x25FE, 0x25FD, 0x2660, 0x2663, 0x2665, 0x2666, 0x263A, 0x2639, + 0x270C, 0x261D, 0x2764 + }; + //0xD83CDE2F, 0xD83CDC04, 0xD83CDE1A, 0xD83CDD7F + + public static final char[] dataChars = { + 0x262E, 0x271D, 0x262A, 0x2638, 0x2721, 0x262F, 0x2626, 0x26CE, 0x2648, 0x2649, + 0x264A, 0x264B, 0x264C, 0x264D, 0x264E, 0x264F, 0x2650, 0x2651, 0x2652, 0x2653, + 0x269B, 0x2622, 0x2623, 0x2734, 0x3299, 0x3297, 0x26D4, 0x274C, 0x2B55, 0x2668, + 0x2757, 0x2755, 0x2753, 0x2754, 0x203C, 0x2049, 0x269C, 0x303D, 0x26A0, 0x267B, + 0x2747, 0x2733, 0x274E, 0x2705, 0x27BF, 0x24C2, 0x267F, 0x25B6, 0x23F8, 0x23EF, + 0x23F9, 0x23FA, 0x23ED, 0x23EE, 0x23E9, 0x23EA, 0x25C0, 0x23EB, 0x23EC, 0x27A1, + 0x2B05, 0x2B06, 0x2B07, 0x2197, 0x2198, 0x2199, 0x2196, 0x2195, 0x2194, 0x21AA, + 0x21A9, 0x2934, 0x2935, 0x2139, 0x3030, 0x27B0, 0x2714, 0x2795, 0x2796, 0x2797, + 0x2716, 0x00A9, 0x00AE, 0x2122, 0x2611, 0x26AA, 0x26AB, 0x25AA, 0x25AB, 0x2B1B, + 0x2B1C, 0x25FC, 0x25FB, 0x25FE, 0x25FD, 0x2660, 0x2663, 0x2665, 0x2666, 0x263A, + 0x2639, 0x270A, 0x270C, 0x270B, 0x261D, 0x270D, 0x26D1, 0x2764, 0x2763, 0x2615, + 0x26BD, 0x26BE, 0x26F3, 0x26F7, 0x26F8, 0x26F9, 0x231A, 0x2328, 0x260E, 0x23F1, + 0x23F2, 0x23F0, 0x23F3, 0x231B, 0x2696, 0x2692, 0x26CF, 0x2699, 0x26D3, 0x2694, + 0x2620, 0x26B0, 0x26B1, 0x2697, 0x26F1, 0x2709, 0x2702, 0x2712, 0x270F, 0x2708, + 0x26F5, 0x26F4, 0x2693, 0x26FD, 0x26F2, 0x26F0, 0x26FA, 0x26EA, 0x26E9, 0x2618, + 0x2B50, 0x2728, 0x2604, 0x2600, 0x26C5, 0x2601, 0x26C8, 0x26A1, 0x2744, 0x2603, + 0x26C4, 0x2602, 0x2614 + }; + + public static final String[] emojiColored = { + "🙌","👏","👍","👎","👊","✊","👋","👈","👉","👆","👇","👌","☝","✌","✋", + "🖐","👐","💪","🙏","🖖","🤘","🖕","✍","💅","👂","👃","👶","👦","👧","👨", + "👩","👱‍♀","👱","👴","👵","👲","👳‍♀","👳","👮‍♀","👮","👷‍♀","👷","💂‍♀","💂", + "🕵‍♀","🕵","🎅","👸","👰","👼","🙇‍♀","🙇","💁","💁‍♂","🙅","🙅‍♂","🙆","🙆‍♂", + "🙋","🙋‍♂","🙎","🙎‍♂","🙍","🙍‍♂","💇","💇‍♂","💆","💆‍♂","💃","🚶‍♀","🚶","🏃‍♀", + "🏃","🏋‍♀","🏋","⛹‍♀","⛹","🏄‍♀","🏄","🏊‍♀","🏊","🚣‍♀","🚣","🚴‍♀","🚴","🚵‍♀", + "🚵","🛀" + }; + + public static final String[][] dataColored = { + new String[]{ + "😀","😬","😁","😂","😃","😄","😅","😆","😇","😉","😊","🙂","🙃","☺", + "😋","😌","😍","😘","😗","😙","😚","😜","😝","😛","🤑","🤓","😎","🤗", + "😏","😶","😐","😑","😒","🙄","🤔","😳","😞","😟","😠","😡","😔","😕", + "🙁","☹","😣","😖","😫","😩","😤","😮","😱","😨","😰","😯","😦","😧", + "😢","😥","😪","😓","😭","😵","😲","🤐","😷","🤒","🤕","😴","💤","💩", + "😈","👿","👹","👺","👻","💀","☠","👽","👾","🤖","😺","😸","😹","😻","😼","😽","🙀","😿","😾", + "🙌", + "👏", + "👍", + "👎", + "👊", + "✊", + "👋", + "👈", + "👉", + "👆", + "👇", + "👌", + "☝", + "✌", + "✋", + "🖐", + "👐", + "💪", + "🙏", + "🖖", + "🤘", + "🖕", + "✍", + "💅", + "👄","👅", + "👂", + "👃", + "👁","👀","🗣","👤","👥", + "👶", + "👦", + "👧", + "👨", + "👩", + "👱‍♀", + "👱", + "👴", + "👵", + "👲", + "👳‍♀", + "👳", + "👮‍♀", + "👮", + "👷‍♀", + "👷", + "💂‍♀", + "💂", + "🕵‍♀", + "🕵", + "🎅", + "👸", + "👰", + "👼", + "🙇‍♀", + "🙇", + "💁", + "💁‍♂", + "🙅", + "🙅‍♂", + "🙆", + "🙆‍♂", + "🙋", + "🙋‍♂", + "🙎", + "🙎‍♂", + "🙍", + "🙍‍♂", + "💇", + "💇‍♂", + "💆", + "💆‍♂", + "💃", + "👯","👯‍♂", + "🚶‍♀", + "🚶", + "🏃‍♀", + "🏃", + "👫","👭","👬","💑","👩‍❤‍👩","👨‍❤‍👨","💏","👩‍❤‍💋‍👩","👨‍❤‍💋‍👨","👪","👨‍👩‍👧", + "👨‍👩‍👧‍👦","👨‍👩‍👦‍👦","👨‍👩‍👧‍👧","👩‍👩‍👦","👩‍👩‍👧","👩‍👩‍👧‍👦","👩‍👩‍👦‍👦", + "👩‍👩‍👧‍👧","👨‍👨‍👦","👨‍👨‍👧","👨‍👨‍👧‍👦","👨‍👨‍👦‍👦","👨‍👨‍👧‍👧","👩‍👦","👩‍👧", + "👩‍👧‍👦","👩‍👦‍👦","👩‍👧‍👧","👨‍👦","👨‍👧","👨‍👧‍👦","👨‍👦‍👦","👨‍👧‍👧","👚","👕", + "👖","👔","👗","👙","👘","💄","💋","👣","👠","👡","👢","👞","👟","👒","🎩","🎓", + "👑","⛑","🎒","👝","👛","👜","💼","👓","🕶","💍","🌂","❤","💛","💚","💙","💜", + "💔","❣","💕","💞","💓","💗","💖","💘","💝" + }, + null, + new String[]{ + "🍏","🍎","🍐","🍊","🍋","🍌","🍉","🍇","🍓","🍈","🍒","🍑","🍍","🍅","🍆", + "🌶","🌽","🍠","🍯","🍞","🧀","🍗","🍖","🍤","🍳","🍔","🍟","🌭","🍕","🍝", + "🌮","🌯","🍜","🍲","🍥","🍣","🍱","🍛","🍙","🍚","🍘","🍢","🍡","🍧","🍨", + "🍦","🍰","🎂","🍮","🍬","🍭","🍫","🍿","🍩","🍪","🍺","🍻","🍷","🍸","🍹", + "🍾","🍶","🍵","☕","🍼","🍴","🍽","⚽","🏀","🏈","⚾","🎾","🏐","🏉","🎱", + "🏓","🏸","🏒","🏑","🏏","🏹","⛳","🎣","⛸","🎿","⛷","🏂", + "🏋‍♀", + "🏋", + "⛹‍♀", + "⛹", + "🏌‍♀","🏌", + "🏄‍♀", + "🏄", + "🏊‍♀", + "🏊", + "🚣‍♀", + "🚣","🏇", + "🚴‍♀", + "🚴", + "🚵‍♀", + "🚵", + "🛀", + "🕴","🎗","🎽","🏅","🎖","🏆","🏵","🎯","🎫","🎟","🎭","🎨","🎪","🎬","🎤","🎧", + "🎼","🎹","🎷","🎺","🎸","🎻","🎮","🎰","🎲","🎳","⌚","📱","📲","💻","⌨","🖥", + "🖨","🖱","🖲","🕹","🗜","💽","💾","💿","📀","📼","📷","📸","📹","🎥","📽","🎞", + "📞","☎","📟","📠","📺","📻","🎙","🎚","🎛","⏱","⏲","⏰","🕰","⏳","⌛","📡", + "🔋","🔌","💡","🔦","🕯","🗑","🛢","💸","💵","💴","💶","💷","💰","💳","💎","⚖", + "🔧","🔨","⚒","🛠","⛏","🔩","⚙","⛓","🔫","💣","🔪","🗡","⚔","🛡","🚬","⚰","⚱", + "🏺","🔮","📿","💈","⚗","🔭","🔬","🕳","💊","💉","🌡","🚽","🚿","🛁","🛎","🔑", + "🗝","🚪","🛋","🛌","🛏","🖼","⛱","🗿","🛍","🎁","🎈","🎏","🎀","🎊","🎉","🎐", + "🏮","🎎","✉","📩","📨","📧","💌","📥","📤","📦","🏷","🔖","📪","📫","📬","📭", + "📮","📯","📜","📃","📄","📑","📊","📈","📉","🗒","🗓","📆","📅","📇","🗃","🗳", + "🗄","📋","📁","📂","🗂","🗞","📰","📓","📔","📒","📕","📗","📘","📙","📚","📖", + "🔗","📎","🖇","📐","📏","✂","📌","📍","🚩","🎌","🏳","🏴","🏁","🏳‍🌈","🖌","🖍", + "🖊","🖋","✒","📝","✏","🔏","🔐","🔒","🔓","🔍","🔎" + }, + null, + null + }; + + public static final String[][] data = { + new String[]{ + "😀","😬","😁","😂","😃","😄","😅","😆","😇","😉","😊","🙂","🙃","☺","😋","😌", + "😍","😘","😗","😙","😚","😜","😝","😛","🤑","🤓","😎","🤗","😏","😶","😐","😑", + "😒","🙄","🤔","😳","😞","😟","😠","😡","😔","😕","🙁","☹","😣","😖","😫","😩", + "😤","😮","😱","😨","😰","😯","😦","😧","😢","😥","😪","😓","😭","😵","😲","🤐", + "😷","🤒","🤕","😴","💤","💩","😈","👿","👹","👺","👻","💀","☠","👽","👾","🤖", + "😺","😸","😹","😻","😼","😽","🙀","😿","😾","🙌","🙌🏻","🙌🏼","🙌🏽","🙌🏾", + "🙌🏿","👏","👏🏻","👏🏼","👏🏽","👏🏾","👏🏿","👍","👍🏻","👍🏼","👍🏽","👍🏾", + "👍🏿","👎","👎🏻","👎🏼","👎🏽","👎🏾","👎🏿","👊","👊🏻","👊🏼","👊🏽","👊🏾", + "👊🏿","✊","✊🏻","✊🏼","✊🏽","✊🏾","✊🏿","👋","👋🏻","👋🏼","👋🏽","👋🏾", + "👋🏿","👈","👈🏻","👈🏼","👈🏽","👈🏾","👈🏿","👉","👉🏻","👉🏼","👉🏽","👉🏾", + "👉🏿","👆","👆🏻","👆🏼","👆🏽","👆🏾","👆🏿","👇","👇🏻","👇🏼","👇🏽","👇🏾", + "👇🏿","👌","👌🏻","👌🏼","👌🏽","👌🏾","👌🏿","☝","☝🏻","☝🏼","☝🏽","☝🏾","☝🏿", + "✌","✌🏻","✌🏼","✌🏽","✌🏾","✌🏿","✋","✋🏻","✋🏼","✋🏽","✋🏾","✋🏿","🖐", + "🖐🏻","🖐🏼","🖐🏽","🖐🏾","🖐🏿","👐","👐🏻","👐🏼","👐🏽","👐🏾","👐🏿","💪", + "💪🏻","💪🏼","💪🏽","💪🏾","💪🏿","🙏","🙏🏻","🙏🏼","🙏🏽","🙏🏾","🙏🏿","🖖", + "🖖🏻","🖖🏼","🖖🏽","🖖🏾","🖖🏿","🤘","🤘🏻","🤘🏼","🤘🏽","🤘🏾","🤘🏿","🖕", + "🖕🏻","🖕🏼","🖕🏽","🖕🏾","🖕🏿","✍","✍🏻","✍🏼","✍🏽","✍🏾","✍🏿","💅","💅🏻", + "💅🏼","💅🏽","💅🏾","💅🏿","👄","👅","👂","👂🏻","👂🏼","👂🏽","👂🏾","👂🏿","👃", + "👃🏻","👃🏼","👃🏽","👃🏾","👃🏿","👁","👀","🗣","👤","👥","👶","👶🏻","👶🏼","👶🏽", + "👶🏾","👶🏿","👦","👦🏻","👦🏼","👦🏽","👦🏾","👦🏿","👧","👧🏻","👧🏼","👧🏽","👧🏾", + "👧🏿","👨","👨🏻","👨🏼","👨🏽","👨🏾","👨🏿","👩","👩🏻","👩🏼","👩🏽","👩🏾","👩🏿", + "👱‍♀","👱🏻‍♀","👱🏼‍♀","👱🏽‍♀","👱🏾‍♀","👱🏿‍♀","👱","👱🏻","👱🏼","👱🏽","👱🏾","👱🏿", + "👴","👴🏻","👴🏼","👴🏽","👴🏾","👴🏿","👵","👵🏻","👵🏼","👵🏽","👵🏾","👵🏿","👲", + "👲🏻","👲🏼","👲🏽","👲🏾","👲🏿","👳‍♀","👳🏻‍♀","👳🏼‍♀","👳🏽‍♀","👳🏾‍♀","👳🏿‍♀", + "👳","👳🏻","👳🏼","👳🏽","👳🏾","👳🏿","👮‍♀","👮🏻‍♀","👮🏼‍♀","👮🏽‍♀","👮🏾‍♀", + "👮🏿‍♀","👮","👮🏻","👮🏼","👮🏽","👮🏾","👮🏿","👷‍♀","👷🏻‍♀","👷🏼‍♀","👷🏽‍♀", + "👷🏾‍♀","👷🏿‍♀","👷","👷🏻","👷🏼","👷🏽","👷🏾","👷🏿","💂‍♀","💂🏻‍♀","💂🏼‍♀", + "💂🏽‍♀","💂🏾‍♀","💂🏿‍♀","💂","💂🏻","💂🏼","💂🏽","💂🏾","💂🏿","🕵‍♀","🕵🏻‍♀", + "🕵🏼‍♀","🕵🏽‍♀","🕵🏾‍♀","🕵🏿‍♀","🕵","🕵🏻","🕵🏼","🕵🏽","🕵🏾","🕵🏿","🎅", + "🎅🏻","🎅🏼","🎅🏽","🎅🏾","🎅🏿","👸","👸🏻","👸🏼","👸🏽","👸🏾","👸🏿","👰", + "👰🏻","👰🏼","👰🏽","👰🏾","👰🏿","👼","👼🏻","👼🏼","👼🏽","👼🏾","👼🏿","🙇‍♀", + "🙇🏻‍♀","🙇🏼‍♀","🙇🏽‍♀","🙇🏾‍♀","🙇🏿‍♀","🙇","🙇🏻","🙇🏼","🙇🏽","🙇🏾","🙇🏿", + "💁","💁🏻","💁🏼","💁🏽","💁🏾","💁🏿","💁‍♂","💁🏻‍♂","💁🏼‍♂","💁🏽‍♂","💁🏾‍♂", + "💁🏿‍♂","🙅","🙅🏻","🙅🏼","🙅🏽","🙅🏾","🙅🏿","🙅‍♂","🙅🏻‍♂","🙅🏼‍♂","🙅🏽‍♂", + "🙅🏾‍♂","🙅🏿‍♂","🙆","🙆🏻","🙆🏼","🙆🏽","🙆🏾","🙆🏿","🙆‍♂","🙆🏻‍♂","🙆🏼‍♂","🙆🏽‍♂", + "🙆🏾‍♂","🙆🏿‍♂","🙋","🙋🏻","🙋🏼","🙋🏽","🙋🏾","🙋🏿","🙋‍♂","🙋🏻‍♂","🙋🏼‍♂","🙋🏽‍♂", + "🙋🏾‍♂","🙋🏿‍♂","🙎","🙎🏻","🙎🏼","🙎🏽","🙎🏾","🙎🏿","🙎‍♂","🙎🏻‍♂","🙎🏼‍♂","🙎🏽‍♂", + "🙎🏾‍♂","🙎🏿‍♂","🙍","🙍🏻","🙍🏼","🙍🏽","🙍🏾","🙍🏿","🙍‍♂","🙍🏻‍♂","🙍🏼‍♂","🙍🏽‍♂", + "🙍🏾‍♂","🙍🏿‍♂","💇","💇🏻","💇🏼","💇🏽","💇🏾","💇🏿","💇‍♂","💇🏻‍♂","💇🏼‍♂","💇🏽‍♂", + "💇🏾‍♂","💇🏿‍♂","💆","💆🏻","💆🏼","💆🏽","💆🏾","💆🏿","💆‍♂","💆🏻‍♂","💆🏼‍♂","💆🏽‍♂", + "💆🏾‍♂","💆🏿‍♂","💃","💃🏻","💃🏼","💃🏽","💃🏾","💃🏿","👯","👯‍♂","🚶‍♀","🚶🏻‍♀","🚶🏼‍♀", + "🚶🏽‍♀","🚶🏾‍♀","🚶🏿‍♀","🚶","🚶🏻","🚶🏼","🚶🏽","🚶🏾","🚶🏿","🏃‍♀","🏃🏻‍♀","🏃🏼‍♀", + "🏃🏽‍♀","🏃🏾‍♀","🏃🏿‍♀","🏃","🏃🏻","🏃🏼","🏃🏽","🏃🏾","🏃🏿","👫","👭","👬","💑","👩‍❤‍👩", + "👨‍❤‍👨","💏","👩‍❤‍💋‍👩","👨‍❤‍💋‍👨","👪","👨‍👩‍👧","👨‍👩‍👧‍👦","👨‍👩‍👦‍👦","👨‍👩‍👧‍👧","👩‍👩‍👦", + "👩‍👩‍👧","👩‍👩‍👧‍👦","👩‍👩‍👦‍👦","👩‍👩‍👧‍👧","👨‍👨‍👦","👨‍👨‍👧","👨‍👨‍👧‍👦","👨‍👨‍👦‍👦","👨‍👨‍👧‍👧", + "👩‍👦","👩‍👧","👩‍👧‍👦","👩‍👦‍👦","👩‍👧‍👧","👨‍👦","👨‍👧","👨‍👧‍👦","👨‍👦‍👦","👨‍👧‍👧","👚","👕", + "👖","👔","👗","👙","👘","💄","💋","👣","👠","👡","👢","👞","👟","👒","🎩","🎓","👑","⛑","🎒", + "👝","👛","👜","💼","👓","🕶","💍","🌂","❤","💛","💚","💙","💜","💔","❣","💕","💞","💓","💗","💖","💘","💝" + }, + new String[]{ + "🐶","🐱","🐭","🐹","🐰","🐻","🐼","🐨","🐯","🦁","🐮","🐷","🐽","🐸","🐙","🐵","🙈","🙉", + "🙊","🐒","🐔","🐧","🐦","🐤","🐣","🐥","🐺","🐗","🐴","🦄","🐝","🐛","🐌","🐞","🐜","🕷", + "🦂","🦀","🐍","🐢","🐠","🐟","🐡","🐬","🐳","🐋","🐊","🐆","🐅","🐃","🐂","🐄","🐪","🐫", + "🐘","🐐","🐏","🐑","🐎","🐖","🐀","🐁","🐓","🦃","🕊","🐕","🐩","🐈","🐇","🐿","🐾","🐉", + "🐲","🌵","🎄","🌲","🌳","🌴","🌱","🌿","☘","🍀","🎍","🎋","🍃","🍂","🍁","🌾","🌺","🌻", + "🌹","🌷","🌼","🌸","💐","🍄","🌰","🎃","🐚","🕸","🌎","🌍","🌏","🌕","🌖","🌗","🌘","🌑", + "🌒","🌓","🌔","🌚","🌝","🌛","🌜","🌞","🌙","⭐","🌟","💫","✨","☄","☀","🌤","⛅","🌥", + "🌦","☁","🌧","⛈","🌩","⚡","🔥","💥","❄","🌨","☃","⛄","🌬","💨","🌪","🌫","☂","☔","💧","💦","🌊" + }, + new String[]{ + "🍏","🍎","🍐","🍊","🍋","🍌","🍉","🍇","🍓","🍈","🍒","🍑","🍍","🍅","🍆","🌶","🌽", + "🍠","🍯","🍞","🧀","🍗","🍖","🍤","🍳","🍔","🍟","🌭","🍕","🍝","🌮","🌯","🍜","🍲", + "🍥","🍣","🍱","🍛","🍙","🍚","🍘","🍢","🍡","🍧","🍨","🍦","🍰","🎂","🍮","🍬","🍭", + "🍫","🍿","🍩","🍪","🍺","🍻","🍷","🍸","🍹","🍾","🍶","🍵","☕","🍼","🍴","🍽","⚽", + "🏀","🏈","⚾","🎾","🏐","🏉","🎱","🏓","🏸","🏒","🏑","🏏","🏹","⛳","🎣","⛸","🎿", + "⛷","🏂","🏋‍♀","🏋🏻‍♀","🏋🏼‍♀","🏋🏽‍♀","🏋🏾‍♀","🏋🏿‍♀","🏋","🏋🏻","🏋🏼","🏋🏽", + "🏋🏾","🏋🏿","⛹‍♀","⛹🏻‍♀","⛹🏼‍♀","⛹🏽‍♀","⛹🏾‍♀","⛹🏿‍♀","⛹","⛹🏻","⛹🏼", + "⛹🏽","⛹🏾","⛹🏿","🏌‍♀","🏌","🏄‍♀","🏄🏻‍♀","🏄🏼‍♀","🏄🏽‍♀","🏄🏾‍♀","🏄🏿‍♀", + "🏄","🏄🏻","🏄🏼","🏄🏽","🏄🏾","🏄🏿","🏊‍♀","🏊🏻‍♀","🏊🏼‍♀","🏊🏽‍♀","🏊🏾‍♀", + "🏊🏿‍♀","🏊","🏊🏻","🏊🏼","🏊🏽","🏊🏾","🏊🏿","🚣‍♀","🚣🏻‍♀","🚣🏼‍♀","🚣🏽‍♀", + "🚣🏾‍♀","🚣🏿‍♀","🚣","🚣🏻","🚣🏼","🚣🏽","🚣🏾","🚣🏿","🏇","🚴‍♀","🚴🏻‍♀","🚴🏼‍♀", + "🚴🏽‍♀","🚴🏾‍♀","🚴🏿‍♀","🚴","🚴🏻","🚴🏼","🚴🏽","🚴🏾","🚴🏿","🚵‍♀","🚵🏻‍♀","🚵🏼‍♀", + "🚵🏽‍♀","🚵🏾‍♀","🚵🏿‍♀","🚵","🚵🏻","🚵🏼","🚵🏽","🚵🏾","🚵🏿","🛀","🛀🏻","🛀🏼", + "🛀🏽","🛀🏾","🛀🏿","🕴","🎗","🎽","🏅","🎖","🏆","🏵","🎯","🎫","🎟","🎭","🎨","🎪", + "🎬","🎤","🎧","🎼","🎹","🎷","🎺","🎸","🎻","🎮","🎰","🎲","🎳","⌚","📱","📲","💻", + "⌨","🖥","🖨","🖱","🖲","🕹","🗜","💽","💾","💿","📀","📼","📷","📸","📹","🎥","📽", + "🎞","📞","☎","📟","📠","📺","📻","🎙","🎚","🎛","⏱","⏲","⏰","🕰","⏳","⌛","📡", + "🔋","🔌","💡","🔦","🕯","🗑","🛢","💸","💵","💴","💶","💷","💰","💳","💎","⚖","🔧", + "🔨","⚒","🛠","⛏","🔩","⚙","⛓","🔫","💣","🔪","🗡","⚔","🛡","🚬","⚰","⚱","🏺","🔮", + "📿","💈","⚗","🔭","🔬","🕳","💊","💉","🌡","🚽","🚿","🛁","🛎","🔑","🗝","🚪","🛋","🛌", + "🛏","🖼","⛱","🗿","🛍","🎁","🎈","🎏","🎀","🎊","🎉","🎐","🏮","🎎","✉","📩","📨","📧", + "💌","📥","📤","📦","🏷","🔖","📪","📫","📬","📭","📮","📯","📜","📃","📄","📑","📊","📈", + "📉","🗒","🗓","📆","📅","📇","🗃","🗳","🗄","📋","📁","📂","🗂","🗞","📰","📓","📔","📒", + "📕","📗","📘","📙","📚","📖","🔗","📎","🖇","📐","📏","✂","📌","📍","🚩","🎌","🏳","🏴", + "🏁","🏳‍🌈","🖌","🖍","🖊","🖋","✒","📝","✏","🔏","🔐","🔒","🔓","🔍","🔎" + }, + new String[]{ + "🚗","🚕","🚙","🚌","🚎","🏎","🚓","🚑","🚒","🚐","🚚","🚛","🚜","🏍","🚲","🚨","🚔","🚍", + "🚘","🚖","🚡","🚠","🚟","🚃","🚋","🚝","🚄","🚅","🚈","🚞","🚂","🚆","🚇","🚊","🚉","🚁", + "🛩","✈","🛫","🛬","⛵","🛥","🚤","⛴","🛳","🚀","🛰","💺","⚓","🚧","⛽","🚏","🚦","🚥", + "🗺","🚢","🎡","🎢","🎠","🏗","🌁","🗼","🏭","⛲","🎑","⛰","🏔","🗻","🌋","🗾","🏕","⛺", + "🏞","🛣","🛤","🌅","🌄","🏜","🏖","🏝","🌇","🌆","🏙","🌃","🌉","🌌","🌠","🎇","🎆","🌈", + "🏘","🏰","🏯","🏟","🗽","🏠","🏡","🏚","🏢","🏬","🏣","🏤","🏥","🏦","🏨","🏪","🏫","🏩", + "💒","🏛","⛪","🕌","🕍","🕋","⛩","🇦🇺","🇦🇹","🇦🇿","🇦🇽","🇦🇱","🇩🇿","🇦🇸","🇦🇮","🇦🇴", + "🇦🇩","🇦🇶","🇦🇬","🇦🇷","🇦🇲","🇦🇼","🇦🇫","🇧🇸","🇧🇩","🇧🇧","🇧🇭","🇧🇾","🇧🇿","🇧🇪", + "🇧🇯","🇧🇲","🇧🇬","🇧🇴","🇧🇶","🇧🇦","🇧🇼","🇧🇷","🇮🇴","🇧🇳","🇧🇫","🇧🇮","🇧🇹","🇻🇺", + "🇻🇦","🇬🇧","🇭🇺","🇻🇪","🇻🇬","🇻🇮","🇹🇱","🇻🇳","🇬🇦","🇭🇹","🇬🇾","🇬🇲","🇬🇭","🇬🇵", + "🇬🇹","🇬🇳","🇬🇼","🇩🇪","🇬🇬","🇬🇮","🇭🇳","🇭🇰","🇬🇩","🇬🇱","🇬🇷","🇬🇪","🇬🇺","🇩🇰", + "🇯🇪","🇩🇯","🇩🇲","🇩🇴","🇪🇺","🇪🇬","🇿🇲","🇪🇭","🇿🇼","🇮🇱","🇮🇳","🇮🇩","🇯🇴","🇮🇶", + "🇮🇷","🇮🇪","🇮🇸","🇪🇸","🇮🇹","🇾🇪","🇨🇻","🇰🇿","🇰🇾","🇰🇭","🇨🇲","🇨🇦","🇮🇨","🇶🇦", + "🇰🇪","🇨🇾","🇰🇬","🇰🇮","🇨🇳","🇰🇵","🇨🇨","🇨🇴","🇰🇲","🇨🇬","🇨🇩","🇽🇰","🇨🇷","🇨🇮", + "🇨🇺","🇰🇼","🇨🇼","🇱🇦","🇱🇻","🇱🇸","🇱🇷","🇱🇧","🇱🇾","🇱🇹","🇱🇮","🇱🇺","🇲🇺","🇲🇷", + "🇲🇬","🇾🇹","🇲🇴","🇲🇰","🇲🇼","🇲🇾","🇲🇱","🇲🇻","🇲🇹","🇲🇦","🇲🇶","🇲🇭","🇲🇽","🇫🇲", + "🇲🇿","🇲🇩","🇲🇨","🇲🇳","🇲🇸","🇲🇲","🇳🇦","🇳🇷","🇳🇵","🇳🇪","🇳🇬","🇳🇱","🇳🇮","🇳🇺", + "🇳🇿","🇳🇨","🇳🇴","🇮🇲","🇳🇫","🇨🇽","🇸🇭","🇨🇰","🇹🇨","🇦🇪","🇴🇲","🇵🇳","🇵🇰","🇵🇼", + "🇵🇸","🇵🇦","🇵🇬","🇵🇾","🇵🇪","🇵🇱","🇵🇹","🇵🇷","🇰🇷","🇷🇪","🇷🇺","🇷🇼","🇷🇴","🇸🇻", + "🇼🇸","🇸🇲","🇸🇹","🇸🇦","🇸🇿","🇲🇵","🇸🇨","🇧🇱","🇵🇲","🇸🇳","🇻🇨","🇰🇳","🇱🇨","🇷🇸", + "🇸🇬","🇸🇽","🇸🇾","🇸🇰","🇸🇮","🇺🇸","🇸🇧","🇸🇴","🇸🇩","🇸🇷","🇸🇱","🇹🇯","🇹🇭","🇹🇼", + "🇹🇿","🇹🇬","🇹🇰","🇹🇴","🇹🇹","🇹🇻","🇹🇳","🇹🇲","🇹🇷","🇺🇬","🇺🇿","🇺🇦","🇼🇫","🇺🇾", + "🇫🇴","🇫🇯","🇵🇭","🇫🇮","🇫🇰","🇫🇷","🇬🇫","🇵🇫","🇹🇫","🇭🇷","🇨🇫","🇹🇩","🇲🇪","🇨🇿", + "🇨🇱","🇨🇭","🇸🇪","🇱🇰","🇪🇨","🇬🇶","🇪🇷","🇪🇪","🇪🇹","🇿🇦","🇬🇸","🇸🇸","🇯🇲","🇯🇵" + }, + new String[]{ + "💟","☮","✝","☪","🕉","☸","✡","🔯","🕎","☯","☦","🛐","⛎","♈","♉","♊","♋","♌","♍","♎","♏", + "♐","♑","♒","♓","🆔","⚛","🈳","🈹","☢","☣","📴","📳","🈶","🈚","🈸","🈺","🈷","✴","🆚","🉑", + "💮","🉐","㊙","㊗","🈴","🈵","🈲","🅰","🅱","🆎","🆑","🅾","🆘","⛔","📛","🚫","❌","⭕","💢", + "♨","🚷","🚯","🚳","🚱","🔞","📵","❗","❕","❓","❔","‼","⁉","💯","🔅","🔆","🔱","⚜","〽","⚠", + "🚸","🔰","♻","🈯","💹","❇","✳","❎","✅","🌐","Ⓜ","💠","🌀","➿","🏧","🈂","🛂","🛃","🛄", + "🛅","♿","🚭","🚾","🅿","🚰","🚹","🚺","🚼","🚻","🚮","🎦","📶","🈁","🔤","🔡","🔠","🔣","ℹ", + "🆖","🆗","🆙","🆒","🆕","🆓","0⃣","1⃣","2⃣","3⃣","4⃣","5⃣","6⃣","7⃣","8⃣","9⃣","🔟","🔢","#⃣","*⃣","▶", + "⏸","⏯","⏹","⏺","⏭","⏮","⏩","⏪","⏫","⏬","◀","🔼","🔽","➡","⬅","⬆","⬇","↗","↘","↙", + "↖","↕","↔","↪","↩","⤴","⤵","🔀","🔁","🔂","🔄","🔃","🎵","🎶","〰","➰","✔","➕","➖","➗", + "✖","💲","💱","™","©","®","🔚","🔙","🔛","🔝","🔜","☑","🔘","⚪","⚫","🔴","🔵","🔺","🔻","🔸", + "🔹","🔶","🔷","🔳","🔲","▪","▫","◾","◽","◼","◻","⬛","⬜","🔇","🔈","🔉","🔊","🔕","🔔","📣", + "📢","👁‍🗨","💬","💭","🗯","🃏","🀄","🎴","♠","♣","♥","♦","🕐","🕑","🕒","🕓","🕔","🕕","🕖", + "🕗","🕘","🕙","🕚","🕛","🕜","🕝","🕞","🕟","🕠","🕡","🕢","🕣","🕤","🕥","🕦","🕧" + } + }; + + public static final HashMap emojiToFE0FMap = new HashMap<>(emojiToFE0F.length); + public static final HashMap dataCharsMap = new HashMap<>(dataChars.length); + public static final HashMap emojiColoredMap = new HashMap<>(emojiColored.length); + + static { + for (int a = 0; a < emojiToFE0F.length; a++) { + emojiToFE0FMap.put(emojiToFE0F[a], true); + } + for (int a = 0; a < dataChars.length; a++) { + dataCharsMap.put(dataChars[a], true); + } + for (int a = 0; a < emojiColored.length; a++) { + emojiColoredMap.put(emojiColored[a], true); + } + dataColored[1] = data[1]; + dataColored[3] = data[3]; + dataColored[4] = data[4]; + } +} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java new file mode 100644 index 0000000000..7c8c7416f4 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java @@ -0,0 +1,330 @@ +package im.actor.sdk.view.emoji.keyboard.emoji; + +import android.content.Context; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewTreeObserver; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.PopupWindow; + +import im.actor.sdk.view.emoji.EmojiData; + +/** + * Created by 98379720172 on 03/01/17. + */ + +public class EmojiView extends FrameLayout { + + public interface Listener { + boolean onBackspace(); + void onEmojiSelected(String emoji); + void onStickersSettingsClick(); + void onGifTab(boolean opened); + void onClearEmojiRecent(); + } + + + private class ImageViewEmoji extends ImageView { + + private boolean touched; + private float lastX; + private float lastY; + private float touchedX; + private float touchedY; + + public ImageViewEmoji(Context context) { + super(context); + setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + sendEmoji(null); + } + }); + setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + String code = (String) view.getTag(); + if (EmojiData.emojiColoredMap.containsKey(code)) { + touched = true; + touchedX = lastX; + touchedY = lastY; + + String color = emojiColor.get(code); + if (color != null) { + switch (color) { + case "\uD83C\uDFFB": + pickerView.setSelection(1); + break; + case "\uD83C\uDFFC": + pickerView.setSelection(2); + break; + case "\uD83C\uDFFD": + pickerView.setSelection(3); + break; + case "\uD83C\uDFFE": + pickerView.setSelection(4); + break; + case "\uD83C\uDFFF": + pickerView.setSelection(5); + break; + } + } else { + pickerView.setSelection(0); + } + view.getLocationOnScreen(location); + int x = emojiSize * pickerView.getSelection() + AndroidUtilities.dp(4 * pickerView.getSelection() - (AndroidUtilities.isTablet() ? 5 : 1)); + if (location[0] - x < AndroidUtilities.dp(5)) { + x += (location[0] - x) - AndroidUtilities.dp(5); + } else if (location[0] - x + popupWidth > AndroidUtilities.displaySize.x - AndroidUtilities.dp(5)) { + x += (location[0] - x + popupWidth) - (AndroidUtilities.displaySize.x - AndroidUtilities.dp(5)); + } + int xOffset = -x; + int yOffset = view.getTop() < 0 ? view.getTop() : 0; + + pickerView.setEmoji(code, AndroidUtilities.dp(AndroidUtilities.isTablet() ? 30 : 22) - xOffset + (int) AndroidUtilities.dpf2(0.5f)); + + pickerViewPopup.setFocusable(true); + pickerViewPopup.showAsDropDown(view, xOffset, -view.getMeasuredHeight() - popupHeight + (view.getMeasuredHeight() - emojiSize) / 2 - yOffset); + view.getParent().requestDisallowInterceptTouchEvent(true); + return true; + } else if (pager.getCurrentItem() == 0) { + listener.onClearEmojiRecent(); + } + return false; + } + }); + setBackgroundResource(R.drawable.list_selector); + setScaleType(ImageView.ScaleType.CENTER); + } + + private void sendEmoji(String override) { + String code = override != null ? override : (String) getTag(); + if (override == null) { + if (pager.getCurrentItem() != 0) { + String color = emojiColor.get(code); + if (color != null) { + code = addColorToCode(code, color); + } + } + Integer count = emojiUseHistory.get(code); + if (count == null) { + count = 0; + } + if (count == 0 && emojiUseHistory.size() > 50) { + for (int a = recentEmoji.size() - 1; a >= 0; a--) { + String emoji = recentEmoji.get(a); + emojiUseHistory.remove(emoji); + recentEmoji.remove(a); + if (emojiUseHistory.size() <= 50) { + break; + } + } + } + emojiUseHistory.put(code, ++count); + if (pager.getCurrentItem() != 0) { + sortEmoji(); + } + saveRecentEmoji(); + adapters.get(0).notifyDataSetChanged(); + if (listener != null) { + listener.onEmojiSelected(Emoji.fixEmoji(code)); + } + } else { + if (listener != null) { + listener.onEmojiSelected(Emoji.fixEmoji(override)); + } + } + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(View.MeasureSpec.getSize(widthMeasureSpec), View.MeasureSpec.getSize(widthMeasureSpec)); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (touched) { + if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { + if (pickerViewPopup != null && pickerViewPopup.isShowing()) { + pickerViewPopup.dismiss(); + + String color = null; + switch (pickerView.getSelection()) { + case 1: + color = "\uD83C\uDFFB"; + break; + case 2: + color = "\uD83C\uDFFC"; + break; + case 3: + color = "\uD83C\uDFFD"; + break; + case 4: + color = "\uD83C\uDFFE"; + break; + case 5: + color = "\uD83C\uDFFF"; + break; + } + String code = (String) getTag(); + if (pager.getCurrentItem() != 0) { + if (color != null) { + emojiColor.put(code, color); + code = addColorToCode(code, color); + } else { + emojiColor.remove(code); + } + setImageDrawable(Emoji.getEmojiBigDrawable(code)); + sendEmoji(null); + saveEmojiColors(); + } else { + sendEmoji(code + (color != null ? color : "")); + } + } + touched = false; + touchedX = -10000; + touchedY = -10000; + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + boolean ignore = false; + if (touchedX != -10000) { + if (Math.abs(touchedX - event.getX()) > AndroidUtilities.getPixelsInCM(0.2f, true) || Math.abs(touchedY - event.getY()) > AndroidUtilities.getPixelsInCM(0.2f, false)) { + touchedX = -10000; + touchedY = -10000; + } else { + ignore = true; + } + } + if (!ignore) { + getLocationOnScreen(location); + float x = location[0] + event.getX(); + pickerView.getLocationOnScreen(location); + x -= location[0] + AndroidUtilities.dp(3); + int position = (int) (x / (emojiSize + AndroidUtilities.dp(4))); + if (position < 0) { + position = 0; + } else if (position > 5) { + position = 5; + } + pickerView.setSelection(position); + } + } + } + lastX = event.getX(); + lastY = event.getY(); + return super.onTouchEvent(event); + } + } + + + + private class EmojiPopupWindow extends PopupWindow { + + private ViewTreeObserver.OnScrollChangedListener mSuperScrollListener; + private ViewTreeObserver mViewTreeObserver; + + public EmojiPopupWindow() { + super(); + init(); + } + + public EmojiPopupWindow(Context context) { + super(context); + init(); + } + + public EmojiPopupWindow(int width, int height) { + super(width, height); + init(); + } + + public EmojiPopupWindow(View contentView) { + super(contentView); + init(); + } + + public EmojiPopupWindow(View contentView, int width, int height, boolean focusable) { + super(contentView, width, height, focusable); + init(); + } + + public EmojiPopupWindow(View contentView, int width, int height) { + super(contentView, width, height); + init(); + } + + private void init() { + if (superListenerField != null) { + try { + mSuperScrollListener = (ViewTreeObserver.OnScrollChangedListener) superListenerField.get(this); + superListenerField.set(this, NOP); + } catch (Exception e) { + mSuperScrollListener = null; + } + } + } + + private void unregisterListener() { + if (mSuperScrollListener != null && mViewTreeObserver != null) { + if (mViewTreeObserver.isAlive()) { + mViewTreeObserver.removeOnScrollChangedListener(mSuperScrollListener); + } + mViewTreeObserver = null; + } + } + + private void registerListener(View anchor) { + if (mSuperScrollListener != null) { + ViewTreeObserver vto = (anchor.getWindowToken() != null) ? anchor.getViewTreeObserver() : null; + if (vto != mViewTreeObserver) { + if (mViewTreeObserver != null && mViewTreeObserver.isAlive()) { + mViewTreeObserver.removeOnScrollChangedListener(mSuperScrollListener); + } + if ((mViewTreeObserver = vto) != null) { + vto.addOnScrollChangedListener(mSuperScrollListener); + } + } + } + } + + @Override + public void showAsDropDown(View anchor, int xoff, int yoff) { + try { + super.showAsDropDown(anchor, xoff, yoff); + registerListener(anchor); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + + @Override + public void update(View anchor, int xoff, int yoff, int width, int height) { + super.update(anchor, xoff, yoff, width, height); + registerListener(anchor); + } + + @Override + public void update(View anchor, int width, int height) { + super.update(anchor, width, height); + registerListener(anchor); + } + + @Override + public void showAtLocation(View parent, int gravity, int x, int y) { + super.showAtLocation(parent, gravity, x, y); + unregisterListener(); + } + + @Override + public void dismiss() { + setFocusable(false); + try { + super.dismiss(); + } catch (Exception e) { + //don't promt + } + unregisterListener(); + } + } + +} From 7f24348e69e5a1f59d096ebfddcf1c967f7fb19b Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Fri, 6 Jan 2017 09:58:12 -0200 Subject: [PATCH 202/253] alteracoes --- .../im/actor/sdk/ActorSDKApplication.java | 13 + .../java/im/actor/sdk/util/AndroidUtils.java | 33 + .../java/im/actor/sdk/util/DispatchQueue.java | 83 ++ .../main/java/im/actor/sdk/util/Screen.java | 67 +- .../java/im/actor/sdk/util/Utilities.java | 12 + .../sdk/view/emoji/keyboard/emoji/Emoji.java | 525 +++++++ .../view/emoji/keyboard/emoji/EmojiData.java | 339 +++++ .../view/emoji/keyboard/emoji/EmojiView.java | 1258 ++++++++++++++++- .../main/res/drawable-hdpi/ic_smiles2_car.png | Bin 0 -> 1931 bytes .../drawable-hdpi/ic_smiles2_car_active.png | Bin 0 -> 1931 bytes .../res/drawable-hdpi/ic_smiles2_food.png | Bin 0 -> 1782 bytes .../drawable-hdpi/ic_smiles2_food_active.png | Bin 0 -> 1781 bytes .../res/drawable-hdpi/ic_smiles2_nature.png | Bin 0 -> 2068 bytes .../ic_smiles2_nature_active.png | Bin 0 -> 2033 bytes .../res/drawable-hdpi/ic_smiles2_objects.png | Bin 0 -> 1779 bytes .../ic_smiles2_objects_active.png | Bin 0 -> 1779 bytes .../res/drawable-hdpi/ic_smiles2_recent.png | Bin 0 -> 1736 bytes .../ic_smiles2_recent_active.png | Bin 0 -> 1739 bytes .../res/drawable-hdpi/ic_smiles2_smile.png | Bin 0 -> 1932 bytes .../drawable-hdpi/ic_smiles2_smile_active.png | Bin 0 -> 1950 bytes .../res/drawable-hdpi/ic_smiles2_stickers.png | Bin 0 -> 2021 bytes .../ic_smiles2_stickers_active.png | Bin 0 -> 2020 bytes .../res/drawable-hdpi/stickers_back_all.9.png | Bin 0 -> 1520 bytes .../res/drawable-hdpi/stickers_back_arrow.png | Bin 0 -> 1087 bytes .../main/res/drawable-mdpi/ic_smiles2_car.png | Bin 0 -> 1570 bytes .../drawable-mdpi/ic_smiles2_car_active.png | Bin 0 -> 1570 bytes .../res/drawable-mdpi/ic_smiles2_food.png | Bin 0 -> 1446 bytes .../drawable-mdpi/ic_smiles2_food_active.png | Bin 0 -> 1448 bytes .../res/drawable-mdpi/ic_smiles2_nature.png | Bin 0 -> 1592 bytes .../ic_smiles2_nature_active.png | Bin 0 -> 1595 bytes .../res/drawable-mdpi/ic_smiles2_objects.png | Bin 0 -> 1426 bytes .../ic_smiles2_objects_active.png | Bin 0 -> 1428 bytes .../res/drawable-mdpi/ic_smiles2_recent.png | Bin 0 -> 1392 bytes .../ic_smiles2_recent_active.png | Bin 0 -> 1405 bytes .../res/drawable-mdpi/ic_smiles2_smile.png | Bin 0 -> 1521 bytes .../drawable-mdpi/ic_smiles2_smile_active.png | Bin 0 -> 1522 bytes .../res/drawable-mdpi/ic_smiles2_stickers.png | Bin 0 -> 1592 bytes .../ic_smiles2_stickers_active.png | Bin 0 -> 1592 bytes .../res/drawable-mdpi/stickers_back_all.9.png | Bin 0 -> 400 bytes .../res/drawable-mdpi/stickers_back_arrow.png | Bin 0 -> 1045 bytes .../main/res/drawable-v21/list_selector.xml | 5 + .../res/drawable-xhdpi/ic_smiles2_car.png | Bin 0 -> 2398 bytes .../drawable-xhdpi/ic_smiles2_car_active.png | Bin 0 -> 2398 bytes .../res/drawable-xhdpi/ic_smiles2_food.png | Bin 0 -> 2198 bytes .../drawable-xhdpi/ic_smiles2_food_active.png | Bin 0 -> 2168 bytes .../res/drawable-xhdpi/ic_smiles2_nature.png | Bin 0 -> 2513 bytes .../ic_smiles2_nature_active.png | Bin 0 -> 2499 bytes .../res/drawable-xhdpi/ic_smiles2_objects.png | Bin 0 -> 2078 bytes .../ic_smiles2_objects_active.png | Bin 0 -> 2081 bytes .../res/drawable-xhdpi/ic_smiles2_recent.png | Bin 0 -> 2091 bytes .../ic_smiles2_recent_active.png | Bin 0 -> 2082 bytes .../res/drawable-xhdpi/ic_smiles2_smile.png | Bin 0 -> 2378 bytes .../ic_smiles2_smile_active.png | Bin 0 -> 2368 bytes .../drawable-xhdpi/ic_smiles2_stickers.png | Bin 0 -> 2571 bytes .../ic_smiles2_stickers_active.png | Bin 0 -> 2580 bytes .../drawable-xhdpi/ic_smiles_backspace.png | Bin .../ic_smiles_backspace_active.png | Bin .../drawable-xhdpi/stickers_back_all.9.png | Bin 0 -> 853 bytes .../drawable-xhdpi/stickers_back_arrow.png | Bin 0 -> 1272 bytes .../res/drawable-xxhdpi/ic_smiles2_car.png | Bin 0 -> 2938 bytes .../drawable-xxhdpi/ic_smiles2_car_active.png | Bin 0 -> 2941 bytes .../res/drawable-xxhdpi/ic_smiles2_food.png | Bin 0 -> 2774 bytes .../ic_smiles2_food_active.png | Bin 0 -> 2798 bytes .../res/drawable-xxhdpi/ic_smiles2_nature.png | Bin 0 -> 3280 bytes .../ic_smiles2_nature_active.png | Bin 0 -> 3267 bytes .../drawable-xxhdpi/ic_smiles2_objects.png | Bin 0 -> 2675 bytes .../ic_smiles2_objects_active.png | Bin 0 -> 2676 bytes .../res/drawable-xxhdpi/ic_smiles2_recent.png | Bin 0 -> 2543 bytes .../ic_smiles2_recent_active.png | Bin 0 -> 2582 bytes .../res/drawable-xxhdpi/ic_smiles2_smile.png | Bin 0 -> 3164 bytes .../ic_smiles2_smile_active.png | Bin 0 -> 3184 bytes .../drawable-xxhdpi/ic_smiles2_stickers.png | Bin 0 -> 3363 bytes .../ic_smiles2_stickers_active.png | Bin 0 -> 3317 bytes .../drawable-xxhdpi/stickers_back_all.9.png | Bin 0 -> 2280 bytes .../drawable-xxhdpi/stickers_back_arrow.png | Bin 0 -> 1451 bytes .../src/main/res/drawable/ic_emoji_bell.xml | 13 + .../src/main/res/drawable/ic_emoji_car.xml | 16 + .../src/main/res/drawable/ic_emoji_flower.xml | 16 + .../src/main/res/drawable/ic_emoji_recent.xml | 16 + .../src/main/res/drawable/ic_emoji_smile.xml | 16 + .../src/main/res/drawable/ic_emoji_symbol.xml | 8 + .../src/main/res/drawable/list_selector.xml | 19 + .../src/main/res/values-sw600dp/values.xml | 4 + .../src/main/res/values-sw720dp/values.xml | 4 + .../src/main/res/values/values.xml | 4 + .../actor/runtime/android/AndroidContext.java | 9 + 86 files changed, 2446 insertions(+), 14 deletions(-) create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/AndroidUtils.java create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/DispatchQueue.java create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Utilities.java create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiData.java create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_car.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_car_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_food.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_food_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_nature.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_nature_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_objects.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_objects_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_recent.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_recent_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_smile.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_smile_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_stickers.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_stickers_active.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/stickers_back_all.9.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/stickers_back_arrow.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_car.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_car_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_food.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_food_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_nature.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_nature_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_objects.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_objects_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_recent.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_recent_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_smile.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_smile_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_stickers.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_stickers_active.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/stickers_back_all.9.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/stickers_back_arrow.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-v21/list_selector.xml create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_car.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_car_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_food.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_food_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_nature.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_nature_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_objects.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_objects_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_recent.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_recent_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_smile.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_smile_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_stickers.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_stickers_active.png mode change 100644 => 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles_backspace.png mode change 100644 => 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles_backspace_active.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/stickers_back_all.9.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/stickers_back_arrow.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_car.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_car_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_food.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_food_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_nature.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_nature_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_objects.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_objects_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_recent.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_recent_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_smile.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_smile_active.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_stickers.png create mode 100755 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_stickers_active.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/stickers_back_all.9.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/stickers_back_arrow.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_bell.xml create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_car.xml create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_flower.xml create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_recent.xml create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_smile.xml create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_symbol.xml create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/list_selector.xml create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/values-sw600dp/values.xml create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/values-sw720dp/values.xml create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/values/values.xml diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKApplication.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKApplication.java index 4e9b3986c9..6102172c0d 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKApplication.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDKApplication.java @@ -2,8 +2,11 @@ import android.app.ActivityManager; import android.app.Application; +import android.content.res.Configuration; import im.actor.runtime.android.AndroidContext; +import im.actor.sdk.util.AndroidUtils; +import im.actor.sdk.util.Screen; /** * Implementation of Application object that handles everything required for creating and @@ -38,4 +41,14 @@ public void onCreate() { public void onConfigureActorSDK() { } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + try { + Screen.checkDisplaySize(getApplicationContext(), newConfig); + } catch (Exception e) { + e.printStackTrace(); + } + } } \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/AndroidUtils.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/AndroidUtils.java new file mode 100644 index 0000000000..e8bd366a23 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/AndroidUtils.java @@ -0,0 +1,33 @@ +package im.actor.sdk.util; + +import im.actor.runtime.android.AndroidContext; +import im.actor.sdk.ActorSDK; +import im.actor.sdk.R; + +/** + * Created by 98379720172 on 05/01/17. + */ + +public class AndroidUtils { + + private static Boolean isTablet = null; + + public static boolean isTablet() { + if (isTablet == null) { + isTablet = AndroidContext.getContext().getResources().getBoolean(R.bool.isTablet); + } + return isTablet; + } + + public static void runOnUIThread(Runnable runnable, long delay) { + if (delay == 0) { + AndroidContext.applicationHandler().post(runnable); + } else { + AndroidContext.applicationHandler().postDelayed(runnable, delay); + } + } + + public static void runOnUIThread(Runnable runnable) { + runOnUIThread(runnable, 0); + } +} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/DispatchQueue.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/DispatchQueue.java new file mode 100644 index 0000000000..e8f78ec390 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/DispatchQueue.java @@ -0,0 +1,83 @@ +package im.actor.sdk.util; + +/** + * Created by 98379720172 on 06/01/17. + */ + + +import android.os.Handler; +import android.os.Looper; +import android.os.Message; + +import java.util.concurrent.CountDownLatch; + +import im.actor.runtime.Log; + +public class DispatchQueue extends Thread { + + private volatile Handler handler = null; + private CountDownLatch syncLatch = new CountDownLatch(1); + + private static String TAG = DispatchQueue.class.getName(); + + public DispatchQueue(final String threadName) { + setName(threadName); + start(); + } + + private void sendMessage(Message msg, int delay) { + try { + syncLatch.await(); + if (delay <= 0) { + handler.sendMessage(msg); + } else { + handler.sendMessageDelayed(msg, delay); + } + } catch (Exception e) { + Log.e(TAG, e); + } + } + + public void cancelRunnable(Runnable runnable) { + try { + syncLatch.await(); + handler.removeCallbacks(runnable); + } catch (Exception e) { + Log.e(TAG, e); + } + } + + public void postRunnable(Runnable runnable) { + postRunnable(runnable, 0); + } + + public void postRunnable(Runnable runnable, long delay) { + try { + syncLatch.await(); + if (delay <= 0) { + handler.post(runnable); + } else { + handler.postDelayed(runnable, delay); + } + } catch (Exception e) { + Log.e(TAG, e); + } + } + + public void cleanupQueue() { + try { + syncLatch.await(); + handler.removeCallbacksAndMessages(null); + } catch (Exception e) { + Log.e(TAG, e); + } + } + + @Override + public void run() { + Looper.prepare(); + handler = new Handler(); + syncLatch.countDown(); + Looper.loop(); + } +} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Screen.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Screen.java index 2cde4c7d73..f9d14a38a7 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Screen.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Screen.java @@ -1,19 +1,30 @@ package im.actor.sdk.util; +import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; +import android.graphics.Point; +import android.util.DisplayMetrics; +import android.view.Display; +import android.view.WindowManager; +import im.actor.runtime.Log; import im.actor.runtime.android.AndroidContext; public class Screen { private static float density; private static float scaledDensity; + public static Point displaySize = new Point(); + public static boolean usingHardwareInput; + public static DisplayMetrics displayMetrics = new DisplayMetrics(); - public static int dp(float dp) { - if (density == 0f) - density = AndroidContext.getContext().getResources().getDisplayMetrics().density; + static { + checkDisplaySize(AndroidContext.getContext(), null); + } - return (int) (dp * density + .5f); + public static int dp(float dp) { + return (int) (dp * getDensity() + .5f); } public static int sp(float sp) { @@ -58,6 +69,54 @@ public static boolean hasNavigationBar() { } public static float getDensity() { + if (density == 0f) + density = AndroidContext.getContext().getResources().getDisplayMetrics().density; + return density; } + + public static void checkDisplaySize(Context context, Configuration newConfiguration) { + try { + density = context.getResources().getDisplayMetrics().density; + Configuration configuration = newConfiguration; + if (configuration == null) { + configuration = context.getResources().getConfiguration(); + } + usingHardwareInput = configuration.keyboard != Configuration.KEYBOARD_NOKEYS && configuration.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO; + WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + if (manager != null) { + Display display = manager.getDefaultDisplay(); + if (display != null) { + display.getMetrics(displayMetrics); + display.getSize(displaySize); + } + } + if (configuration.screenWidthDp != Configuration.SCREEN_WIDTH_DP_UNDEFINED) { + int newSize = (int) Math.ceil(configuration.screenWidthDp * density); + if (Math.abs(displaySize.x - newSize) > 3) { + displaySize.x = newSize; + } + } + if (configuration.screenHeightDp != Configuration.SCREEN_HEIGHT_DP_UNDEFINED) { + int newSize = (int) Math.ceil(configuration.screenHeightDp * density); + if (Math.abs(displaySize.y - newSize) > 3) { + displaySize.y = newSize; + } + } + } catch (Exception e) { + Log.e(Screen.class.getName(), e); + } + } + + public static float dpf2(float value) { + if (value == 0) { + return 0; + } + return getDensity() * value; + } + + public static float getPixelsInCM(float cm, boolean isX) { + return (cm / 2.54f) * (isX ? displayMetrics.xdpi : displayMetrics.ydpi); + } + } \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Utilities.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Utilities.java new file mode 100644 index 0000000000..372691f098 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Utilities.java @@ -0,0 +1,12 @@ +package im.actor.sdk.util; + +/** + * Created by 98379720172 on 06/01/17. + */ + +public class Utilities { + + public static volatile DispatchQueue globalQueue = new DispatchQueue("globalQueue"); + + +} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java new file mode 100644 index 0000000000..58120ed30f --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java @@ -0,0 +1,525 @@ +package im.actor.sdk.view.emoji.keyboard.emoji; + +/** + * Created by 98379720172 on 05/01/17. + */ + + +import java.io.File; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Locale; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.text.Spannable; +import android.text.Spanned; +import android.text.TextPaint; +import android.text.style.DynamicDrawableSpan; +import android.text.style.ImageSpan; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import im.actor.runtime.Log; +import im.actor.runtime.android.AndroidContext; +import im.actor.sdk.util.AndroidUtils; +import im.actor.sdk.util.Screen; +import im.actor.sdk.util.Utilities; + +public class Emoji { + private static HashMap rects = new HashMap<>(); + private static int drawImgSize; + private static int bigImgSize; + private static boolean inited = false; + private static Paint placeholderPaint; + private static final int splitCount = 4; + private static Bitmap emojiBmp[][] = new Bitmap[5][splitCount]; + private static boolean loadingEmoji[][] = new boolean[5][splitCount]; + + private static final int[][] cols = { + {12, 12, 12, 12}, + {6, 6, 6, 6}, + {9, 9, 9, 9}, + {9, 9, 9, 9}, + {8, 8, 8, 7} + }; + + static { + int emojiFullSize; + int add = 2; + if (Screen.getDensity() <= 1.0f) { + emojiFullSize = 32; + add = 1; + } else if (Screen.getDensity() <= 1.5f) { + emojiFullSize = 64; + } else if (Screen.getDensity() <= 2.0f) { + emojiFullSize = 64; + } else { + emojiFullSize = 64; + } + drawImgSize = Screen.dp(20); + bigImgSize = Screen.dp(AndroidUtils.isTablet() ? 40 : 32); + + for (int j = 0; j < EmojiData.data.length; j++) { + int count2 = (int) Math.ceil(EmojiData.data[j].length / (float) splitCount); + int position; + for (int i = 0; i < EmojiData.data[j].length; i++) { + int page = i / count2; + position = i - page * count2; + int row = position % cols[j][page]; + int col = position / cols[j][page]; + Rect rect = new Rect(row * emojiFullSize + row * add, col * emojiFullSize + col * add, (row + 1) * emojiFullSize + row * add, (col + 1) * emojiFullSize + col * add); + rects.put(EmojiData.data[j][i], new DrawableInfo(rect, (byte) j, (byte) page, i)); + } + } + placeholderPaint = new Paint(); + placeholderPaint.setColor(0x00000000); + } + + private static void loadEmoji(final int page, final int page2) { + try { + float scale; + int imageResize = 1; + if (Screen.getDensity() <= 1.0f) { + scale = 2.0f; + imageResize = 2; + } else if (Screen.getDensity() <= 1.5f) { + //scale = 3.0f; + //imageResize = 2; + scale = 2.0f; + } else if (Screen.getDensity() <= 2.0f) { + scale = 2.0f; + } else { + scale = 2.0f; + } + + /*String q = ""; + for (int a = 0; a < EmojiData.data.length; a++) { + String arr[] = EmojiData.data[a]; + for (int b = 0; b < arr.length; b++) { + String emoji = arr[b]; + for (int c = 0; c < emoji.length(); c++) { + if (emoji.charAt(c) == '\ufe0f') { + q += String.format("0x%x, ", (int) emoji.charAt(0)); + break; + } + } + } + } + FileLog.e("tmessages", q);*/ + + String imageName; + File imageFile; + + try { + for (int a = 4; a < 7; a++) { + imageName = String.format(Locale.US, "v%d_emoji%.01fx_%d.jpg", a, scale, page); + imageFile = AndroidContext.getContext().getFileStreamPath(imageName); + if (imageFile.exists()) { + imageFile.delete(); + } + imageName = String.format(Locale.US, "v%d_emoji%.01fx_a_%d.jpg", a, scale, page); + imageFile = AndroidContext.getContext().getFileStreamPath(imageName); + if (imageFile.exists()) { + imageFile.delete(); + } + } + for (int a = 8; a < 10; a++) { + imageName = String.format(Locale.US, "v%d_emoji%.01fx_%d.png", a, scale, page); + imageFile = AndroidContext.getContext().getFileStreamPath(imageName); + if (imageFile.exists()) { + imageFile.delete(); + } + } + } catch (Exception e) { + //FileLog.e("tmessages", e); + } + Bitmap bitmap = null; + try { + InputStream is = AndroidContext.getContext().getAssets().open("emoji/" + String.format(Locale.US, "v10_emoji%.01fx_%d_%d.png", scale, page, page2)); + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inJustDecodeBounds = false; + opts.inSampleSize = imageResize; + bitmap = BitmapFactory.decodeStream(is, null, opts); + is.close(); + } catch (Throwable e) { + //FileLog.e("tmessages", e); + } + + final Bitmap finalBitmap = bitmap; + AndroidUtils.runOnUIThread(new Runnable() { + @Override + public void run() { + emojiBmp[page][page2] = finalBitmap; + + //NotificationCenter.getInstance().postNotificationName(NotificationCenter.emojiDidLoaded); + } + }); + } catch (Throwable x) { + //FileLog.e("tmessages", "Error loading emoji", x); + } + } + + public static void invalidateAll(View view) { + if (view instanceof ViewGroup) { + ViewGroup g = (ViewGroup) view; + for (int i = 0; i < g.getChildCount(); i++) { + invalidateAll(g.getChildAt(i)); + } + } else if (view instanceof TextView) { + view.invalidate(); + } + } + + public static String fixEmoji(String emoji) { + char ch; + int lenght = emoji.length(); + for (int a = 0; a < lenght; a++) { + ch = emoji.charAt(a); + if (ch >= 0xD83C && ch <= 0xD83E) { + if (ch == 0xD83C && a < lenght - 1) { + ch = emoji.charAt(a + 1); + if (ch == 0xDE2F || ch == 0xDC04 || ch == 0xDE1A || ch == 0xDD7F) { + emoji = emoji.substring(0, a + 2) + "\uFE0F" + emoji.substring(a + 2); + lenght++; + a += 2; + } else { + a++; + } + } else { + a++; + } + } else if (ch == 0x20E3) { + return emoji; + } else if (ch >= 0x203C && ch <= 0x3299) { + if (EmojiData.emojiToFE0FMap.containsKey(ch)) { + emoji = emoji.substring(0, a + 1) + "\uFE0F" + emoji.substring(a + 1); + lenght++; + a++; + } + } + } + return emoji; + } + + public static EmojiDrawable getEmojiDrawable(CharSequence code) { + DrawableInfo info = rects.get(code); + if (info == null) { + Log.e(Emoji.class.getName(), new Throwable("No drawable for emoji " + code)); + return null; + } + EmojiDrawable ed = new EmojiDrawable(info); + ed.setBounds(0, 0, drawImgSize, drawImgSize); + return ed; + } + + public static Drawable getEmojiBigDrawable(String code) { + EmojiDrawable ed = getEmojiDrawable(code); + if (ed == null) { + return null; + } + ed.setBounds(0, 0, bigImgSize, bigImgSize); + ed.fullSize = true; + return ed; + } + + public static class EmojiDrawable extends Drawable { + private DrawableInfo info; + private boolean fullSize = false; + private static Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); + private static Rect rect = new Rect(); + private static TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + + public EmojiDrawable(DrawableInfo i) { + info = i; + } + + public DrawableInfo getDrawableInfo() { + return info; + } + + public Rect getDrawRect() { + Rect original = getBounds(); + int cX = original.centerX(), cY = original.centerY(); + rect.left = cX - (fullSize ? bigImgSize : drawImgSize) / 2; + rect.right = cX + (fullSize ? bigImgSize : drawImgSize) / 2; + rect.top = cY - (fullSize ? bigImgSize : drawImgSize) / 2; + rect.bottom = cY + (fullSize ? bigImgSize : drawImgSize) / 2; + return rect; + } + + @Override + public void draw(Canvas canvas) { + /*if (MessagesController.getInstance().useSystemEmoji) { + //textPaint.setTextSize(getBounds().width()); + canvas.drawText(EmojiData.data[info.page][info.emojiIndex], getBounds().left, getBounds().bottom, textPaint); + return; + }*/ + if (emojiBmp[info.page][info.page2] == null) { + if (loadingEmoji[info.page][info.page2]) { + return; + } + loadingEmoji[info.page][info.page2] = true; + Utilities.globalQueue.postRunnable(new Runnable() { + @Override + public void run() { + loadEmoji(info.page, info.page2); + loadingEmoji[info.page][info.page2] = false; + } + }); + canvas.drawRect(getBounds(), placeholderPaint); + return; + } + + Rect b; + if (fullSize) { + b = getDrawRect(); + } else { + b = getBounds(); + } + + //if (!canvas.quickReject(b.left, b.top, b.right, b.bottom, Canvas.EdgeType.AA)) { + canvas.drawBitmap(emojiBmp[info.page][info.page2], info.rect, b, paint); + //} + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSPARENT; + } + + @Override + public void setAlpha(int alpha) { + + } + + @Override + public void setColorFilter(ColorFilter cf) { + + } + } + + private static class DrawableInfo { + public Rect rect; + public byte page; + public byte page2; + public int emojiIndex; + + public DrawableInfo(Rect r, byte p, byte p2, int index) { + rect = r; + page = p; + page2 = p2; + emojiIndex = index; + } + } + + private static boolean inArray(char c, char[] a) { + for (char cc : a) { + if (cc == c) { + return true; + } + } + return false; + } + + public static CharSequence replaceEmoji(CharSequence cs, Paint.FontMetricsInt fontMetrics, int size, boolean createNew) { + return replaceEmoji(cs, fontMetrics, size, createNew, null); + } + + public static CharSequence replaceEmoji(CharSequence cs, Paint.FontMetricsInt fontMetrics, int size, boolean createNew, int[] emojiOnly) { + if (cs == null || cs.length() == 0) { + return cs; + } + //SpannableStringLight.isFieldsAvailable(); + //SpannableStringLight s = new SpannableStringLight(cs.toString()); + Spannable s; + if (!createNew && cs instanceof Spannable) { + s = (Spannable) cs; + } else { + s = Spannable.Factory.getInstance().newSpannable(cs.toString()); + } + long buf = 0; + int emojiCount = 0; + char c; + int startIndex = -1; + int startLength = 0; + int previousGoodIndex = 0; + StringBuilder emojiCode = new StringBuilder(16); + boolean nextIsSkinTone; + EmojiDrawable drawable; + EmojiSpan span; + int length = cs.length(); + boolean doneEmoji = false; + //s.setSpansCount(emojiCount); + + try { + for (int i = 0; i < length; i++) { + c = cs.charAt(i); + if (c >= 0xD83C && c <= 0xD83E || (buf != 0 && (buf & 0xFFFFFFFF00000000L) == 0 && (buf & 0xFFFF) == 0xD83C && (c >= 0xDDE6 && c <= 0xDDFF))) { + if (startIndex == -1) { + startIndex = i; + } + emojiCode.append(c); + startLength++; + buf <<= 16; + buf |= c; + } else if (emojiCode.length() > 0 && (c == 0x2640 || c == 0x2642)) { + emojiCode.append(c); + startLength++; + buf = 0; + doneEmoji = true; + } else if (buf > 0 && (c & 0xF000) == 0xD000) { + emojiCode.append(c); + startLength++; + buf = 0; + doneEmoji = true; + } else if (c == 0x20E3) { + if (i > 0) { + char c2 = cs.charAt(previousGoodIndex); + if ((c2 >= '0' && c2 <= '9') || c2 == '#' || c2 == '*') { + startIndex = previousGoodIndex; + startLength = i - previousGoodIndex + 1; + emojiCode.append(c2); + emojiCode.append(c); + doneEmoji = true; + } + } + } else if ((c == 0x00A9 || c == 0x00AE || c >= 0x203C && c <= 0x3299) && EmojiData.dataCharsMap.containsKey(c)) { + if (startIndex == -1) { + startIndex = i; + } + startLength++; + emojiCode.append(c); + doneEmoji = true; + } else if (startIndex != -1) { + emojiCode.setLength(0); + startIndex = -1; + startLength = 0; + doneEmoji = false; + } else if (c != 0xfe0f) { + if (emojiOnly != null) { + emojiOnly[0] = 0; + emojiOnly = null; + } + } + previousGoodIndex = i; + for (int a = 0; a < 3; a++) { + if (i + 1 < length) { + c = cs.charAt(i + 1); + if (a == 1) { + if (c == 0x200D && emojiCode.length() > 0) { + emojiCode.append(c); + i++; + startLength++; + doneEmoji = false; + } + } else { + if (c >= 0xFE00 && c <= 0xFE0F) { + i++; + startLength++; + } + } + } + } + if (doneEmoji) { + if (emojiOnly != null) { + emojiOnly[0]++; + } + if (i + 2 < length) { + if (cs.charAt(i + 1) == 0xD83C && cs.charAt(i + 2) >= 0xDFFB && cs.charAt(i + 2) <= 0xDFFF) { + emojiCode.append(cs.subSequence(i + 1, i + 3)); + startLength += 2; + i += 2; + } + } + if (i + 2 < length) { + if (cs.charAt(i + 1) == 0x200D && (cs.charAt(i + 2) == 0x2640 || cs.charAt(i + 2) == 0x2642)) { + emojiCode.append(cs.subSequence(i + 1, i + 3)); + startLength += 2; + i += 2; + } + } + drawable = Emoji.getEmojiDrawable(emojiCode.subSequence(0, emojiCode.length())); + if (drawable != null) { + span = new EmojiSpan(drawable, DynamicDrawableSpan.ALIGN_BOTTOM, size, fontMetrics); + s.setSpan(span, startIndex, startIndex + startLength, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + emojiCount++; + } + startLength = 0; + startIndex = -1; + emojiCode.setLength(0); + doneEmoji = false; + } + if (Build.VERSION.SDK_INT < 23 && emojiCount >= 50) { + break; + } + } + } catch (Exception e) { + //FileLog.e("tmessages", e); + return cs; + } + return s; + } + + public static class EmojiSpan extends ImageSpan { + private Paint.FontMetricsInt fontMetrics = null; + private int size = Screen.dp(20); + + public EmojiSpan(EmojiDrawable d, int verticalAlignment, int s, Paint.FontMetricsInt original) { + super(d, verticalAlignment); + fontMetrics = original; + if (original != null) { + size = Math.abs(fontMetrics.descent) + Math.abs(fontMetrics.ascent); + if (size == 0) { + size = Screen.dp(20); + } + } + } + + public void replaceFontMetrics(Paint.FontMetricsInt newMetrics, int newSize) { + fontMetrics = newMetrics; + size = newSize; + } + + @Override + public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { + if (fm == null) { + fm = new Paint.FontMetricsInt(); + } + + if (fontMetrics == null) { + int sz = super.getSize(paint, text, start, end, fm); + + int offset = Screen.dp(8); + int w = Screen.dp(10); + fm.top = -w - offset; + fm.bottom = w - offset; + fm.ascent = -w - offset; + fm.leading = 0; + fm.descent = w - offset; + + return sz; + } else { + if (fm != null) { + fm.ascent = fontMetrics.ascent; + fm.descent = fontMetrics.descent; + + fm.top = fontMetrics.top; + fm.bottom = fontMetrics.bottom; + } + if (getDrawable() != null) { + getDrawable().setBounds(0, 0, size, size); + } + return size; + } + } + } +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiData.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiData.java new file mode 100644 index 0000000000..bf6703ae7e --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiData.java @@ -0,0 +1,339 @@ +package im.actor.sdk.view.emoji.keyboard.emoji; + +/** + * Created by 98379720172 on 05/01/17. + */ + + +import java.util.HashMap; + +public class EmojiData { + + public static final char[] emojiToFE0F = { + 0x2B50, 0x2600, 0x26C5, 0x2601, 0x26A1, 0x2744, 0x26C4, 0x2614, 0x2708, 0x26F5, + 0x2693, 0x26FD, 0x26F2, 0x26FA, 0x26EA, 0x2615, 0x26BD, 0x26BE, 0x26F3, 0x231A, + 0x260E, 0x231B, 0x2709, 0x2702, 0x2712, 0x270F, 0x2648, 0x2649, 0x264A, 0x264B, + 0x264C, 0x264D, 0x264E, 0x264F, 0x2650, 0x2651, 0x2652, 0x2653, 0x2734, 0x3299, + 0x3297, 0x26D4, 0x2B55, 0x2668, 0x2757, 0x203C, 0x2049, 0x303D, 0x26A0, 0x267B, + 0x2747, 0x2733, 0x24C2, 0x267F, 0x25B6, 0x25C0, 0x27A1, 0x2B05, 0x2B06, 0x2B07, + 0x2197, 0x2198, 0x2199, 0x2196, 0x2195, 0x2194, 0x21AA, 0x21A9, 0x2934, 0x2935, + 0x2139, 0x2714, 0x2716, 0x2611, 0x26AA, 0x26AB, 0x25AA, 0x25AB, 0x2B1B, 0x2B1C, + 0x25FC, 0x25FB, 0x25FE, 0x25FD, 0x2660, 0x2663, 0x2665, 0x2666, 0x263A, 0x2639, + 0x270C, 0x261D, 0x2764 + }; + //0xD83CDE2F, 0xD83CDC04, 0xD83CDE1A, 0xD83CDD7F + + public static final char[] dataChars = { + 0x262E, 0x271D, 0x262A, 0x2638, 0x2721, 0x262F, 0x2626, 0x26CE, 0x2648, 0x2649, + 0x264A, 0x264B, 0x264C, 0x264D, 0x264E, 0x264F, 0x2650, 0x2651, 0x2652, 0x2653, + 0x269B, 0x2622, 0x2623, 0x2734, 0x3299, 0x3297, 0x26D4, 0x274C, 0x2B55, 0x2668, + 0x2757, 0x2755, 0x2753, 0x2754, 0x203C, 0x2049, 0x269C, 0x303D, 0x26A0, 0x267B, + 0x2747, 0x2733, 0x274E, 0x2705, 0x27BF, 0x24C2, 0x267F, 0x25B6, 0x23F8, 0x23EF, + 0x23F9, 0x23FA, 0x23ED, 0x23EE, 0x23E9, 0x23EA, 0x25C0, 0x23EB, 0x23EC, 0x27A1, + 0x2B05, 0x2B06, 0x2B07, 0x2197, 0x2198, 0x2199, 0x2196, 0x2195, 0x2194, 0x21AA, + 0x21A9, 0x2934, 0x2935, 0x2139, 0x3030, 0x27B0, 0x2714, 0x2795, 0x2796, 0x2797, + 0x2716, 0x00A9, 0x00AE, 0x2122, 0x2611, 0x26AA, 0x26AB, 0x25AA, 0x25AB, 0x2B1B, + 0x2B1C, 0x25FC, 0x25FB, 0x25FE, 0x25FD, 0x2660, 0x2663, 0x2665, 0x2666, 0x263A, + 0x2639, 0x270A, 0x270C, 0x270B, 0x261D, 0x270D, 0x26D1, 0x2764, 0x2763, 0x2615, + 0x26BD, 0x26BE, 0x26F3, 0x26F7, 0x26F8, 0x26F9, 0x231A, 0x2328, 0x260E, 0x23F1, + 0x23F2, 0x23F0, 0x23F3, 0x231B, 0x2696, 0x2692, 0x26CF, 0x2699, 0x26D3, 0x2694, + 0x2620, 0x26B0, 0x26B1, 0x2697, 0x26F1, 0x2709, 0x2702, 0x2712, 0x270F, 0x2708, + 0x26F5, 0x26F4, 0x2693, 0x26FD, 0x26F2, 0x26F0, 0x26FA, 0x26EA, 0x26E9, 0x2618, + 0x2B50, 0x2728, 0x2604, 0x2600, 0x26C5, 0x2601, 0x26C8, 0x26A1, 0x2744, 0x2603, + 0x26C4, 0x2602, 0x2614 + }; + + public static final String[] emojiColored = { + "🙌","👏","👍","👎","👊","✊","👋","👈","👉","👆","👇","👌","☝","✌","✋", + "🖐","👐","💪","🙏","🖖","🤘","🖕","✍","💅","👂","👃","👶","👦","👧","👨", + "👩","👱‍♀","👱","👴","👵","👲","👳‍♀","👳","👮‍♀","👮","👷‍♀","👷","💂‍♀","💂", + "🕵‍♀","🕵","🎅","👸","👰","👼","🙇‍♀","🙇","💁","💁‍♂","🙅","🙅‍♂","🙆","🙆‍♂", + "🙋","🙋‍♂","🙎","🙎‍♂","🙍","🙍‍♂","💇","💇‍♂","💆","💆‍♂","💃","🚶‍♀","🚶","🏃‍♀", + "🏃","🏋‍♀","🏋","⛹‍♀","⛹","🏄‍♀","🏄","🏊‍♀","🏊","🚣‍♀","🚣","🚴‍♀","🚴","🚵‍♀", + "🚵","🛀" + }; + + public static final String[][] dataColored = { + new String[]{ + "😀","😬","😁","😂","😃","😄","😅","😆","😇","😉","😊","🙂","🙃","☺", + "😋","😌","😍","😘","😗","😙","😚","😜","😝","😛","🤑","🤓","😎","🤗", + "😏","😶","😐","😑","😒","🙄","🤔","😳","😞","😟","😠","😡","😔","😕", + "🙁","☹","😣","😖","😫","😩","😤","😮","😱","😨","😰","😯","😦","😧", + "😢","😥","😪","😓","😭","😵","😲","🤐","😷","🤒","🤕","😴","💤","💩", + "😈","👿","👹","👺","👻","💀","☠","👽","👾","🤖","😺","😸","😹","😻","😼","😽","🙀","😿","😾", + "🙌", + "👏", + "👍", + "👎", + "👊", + "✊", + "👋", + "👈", + "👉", + "👆", + "👇", + "👌", + "☝", + "✌", + "✋", + "🖐", + "👐", + "💪", + "🙏", + "🖖", + "🤘", + "🖕", + "✍", + "💅", + "👄","👅", + "👂", + "👃", + "👁","👀","🗣","👤","👥", + "👶", + "👦", + "👧", + "👨", + "👩", + "👱‍♀", + "👱", + "👴", + "👵", + "👲", + "👳‍♀", + "👳", + "👮‍♀", + "👮", + "👷‍♀", + "👷", + "💂‍♀", + "💂", + "🕵‍♀", + "🕵", + "🎅", + "👸", + "👰", + "👼", + "🙇‍♀", + "🙇", + "💁", + "💁‍♂", + "🙅", + "🙅‍♂", + "🙆", + "🙆‍♂", + "🙋", + "🙋‍♂", + "🙎", + "🙎‍♂", + "🙍", + "🙍‍♂", + "💇", + "💇‍♂", + "💆", + "💆‍♂", + "💃", + "👯","👯‍♂", + "🚶‍♀", + "🚶", + "🏃‍♀", + "🏃", + "👫","👭","👬","💑","👩‍❤‍👩","👨‍❤‍👨","💏","👩‍❤‍💋‍👩","👨‍❤‍💋‍👨","👪","👨‍👩‍👧", + "👨‍👩‍👧‍👦","👨‍👩‍👦‍👦","👨‍👩‍👧‍👧","👩‍👩‍👦","👩‍👩‍👧","👩‍👩‍👧‍👦","👩‍👩‍👦‍👦", + "👩‍👩‍👧‍👧","👨‍👨‍👦","👨‍👨‍👧","👨‍👨‍👧‍👦","👨‍👨‍👦‍👦","👨‍👨‍👧‍👧","👩‍👦","👩‍👧", + "👩‍👧‍👦","👩‍👦‍👦","👩‍👧‍👧","👨‍👦","👨‍👧","👨‍👧‍👦","👨‍👦‍👦","👨‍👧‍👧","👚","👕", + "👖","👔","👗","👙","👘","💄","💋","👣","👠","👡","👢","👞","👟","👒","🎩","🎓", + "👑","⛑","🎒","👝","👛","👜","💼","👓","🕶","💍","🌂","❤","💛","💚","💙","💜", + "💔","❣","💕","💞","💓","💗","💖","💘","💝" + }, + null, + new String[]{ + "🍏","🍎","🍐","🍊","🍋","🍌","🍉","🍇","🍓","🍈","🍒","🍑","🍍","🍅","🍆", + "🌶","🌽","🍠","🍯","🍞","🧀","🍗","🍖","🍤","🍳","🍔","🍟","🌭","🍕","🍝", + "🌮","🌯","🍜","🍲","🍥","🍣","🍱","🍛","🍙","🍚","🍘","🍢","🍡","🍧","🍨", + "🍦","🍰","🎂","🍮","🍬","🍭","🍫","🍿","🍩","🍪","🍺","🍻","🍷","🍸","🍹", + "🍾","🍶","🍵","☕","🍼","🍴","🍽","⚽","🏀","🏈","⚾","🎾","🏐","🏉","🎱", + "🏓","🏸","🏒","🏑","🏏","🏹","⛳","🎣","⛸","🎿","⛷","🏂", + "🏋‍♀", + "🏋", + "⛹‍♀", + "⛹", + "🏌‍♀","🏌", + "🏄‍♀", + "🏄", + "🏊‍♀", + "🏊", + "🚣‍♀", + "🚣","🏇", + "🚴‍♀", + "🚴", + "🚵‍♀", + "🚵", + "🛀", + "🕴","🎗","🎽","🏅","🎖","🏆","🏵","🎯","🎫","🎟","🎭","🎨","🎪","🎬","🎤","🎧", + "🎼","🎹","🎷","🎺","🎸","🎻","🎮","🎰","🎲","🎳","⌚","📱","📲","💻","⌨","🖥", + "🖨","🖱","🖲","🕹","🗜","💽","💾","💿","📀","📼","📷","📸","📹","🎥","📽","🎞", + "📞","☎","📟","📠","📺","📻","🎙","🎚","🎛","⏱","⏲","⏰","🕰","⏳","⌛","📡", + "🔋","🔌","💡","🔦","🕯","🗑","🛢","💸","💵","💴","💶","💷","💰","💳","💎","⚖", + "🔧","🔨","⚒","🛠","⛏","🔩","⚙","⛓","🔫","💣","🔪","🗡","⚔","🛡","🚬","⚰","⚱", + "🏺","🔮","📿","💈","⚗","🔭","🔬","🕳","💊","💉","🌡","🚽","🚿","🛁","🛎","🔑", + "🗝","🚪","🛋","🛌","🛏","🖼","⛱","🗿","🛍","🎁","🎈","🎏","🎀","🎊","🎉","🎐", + "🏮","🎎","✉","📩","📨","📧","💌","📥","📤","📦","🏷","🔖","📪","📫","📬","📭", + "📮","📯","📜","📃","📄","📑","📊","📈","📉","🗒","🗓","📆","📅","📇","🗃","🗳", + "🗄","📋","📁","📂","🗂","🗞","📰","📓","📔","📒","📕","📗","📘","📙","📚","📖", + "🔗","📎","🖇","📐","📏","✂","📌","📍","🚩","🎌","🏳","🏴","🏁","🏳‍🌈","🖌","🖍", + "🖊","🖋","✒","📝","✏","🔏","🔐","🔒","🔓","🔍","🔎" + }, + null, + null + }; + + public static final String[][] data = { + new String[]{ + "😀","😬","😁","😂","😃","😄","😅","😆","😇","😉","😊","🙂","🙃","☺","😋","😌", + "😍","😘","😗","😙","😚","😜","😝","😛","🤑","🤓","😎","🤗","😏","😶","😐","😑", + "😒","🙄","🤔","😳","😞","😟","😠","😡","😔","😕","🙁","☹","😣","😖","😫","😩", + "😤","😮","😱","😨","😰","😯","😦","😧","😢","😥","😪","😓","😭","😵","😲","🤐", + "😷","🤒","🤕","😴","💤","💩","😈","👿","👹","👺","👻","💀","☠","👽","👾","🤖", + "😺","😸","😹","😻","😼","😽","🙀","😿","😾","🙌","🙌🏻","🙌🏼","🙌🏽","🙌🏾", + "🙌🏿","👏","👏🏻","👏🏼","👏🏽","👏🏾","👏🏿","👍","👍🏻","👍🏼","👍🏽","👍🏾", + "👍🏿","👎","👎🏻","👎🏼","👎🏽","👎🏾","👎🏿","👊","👊🏻","👊🏼","👊🏽","👊🏾", + "👊🏿","✊","✊🏻","✊🏼","✊🏽","✊🏾","✊🏿","👋","👋🏻","👋🏼","👋🏽","👋🏾", + "👋🏿","👈","👈🏻","👈🏼","👈🏽","👈🏾","👈🏿","👉","👉🏻","👉🏼","👉🏽","👉🏾", + "👉🏿","👆","👆🏻","👆🏼","👆🏽","👆🏾","👆🏿","👇","👇🏻","👇🏼","👇🏽","👇🏾", + "👇🏿","👌","👌🏻","👌🏼","👌🏽","👌🏾","👌🏿","☝","☝🏻","☝🏼","☝🏽","☝🏾","☝🏿", + "✌","✌🏻","✌🏼","✌🏽","✌🏾","✌🏿","✋","✋🏻","✋🏼","✋🏽","✋🏾","✋🏿","🖐", + "🖐🏻","🖐🏼","🖐🏽","🖐🏾","🖐🏿","👐","👐🏻","👐🏼","👐🏽","👐🏾","👐🏿","💪", + "💪🏻","💪🏼","💪🏽","💪🏾","💪🏿","🙏","🙏🏻","🙏🏼","🙏🏽","🙏🏾","🙏🏿","🖖", + "🖖🏻","🖖🏼","🖖🏽","🖖🏾","🖖🏿","🤘","🤘🏻","🤘🏼","🤘🏽","🤘🏾","🤘🏿","🖕", + "🖕🏻","🖕🏼","🖕🏽","🖕🏾","🖕🏿","✍","✍🏻","✍🏼","✍🏽","✍🏾","✍🏿","💅","💅🏻", + "💅🏼","💅🏽","💅🏾","💅🏿","👄","👅","👂","👂🏻","👂🏼","👂🏽","👂🏾","👂🏿","👃", + "👃🏻","👃🏼","👃🏽","👃🏾","👃🏿","👁","👀","🗣","👤","👥","👶","👶🏻","👶🏼","👶🏽", + "👶🏾","👶🏿","👦","👦🏻","👦🏼","👦🏽","👦🏾","👦🏿","👧","👧🏻","👧🏼","👧🏽","👧🏾", + "👧🏿","👨","👨🏻","👨🏼","👨🏽","👨🏾","👨🏿","👩","👩🏻","👩🏼","👩🏽","👩🏾","👩🏿", + "👱‍♀","👱🏻‍♀","👱🏼‍♀","👱🏽‍♀","👱🏾‍♀","👱🏿‍♀","👱","👱🏻","👱🏼","👱🏽","👱🏾","👱🏿", + "👴","👴🏻","👴🏼","👴🏽","👴🏾","👴🏿","👵","👵🏻","👵🏼","👵🏽","👵🏾","👵🏿","👲", + "👲🏻","👲🏼","👲🏽","👲🏾","👲🏿","👳‍♀","👳🏻‍♀","👳🏼‍♀","👳🏽‍♀","👳🏾‍♀","👳🏿‍♀", + "👳","👳🏻","👳🏼","👳🏽","👳🏾","👳🏿","👮‍♀","👮🏻‍♀","👮🏼‍♀","👮🏽‍♀","👮🏾‍♀", + "👮🏿‍♀","👮","👮🏻","👮🏼","👮🏽","👮🏾","👮🏿","👷‍♀","👷🏻‍♀","👷🏼‍♀","👷🏽‍♀", + "👷🏾‍♀","👷🏿‍♀","👷","👷🏻","👷🏼","👷🏽","👷🏾","👷🏿","💂‍♀","💂🏻‍♀","💂🏼‍♀", + "💂🏽‍♀","💂🏾‍♀","💂🏿‍♀","💂","💂🏻","💂🏼","💂🏽","💂🏾","💂🏿","🕵‍♀","🕵🏻‍♀", + "🕵🏼‍♀","🕵🏽‍♀","🕵🏾‍♀","🕵🏿‍♀","🕵","🕵🏻","🕵🏼","🕵🏽","🕵🏾","🕵🏿","🎅", + "🎅🏻","🎅🏼","🎅🏽","🎅🏾","🎅🏿","👸","👸🏻","👸🏼","👸🏽","👸🏾","👸🏿","👰", + "👰🏻","👰🏼","👰🏽","👰🏾","👰🏿","👼","👼🏻","👼🏼","👼🏽","👼🏾","👼🏿","🙇‍♀", + "🙇🏻‍♀","🙇🏼‍♀","🙇🏽‍♀","🙇🏾‍♀","🙇🏿‍♀","🙇","🙇🏻","🙇🏼","🙇🏽","🙇🏾","🙇🏿", + "💁","💁🏻","💁🏼","💁🏽","💁🏾","💁🏿","💁‍♂","💁🏻‍♂","💁🏼‍♂","💁🏽‍♂","💁🏾‍♂", + "💁🏿‍♂","🙅","🙅🏻","🙅🏼","🙅🏽","🙅🏾","🙅🏿","🙅‍♂","🙅🏻‍♂","🙅🏼‍♂","🙅🏽‍♂", + "🙅🏾‍♂","🙅🏿‍♂","🙆","🙆🏻","🙆🏼","🙆🏽","🙆🏾","🙆🏿","🙆‍♂","🙆🏻‍♂","🙆🏼‍♂","🙆🏽‍♂", + "🙆🏾‍♂","🙆🏿‍♂","🙋","🙋🏻","🙋🏼","🙋🏽","🙋🏾","🙋🏿","🙋‍♂","🙋🏻‍♂","🙋🏼‍♂","🙋🏽‍♂", + "🙋🏾‍♂","🙋🏿‍♂","🙎","🙎🏻","🙎🏼","🙎🏽","🙎🏾","🙎🏿","🙎‍♂","🙎🏻‍♂","🙎🏼‍♂","🙎🏽‍♂", + "🙎🏾‍♂","🙎🏿‍♂","🙍","🙍🏻","🙍🏼","🙍🏽","🙍🏾","🙍🏿","🙍‍♂","🙍🏻‍♂","🙍🏼‍♂","🙍🏽‍♂", + "🙍🏾‍♂","🙍🏿‍♂","💇","💇🏻","💇🏼","💇🏽","💇🏾","💇🏿","💇‍♂","💇🏻‍♂","💇🏼‍♂","💇🏽‍♂", + "💇🏾‍♂","💇🏿‍♂","💆","💆🏻","💆🏼","💆🏽","💆🏾","💆🏿","💆‍♂","💆🏻‍♂","💆🏼‍♂","💆🏽‍♂", + "💆🏾‍♂","💆🏿‍♂","💃","💃🏻","💃🏼","💃🏽","💃🏾","💃🏿","👯","👯‍♂","🚶‍♀","🚶🏻‍♀","🚶🏼‍♀", + "🚶🏽‍♀","🚶🏾‍♀","🚶🏿‍♀","🚶","🚶🏻","🚶🏼","🚶🏽","🚶🏾","🚶🏿","🏃‍♀","🏃🏻‍♀","🏃🏼‍♀", + "🏃🏽‍♀","🏃🏾‍♀","🏃🏿‍♀","🏃","🏃🏻","🏃🏼","🏃🏽","🏃🏾","🏃🏿","👫","👭","👬","💑","👩‍❤‍👩", + "👨‍❤‍👨","💏","👩‍❤‍💋‍👩","👨‍❤‍💋‍👨","👪","👨‍👩‍👧","👨‍👩‍👧‍👦","👨‍👩‍👦‍👦","👨‍👩‍👧‍👧","👩‍👩‍👦", + "👩‍👩‍👧","👩‍👩‍👧‍👦","👩‍👩‍👦‍👦","👩‍👩‍👧‍👧","👨‍👨‍👦","👨‍👨‍👧","👨‍👨‍👧‍👦","👨‍👨‍👦‍👦","👨‍👨‍👧‍👧", + "👩‍👦","👩‍👧","👩‍👧‍👦","👩‍👦‍👦","👩‍👧‍👧","👨‍👦","👨‍👧","👨‍👧‍👦","👨‍👦‍👦","👨‍👧‍👧","👚","👕", + "👖","👔","👗","👙","👘","💄","💋","👣","👠","👡","👢","👞","👟","👒","🎩","🎓","👑","⛑","🎒", + "👝","👛","👜","💼","👓","🕶","💍","🌂","❤","💛","💚","💙","💜","💔","❣","💕","💞","💓","💗","💖","💘","💝" + }, + new String[]{ + "🐶","🐱","🐭","🐹","🐰","🐻","🐼","🐨","🐯","🦁","🐮","🐷","🐽","🐸","🐙","🐵","🙈","🙉", + "🙊","🐒","🐔","🐧","🐦","🐤","🐣","🐥","🐺","🐗","🐴","🦄","🐝","🐛","🐌","🐞","🐜","🕷", + "🦂","🦀","🐍","🐢","🐠","🐟","🐡","🐬","🐳","🐋","🐊","🐆","🐅","🐃","🐂","🐄","🐪","🐫", + "🐘","🐐","🐏","🐑","🐎","🐖","🐀","🐁","🐓","🦃","🕊","🐕","🐩","🐈","🐇","🐿","🐾","🐉", + "🐲","🌵","🎄","🌲","🌳","🌴","🌱","🌿","☘","🍀","🎍","🎋","🍃","🍂","🍁","🌾","🌺","🌻", + "🌹","🌷","🌼","🌸","💐","🍄","🌰","🎃","🐚","🕸","🌎","🌍","🌏","🌕","🌖","🌗","🌘","🌑", + "🌒","🌓","🌔","🌚","🌝","🌛","🌜","🌞","🌙","⭐","🌟","💫","✨","☄","☀","🌤","⛅","🌥", + "🌦","☁","🌧","⛈","🌩","⚡","🔥","💥","❄","🌨","☃","⛄","🌬","💨","🌪","🌫","☂","☔","💧","💦","🌊" + }, + new String[]{ + "🍏","🍎","🍐","🍊","🍋","🍌","🍉","🍇","🍓","🍈","🍒","🍑","🍍","🍅","🍆","🌶","🌽", + "🍠","🍯","🍞","🧀","🍗","🍖","🍤","🍳","🍔","🍟","🌭","🍕","🍝","🌮","🌯","🍜","🍲", + "🍥","🍣","🍱","🍛","🍙","🍚","🍘","🍢","🍡","🍧","🍨","🍦","🍰","🎂","🍮","🍬","🍭", + "🍫","🍿","🍩","🍪","🍺","🍻","🍷","🍸","🍹","🍾","🍶","🍵","☕","🍼","🍴","🍽","⚽", + "🏀","🏈","⚾","🎾","🏐","🏉","🎱","🏓","🏸","🏒","🏑","🏏","🏹","⛳","🎣","⛸","🎿", + "⛷","🏂","🏋‍♀","🏋🏻‍♀","🏋🏼‍♀","🏋🏽‍♀","🏋🏾‍♀","🏋🏿‍♀","🏋","🏋🏻","🏋🏼","🏋🏽", + "🏋🏾","🏋🏿","⛹‍♀","⛹🏻‍♀","⛹🏼‍♀","⛹🏽‍♀","⛹🏾‍♀","⛹🏿‍♀","⛹","⛹🏻","⛹🏼", + "⛹🏽","⛹🏾","⛹🏿","🏌‍♀","🏌","🏄‍♀","🏄🏻‍♀","🏄🏼‍♀","🏄🏽‍♀","🏄🏾‍♀","🏄🏿‍♀", + "🏄","🏄🏻","🏄🏼","🏄🏽","🏄🏾","🏄🏿","🏊‍♀","🏊🏻‍♀","🏊🏼‍♀","🏊🏽‍♀","🏊🏾‍♀", + "🏊🏿‍♀","🏊","🏊🏻","🏊🏼","🏊🏽","🏊🏾","🏊🏿","🚣‍♀","🚣🏻‍♀","🚣🏼‍♀","🚣🏽‍♀", + "🚣🏾‍♀","🚣🏿‍♀","🚣","🚣🏻","🚣🏼","🚣🏽","🚣🏾","🚣🏿","🏇","🚴‍♀","🚴🏻‍♀","🚴🏼‍♀", + "🚴🏽‍♀","🚴🏾‍♀","🚴🏿‍♀","🚴","🚴🏻","🚴🏼","🚴🏽","🚴🏾","🚴🏿","🚵‍♀","🚵🏻‍♀","🚵🏼‍♀", + "🚵🏽‍♀","🚵🏾‍♀","🚵🏿‍♀","🚵","🚵🏻","🚵🏼","🚵🏽","🚵🏾","🚵🏿","🛀","🛀🏻","🛀🏼", + "🛀🏽","🛀🏾","🛀🏿","🕴","🎗","🎽","🏅","🎖","🏆","🏵","🎯","🎫","🎟","🎭","🎨","🎪", + "🎬","🎤","🎧","🎼","🎹","🎷","🎺","🎸","🎻","🎮","🎰","🎲","🎳","⌚","📱","📲","💻", + "⌨","🖥","🖨","🖱","🖲","🕹","🗜","💽","💾","💿","📀","📼","📷","📸","📹","🎥","📽", + "🎞","📞","☎","📟","📠","📺","📻","🎙","🎚","🎛","⏱","⏲","⏰","🕰","⏳","⌛","📡", + "🔋","🔌","💡","🔦","🕯","🗑","🛢","💸","💵","💴","💶","💷","💰","💳","💎","⚖","🔧", + "🔨","⚒","🛠","⛏","🔩","⚙","⛓","🔫","💣","🔪","🗡","⚔","🛡","🚬","⚰","⚱","🏺","🔮", + "📿","💈","⚗","🔭","🔬","🕳","💊","💉","🌡","🚽","🚿","🛁","🛎","🔑","🗝","🚪","🛋","🛌", + "🛏","🖼","⛱","🗿","🛍","🎁","🎈","🎏","🎀","🎊","🎉","🎐","🏮","🎎","✉","📩","📨","📧", + "💌","📥","📤","📦","🏷","🔖","📪","📫","📬","📭","📮","📯","📜","📃","📄","📑","📊","📈", + "📉","🗒","🗓","📆","📅","📇","🗃","🗳","🗄","📋","📁","📂","🗂","🗞","📰","📓","📔","📒", + "📕","📗","📘","📙","📚","📖","🔗","📎","🖇","📐","📏","✂","📌","📍","🚩","🎌","🏳","🏴", + "🏁","🏳‍🌈","🖌","🖍","🖊","🖋","✒","📝","✏","🔏","🔐","🔒","🔓","🔍","🔎" + }, + new String[]{ + "🚗","🚕","🚙","🚌","🚎","🏎","🚓","🚑","🚒","🚐","🚚","🚛","🚜","🏍","🚲","🚨","🚔","🚍", + "🚘","🚖","🚡","🚠","🚟","🚃","🚋","🚝","🚄","🚅","🚈","🚞","🚂","🚆","🚇","🚊","🚉","🚁", + "🛩","✈","🛫","🛬","⛵","🛥","🚤","⛴","🛳","🚀","🛰","💺","⚓","🚧","⛽","🚏","🚦","🚥", + "🗺","🚢","🎡","🎢","🎠","🏗","🌁","🗼","🏭","⛲","🎑","⛰","🏔","🗻","🌋","🗾","🏕","⛺", + "🏞","🛣","🛤","🌅","🌄","🏜","🏖","🏝","🌇","🌆","🏙","🌃","🌉","🌌","🌠","🎇","🎆","🌈", + "🏘","🏰","🏯","🏟","🗽","🏠","🏡","🏚","🏢","🏬","🏣","🏤","🏥","🏦","🏨","🏪","🏫","🏩", + "💒","🏛","⛪","🕌","🕍","🕋","⛩","🇦🇺","🇦🇹","🇦🇿","🇦🇽","🇦🇱","🇩🇿","🇦🇸","🇦🇮","🇦🇴", + "🇦🇩","🇦🇶","🇦🇬","🇦🇷","🇦🇲","🇦🇼","🇦🇫","🇧🇸","🇧🇩","🇧🇧","🇧🇭","🇧🇾","🇧🇿","🇧🇪", + "🇧🇯","🇧🇲","🇧🇬","🇧🇴","🇧🇶","🇧🇦","🇧🇼","🇧🇷","🇮🇴","🇧🇳","🇧🇫","🇧🇮","🇧🇹","🇻🇺", + "🇻🇦","🇬🇧","🇭🇺","🇻🇪","🇻🇬","🇻🇮","🇹🇱","🇻🇳","🇬🇦","🇭🇹","🇬🇾","🇬🇲","🇬🇭","🇬🇵", + "🇬🇹","🇬🇳","🇬🇼","🇩🇪","🇬🇬","🇬🇮","🇭🇳","🇭🇰","🇬🇩","🇬🇱","🇬🇷","🇬🇪","🇬🇺","🇩🇰", + "🇯🇪","🇩🇯","🇩🇲","🇩🇴","🇪🇺","🇪🇬","🇿🇲","🇪🇭","🇿🇼","🇮🇱","🇮🇳","🇮🇩","🇯🇴","🇮🇶", + "🇮🇷","🇮🇪","🇮🇸","🇪🇸","🇮🇹","🇾🇪","🇨🇻","🇰🇿","🇰🇾","🇰🇭","🇨🇲","🇨🇦","🇮🇨","🇶🇦", + "🇰🇪","🇨🇾","🇰🇬","🇰🇮","🇨🇳","🇰🇵","🇨🇨","🇨🇴","🇰🇲","🇨🇬","🇨🇩","🇽🇰","🇨🇷","🇨🇮", + "🇨🇺","🇰🇼","🇨🇼","🇱🇦","🇱🇻","🇱🇸","🇱🇷","🇱🇧","🇱🇾","🇱🇹","🇱🇮","🇱🇺","🇲🇺","🇲🇷", + "🇲🇬","🇾🇹","🇲🇴","🇲🇰","🇲🇼","🇲🇾","🇲🇱","🇲🇻","🇲🇹","🇲🇦","🇲🇶","🇲🇭","🇲🇽","🇫🇲", + "🇲🇿","🇲🇩","🇲🇨","🇲🇳","🇲🇸","🇲🇲","🇳🇦","🇳🇷","🇳🇵","🇳🇪","🇳🇬","🇳🇱","🇳🇮","🇳🇺", + "🇳🇿","🇳🇨","🇳🇴","🇮🇲","🇳🇫","🇨🇽","🇸🇭","🇨🇰","🇹🇨","🇦🇪","🇴🇲","🇵🇳","🇵🇰","🇵🇼", + "🇵🇸","🇵🇦","🇵🇬","🇵🇾","🇵🇪","🇵🇱","🇵🇹","🇵🇷","🇰🇷","🇷🇪","🇷🇺","🇷🇼","🇷🇴","🇸🇻", + "🇼🇸","🇸🇲","🇸🇹","🇸🇦","🇸🇿","🇲🇵","🇸🇨","🇧🇱","🇵🇲","🇸🇳","🇻🇨","🇰🇳","🇱🇨","🇷🇸", + "🇸🇬","🇸🇽","🇸🇾","🇸🇰","🇸🇮","🇺🇸","🇸🇧","🇸🇴","🇸🇩","🇸🇷","🇸🇱","🇹🇯","🇹🇭","🇹🇼", + "🇹🇿","🇹🇬","🇹🇰","🇹🇴","🇹🇹","🇹🇻","🇹🇳","🇹🇲","🇹🇷","🇺🇬","🇺🇿","🇺🇦","🇼🇫","🇺🇾", + "🇫🇴","🇫🇯","🇵🇭","🇫🇮","🇫🇰","🇫🇷","🇬🇫","🇵🇫","🇹🇫","🇭🇷","🇨🇫","🇹🇩","🇲🇪","🇨🇿", + "🇨🇱","🇨🇭","🇸🇪","🇱🇰","🇪🇨","🇬🇶","🇪🇷","🇪🇪","🇪🇹","🇿🇦","🇬🇸","🇸🇸","🇯🇲","🇯🇵" + }, + new String[]{ + "💟","☮","✝","☪","🕉","☸","✡","🔯","🕎","☯","☦","🛐","⛎","♈","♉","♊","♋","♌","♍","♎","♏", + "♐","♑","♒","♓","🆔","⚛","🈳","🈹","☢","☣","📴","📳","🈶","🈚","🈸","🈺","🈷","✴","🆚","🉑", + "💮","🉐","㊙","㊗","🈴","🈵","🈲","🅰","🅱","🆎","🆑","🅾","🆘","⛔","📛","🚫","❌","⭕","💢", + "♨","🚷","🚯","🚳","🚱","🔞","📵","❗","❕","❓","❔","‼","⁉","💯","🔅","🔆","🔱","⚜","〽","⚠", + "🚸","🔰","♻","🈯","💹","❇","✳","❎","✅","🌐","Ⓜ","💠","🌀","➿","🏧","🈂","🛂","🛃","🛄", + "🛅","♿","🚭","🚾","🅿","🚰","🚹","🚺","🚼","🚻","🚮","🎦","📶","🈁","🔤","🔡","🔠","🔣","ℹ", + "🆖","🆗","🆙","🆒","🆕","🆓","0⃣","1⃣","2⃣","3⃣","4⃣","5⃣","6⃣","7⃣","8⃣","9⃣","🔟","🔢","#⃣","*⃣","▶", + "⏸","⏯","⏹","⏺","⏭","⏮","⏩","⏪","⏫","⏬","◀","🔼","🔽","➡","⬅","⬆","⬇","↗","↘","↙", + "↖","↕","↔","↪","↩","⤴","⤵","🔀","🔁","🔂","🔄","🔃","🎵","🎶","〰","➰","✔","➕","➖","➗", + "✖","💲","💱","™","©","®","🔚","🔙","🔛","🔝","🔜","☑","🔘","⚪","⚫","🔴","🔵","🔺","🔻","🔸", + "🔹","🔶","🔷","🔳","🔲","▪","▫","◾","◽","◼","◻","⬛","⬜","🔇","🔈","🔉","🔊","🔕","🔔","📣", + "📢","👁‍🗨","💬","💭","🗯","🃏","🀄","🎴","♠","♣","♥","♦","🕐","🕑","🕒","🕓","🕔","🕕","🕖", + "🕗","🕘","🕙","🕚","🕛","🕜","🕝","🕞","🕟","🕠","🕡","🕢","🕣","🕤","🕥","🕦","🕧" + } + }; + + public static final HashMap emojiToFE0FMap = new HashMap<>(emojiToFE0F.length); + public static final HashMap dataCharsMap = new HashMap<>(dataChars.length); + public static final HashMap emojiColoredMap = new HashMap<>(emojiColored.length); + + static { + for (int a = 0; a < emojiToFE0F.length; a++) { + emojiToFE0FMap.put(emojiToFE0F[a], true); + } + for (int a = 0; a < dataChars.length; a++) { + dataCharsMap.put(dataChars[a], true); + } + for (int a = 0; a < emojiColored.length; a++) { + emojiColoredMap.put(emojiColored[a], true); + } + dataColored[1] = data[1]; + dataColored[3] = data[3]; + dataColored[4] = data[4]; + } +} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java index 7c8c7416f4..68600840e0 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java @@ -1,13 +1,49 @@ package im.actor.sdk.view.emoji.keyboard.emoji; +import android.annotation.TargetApi; +import android.app.Activity; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.database.DataSetObserver; +import android.graphics.Canvas; +import android.graphics.Outline; +import android.graphics.Paint; +import android.graphics.RectF; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.support.v7.widget.RecyclerView; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.HapticFeedbackConstants; +import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; +import android.view.ViewGroup; +import android.view.ViewOutlineProvider; import android.view.ViewTreeObserver; +import android.view.WindowManager; +import android.widget.BaseAdapter; import android.widget.FrameLayout; +import android.widget.GridView; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.PopupWindow; +import android.widget.TextView; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; + +import im.actor.runtime.Log; +import im.actor.sdk.R; +import im.actor.sdk.util.AndroidUtils; +import im.actor.sdk.util.Screen; import im.actor.sdk.view.emoji.EmojiData; /** @@ -24,6 +60,37 @@ public interface Listener { void onClearEmojiRecent(); } + private static final Field superListenerField; + static { + Field f = null; + try { + f = PopupWindow.class.getDeclaredField("mOnScrollChangedListener"); + f.setAccessible(true); + } catch (NoSuchFieldException e) { + /* ignored */ + } + superListenerField = f; + } + + private static final ViewTreeObserver.OnScrollChangedListener NOP = new ViewTreeObserver.OnScrollChangedListener() { + @Override + public void onScrollChanged() { + /* do nothing */ + } + }; + + private static String addColorToCode(String code, String color) { + String end = null; + if (code.endsWith("\u200D\u2640") || code.endsWith("\u200D\u2642")) { + end = code.substring(code.length() - 2); + code = code.substring(0, code.length() - 2); + } + code += color; + if (end != null) { + code += end; + } + return code; + } private class ImageViewEmoji extends ImageView { @@ -73,16 +140,17 @@ public boolean onLongClick(View view) { pickerView.setSelection(0); } view.getLocationOnScreen(location); - int x = emojiSize * pickerView.getSelection() + AndroidUtilities.dp(4 * pickerView.getSelection() - (AndroidUtilities.isTablet() ? 5 : 1)); - if (location[0] - x < AndroidUtilities.dp(5)) { - x += (location[0] - x) - AndroidUtilities.dp(5); - } else if (location[0] - x + popupWidth > AndroidUtilities.displaySize.x - AndroidUtilities.dp(5)) { - x += (location[0] - x + popupWidth) - (AndroidUtilities.displaySize.x - AndroidUtilities.dp(5)); + + int x = emojiSize * pickerView.getSelection() + Screen.dp(4 * pickerView.getSelection() - (AndroidUtils.isTablet() ? 5 : 1)); + if (location[0] - x < Screen.dp(5)) { + x += (location[0] - x) - Screen.dp(5); + } else if (location[0] - x + popupWidth > Screen.displaySize.x - Screen.dp(5)) { + x += (location[0] - x + popupWidth) - (Screen.displaySize.x - Screen.dp(5)); } int xOffset = -x; int yOffset = view.getTop() < 0 ? view.getTop() : 0; - pickerView.setEmoji(code, AndroidUtilities.dp(AndroidUtilities.isTablet() ? 30 : 22) - xOffset + (int) AndroidUtilities.dpf2(0.5f)); + pickerView.setEmoji(code, Screen.dp(AndroidUtils.isTablet() ? 30 : 22) - xOffset + (int) Screen.dpf2(0.5f)); pickerViewPopup.setFocusable(true); pickerViewPopup.showAsDropDown(view, xOffset, -view.getMeasuredHeight() - popupHeight + (view.getMeasuredHeight() - emojiSize) / 2 - yOffset); @@ -188,7 +256,7 @@ public boolean onTouchEvent(MotionEvent event) { } else if (event.getAction() == MotionEvent.ACTION_MOVE) { boolean ignore = false; if (touchedX != -10000) { - if (Math.abs(touchedX - event.getX()) > AndroidUtilities.getPixelsInCM(0.2f, true) || Math.abs(touchedY - event.getY()) > AndroidUtilities.getPixelsInCM(0.2f, false)) { + if (Math.abs(touchedX - event.getX()) > Screen.getPixelsInCM(0.2f, true) || Math.abs(touchedY - event.getY()) > Screen.getPixelsInCM(0.2f, false)) { touchedX = -10000; touchedY = -10000; } else { @@ -199,8 +267,8 @@ public boolean onTouchEvent(MotionEvent event) { getLocationOnScreen(location); float x = location[0] + event.getX(); pickerView.getLocationOnScreen(location); - x -= location[0] + AndroidUtilities.dp(3); - int position = (int) (x / (emojiSize + AndroidUtilities.dp(4))); + x -= location[0] + Screen.dp(3); + int position = (int) (x / (emojiSize + Screen.dp(4))); if (position < 0) { position = 0; } else if (position > 5) { @@ -293,7 +361,7 @@ public void showAsDropDown(View anchor, int xoff, int yoff) { super.showAsDropDown(anchor, xoff, yoff); registerListener(anchor); } catch (Exception e) { - FileLog.e("tmessages", e); + Log.e("tmessages", e); } } @@ -327,4 +395,1174 @@ public void dismiss() { } } + private class EmojiColorPickerView extends View { + + private Drawable backgroundDrawable; + private Drawable arrowDrawable; + private String currentEmoji; + private int arrowX; + private int selection; + private Paint rectPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private RectF rect = new RectF(); + + public void setEmoji(String emoji, int arrowPosition) { + currentEmoji = emoji; + arrowX = arrowPosition; + rectPaint.setColor(0x2f000000); + invalidate(); + } + + public String getEmoji() { + return currentEmoji; + } + + public void setSelection(int position) { + if (selection == position) { + return; + } + selection = position; + invalidate(); + } + + public int getSelection() { + return selection; + } + + public EmojiColorPickerView(Context context) { + super(context); + + backgroundDrawable = getResources().getDrawable(R.drawable.stickers_back_all); + arrowDrawable = getResources().getDrawable(R.drawable.stickers_back_arrow); + } + + @Override + protected void onDraw(Canvas canvas) { + backgroundDrawable.setBounds(0, 0, getMeasuredWidth(), Screen.dp(AndroidUtils.isTablet() ? 60 : 52)); + backgroundDrawable.draw(canvas); + + arrowDrawable.setBounds(arrowX - Screen.dp(9), Screen.dp(AndroidUtils.isTablet() ? 55.5f : 47.5f), arrowX + Screen.dp(9), Screen.dp((AndroidUtils.isTablet() ? 55.5f : 47.5f) + 8)); + arrowDrawable.draw(canvas); + + if (currentEmoji != null) { + String code; + for (int a = 0; a < 6; a++) { + int x = emojiSize * a + Screen.dp(5 + 4 * a); + int y = Screen.dp(9); + if (selection == a) { + rect.set(x, y - (int) Screen.dpf2(3.5f), x + emojiSize, y + emojiSize + Screen.dp(3)); + canvas.drawRoundRect(rect, Screen.dp(4), Screen.dp(4), rectPaint); + } + code = currentEmoji; + if (a != 0) { + String color; + switch (a) { + case 1: + color = "\uD83C\uDFFB"; + break; + case 2: + color = "\uD83C\uDFFC"; + break; + case 3: + color = "\uD83C\uDFFD"; + break; + case 4: + color = "\uD83C\uDFFE"; + break; + case 5: + color = "\uD83C\uDFFF"; + break; + default: + color = ""; + } + code = addColorToCode(code, color); + } + Drawable drawable = Emoji.getEmojiBigDrawable(code); + if (drawable != null) { + drawable.setBounds(x, y, x + emojiSize, y + emojiSize); + drawable.draw(canvas); + } + } + } + } + } + + private ArrayList adapters = new ArrayList<>(); + private HashMap emojiUseHistory = new HashMap<>(); + private static HashMap emojiColor = new HashMap<>(); + private ArrayList recentEmoji = new ArrayList<>(); + + + private Drawable dotDrawable; + + private int[] icons = { + R.drawable.ic_emoji_recent, + R.drawable.ic_emoji_smile, + R.drawable.ic_emoji_flower, + R.drawable.ic_emoji_bell, + R.drawable.ic_emoji_car, + R.drawable.ic_emoji_symbol, + R.drawable.ic_smiles2_stickers}; + + private Listener listener; + private ViewPager pager; + private FrameLayout stickersWrap; + private ArrayList views = new ArrayList<>(); + private ArrayList emojiGrids = new ArrayList<>(); + private ImageView backspaceButton; + private StickersGridAdapter stickersGridAdapter; + private LinearLayout emojiTab; +// private ScrollSlidingTabStrip stickersTab; +// private RecyclerListView stickersGridView; +// private GridLayoutManager stickersLayoutManager; + private TextView stickersEmptyView; +// private RecyclerListView gifsGridView; +// private ExtendedGridLayoutManager flowLayoutManager; +// private GifsAdapter gifsAdapter; +// private RecyclerListView trendingGridView; +// private GridLayoutManager trendingLayoutManager; +// private TrendingGridAdapter trendingGridAdapter; +// private RecyclerListView.OnItemClickListener stickersOnItemClickListener; + private PagerSlidingTabStrip pagerSlidingTabStrip; + + private boolean trendingLoaded; + + private int currentPage; + + private EmojiColorPickerView pickerView; + private EmojiPopupWindow pickerViewPopup; + private int popupWidth; + private int popupHeight; + private int emojiSize; + private int location[] = new int[2]; + private int stickersTabOffset; + private int recentTabBum = -2; + private int gifTabNum = -2; + private int trendingTabNum = -2; + private boolean switchToGifTab; + + private boolean isLayout; + private int currentBackgroundType = -1; + private Object outlineProvider; + + private int oldWidth; + private int lastNotifyWidth; + + private boolean backspacePressed; + private boolean backspaceOnce; + private boolean showGifs; + + private int minusDy; + + public EmojiView(boolean needStickers, boolean needGif, final Context context) { + super(context); + + showGifs = needGif; + + dotDrawable = context.getResources().getDrawable(R.drawable.bluecircle); + + if (Build.VERSION.SDK_INT >= 21) { + outlineProvider = new ViewOutlineProvider() { + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + @Override + public void getOutline(View view, Outline outline) { + outline.setRoundRect(view.getPaddingLeft(), view.getPaddingTop(), view.getMeasuredWidth() - view.getPaddingRight(), view.getMeasuredHeight() - view.getPaddingBottom(), Screen.dp(6)); + } + }; + } + + for (int i = 0; i < EmojiData.dataColored.length + 1; i++) { + GridView gridView = new GridView(context); + if (AndroidUtils.isTablet()) { + gridView.setColumnWidth(Screen.dp(60)); + } else { + gridView.setColumnWidth(Screen.dp(45)); + } + gridView.setNumColumns(-1); + EmojiGridAdapter emojiGridAdapter = new EmojiGridAdapter(i - 1); + AndroidUtilities.setListViewEdgeEffectColor(gridView, 0xfff5f6f7); + gridView.setAdapter(emojiGridAdapter); + adapters.add(emojiGridAdapter); + emojiGrids.add(gridView); + FrameLayout frameLayout = new FrameLayout(context); + frameLayout.addView(gridView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, 0, 48, 0, 0)); + + views.add(frameLayout); + } + + + + pager = new ViewPager(context) { + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (getParent() != null) { + getParent().requestDisallowInterceptTouchEvent(true); + } + return super.onInterceptTouchEvent(ev); + } + }; + pager.setAdapter(new EmojiPagesAdapter()); + + emojiTab = new LinearLayout(context) { + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (getParent() != null) { + getParent().requestDisallowInterceptTouchEvent(true); + } + return super.onInterceptTouchEvent(ev); + } + }; + emojiTab.setOrientation(LinearLayout.HORIZONTAL); + addView(emojiTab, LayoutHelper.createFrame(LayoutParams.MATCH_PARENT, 48)); + + pagerSlidingTabStrip = new PagerSlidingTabStrip(context); + pagerSlidingTabStrip.setViewPager(pager); + pagerSlidingTabStrip.setShouldExpand(true); + pagerSlidingTabStrip.setIndicatorHeight(Screen.dp(2)); + pagerSlidingTabStrip.setUnderlineHeight(Screen.dp(1)); + pagerSlidingTabStrip.setIndicatorColor(0xff2b96e2); + pagerSlidingTabStrip.setUnderlineColor(0xffe2e5e7); + emojiTab.addView(pagerSlidingTabStrip, LayoutHelper.createLinear(0, 48, 1.0f)); + pagerSlidingTabStrip.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + EmojiView.this.onPageScrolled(position, getMeasuredWidth() - getPaddingLeft() - getPaddingRight(), positionOffsetPixels); + } + + @Override + public void onPageSelected(int position) { + saveNewPage(); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + + FrameLayout frameLayout = new FrameLayout(context); + emojiTab.addView(frameLayout, LayoutHelper.createLinear(52, 48)); + + backspaceButton = new ImageView(context) { + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + backspacePressed = true; + backspaceOnce = false; + postBackspaceRunnable(350); + } else if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_UP) { + backspacePressed = false; + if (!backspaceOnce) { + if (listener != null && listener.onBackspace()) { + backspaceButton.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); + } + } + } + super.onTouchEvent(event); + return true; + } + }; + backspaceButton.setImageResource(R.drawable.ic_smiles_backspace); + backspaceButton.setBackgroundResource(R.drawable.ic_emoji_backspace); + backspaceButton.setScaleType(ImageView.ScaleType.CENTER); + frameLayout.addView(backspaceButton, LayoutHelper.createFrame(52, 48)); + + View view = new View(context); + view.setBackgroundColor(0xffe2e5e7); + frameLayout.addView(view, LayoutHelper.createFrame(52, 1, Gravity.LEFT | Gravity.BOTTOM)); + + TextView textView = new TextView(context); + textView.setText(LocaleController.getString("NoRecent", R.string.NoRecent)); + textView.setTextSize(18); + textView.setTextColor(0xff888888); + textView.setGravity(Gravity.CENTER); + textView.setClickable(false); + textView.setFocusable(false); + ((FrameLayout) views.get(0)).addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 0, 48, 0, 0)); + emojiGrids.get(0).setEmptyView(textView); + + addView(pager, 0, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP)); + + emojiSize = Screen.dp(AndroidUtils.isTablet() ? 40 : 32); + pickerView = new EmojiColorPickerView(context); + pickerViewPopup = new EmojiPopupWindow(pickerView, popupWidth = Screen.dp((AndroidUtils.isTablet() ? 40 : 32) * 6 + 10 + 4 * 5), popupHeight = Screen.dp(AndroidUtils.isTablet() ? 64 : 56)); + pickerViewPopup.setOutsideTouchable(true); + pickerViewPopup.setClippingEnabled(true); + pickerViewPopup.setInputMethodMode(EmojiPopupWindow.INPUT_METHOD_NOT_NEEDED); + pickerViewPopup.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED); + pickerViewPopup.getContentView().setFocusableInTouchMode(true); + pickerViewPopup.getContentView().setOnKeyListener(new OnKeyListener() { + @Override + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0 && event.getAction() == KeyEvent.ACTION_UP && pickerViewPopup != null && pickerViewPopup.isShowing()) { + pickerViewPopup.dismiss(); + return true; + } + return false; + } + }); + currentPage = getContext().getSharedPreferences("emoji", Activity.MODE_PRIVATE).getInt("selected_page", 0); + loadRecents(); + } + + private void checkStickersTabY(View list, int dy) { + if (list == null) { + stickersTab.setTranslationY(minusDy = 0); + return; + } + if (list.getVisibility() != VISIBLE) { + return; + } + minusDy -= dy; + if (minusDy > 0) { + minusDy = 0; + } else if (minusDy < -Screen.dp(48 * 6)) { + minusDy = -Screen.dp(48 * 6); + } + stickersTab.setTranslationY(Math.max(-Screen.dp(47), minusDy)); + } + + private void checkScroll() { + int firstVisibleItem = stickersLayoutManager.findFirstVisibleItemPosition(); + if (firstVisibleItem == RecyclerView.NO_POSITION) { + return; + } + checkStickersScroll(firstVisibleItem); + } + + private void saveNewPage() { + int newPage; + if (pager.getCurrentItem() == 6) { + if (gifsGridView != null && gifsGridView.getVisibility() == VISIBLE) { + newPage = 2; + } else { + newPage = 1; + } + } else { + newPage = 0; + } + if (currentPage != newPage) { + currentPage = newPage; + getContext().getSharedPreferences("emoji", Activity.MODE_PRIVATE).edit().putInt("selected_page", newPage).commit(); + } + } + + public void clearRecentEmoji() { + SharedPreferences preferences = getContext().getSharedPreferences("emoji", Activity.MODE_PRIVATE); + preferences.edit().putBoolean("filled_default", true).commit(); + emojiUseHistory.clear(); + recentEmoji.clear(); + saveRecentEmoji(); + adapters.get(0).notifyDataSetChanged(); + } + + + private void onPageScrolled(int position, int width, int positionOffsetPixels) { + if (stickersTab == null) { + return; + } + + if (width == 0) { + width = AndroidUtilities.displaySize.x; + } + + int margin = 0; + if (position == 5) { + margin = -positionOffsetPixels; + if (listener != null) { + listener.onStickersTab(positionOffsetPixels != 0); + } + } else if (position == 6) { + margin = -width; + if (listener != null) { + listener.onStickersTab(true); + } + } else { + if (listener != null) { + listener.onStickersTab(false); + } + } + + if (emojiTab.getTranslationX() != margin) { + emojiTab.setTranslationX(margin); + stickersTab.setTranslationX(width + margin); + stickersTab.setVisibility(margin < 0 ? VISIBLE : INVISIBLE); + } + } + + private void postBackspaceRunnable(final int time) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (!backspacePressed) { + return; + } + if (listener != null && listener.onBackspace()) { + backspaceButton.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); + } + backspaceOnce = true; + postBackspaceRunnable(Math.max(50, time - 100)); + } + }, time); + } + + private String convert(long paramLong) { + String str = ""; + for (int i = 0; ; i++) { + if (i >= 4) { + return str; + } + int j = (int) (0xFFFF & paramLong >> 16 * (3 - i)); + if (j != 0) { + str = str + (char) j; + } + } + } + + private void saveRecentEmoji() { + SharedPreferences preferences = getContext().getSharedPreferences("emoji", Activity.MODE_PRIVATE); + StringBuilder stringBuilder = new StringBuilder(); + for (HashMap.Entry entry : emojiUseHistory.entrySet()) { + if (stringBuilder.length() != 0) { + stringBuilder.append(","); + } + stringBuilder.append(entry.getKey()); + stringBuilder.append("="); + stringBuilder.append(entry.getValue()); + } + preferences.edit().putString("emojis2", stringBuilder.toString()).commit(); + } + + private void saveEmojiColors() { + SharedPreferences preferences = getContext().getSharedPreferences("emoji", Activity.MODE_PRIVATE); + StringBuilder stringBuilder = new StringBuilder(); + for (HashMap.Entry entry : emojiColor.entrySet()) { + if (stringBuilder.length() != 0) { + stringBuilder.append(","); + } + stringBuilder.append(entry.getKey()); + stringBuilder.append("="); + stringBuilder.append(entry.getValue()); + } + preferences.edit().putString("color", stringBuilder.toString()).commit(); + } + + + + private void sortEmoji() { + recentEmoji.clear(); + for (HashMap.Entry entry : emojiUseHistory.entrySet()) { + recentEmoji.add(entry.getKey()); + } + Collections.sort(recentEmoji, new Comparator() { + @Override + public int compare(String lhs, String rhs) { + Integer count1 = emojiUseHistory.get(lhs); + Integer count2 = emojiUseHistory.get(rhs); + if (count1 == null) { + count1 = 0; + } + if (count2 == null) { + count2 = 0; + } + if (count1 > count2) { + return -1; + } else if (count1 < count2) { + return 1; + } + return 0; + } + }); + while (recentEmoji.size() > 50) { + recentEmoji.remove(recentEmoji.size() - 1); + } + } + + + + public void loadRecents() { + SharedPreferences preferences = getContext().getSharedPreferences("emoji", Activity.MODE_PRIVATE); + + String str; + try { + emojiUseHistory.clear(); + if (preferences.contains("emojis")) { + str = preferences.getString("emojis", ""); + if (str != null && str.length() > 0) { + String[] args = str.split(","); + for (String arg : args) { + String[] args2 = arg.split("="); + long value = Utilities.parseLong(args2[0]); + String string = ""; + for (int a = 0; a < 4; a++) { + char ch = (char) value; + string = String.valueOf(ch) + string; + value >>= 16; + if (value == 0) { + break; + } + } + if (string.length() > 0) { + emojiUseHistory.put(string, Utilities.parseInt(args2[1])); + } + } + } + preferences.edit().remove("emojis").commit(); + saveRecentEmoji(); + } else { + str = preferences.getString("emojis2", ""); + if (str != null && str.length() > 0) { + String[] args = str.split(","); + for (String arg : args) { + String[] args2 = arg.split("="); + emojiUseHistory.put(args2[0], Utilities.parseInt(args2[1])); + } + } + } + if (emojiUseHistory.isEmpty()) { + if (!preferences.getBoolean("filled_default", false)) { + String[] newRecent = new String[]{ + "\uD83D\uDE02", "\uD83D\uDE18", "\u2764", "\uD83D\uDE0D", "\uD83D\uDE0A", "\uD83D\uDE01", + "\uD83D\uDC4D", "\u263A", "\uD83D\uDE14", "\uD83D\uDE04", "\uD83D\uDE2D", "\uD83D\uDC8B", + "\uD83D\uDE12", "\uD83D\uDE33", "\uD83D\uDE1C", "\uD83D\uDE48", "\uD83D\uDE09", "\uD83D\uDE03", + "\uD83D\uDE22", "\uD83D\uDE1D", "\uD83D\uDE31", "\uD83D\uDE21", "\uD83D\uDE0F", "\uD83D\uDE1E", + "\uD83D\uDE05", "\uD83D\uDE1A", "\uD83D\uDE4A", "\uD83D\uDE0C", "\uD83D\uDE00", "\uD83D\uDE0B", + "\uD83D\uDE06", "\uD83D\uDC4C", "\uD83D\uDE10", "\uD83D\uDE15"}; + for (int i = 0; i < newRecent.length; i++) { + emojiUseHistory.put(newRecent[i], newRecent.length - i); + } + preferences.edit().putBoolean("filled_default", true).commit(); + saveRecentEmoji(); + } + } + sortEmoji(); + adapters.get(0).notifyDataSetChanged(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + + try { + str = preferences.getString("color", ""); + if (str != null && str.length() > 0) { + String[] args = str.split(","); + for (int a = 0; a < args.length; a++) { + String arg = args[a]; + String[] args2 = arg.split("="); + emojiColor.put(args2[0], args2[1]); + } + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + + @Override + public void requestLayout() { + if (isLayout) { + return; + } + super.requestLayout(); + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + isLayout = true; + if (AndroidUtilities.isInMultiwindow) { + if (currentBackgroundType != 1) { + if (Build.VERSION.SDK_INT >= 21) { + setOutlineProvider((ViewOutlineProvider) outlineProvider); + setClipToOutline(true); + setElevation(Screen.dp(2)); + } + setBackgroundResource(R.drawable.smiles_popup); + emojiTab.setBackgroundDrawable(null); + currentBackgroundType = 1; + } + } else { + if (currentBackgroundType != 0) { + if (Build.VERSION.SDK_INT >= 21) { + setOutlineProvider(null); + setClipToOutline(false); + setElevation(0); + } + setBackgroundColor(0xfff5f6f7); + emojiTab.setBackgroundColor(0xfff5f6f7); + currentBackgroundType = 0; + } + } + + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) emojiTab.getLayoutParams(); + FrameLayout.LayoutParams layoutParams1 = null; + layoutParams.width = View.MeasureSpec.getSize(widthMeasureSpec); + + if (layoutParams.width != oldWidth) { + if (layoutParams1 != null) { + onPageScrolled(pager.getCurrentItem(), layoutParams.width - getPaddingLeft() - getPaddingRight(), 0); + } + emojiTab.setLayoutParams(layoutParams); + oldWidth = layoutParams.width; + } + super.onMeasure(View.MeasureSpec.makeMeasureSpec(layoutParams.width, MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY)); + isLayout = false; + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + if (lastNotifyWidth != right - left) { + lastNotifyWidth = right - left; + } + super.onLayout(changed, left, top, right, bottom); + } + + public void setListener(Listener value) { + listener = value; + } + + public void invalidateViews() { + for (int a = 0; a < emojiGrids.size(); a++) { + emojiGrids.get(a).invalidateViews(); + } + } + + public void onOpen(boolean forceEmoji) { + if (stickersTab != null) { + if (currentPage == 0 || forceEmoji) { + if (pager.getCurrentItem() == 6) { + pager.setCurrentItem(0, !forceEmoji); + } + } else if (currentPage == 1) { + if (pager.getCurrentItem() != 6) { + pager.setCurrentItem(6); + } + if (stickersTab.getCurrentPosition() == gifTabNum + 1) { + if (recentTabBum >= 0) { + stickersTab.selectTab(recentTabBum + 1); + } else if (gifTabNum >= 0) { + stickersTab.selectTab(gifTabNum + 2); + } else { + stickersTab.selectTab(1); + } + } + } else if (currentPage == 2) { + if (pager.getCurrentItem() != 6) { + pager.setCurrentItem(6); + } + if (stickersTab.getCurrentPosition() != gifTabNum + 1) { + if (gifTabNum >= 0 && !recentGifs.isEmpty()) { + stickersTab.selectTab(gifTabNum + 1); + } else { + switchToGifTab = true; + } + } + } + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (stickersGridAdapter != null) { + NotificationCenter.getInstance().addObserver(this, NotificationCenter.stickersDidLoaded); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.recentImagesDidLoaded); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.featuredStickersDidLoaded); + + } + } + + @Override + public void setVisibility(int visibility) { + super.setVisibility(visibility); + if (visibility != GONE) { + sortEmoji(); + adapters.get(0).notifyDataSetChanged(); + if (stickersGridAdapter != null) { + NotificationCenter.getInstance().addObserver(this, NotificationCenter.stickersDidLoaded); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.recentDocumentsDidLoaded); + updateStickerTabs(); + reloadStickersAdapter(); + if (gifsGridView != null && gifsGridView.getVisibility() == VISIBLE && listener != null) { + listener.onGifTab(pager != null && pager.getCurrentItem() >= 6); + } + } + if (trendingGridAdapter != null) { + trendingLoaded = false; + trendingGridAdapter.notifyDataSetChanged(); + } + checkDocuments(true); + checkDocuments(false); + StickersQuery.loadRecents(StickersQuery.TYPE_IMAGE, true, true); + StickersQuery.loadRecents(StickersQuery.TYPE_IMAGE, false, true); + } + } + + public int getCurrentPage() { + return currentPage; + } + + public void onDestroy() { + if (stickersGridAdapter != null) { + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.stickersDidLoaded); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.recentDocumentsDidLoaded); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.featuredStickersDidLoaded); + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (pickerViewPopup != null && pickerViewPopup.isShowing()) { + pickerViewPopup.dismiss(); + } + } + + + @SuppressWarnings("unchecked") + @Override + public void didReceivedNotification(int id, Object... args) { + if (id == NotificationCenter.stickersDidLoaded) { + if ((Integer) args[0] == StickersQuery.TYPE_IMAGE) { + if (trendingGridAdapter != null) { + if (trendingLoaded) { + updateVisibleTrendingSets(); + } else { + trendingGridAdapter.notifyDataSetChanged(); + } + } + updateStickerTabs(); + reloadStickersAdapter(); + checkPanels(); + } + } else if (id == NotificationCenter.recentDocumentsDidLoaded) { + boolean isGif = (Boolean) args[0]; + if (isGif || (Integer) args[1] == StickersQuery.TYPE_IMAGE) { + checkDocuments(isGif); + } + } else if (id == NotificationCenter.featuredStickersDidLoaded) { + if (trendingGridAdapter != null) { + if (trendingLoaded) { + updateVisibleTrendingSets(); + } else { + trendingGridAdapter.notifyDataSetChanged(); + } + } + if (pagerSlidingTabStrip != null) { + int count = pagerSlidingTabStrip.getChildCount(); + for (int a = 0; a < count; a++) { + pagerSlidingTabStrip.getChildAt(a).invalidate(); + } + } + updateStickerTabs(); + } + } + + private class TrendingGridAdapter extends RecyclerView.Adapter { + + private Context context; + private int stickersPerRow; + private HashMap cache = new HashMap<>(); + private ArrayList sets = new ArrayList<>(); + private HashMap positionsToSets = new HashMap<>(); + private int totalItems; + + public TrendingGridAdapter(Context context) { + this.context = context; + } + + @Override + public int getItemCount() { + return totalItems; + } + + public Object getItem(int i) { + return cache.get(i); + } + + @Override + public int getItemViewType(int position) { + Object object = cache.get(position); + if (object != null) { + if (object instanceof TLRPC.Document) { + return 0; + } else { + return 2; + } + } + return 1; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = null; + switch (viewType) { + case 0: + view = new StickerEmojiCell(context) { + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Screen.dp(82), MeasureSpec.EXACTLY)); + } + }; + break; + case 1: + view = new EmptyCell(context); + break; + case 2: + view = new FeaturedStickerSetInfoCell(context, 17); + ((FeaturedStickerSetInfoCell) view).setAddOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + FeaturedStickerSetInfoCell parent = (FeaturedStickerSetInfoCell) v.getParent(); + TLRPC.StickerSetCovered pack = parent.getStickerSet(); + if (installingStickerSets.containsKey(pack.set.id) || removingStickerSets.containsKey(pack.set.id)) { + return; + } + if (parent.isInstalled()) { + removingStickerSets.put(pack.set.id, pack); + listener.onStickerSetRemove(parent.getStickerSet()); + } else { + installingStickerSets.put(pack.set.id, pack); + listener.onStickerSetAdd(parent.getStickerSet()); + } + parent.setDrawProgress(true); + } + }); + break; + } + + return new Holder(view); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + switch (holder.getItemViewType()) { + case 0: + TLRPC.Document sticker = (TLRPC.Document) cache.get(position); + ((StickerEmojiCell) holder.itemView).setSticker(sticker, false); + break; + case 1: + ((EmptyCell) holder.itemView).setHeight(Screen.dp(82)); + break; + case 2: + ArrayList unreadStickers = StickersQuery.getUnreadStickerSets(); + TLRPC.StickerSetCovered stickerSetCovered = sets.get((Integer) cache.get(position)); + boolean unread = unreadStickers != null && unreadStickers.contains(stickerSetCovered.set.id); + FeaturedStickerSetInfoCell cell = (FeaturedStickerSetInfoCell) holder.itemView; + cell.setStickerSet(stickerSetCovered, unread); + if (unread) { + StickersQuery.markFaturedStickersByIdAsRead(stickerSetCovered.set.id); + } + boolean installing = installingStickerSets.containsKey(stickerSetCovered.set.id); + boolean removing = removingStickerSets.containsKey(stickerSetCovered.set.id); + if (installing || removing) { + if (installing && cell.isInstalled()) { + installingStickerSets.remove(stickerSetCovered.set.id); + installing = false; + } else if (removing && !cell.isInstalled()) { + removingStickerSets.remove(stickerSetCovered.set.id); + removing = false; + } + } + cell.setDrawProgress(installing || removing); + break; + } + } + + @Override + public void notifyDataSetChanged() { + if (trendingLoaded) { + return; + } + int width = getMeasuredWidth(); + if (width == 0) { + width = AndroidUtilities.displaySize.x; + } + stickersPerRow = width / Screen.dp(72); + trendingLayoutManager.setSpanCount(stickersPerRow); + cache.clear(); + positionsToSets.clear(); + sets.clear(); + totalItems = 0; + int num = 0; + + ArrayList packs = StickersQuery.getFeaturedStickerSets(); + + for (int a = 0; a < packs.size(); a++) { + TLRPC.StickerSetCovered pack = packs.get(a); + if (StickersQuery.isStickerPackInstalled(pack.set.id) || pack.covers.isEmpty() && pack.cover == null) { + continue; + } + sets.add(pack); + positionsToSets.put(totalItems, pack); + cache.put(totalItems++, num++); + int startRow = totalItems / stickersPerRow; + int count; + if (!pack.covers.isEmpty()) { + count = (int) Math.ceil(pack.covers.size() / (float) stickersPerRow); + for (int b = 0; b < pack.covers.size(); b++) { + cache.put(b + totalItems, pack.covers.get(b)); + } + } else { + count = 1; + cache.put(totalItems, pack.cover); + } + for (int b = 0; b < count * stickersPerRow; b++) { + positionsToSets.put(totalItems + b, pack); + } + totalItems += count * stickersPerRow; + } + if (totalItems != 0) { + trendingLoaded = true; + } + super.notifyDataSetChanged(); + } + } + + private class StickersGridAdapter extends RecyclerView.Adapter { + + private Context context; + private int stickersPerRow; + private HashMap rowStartPack = new HashMap<>(); + private HashMap packStartRow = new HashMap<>(); + private HashMap cache = new HashMap<>(); + private int totalItems; + + public StickersGridAdapter(Context context) { + this.context = context; + } + + @Override + public int getItemCount() { + return totalItems != 0 ? totalItems + 1 : 0; + } + + public Object getItem(int i) { + return cache.get(i); + } + + public int getPositionForPack(TLRPC.TL_messages_stickerSet stickerSet) { + return packStartRow.get(stickerSet) * stickersPerRow; + } + + @Override + public int getItemViewType(int position) { + if (cache.get(position) != null) { + return 0; + } + return 1; + } + + public int getTabForPosition(int position) { + if (stickersPerRow == 0) { + int width = getMeasuredWidth(); + if (width == 0) { + width = AndroidUtilities.displaySize.x; + } + stickersPerRow = width / Screen.dp(72); + } + int row = position / stickersPerRow; + TLRPC.TL_messages_stickerSet pack = rowStartPack.get(row); + if (pack == null) { + return recentTabBum; + } + return stickerSets.indexOf(pack) + stickersTabOffset; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = null; + switch (viewType) { + case 0: + view = new StickerEmojiCell(context) { + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Screen.dp(82), MeasureSpec.EXACTLY)); + } + }; + break; + case 1: + view = new EmptyCell(context); + break; + } + + return new Holder(view); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + switch (holder.getItemViewType()) { + case 0: + TLRPC.Document sticker = cache.get(position); + ((StickerEmojiCell) holder.itemView).setSticker(sticker, false); + break; + case 1: + if (position == totalItems) { + int row = (position - 1) / stickersPerRow; + TLRPC.TL_messages_stickerSet pack = rowStartPack.get(row); + if (pack == null) { + ((EmptyCell) holder.itemView).setHeight(1); + } else { + int height = pager.getHeight() - (int) Math.ceil(pack.documents.size() / (float) stickersPerRow) * Screen.dp(82); + ((EmptyCell) holder.itemView).setHeight(height > 0 ? height : 1); + } + } else { + ((EmptyCell) holder.itemView).setHeight(Screen.dp(82)); + } + break; + } + } + + @Override + public void notifyDataSetChanged() { + int width = getMeasuredWidth(); + if (width == 0) { + width = AndroidUtilities.displaySize.x; + } + stickersPerRow = width / Screen.dp(72); + stickersLayoutManager.setSpanCount(stickersPerRow); + rowStartPack.clear(); + packStartRow.clear(); + cache.clear(); + totalItems = 0; + ArrayList packs = stickerSets; + for (int a = -1; a < packs.size(); a++) { + ArrayList documents; + TLRPC.TL_messages_stickerSet pack = null; + int startRow = totalItems / stickersPerRow; + if (a == -1) { + documents = recentStickers; + } else { + pack = packs.get(a); + documents = pack.documents; + packStartRow.put(pack, startRow); + } + if (documents.isEmpty()) { + continue; + } + int count = (int) Math.ceil(documents.size() / (float) stickersPerRow); + for (int b = 0; b < documents.size(); b++) { + cache.put(b + totalItems, documents.get(b)); + } + totalItems += count * stickersPerRow; + for (int b = 0; b < count; b++) { + rowStartPack.put(startRow + b, pack); + } + } + super.notifyDataSetChanged(); + } + } + + private class EmojiGridAdapter extends BaseAdapter { + + private int emojiPage; + + public EmojiGridAdapter(int page) { + emojiPage = page; + } + + @Override + public Object getItem(int position) { + return null; + } + + @Override + public int getCount() { + if (emojiPage == -1) { + return recentEmoji.size(); + } + return EmojiData.dataColored[emojiPage].length; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View view, ViewGroup paramViewGroup) { + ImageViewEmoji imageView = (ImageViewEmoji) view; + if (imageView == null) { + imageView = new ImageViewEmoji(getContext()); + } + String code; + String coloredCode; + if (emojiPage == -1) { + coloredCode = code = recentEmoji.get(position); + } else { + coloredCode = code = EmojiData.dataColored[emojiPage][position]; + String color = emojiColor.get(code); + if (color != null) { + coloredCode = addColorToCode(coloredCode, color); + } + } + imageView.setImageDrawable(Emoji.getEmojiBigDrawable(coloredCode)); + imageView.setTag(code); + return imageView; + } + + @Override + public void unregisterDataSetObserver(DataSetObserver observer) { + if (observer != null) { + super.unregisterDataSetObserver(observer); + } + } + } + + private class EmojiPagesAdapter extends PagerAdapter implements PagerSlidingTabStrip.IconTabProvider { + + public void destroyItem(ViewGroup viewGroup, int position, Object object) { + View view; + if (position == 6) { + view = stickersWrap; + } else { + view = views.get(position); + } + viewGroup.removeView(view); + } + + public int getCount() { + return views.size(); + } + + public int getPageIconResId(int paramInt) { + return icons[paramInt]; + } + + @Override + public void customOnDraw(Canvas canvas, int position) { + if (position == 6 && dotDrawable != null) { + int x = canvas.getWidth() / 2 + Screen.dp(4); + int y = canvas.getHeight() / 2 - Screen.dp(13); + dotDrawable.setBounds(x, y, x + dotDrawable.getIntrinsicWidth(), y + dotDrawable.getIntrinsicHeight()); + dotDrawable.draw(canvas); + } + } + + public Object instantiateItem(ViewGroup viewGroup, int position) { + View view; + if (position == 6) { + view = stickersWrap; + } else { + view = views.get(position); + } + viewGroup.addView(view); + return view; + } + + public boolean isViewFromObject(View view, Object object) { + return view == object; + } + + @Override + public void unregisterDataSetObserver(DataSetObserver observer) { + if (observer != null) { + super.unregisterDataSetObserver(observer); + } + } + } + + private class Holder extends RecyclerView.ViewHolder { + + public Holder(View itemView) { + super(itemView); + } + } + + + } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_car.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_car.png new file mode 100755 index 0000000000000000000000000000000000000000..d069347777a30af76c55b10618d78c13208f2e9a GIT binary patch literal 1931 zcmaJ?e_RuFAD>Pp7{rf;2wGl;)eP8fV;gL2(A=1=9MYIDjmWV(VQjaXy8{N2ZX)`M zfGA49L;-t1NmF@5EGpyy6NBJM2*d{od`$)9(SArsMs_2i{&;xqdw1U-ulM`?`FXE< zD>i1m$FhKB6bi*du|cLHXUO@u(#Uth;_3b51P=}#RtrNqvqGpm!p@^caX06VE5I{1LqBn`bdri$Cpohg^ z0#6Ak%~B*)zaiU##AU~*b=d};00yHX0g+Wm3ZMv~1+1vigbS@=a8_4HuARp$5SWD! z1~K@jQyOI~AjK>Qz+;An=pZ&5;PaVmE|1S=2Ll|4&0#_0%@1L7g*?8H69zoKK+>88 z-Y!(hmJ}9SAP_h;IGhj?5rSu#2(2~5ga^(k$Pip- z(VGc9W&)gw+GH%95QC(re};gX=VeX!<1~>8V_CIk7Mlq; zubss!l|qFHC$uIVqL7I}Qh}-0!@^LRTq+3Tt_$ZuayC1fA1;8{5=a2?q|xl~Xb76) z$}n9zikOHwF8mi)x**rt3aFX1EJG~%32Fcg>#S*Tyw7r}yhkGb%|zDO42vPfrG z&cgn!&~ry*_c)jHZA)(E8y_)|-EJYTdz%&8#d5irC;jr&4J4s zv|GP@meWjpV0Tjdt?#UnhvC4C~ojzH`0Q0Laczz(E%lh{Fl+?Q`^V_O9 zJsVrO-w!;xuzR?Eq9F92P5IE$U7Z8v15Hzd_&vexA&>F9cQYna{D;SH-&ip`JO171 zQ#}QQh4q_0%x!_8L)nZ}TH$ce1GsU-;edapUH!qKI=#4aai}ENb!kgwp*)AelB~5- z>ZrFCmG~_A#ZEvi!(W)|%g(3vK3z;5x}Ud*bEC9{dvoZG*u_J8R#&?Gs;+R?H5U->>&;WtL< zmIP?p@DYwqt`)b!G-$(iBLJ$rs|(VWcr(mRz(+hZK}%}Bf({ZYly-jv)5I~Sn3 zA3Z#FDTnY;t4fb?+mFzW-80^9STQ(-tFE`+@j5+Zd{mHBw)F6oi$2RS`;R#p!IaJR zHRlp~J#9OO1FhXI&!q4QBA1wM;?>osmV95Pc~lG12;}sO!*Rt;8fjIAh2>Od}Yvenhm|Xw$&id~2rthd{2FuQC zaz1^3#nUHphFZK*)^o&Q>@sOhd&Ispv^aQEm4ALx&1gf?5Za)(HJ&@@JHtEWmaXk= zw|VC$)s7Ch8xBs;qR@ci)?+n_1DtW@KVEP2*|_nP{l(~a;_s(*U2kwdc{8%@!PW!8 zhGV7KqWMu%Wb>D$C546D&WpK}4%*orM-E;Nf&JH4 z?+u*HyBPnR_*uOF>n(4t@H6{l65vt)hc8@lRWb)Wj&3;=d0b>KZa-UOt$7$=a;z*v zUJG}9eZt6y@NJ!5)qO6|W7ivft?|gIZHBlbUvaWGd+y)zuQgHq62F$Gb{~3~J2qIV z`W3iS`RcZhREXT{XvjVJWOki>v%$CaaL$yg*qGId^x0B##XsdebItPx_exNZ&j;c& zwX$i$ro7vC&`46u5Bnt#!BVH1DmC4Kr7zp|5y_kL>u} pF=OnRF1^COFh43iZ#Gk?6y3zNiXF*}TIcUk5gjA@WZkwse*pdb2gLvY literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_car_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_car_active.png new file mode 100755 index 0000000000000000000000000000000000000000..954d316b4b7d56550be988ea9ecd5f275453b7d8 GIT binary patch literal 1931 zcmaJ?c~BE)9E|}(!6J%Qj#^m4V2eVI%|Q|f60@OzMj?PejnyUDgiJ^_W)}%TG=QTh z(h7)EMiEcM62%imz@kN~Vnr~HRyx!J%2A67TD0QW4HeoyO848{@0j=A@7&ofu}eR9 zb@6r~kw~u5QIL$78TRJ`3h_=NzurttUbrL~k4IH_CTv7VA|;xN0MR;FjmQvKnYHE` z5=J69P&En3c(QbfK!NILupL7)=?ny$L<(DIGQbKgf&;0DTB8?IpEi6)1vE+_HHjl- zNDX2nO%r7{BJt*>2@11T!Bx$p8g$z&M+aX$KI!jNEqD&8|X|L!yeK&P%8a@s7^P5#&8+(kH7yZ zj3s0l5V{P(&9lj5MM;U@T;TW^!Nnlj^dS;Sl~Kzc*;O%XI3y}&;QbZV3uRrUIae}jdar9cy20mejWRKqO^b>jV(y;*UEDbn0tgCR5!oh zdCSTL>X-2D=4(Hty*DFJcRIGKfEV5s@=9B00LG8I>^uhejOQOD1wfLta zo>#E2&ac?7a?0ISlr`lYmF9T2_9Y7Es+?!Nl{>9;TsFF9e)~aeRZPEwH9s=9IHt_& zV)5PSb%MSll;uYgKNP+mgw6McHnm!(v{SOXhlQtoTNoV+7L@D|o;VD>)-ID*CFoev|jKkp6%$T_t%-nJ3X2ui^TU!#F zvPJaTHcnehsST-!6G>}xdQD4f?BT>xY0HspwRbGFf2_Ud-uwIhe&_S~e4qE+qFD9@ zb5na$91dq58NuXWD_Q>-8)5GRgPGmfVuyzDP%fN`DuoDyV~F7t2#Ayl(;yBc6z67l zLjgD(fhdXNp*&VJT?9)>LOq70lFBhQ4i~UqB^Qb^Arwe~(j>A#;)|A6A|Me55)*t_ zWR^S>N|!{a5s0g1$BERLBAS@EJ_ra<(J=ujgbD$bG)tzSs{)C0x^&FeAA>|-4uWO| z68{N`$BG3)VFUtvNM0TyGKB(AsU(WG50y$;2Y8Yxo*)^!sU8$>x(}7^=?lzXM9do^ zPNj30;q$(*T_7C}dU{|84@IsF6{e%qWV(xBAJXh)vptk+tN#ftGa#> z*3mkxKb#-RiaK`-IoiI4baE%1dicQi@p}iNtWtM0N8gViN!OK@C*J0Ty1!h4&@xE= zq~_?XwOKz?yQassA6KjUyJ_`LbDs^rdr&)gaXR3|Y|!9z^ZWc);l$-Jp2@y32ddoL zR_aV6kc~yP9J1}D*}p0UR(=NglS%d!OFF-DJ3%NfSn;rmP@r+dQ-A!T$y8mCrn7Q2 z8fPdsJ{dbK>>Hdb9;Eiq2`GS&GqstAuO%u~DUvLuN%P&aP5qff;Iq{Z0cbgJ- z9MAE=$Dbt}WSkvQ>yp6)pDyX=XpPjL0nR}FZLh+fS122|T`5o&if8g@%cOAL_ZH@O9 zty6FDOwBf(YsF2ZV#lNG^f!++h5~?hW}xxjpVc-N?x3yN+d`9xqSYsEF)fER57s>@ z>=Uf#Cz+QP>>8+cys7Gx)`fHgyL1ccyGvx?;OWh6jFIt?g5#7wo}Av3(KChY?^)eg z_9}Fuo&RQHRZw!?VJiOdfXB$~mqV6Q$xYYmg^T~(0)M=xEOINwY8uV?K#e~*!^df3H8Z$Vd(ZH_>m?&cz@)t)C=T36_1OFcK( zBM&wjuF0z7)b)Ajyn1Gg42Ru^plfVA@yeB34Sv}cK6l?-h`wR$pZ2@=mzGJtF?+{N zcqchQl91p%7tWfwy|Z@!*~f}`K^=mwh=}G*ZVBnu@_0Ac*KS3z*Q^Y>6Q7a3-R*Fi zWk_Vqi;8Dp!<5W5?p ziF+Kl1cIu}R(q!@NvrU;D{5VSw^wtjI#Wp(JxO{0yf~Zheo(MwiLc-J`> zEo4@H~tb+`nLyROw{GFgMinb_2qu>zn@{huf@jLobI5fuInt^2uE literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_food_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_food_active.png new file mode 100755 index 0000000000000000000000000000000000000000..b0ba3f0e2c18ac8230736b2c135a7a50d7ca0b26 GIT binary patch literal 1781 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 YxS723<)`s_6{`QVzi%+q>>Zc;AMA5N`2YX_ literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_nature_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_nature_active.png new file mode 100755 index 0000000000000000000000000000000000000000..28fbe328c3b5bb555fc7c0933bffca7b469f2b19 GIT binary patch literal 2033 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 BquBre literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_smile.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_smile.png new file mode 100755 index 0000000000000000000000000000000000000000..950116479e9c9b120979f37212d7dcb1fc2cd722 GIT binary patch literal 1932 zcmaJ?eOME99G}n_5{Q6nfRX3K7hr6=y}>Rv9NUxuBN!kfF*&va7H)Ukjy6dY91n{4 zl!YSm1%xn2!xX{SG%zU)!lW`p3bIToN>fy@$ZiJOAJM)2UY^hA^L_n2SC$aJ+{4Y^ zjY6S#sG=1ba^yN*R~Pb|>NLKI9Q+8SmPkUg2n&oO6qz2)L;#f$&PFr{tY4dV0g0ec zoSBAXEumG%K|0jPh8-BT)rgU73MC@aiov>Ega9&;Y=cR{ymk5`CScG@n5jZFSB=S$ z97A*gjwBVtC+iAwbz(g;QVK*^AyUAI5HMght}&S*tAzPj7b545Z4MK73?XtQ%zvEH zsuKV?iX(uK%@5UaK@bp$*q}ft5`ip$#|3#DF8PQ;K>;KbLA)?v@?w(KaD5h}Q7oIZ zMXn^w9D=|g4##4#uq}Kxif3~`u~_WT;PFC9M5uYKiGZ!4Ci8+R1qEW(;RcK_peDef z2xp@CgoH_Y`cDW(?1`+&JeejkVH_)raX>cL5z-V;t^R+g(f9;yCN#)XfB#e1oV*r8 zI2y!^=HoiDa9Il+rZ7m3BQSyD$tb#JDvJp@D1n-DPz;bKiGU@k29qAOn1deU)oMs( zG83>#ho}@1CaJ(S81xWV$WsWFa&fqjy9@-CA{h_lMTH9lVv&e1Bhx>{RiL_jBVr<^ zxcaAD*|c0oD;P1-vI4;kuOa$nIBEnQhYT5}_a$svy-BWqdSAk)<#I@8IF7>ptI$(h zWcN6xPuiATJZXHyM0Pt)w)OoFwKFM{XDBL#EZN#WVqY1ZBAZisyz*<6WcvKSnCkR3gona@uFJ(x5yY6pl7agVz_`5py*xZLtI;B&O%Nlk|7qqz? zrn742pNnJ^cmK7n42`aMWGsrTDPk)p(CW5#1;PEDgN4YvgRbAclvZ8)C54~dXh|CMxPO$ju_ax( zJ3XlA#Wrd1`1y+$Ao)!GfzdhEvR`inShhpTiMiZ>lHwT8g6^@PxP}?>vGH$WPsecX zgGK`wY^pS?l~Fn&ui*SEAXe~ z^MZx@-6Gzuey1L6^}AgO#yWXcvCCsOug;YmZKe+V^07FPVcC=Qn>59J-jTucdjp(Eyxm4C6z^GA+L3ZO&)pnnyn1uh7w7O}``I-g z{p1zDs3tL2P#95iJ@9htk*3Zd_REBwOxFYA(9$qkW@WvWoj31*lO6%g44Zhx;=N6hlkE-IKujK z6vVXsn|(x;GJE)m{<6-29&SYEkE4>{Vl?VW?xD zSFqRVuM4^AnAGx#y*}A7T>)KVksa!*uX$Fy1P^M5>-K#b=5yxEj_6A7+tFA+#E%bV zc}_gPCaGQeRxe$RZy0lKtg&=pV5 eUOVd%)tAzoKiIwQ1j=^&A63eD#i6K-jei5qnezSs literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_smile_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_smile_active.png new file mode 100755 index 0000000000000000000000000000000000000000..75fa7d620620031269bb7d0b0e3778214cc9a22e GIT binary patch literal 1950 zcmaJ?dsI?)949Sxn9#!z8f$mgGVRDyAVJYgP%&YMFMO2<7bUw~f@_dXmrZM?y-c%~ z$LZ3t+{(&YmMv?`*0QFn?Np~W4UM#yZQ9go?PBTn$K3thdw-Af`Fy_5bACl~S-2a1 zE*^)&xk(~K3T$TDKNlzLpWraE37aUWSc%3UTGXsELbwnOk`4h9Sd{@OAeCnA>dR0d z4(AB!VwI>;8YNI8FkNNG&@He5W8-jv!4`u`oduylI+UT)3&E#n&VhhVBLow;Ql``p z3T5gda*R++jx1K4lcnZsz~CSt&?3MDUB3B(MmdY#N53nbzu2m4&7^d5$ZHAd}jtGoU&| z57-q|=}0yz1TjzFga8{RWc8-EX~Gi5u&4|S7M*DiX&fk({y!9kC(tHT0sZ6ee+rvo z*BT&(0x}`lMm1JAt*70TK@e($R48JMMUYkFS(IlYC}PS)3_xfM5AaUV={1PiPOg@*-3G?SN!&odaZz)U6_7{u9e6g6vTO8s)&J`i* zY#7p`<6O-Im&=@#Yi|YEfLRtnM%@}n6J|tUU@T;TZgO8llj^>g#PX1&B+4{J&3sj1 zrbH{{z9PP4Q0W=k!#UwQpEw8Kzr%mH*meiu&+b}t=ESeQxlPOICmqH|YUvWcEp1h~ z$o|COM)LgiK4}~m)m;y{bJcpId}`k4+=1RU?=1I$4?Z~`znu_f$@Ft6nJR0X##!$Q zcziVUf?(NE-bMB}aAn~DxuutJWc9-IRt~f5@t^raX#uA?XX7iKC_kAfr(EzMXEp^n zwz3-u^A$TDrg?q;=vu|_p{8LXFsI#VWI5@`QTpd_%&i2ga^!AZE2Z(X-jz&BPj-4` z;Pc!z8~0A!xkZf*tJ0gD+HqS_{Wor*?hCtJ)ccnL*qxCQF?)Bf_0;b2r__d`A1nMT zdhw6SoJisI;?Di&idM(MNwsQ9d$Vuc5@mz$u0qd6aZN?eLtQ>D2{($L9(vGmZ_ZF1 zHQAaH62GVsS8%klp`O_FY_5}6zHl?|RvJjAzbD@JKwaE?Kl$L2QuKMT`;cSEmxF;n ze@p0_^{~6rL-KTKX*oWs%jVdnxbeE$`Iowo&al6pc)lQuOI~g7eHOo{dJ{f-UjN7W zslLSkExgk!9N)F(__oMjpP9!=<6e%7?eRwrhGPF>UE!TV%qNgr{2fLGg<`}h2&hePk!I&6bJQ?zvR zj@iyXUE9=oH^5D*XK!{V^{`(R4nx7mgEq`d@^0Rhv7*QQ^2XIaG+)1Zp}}+En#2>1 z7qp){tQ-0LD(kyYu$}JYx+k&kR@~m6gHUsw@?{ErxpnL5cHb{OJ0Hv(*wUMY4>;>W zjV~a#U3_1Yse#7P zTOaPs^S-ik)M0-aW$@6p*1*tsFVZ*C)3VO`g2;jsr)kUmd{SuxW?7{VY^GXYyA$E$ zv%W!vxz^g^4TRsK(C6`BVq~l5`8kG)-vU|&O^s5@3sGbO=kncLM%l%Vgcd_|i%nA7 z=YFl-M%8=3N0f{priB-z{jNM`hf6PX+Fs)qH-f;fn)DNJBH$1^bI) z`ZfJzT3yZ6l0O=nvo2~Mw=Ad{UO{?6BqUE68~Lx3^Upa<$5~VE6PE}C&+Ip*L@W~> IUYfSyZ>7})w*UYD literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_stickers.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/ic_smiles2_stickers.png new file mode 100755 index 0000000000000000000000000000000000000000..ac1cd3e63d44858337eef9d171c4bf97a5a46981 GIT binary patch literal 2021 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/stickers_back_all.9.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/stickers_back_all.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8025f3e1afffdfb78c0eee5eb65184ec0baba36d GIT binary patch literal 1520 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4TC!3HF|?4?!%DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49v=zArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XR4cQU}&OXZmDNz zYG`6%sH0$HU}&swV61OwtZQgwWngJ#XsQ4ONh+i#(Mch>H3D2mX`VkM*2oZxQ#zd*s+SwX`$F*!32 z#McCC@b$Iw%quQQ%u7!7bg@+e8ljh&nPO$)WM*h&VQOk&X=rR{=xX9yn>bnwy$e0@Is<&})WMFDNbK765H_NiE7OOHFYr%Fk5*``IcJw_A*H zng`XJg4-=7IQ8lS9itD5S)`bT2?3K2hzU=(Kn^_Rr{)2Zdl4{Q7YJ_n%D}*s?CIhd zQgQ3e^u2!4jsnNuUyJ8(6yg#PVe7sWv_vGZtK-)Ch8KTS>I7OCE`AJ5FrOCf(&bXg zpuJ6JX~&1J1Epb{?_ic|_`}ko&L}BdpY5NY`e{fG; zra8Hg@9bCmDIsfBCZ0^$w(IUY&5GWqe+=6!#c$@6N!x^-@aCN5pmTcHWN)@Jd)@iB zZ4y_Q{ICD3-|}KTXSRwt7qfdNZGW;lQd6v(-Qe8Bhld^Yzj3K6+zHJ-oA%iyi|dP% z|EGBk1)b8{a>Gj-FL2wQjOP0GDoJ2>+cJgqGqx*Qc+6NPd6`v7{~`O#FM6f!N33@o zntr{c{iI`2AB!|wio`yXkIO#Fi*P+rwY9mR9D6KawN6}NrBpe4^FjMq1rJC5kj&-< zReS$Ai?6tt@n^{;IR?vCr-xkHB@rA|Pd@+j-lsHguYJ?E?5(#-Z=C6sd%^naL2CX! z%`ivnl_9UZci;WDRfpx-KR5m_O8yV^pB7$FzYu3M^H0>ukUX(mzg1UXK~0%^4=&--~8^l{9``{7jNX`h~Bt nxrx?$o~UQsd4bm^GcYsAh&#XkxM&}!JZJE9^>bP0l+XkKX&*dg literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/stickers_back_arrow.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/stickers_back_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..93a2d75b4ad24ca3a32128729a6a5f833bb22ab8 GIT binary patch literal 1087 zcmaJ=O-$2J9Iw$Kq9)3L1c|10CW>KeyAN3lW72igC6?fvIKi*dKA=KBY~NTJ7d3J) z5)XRxAX(Ilh5#{9VvIovi3f#)2R{-uew&!+!AOiAd<6y`oK0Te`@j5tzyIeu+uXEk zZP|u048ztYcJoQJSE040v;_SxuAJ&cTP2L8;Xb_sW{CFruJK z*_|`NzFbpE%5_VOOhg*+dYeT8Du5zxt38^<+F@c&mqlmink4W!2<#3M^FgJBW<08! z01tYD9*Lp@crD|lgLEK7*Wf;i_LG#Kr2QV+$5ISS2l0iEK;BHbgH7`B1z*St6I~D* zEJbEdmkxESOE>Un6yGL@lA<|w^&CME*o0<5QIkM|4--hjt0*$6CBrd0 zcsk^d1!y`J;NpQe6XN1j%&${`AkRE7m0lpnOky@{~| z-N_`P%dB%jD3t9qE&;_YdzMDIJ|idyI-VgHKzV2a;co&a8Mpa&@S3 zyVzo^pNxRerILx!##^6`Or76+X7#JOkHewd_wx-iwd}X5vHmMtUE_7*{j2ia7I$lY uaPVjT@~R&(^Q058CVrSZcKQ#|$7pE) literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_car.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_car.png new file mode 100755 index 0000000000000000000000000000000000000000..7c0aab37beabcd9edd7a82b181880904b18779a9 GIT binary patch literal 1570 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFhHZsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6s4IL(9V zO~LIJ6P$YWfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tgVlAu`n<&P4jed45_&F zW_oOgPol)}^0KwEoY{*H?uy`2jq;k^&;4`PgnsUo3w66<6fWtR+Z8Qs;TDQ+(J-1c ziMwmjl=rczF&sbt{gd$CH!Jnn`<4G!UfyW@d`_gP__LMq@8=l5w|xKE=KbeC_h)*T z&DPakHg&q_O)ox?yN!AGq&r=dP82&Yl>7BcHvXa9oz^Y)4}Yw%+0JZdCiv_ykHpiT z?|5UH9vAF-!1H87T>(eh?su_`{1+JaCdlXrd^f%KPn<90Q0daUi*9q8D_%Z%CvgLZ znUnUFgPYfhJv7tZ$0v4brcd8a{sdv4R*wm5HTWm|GW{S?*0N%1_XVcp1ses}cV)+{ zE-Yk}-Ntk)v47p_CaVpya+&<$hqHIYB+Qm?w7alOC$7P=&h>>$?COo}GF2R!mR|(- zt$wbpz-7CTEh&JvIbq2?!?4E=SC7rC;nQhNv(4#NO%&qcl-w)&D%A4Eg0j23?thI6 z1g1HMB~31>6%Q8KyLI{0s1rsXh4*Fr(>`y#Ryyq<+u75v9oD)$T@shpoi}aA47NSI z0)Hzan3g|~$!XmAYQ@?*KA+1KXDsCsHrdrT9k%PfuJJYP^pZ*DCAnU^&dqkrkA>EE@5PzFDqZEDO!&#OIC0lA>vJI)Z$1+WzbGuQ9;R;%W|pVvKQ(PUfX_sQZ3_ddp$jI-l85)?nPe3Q8x`*YZwog zrtDs8_2xa}<+psTk&#I@#~)GMA;iliw~ImlbypcG4Hg;WTUh)-~E#R mH+j6AA9%9y|Gh?gCLV@MIy1EYb7#&5mD--JelF{r5}E)%f>*8p literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_car_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_car_active.png new file mode 100755 index 0000000000000000000000000000000000000000..1093eb6609a287bcacb7f138b12d14cd8efefd4b GIT binary patch literal 1570 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFjeCsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6rXIL(9V zO~LIJC!BiqfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tar}UE@EI{n&#=^7*cWT z&GhJwoBB{k2U5a)To|r16=iwu`h{N+F zt83t?O3lsUPJXXzB)t938a@7grT*3H&BpJ)pIx=n!2fU6^WV?@?)(1V=KW`z_dY6< zPfiiNeCl*pjw++8_=ThO$tinGPZT>ZkgIwv8~@O5i^Hj}1>Tnz++mV2V|;e7(d0<-6Ec{tJAz2|8!Q`AzQq6=%|V*mfxI-rJVw3GWi#1w^n& zFO+=spfY`O!ECX3c5W55xykRGZ?FU_2&HJBVs5DuwP}=9EP5(*B+*1i$HgJMH``QC zZ^5Byj?!-~mWBo}-hR08TY>7HHf`2vKLuZ~mWv$iHn=^tC31bXY1!lj?h~dg=>HIF z8qXN`g3nZ-IZJ{;`AeUn)NgI`bI*h?aAbekpgXOh)4*cM_h~Dxt88$5x=Xrmmr{Yi zEQQ5slfTr6PZqb`x_oNX38jz1`!fD%-?v^Xm3D~j>}l-Aj&oZ#9p>;C#lvl$;JF4(sDrs{z`cUSwFMSj1xS|#^=lxxtvrB~V4Jp2;8 z^P1+&)i$yQ3swFIJ~4?|ckBGS@c4_8(eF>IKQEN|8auyv=O?3OaRQ+;g1g#EPly}% zxNp0@>hM3g4f|~GOqagqGOw$qj6bgG*3QslZ#OWNy_DG?_n*(NjbpoO%2uVcve^BS n|2KKOoFC|UpkDt$KLazvh95Jux%bSL1C`pIu6{1-oD!M<-aTAX literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_food.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_food.png new file mode 100755 index 0000000000000000000000000000000000000000..f8e35bfbe0d03d343e95f0ae342daf38d39a4f26 GIT binary patch literal 1446 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFjeHsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6rfIL(9V zO~LIJN1S@~fsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tRF2rzKel@Ny^j3F{I+w zo9q4_B8f7`3a=}1D6LUp_B7F-nZbEURZ~d+?vYcx&dj2=o{8-L8{E%MmU}ftv5Ebr z%ft@7Jg%yMEhmCl0)+zuUMPh8^W5^*`UA)5N7sJrldirgUo+$8+`F~%&*sj&zk8m8 zf`IthuKw<#qf9dVHvxXVy{nZ;n5lzW07>?HcKLX2q$!H8DqQ{zM#z zyYRB?kjeu+xrIWF9xN{|^tWCsjycL7+mWlmWfj+zUy&@lAhNlCQRwHHZBm6<;*W3r z@6ep%(y4bLYRhaJ_DL5y*6-*n|It!+hmWg($=gbLC)b~V%bOM%Pfih95O({O!ST7j z|5%+WVXU)!!nF3nKjFy?Q)k8hkGC`K%&Xxqt`V56Va{0)_Bk_JzTn;#@f>%B1Iv7k zy*eBkL@qN(S1q}9O;l$Vi^RdqIh!SHVv~RPGVQtcZJuib`>k&?StKrOJE?Ra*mSAl zWQORf8!C%$Bz!R1`dF;hU>CR4m#1>2PTQZZ>9D%0J}Wox@cgK&M^^Kv?2x#_Y1Np# zqd$Jz+aJ2CJ_v2DXv=((!TTe+|4!xCw&v$`clSqq3=~t5ebu$zM0ep-@h$sT3DkzI ze&qaW@8%t$lfAA^={eZUbocXRsfs&q`>T@b&n7W0l6}z6z|62?PriAPYg-wpl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y zaCJ0>>2=9ZF3nBND}m`vLFjeEsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6sCIL(9V zO~LIJ7o2+afsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tSy2jK4)NHlJRtL45_&F zX1cdWNT9@V*~_g854qhtP8BWwsbRi3)1kxc?V|S11-e~I9wM<3-P5vGN2zc~UG&pn znOGL-s5`~uOd!+6E{zo&g%7Q_yexm9AJZner}*57oM+AQ&(GO@zxV#U<@0JE1*zV& zrI$BtzLX=$XxXWj#kTKv<$kVH4|?n7w-pC4{WaMB`@x;Hhfi{T$b5T&Ve19na)tQf zrv-9mYr_sK4|P^ObGT5V?fI_j+^rvq?OAJ@H_VyeBzd=<%lgCVUpz-5Walt$p2%&$ z*S+CwWS;Ue2E9X}JNPb!a7bJ_p7d65PK&7Q5%z+E#`l@(6VA9g^v~Jf{QK7VBmKsm)nRPM%A_$ix(1_t2Z3uVwoJe_~&+ff@P zGBIZB9bKWo%G7s*D+`7uYukte5*Bzb9nAz^5mF-|h7(G~zuuVb!DLT<l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y>2=9ZF3nBND}m`vLFjeFsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6saIL(9V zO~LIJ3!HlOfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tQX&mJ;=bow8qoLF{I+w zo9WRVX98u8r{CEWrnxYpod4RUx4YD)YizQ)aO&`yNhCL4UVkuiM@Cn~$7$}mOwWSCB5T!>-IkfN+5AGNGHFtU;;T73*C{6~>~F9+)nB;Jmi6`-u{+!|R#*2;w7dR6_^HUn=kj@x z_JJ;Yuev+fF5IhNx4D1cw8J;pZk5_G%{s#WO7xMx6w{d*d#{<VmzCYI43lExN?M!PfNL45iii zb1J<5rdkPREW4v27AW6Qoc#Gw&&;f=+#0@NcijFuYY9pydmUA~l~%BD#Z#%7!nVO7 z$7imd7V`V_so%5LvQF8!A^TBm0E>^4W!l;=+os-5PTBnN(Zm^zi`l;Io4Wn*l8o6z6L%qx;4e6MX{`mcEHxv*zf{Nef*z%&oEu3oZXqdSCvzD&foMYq95*a|Ij|bAU$iAE*H;=c2HUF M>FVdQ&MBb@0FK^lr~m)} literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_nature_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_nature_active.png new file mode 100755 index 0000000000000000000000000000000000000000..11bc8d5c3901e95f88cc45c1bdc18b78f92a87a6 GIT binary patch literal 1595 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFjeDsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6p}IL(9V zO~LIJOPqT3fsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8to^uW?Pp+MTJP!N7*cWT z&Gg)ivw_xJGm=ML{LuDk!)`uU%8dmnnJ z2zf34%CYpO5z{5T1=H`&DA{!NuU&MGz}};*h3Y3OpLduhby%pcdfV^&+Wm;wgBuxz zVNWi_DVB9LbIw^WaEbe)_Jr? zUpW3~<};(FIyLQtMKct%jwb%{Q#@p`U(S68=g+c>e%9VH;@(HErm&t_x@OBSpJTUl z*LAQy+L|GDSLwKn;>VyXR>gN+4mim(T27HquBqnRHdD7kz#zP&Z=&7x55iAHEQ`ExOynX&hpnf)h0gP4@=>_-z` zcsV+Vo3H5k79r30Y)bpl)aCV?GtZTj>tEt^qQ=S^FMya?mufWAoWz1dH{aoo(=Q=ydhV8y(>`H$ZkWbSD; zbWP$fHGUpg!{WA}rL(7*?a;1CXRfPQt>yf*W{Pe1)U6iLMpHP-0?wAFm7vjY|9 Mp00i_>zopr09O%bDF6Tf literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_objects.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_objects.png new file mode 100755 index 0000000000000000000000000000000000000000..305f174cecf45240fc1986163455e35559a229c4 GIT binary patch literal 1426 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFhHdsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6qEIL(9V zO~LIJQ=EGBfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8to0eHBjRCeb+YDjh}KfbW(0iRCMlW?G=d=n-ZiHtSR^{%tbQnNZa%YN{X5;l9Mc# zYPfE46npl({!94s+om?(tMWhl{r&as@4NEzKkpmYJdZh=wt429$U8oMdU}k0;txLF zbzXgS)zfp#TNQji-EB0y!1(QoeuR#gbCm+yoW?@4IN)^mY6T)Axy>sJt-;8< z*=yVzu6>sKz;UYb{kf&;`>ZbCGpiHY;4H2AQ|(5C{Pequ8Vs+4{eSKucO@(!Lj)OD?W!6g{bbr1!(F#+$+6avIG3 zYfQW!$GVE@PYN>-zP3!T^M%u_lf?^KuCJHc$gLn-Vk9ZKO+2R|qkx;u(eCm`QH!)Q z7T;U*0=~;XZ)ASgvFOT$S(c8>JAKbLYaKqvEcH}oPQkVFP13&(n+RRo&mr*Cb?UOx zxf}i!sc=8vp&e7yWn%KLPe7sSK=iGWCsp%g4Otd1n6dJ^P>20&3%l8+Ee&1z+itoU nWag)Ky}o`%^}tQ0d#n-+t-R@1FFQ=>0+o`Uu6{1-oD!Ml3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFjeFsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6saIL(9V zO~LIJ3!HlOfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tVIoSZ5bGtI6Pe(Ln>~) zneM6K8Ypo*HYGwpTPGmmMWTBfkD{1aP@9g%QkP{xN^jP77_I5x6$(;W65e5?QtTDj zmC~$p=KTLF|F6C*<2}Fk{ob>`UtKSMzw^HB^ZN52<`#=~AAR)9r?|X$(@qwP*oNo+ z{K@R=wsdhjFrS!kO75V@3%2%G;(e=}d0#eK6mTxP`GYlrA?*XF)&a&D403M#j&j=k z?6C*e6hvn1$y;ci#QK&Nb@Q zn!HzDh)y`t)pl?d@8_kwH4S_dR=7Lp{aw+!`n4oaW5R^R?hagk=ViUDTKP!ifp5O4 zaqTKO#;EhZ4|1<~w3mJQydSS}qHq83Jz%%jQ)_l&a&t_X`T~v|&yR<^LTo?kGa7#> z4Vvj;w{OARyV8d`wbX9QCQov-la{}%oY2fW%_}}-Yuqp24SG|#3m@;vOZ#?ZD!bM} zZSAucE5ZYhb}tb<*0MF(MQPWxv`<1B&%d_2z2Q2+V(a79_LlW_QZWmE0*i=|?ENO= zV?M?4FPMA3S@6pgyNiVR%b($tI+9x@c}1#B?t(#~gT?bT@hsnU`mcCIlnE-liJiKv zbnb?K#VXy8c4)^Gb(xqj_6aCd9dN%@@}%mXj3LY91wAXjvvt_dX0eMdX=!+szwM@& oL3Va(*X!$NR1e%_+Q%ZnkgJ-0RVF^!5L8Zjy85}Sb4q9e0O*+f&Hw-a literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_recent.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_recent.png new file mode 100755 index 0000000000000000000000000000000000000000..f789cf277432d0f1bab57fb2cb527b99fb1c61df GIT binary patch literal 1392 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFl!_sTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6qeH{fy$ zL~jaix0vJ9s}FRHJ}6?5A{r(HOg$hbJlO&{@Pwb52Tbinz+~Ol&;5~sf$@o_i(^Q| ztvAz8dou-!96K&ICBda}El<~q7xfu06o2rGL`?iG_AMf8i*B}H%GLtO8;2uz@H=VU z*_t64GFxn?;SvQ!r%U^|?>F$A>oHE=k-_&zV(0UD#rC$(?^#!AP3^kklRa@(&N_y0 zhuQO-1E)kCUYj7O)4+M*;K%#|?sEq2dCmOXUJ)ZGF)MEQW zRSSmn1?)Kubp}UVo&V?@yXI*AT+Ym^!D9&{(0RV4FMjV)E;dV{SuxXCPCQ^0@y&`e`XD;fdE4!lel|P)`Ehx+qHAsceht(q zJMJ#}+iK~iGLg$}yfyO^X7}C*HLY7e(>y8MVcOQuFTXTeyx;D#uc1RWMenq#!P^H` zXL8gfxjY*61(@HOiHRFppP9Hxc>#}-PVlj|1|CxdiYcN!&M z_S^oD>-=xe3D2iWuQ1eih@V&dxM%8|9OtXo4#--h`5&n`WP913hiz5fVU7EJOWZgo z%rH0_zNvEGq?O%WZo65;YgDzb&%W~bpK%fEpK8YaOgs$BtTQZ@8yU)g%0N$7KbLh* G2~7YM{q%YO literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_recent_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_recent_active.png new file mode 100755 index 0000000000000000000000000000000000000000..e6ef6872a6e8bbb11b1d10b8b1093a36fca70bfc GIT binary patch literal 1405 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFhHbsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6qkIL(9V zO~LIJW1M>RfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tlwFmZ)0F!{OIZ87*cWT z&2(FDW=Dax_lp)y?9e!()ug1=WPk8*zr()l;!GCDt?$fbKntK}Cxvi}?Z?@iTEp0jfy!Ta+=^?3wOa)9U zt_FX3Z!4O;jxjhvh^MJ)TYaN<0Sn)O{%ar7mhF8bD$u;Ip;mywv%qaqj_@v%-(e=K z(GLW+G^i>pyL{A<`H$``F-POydEr_N4>ROq8q7BE&FlUmoGZORbWU^RhTuGg#U)c1 z4*N9D+|wj@tL4Cqy9_OQT$>K8-`tq*7;*fb|LqkQE!-G;n9U=WDX*;mU1?$nepcR^SZ*`{r{yU zw*2wh2H&|Mk-NJz_pVl&KfidB{n5U7!^5G{+^e>G?+lLJ{2z3~n64V6m$J4vPRQ)KJ)?GxBg@Ov*EBme zF3`|1xF^K+ZPR+E+YvjD7xaDqE8wy5$*-<2p97~S-8aZxTGY2ti~9lBnl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vf$McNz^NCM6mkoIHoK%2WtOF;xE1B+DuBIgm5JLeE;!AD z>P^Av7E4#0di8;h(Fa8=QbfaqfT;(>geO}d2cGa#^MI+n2$-yc(>i$>7?^;e=NM9P z>&^7@-XVb^$J5uG$qI_Pk>#YQHT`Y&r{fb?a=A8ZZd^Jg;E~diU(7m=EV@T-sVoT& z_KbF1Bp=jm#=6Zjc1wm>WZ(iZLzBzT50yVCnz?c2ceWS{cDp_1&*v4tulzo@_}%OT zwaJ`0OF~%8B2F<*VZJddUtyxhlc4-YzZVT|H}w9>S8x{2XxYCmSx4;iUgorm>kSy! zPH2goI3>@?Om=A+k z@lTRpr4LB%U@E?_=xw_*31@?Ro;PiMa8-153k`p=~Jj>`tIIg-mtzs%~K7y0XQL7e3Lsn-jx zMcF9GZ$2z;GJW~xgs7Xc7ZXFY|2kVRT|G4AX>#w?Q)Wu{Gxsk~>=#<^>AT{-*FI5g z{zFpH)82N})J{zdt9qz=r%n1$$qv_E`3?bbm>wJ!tgX pU$SsA+v)#3rx1sVpp2LN+nPs?CI*~vd$@?2>=pqIi&yq literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_smile_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/ic_smiles2_smile_active.png new file mode 100755 index 0000000000000000000000000000000000000000..7fac7931b1b5fe0c2977145945d3ad6636f2784c GIT binary patch literal 1522 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-v21/list_selector.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-v21/list_selector.xml new file mode 100644 index 0000000000..0ba2177bc7 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-v21/list_selector.xml @@ -0,0 +1,5 @@ + + + + diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_car.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_car.png new file mode 100755 index 0000000000000000000000000000000000000000..772df38a3cf906afe19b1abb22933e3320775aa0 GIT binary patch literal 2398 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 RV7B&;hY=h>I~T;+^=}#C!Mp$f literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_food.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_food.png new file mode 100755 index 0000000000000000000000000000000000000000..c6aa99f8abc1e14c283fcf58e8f64f0a79e2b9c6 GIT binary patch literal 2198 zcmbVOc~ld39-l-&4zXOaoI0HpK_C|)fy6{Y2uO+`g)E0qNk|3~A%{sI1aL|4M1kOi ztVadg!irka+KN&HSp)?Ud~_`$iV7Ya-4qpJSCE}3xci5%`(EcaGrwcLpU?MxZ;GO$ z)>>P-SONfG%?W46AT!hWn42N*TJh!w$mFaFO;E+k(o|}`0tSMGvQ!x4Ncib+49pj5 zHs65h0I(=c%uP@wM6RO=WD*?TD1*z9$PqLE(1UX1d_e}R0#o61v6KNB8k!(bEM!3O z#JmGgl@LWa-b%ke}U0WXml{dy;@RK>vm zHRGewO0Gr@<6~f@EK4Ck@{xvF03)&ceMLq=#2VUqg&0W+Ka(vJWJzGDio<3=$QPVY zETjea2M4qLL)ipMAUTvmMBHan1Bp}?i5wijq7Wzx93R7yC}a{fFeD_9Ob8_sLn$nF z7%7;IkdR1zWOi8C0+u6Hs`yd?yr5T%=$*&1eius%QNVnaOu?1OG8ZZ!S|n4+lp>iN z42h+HUh!h7P^MO{GN$Lfw`^D;&W43y3Yi3a7hjtABl-i#|IhFDSm7Uu86GhPZ!C`g zDVBvJqyml052cT6J~R(3MLI@-w1!iJCI|pb+BocBZchJrQo4v6Z1X@gZr#wf;`NTd zc|qls<`i}b!#ggzFo^5hXZnRhDA(rP+jF2(#;y}ilRIsaxZ@t)F18We){W4_%#I@! zn{Ryi&!6%dx(8gR>os|X#(T5bY3l53{Hk*4Wz$s$51Hl`josWA&ZH5Xuj3y#T%|Mj z4VWq-Hn=gttzGEk>lC$j^hwod9U(SK;<*;n6Y9O*hdb8&ZlQ{(FyuZO4N?f?nE z0Q#^p5!dbToy9h9bf<1)yyo%+UeEJci@uIV>beH}k)V@RKDxi4s{h_j-(HPsI^Bla zg&KW4OR?^@c|bdt83kD`f%q?W%5Qa>Z@p}KuGYD^9W;nK4bN}=vR-@?Wud7~<`s%&NW9pJ zUiUxG9EgkR9c1xhh$ZoKpI6TYWOKWrF30>#i^gVwXfzz z!jgffgBB|e{p*E$bgu#k?Ht*3TCH_WR`;XLEVf*XxU*DI^lQD9%J$zDf3g9`dj7%w ztdG5?qd2^>b#d~G()vt63wo2)Y>AaG7{ABf&9m}6#qM7DaTZ=ssHI~${G?io*{v4n zHH+)alA!qF6_GZ-#YJ%Y%1x@82*J(vRRP&3RM+;mJtnBBA3RP<#5HF~Zk`Vh_pGkh zY9Fw={ezj+KUSVwX$wrb?xsy zE2^7X<>^IYj?GPexz|R{ZZ&bRy+!PMqe%B!)L76Jh?@SQ|6rom?(!oQjH$*RVp04b;)w$p42FaJz_o$hg+ z^sO$pcG}<3y*O}{i($wa#JDWeKegB^=s4~-h(GVY`oP?HciNLd+iLseSk2Kg=YjZ+ zCTgx8+tEJUQ{{C@AI=Dhy)>S$J+MUT_NyVwc5Kr68a-a0mn$#J`^snT^)G)F#q||o z{4PX)KKzwscB$v_yeswJuMtuss8jNl{Rgu~%N)p3OamY(n&PF@oVk!mQCn`jVr2z( zio2$+5vk8~dqxd64F$nWT~FebkYXOIBr@G;nV~-aw7t!O= W>^x?$BAqq6>}?zxV#jJ>U18bN=(s z+`@>kEp|35Z2$nU;|8;%ke)gBSbc=Nzm}#BA>9f!Cr%v=C#f}jB?PcUumA$NGQJp! zg7~8J)T@v`0GKC9W8&0tp&@i3EW`2VY;anc0zm_S|7NX%FHDBipa2p}ap5L`^A5qDQfV-f1B-21cS*E9iKVc@DtNC_i0nrab^(m!?yrUB3=wbW;Yum8Df|>REZi%DmLTEu(is-(>BC3CZr3We@z8Y4>z;Mb!1w=?- zHLQ}r3NSF50+tAo*WGjCmp$!fAI`%*hCbn7=3-9Wvrmszp?v|S@`%&b?}{@cG5Jf}(5fe4pG z{ThN*gLUKRS?(R?1^Ma+w>_BE*u>7mz#$?oN%n$SQ%ud zE-$@!sl9sfm46K`JwEI8)Wtsd6{=bHX?(hezO40zS25bvG6}HYWKl~jgDWgM+s?XJ z9=aXA$T)qWGb6RVzp$B!Jn# zdC)o^+^!SxaBoiHzFAJn$TmNxf)DmRGmM1q8K?7fl<4Wd3G&>TD<^;2Gs=jK5)_!N zGTjd#s?s7WuDf9CHvXfZ)~)f!^f_1`Yw5RmB`LjVQvwKReP7PBlL<%1lt1GxB-$CL zvrLRh&PLc=q<4xP6riT>-E^&b1Fby@5mqcZkCCThP!Z7DXS^L{ZX;<{3W zX#LcK$7MNRC9?B|AKI^(=*){N17pccrdK|2dphIBnEBPC)E9K`t+WksF0CIm{pc8` ziJ9_^r-f!4bU*(<+C9}sIFy}`y6daYT+Lmq_HB2FOjzGnQ`MH-N_5`Zdd+}3G22TX zF(b_4rduyp)#&IH%ZQqE4!6%*uGrY;LWmj9bUT|iX|Q*~8AHeG-I%(@K#dcc)L-k< zHriqQ>2pwj%(&T4r_;n&+ozg+EyXt7t-$|Mw9e{Ef5p!j;MV^tkwQ5R6VR z4tTcYTNnW?b_C69n#xt7*1pUcqBs&_$HyYin?)P$T?(k-VNuQIw>(GCuJ&{ff*?hb zmAj$GJ&Mk_z8pnp$((MzQB^rzEi^|xrEdud(p|Cw1z3YxJQ+)a7Ck*Xux!Z=QejYDq&;xbWup1?rnxd@r!# zUW3*zyr4R!qjJW*yzX{gmN@&I=kP(o7n73f_w##99osvu-#m~KxqID##hk1A*pFsr zHk6E+`^U}_qq`;Jh9sAiy-k8>=b*%W4$AO2N zi&RU-x^~?TcB`npTzAIScvy>nwRdoA#wN%kwQd6c7-I#yD`r^FISzP8j>!0AB8Y0BZ(aK>z>% literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_nature.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_nature.png new file mode 100755 index 0000000000000000000000000000000000000000..a5c958f57b23ab4ab77e9db58bd15e9132f08b3d GIT binary patch literal 2513 zcmbVO3p|s1AK#eECimV#eVn}`huF<*wwcQq8I55@<-{(}7`Cx3CMD$bauODV-J2GuoZVE9wx;r3A&47MPNp)?5Lu9zFH2xc01%ZY<^XWIkR1U80&HGlTpK_E zfzy1Of`{fF}^Jc5r(P)*g*f-UKApfs7}R?H%D?E`(B> zgvTcb(!9RtQtq4)kuq5<8I4XzNI)gvP-0008cQOPR2=s9NTmc)nkbU7{v7wg+U92D!)ESOJ#w; zzs&fiw3L+?3!no5sd$%!tIP-AVg;;>-5)Db2`a52`%47Mq_AUXV(u;>Ad=B(&Isif z6i>h-J33IQGzU)_hCsx760l15X(S?+Sh9x%V9Uf3mRKCKQUT0Ju}mzD z6vx6nf(UTyV1bAyPLSHD((~C{8XytG13WK@SP1_VU$WpE`W^BA%kR%v-v1Lbw9*)~ zsyP0wSXPdd6{uQ%Eq&$YYx4jiWyeTVtzp4f0)aHabQ+Z{-&LV<#=nG(W6*tW|n=Cvdk2Nfc+t*rw0&a z<&gm{UUnrVTRj3cu6cU($%%uPxf>ty}7!?Hak} zKt8*uO7mEdMRVDBCDIQ$H2tV|2I9A)=fTt#0)*qOAX#(%BIsQ08O&{#9 z?s>f)lCRMTo))z4Pfeaa5yYB=&*{!-%^5K{@&5L&7p@zG=xiRl8lqTJ=?j8n)ZUTr z)}K4j%H4Z)=Q$wq{j5c5@$QGlPswNQ+O-4@L;z5?r6Qjtt5IR`rhV!nb*u70A5T9? z3;K1yNNVk&ORIughC|g#D{kl({*sm_?>R`y22HBxfL+z`6!WbvKil@|m}qCIq0Zg* zkBv8Oi%{H%%DOOs2rrBJm_H%jo&uyJ2P=ox4rZy{U@e#3i#yXd2kqCM;-&wbji@T$ zzKf}rT^2v9M{{dGW}25$%vyFQDy$2)QuXqVxol#u`hjQX!tEr2lUU2J)7cM3y1-!U zYh<^)_S(&1Gq84&*01)tQP0%sFKAo?0+vLb*!9_C@w>!-dA@yAs;~bpZ7id9?B&M% zpAO0b-bB^X72wHN2UG5CvvhmAy|YPBxpn6e+%Tk*_54qYV$#bGN9ZF}?(-(ZX7^~w z=x>Ej-aVv*3#-S!Ck{@86!Khai)&7-v(tl`w9F6qPH$<* zVdz-fuV-Gj6P}F|`lTe#1hyYs1*-P15s$W;5}=XTyq8D8=ISbuz~$@39g1(*Z~K2JWIOMN||{v9F}UT@S~OAvoQvhHm8gKInFJY_)4DD;bs=uh;l_0^zi`7X-p0u~i@sfpRSLX=;DXvF?b#ma5!RmExJE4`mDyZl zb{DGW*u7zPU%;=!^TT&s+8gF|YPy*t_^_p1#L3dS!q<#W^dV~th?vfNgb(M31vioG zy7Vo3H`u7PUljq5^gTE22QA&d?B$HJXzr|fI9_o6g|C_z*2HO^PUtcjmzmlw9Qg5m z2?hCmq-@|g4vjEhWSn~+-BYP(w+vgrbPRS+5Amy)con2J8~#P3yovK!4}v|GmT~49 z6z{TE7+dHM5gPJC6R@Cs^fSp&qlG5)sHgb@UpIw$Gz2q)=Cd+PehC{t&+}*+GM|gf z>Y(1v&N6oUt&*}j;rMOVfm1Pey*DNmwK@kx+IbHYJz-rr7kKlp>`Ff&y()rOyA%H*bTtCPuesL`=Hhr%f06;`cWd(F zk0A6N-kO@DEqvYMrI}S7XM!^M1N6(7Tjiria?=0=(z5J6PPclZpne`to*p;_@CF85#W7$h|P%2vP@u1`ekY={1*BKUs87 KKU%eWc-rq#nfS&4 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_nature_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_nature_active.png new file mode 100755 index 0000000000000000000000000000000000000000..f2b57bf566e6cbf5717a783c65060aec31532b84 GIT binary patch literal 2499 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_objects.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_objects.png new file mode 100755 index 0000000000000000000000000000000000000000..ca6ea1e79e0fce79f8f6eea336275e1d8e07a182 GIT binary patch literal 2078 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij}#Eqoa$7 ztBZk|g{iBVA<+9SmKKJVPR6E==1yh?W-v3b=`{i>Ff=!JvoJMqH8gZJb8<8_wX}3I zax*e@bT&6Ng6Z|lD=taQOHPH^n+dcRs@D~-UMuIK)WnkfqLBRj99Rkn$jC3rFV4s> zP;d@5Q_u*{%uC5HFV+M_55%`FsYRJ(sVQzn`MC<<@U_asV!yd5A%8>krjQe6`as9% zgAxZ)Vu1+(Qy_>5Px?R(JoBXH0dq_dFlz{=?(|?_VDa;GaSW-r^=5XaN2sI7@%5sY zn%;g@+~O3iv&b$*J1n5~MAtO_uNm8GmvV3~(%^_%VQ_m%#>U!>PAe8Pol+7s3exIa z(rciYan(!bblm^L*8P6X-+x{y7cb`flkm*!yVd9Xv~x3!rJjAQ>iw0&+f$Vn#h}|D z=D@vx^#W4{d~%IG1;RD_&lbz|ACF{Q zwSi-UfDV(PT5gm}fwOa`G{>`6u}JKhd6&KUfJDHV^M?*{8XWCqGGPvP zSW;mor*i$%?(oV?n`c$d1wFQ%t63JjycK*!_`p+vT5J9@BGt|o)g2t$IUHtRmU%hr z;8%h7x+3x_O+o9*nWXP39Y`yyPPzGDkE@)vf8>9W=#qjE2A4*WyS$?PV$m`Y7wsmW zeyXO^wAeUdmd0`oyE|IZx~Giih$U>%n7{4ipCW0I!kxxxiTv&?2l$t9tkVwfK6+)# z;k=Gd4$IRV)(E}5naQg5cSC4{*`hxe(-`e$eK{P)IIE*5QXo+2=Z9dK>)~k+_Z-~I z+#2fh)@X9w4Xp#!fqCK!?iv_~nWU}{JmA>#=7-A%mYnDLu7z?3&pgrm+#Jj#(pi+! zP$@2>{YT`^JiWh_cXzfjpS?L$<6DK!bPz?0rdNjjJ`cBL_!9C9+{)x{xzWGU<==EeF?rJq0{8-0Sel5RKhVz(a zuC~k1<)89@AFxXO5Im(kMw3A@Hp|cKpKs^)XR$H2!VZ^f&Px69PWX?T=e4Da>iXE@ z^IEevzRKIs}GFSxJN0qRr9Xt`E|YqKL4-IC~HQ|$}9g0CNQw_-YCDru_z8yV|%*#xvX
&=AzhmF)l8khEX|)sS`DNF22mS8d7DlF zryytokMho`NNEV@hv;CCMf0R8AO-_uvuO-37MsoR0GSYjNr&*8O=Wm-S!^!T8+?CJ zaBDhcELSG-e{Tz4@hI^qs^!w@27`fS@T4KSI68yF;g~g;Oe&6`>XS979HVOVuG0!4 zSg+8jw5STvfM!K`43dQMD7dHZLQrd^(htHK{rg1WDWhX@EuBGw=xVh&t|_!0mBIgU z5=Hq!6tq9hsw!%t(9ij%O^2=3y%s%UX#r=+}{C{#r$DN^@i{rnFWqJ#* zK=brN>EnwJ%>!%jj?v+*(f*J}0syN}iAWHRwe^>(5~YGUtw_GVWMIbu$Iw9c=1-y| z`5n8d-`IJr4Gay;&j#&<53bIx+MKZbMM|F4jIU+F#hKZxc~N^llh#lV$^ICxFpYK< zpF4SSVsOO7xj`>EZ(M=&{Cg;c;!8f^9O;s^tgmHXWE}C^Ye$+qAm^(kg{s>jYpm0V zl{4pCK5IH1Qf6TvZH+Ya`%-nHW#HlkPN}=ykmgzW5Z|{N(A5FHRL1W=G86 zx17njZf6;n9{zFxw7!O%Z}Jme5Ca>^j%Dp&o}1NkX7A)~uaGXNrTQT1EH0W7WOSMsbprpMNrc%xenIwz;&cT#{u-+b7v;ihBG*y3uU6YW7p zBKPt}>mSQB8KK1;nZT>)kq)lzZ1_y+3Xe@ye>ct}3}-jQRXdc_x2z)^${E{UO2m){ ze~Th!&hEE9t|30Agm7BrHU-TBpk7L1Moq*Hw^83;O`!?kjhk}WK{+(rS)<-qGt{`H?_Rm81pZA=c zbF!ykQC5Aaa~&;q@00Imn5>IS#@M6x_s1+T$3QG*+VM`jC zN3J@4o^aQV^B0{bJ$f)k}@Z;w+d zjs~rWAa(pgv=QyJ^}cl0Sd?F3jE13%br7+#R#W)HuCVTxlZq7ggLf*rfXvof3#b0) zcHP$|JaTzW<)8n&JpWDIq}o057`jrN+`I9<61VijF**`8*~4 z?y~FLh@L#%Q}^1(8)_PzYhoUG|MOMKtw7hxOUq6_8EPlUf`)fzRX31>>Q9WWv+3|` zyw*q^;aOr!C3BaoUB?dDC1~!wd!d(27&Gjt2VQL0)v`UeH!otFRXpJhop4j!CmtporWz%Me7$m4jm-DG_p()PgLbh*}FF86b~jCQK#-SSpCfx*V2N zNI?Z8ibz3>Z58*afY?@6d27J6bhV4HRRJr9M-QR6J5g}=4`27a{k@s_UEj~=d%yWp zQsUd|)_AM|0AQUco}Wz2apsr2n)rSy&l@8qcU+K$i_t7xE5TrZBSSM`P^6S(!^yBj zR+#q}I0gVLv*amhcv`}{EGep_O3X6U0;P&T13*k{fl4CHg>f(w&Xyx=%G~)r3MiMc zDO)2G=m{zwoFk7f!eDVxVv4jVSIU%8VmE;?1uTL<3F8v5K&e2~tO7RW1uu(On~!M} z@P!DT%ci_EDlH)i>*0>g@%0?1=G#@3Lju}uH-o#r z?&ij+(^W1ypL*6^ zxjS3hr$3lmnp;ZGo9w^R^vowbySI_4zCTpLBSz2xxcsV$L2|ROSych>N`3q7GRSn2 z?9=Mc7P(@vIOxY}-w@xSfRGJN4#(|2%PT3J*UcZCZJEc>$# zsdo2mo_IOx)?(23t>6LWKp}VXUy#*t$3(kk`=2)C6vs5yXj@vlrgt}3hz2)uy?q0| zzDTv1vE{~A^hR22bgU#-S%-i1mXyPHo&YA2YptVs-*)e;GERf<`+w(K?pVjzZ#
  • xE9Yb?)cB*4*)nSl|G(&93}r@5Z)A9xW$Me|%UnIR2i@eZt-=(8_z(VXTmC zRUq=9J>F4~TU|vBB@e?d=skg#zHMpnC`R&i=T&^aEvE;2)80$9_+JjIQtD_eknDO>g|; z{eX;)ta|iWe1GVa-R7uKazpUQh1H9N=b}m8A&rw(tFZQO>`RaA|66PST8rbAcnLuM zC1m8l#d*@_f};M8)SR(9u^OYF^A(<#({$GnetB}^HHUPPLt$kfzv!4N$>z)Hz#f^l zY;jwja8E9&I6nKY@=YIxVPTh+0x3&lYduZ=Ui%FZkp=n-2aL^e&7&t+Gl)E^`QQccD*;f+KryQ=Z7 zb6bx*yfV{!`CIRRr_7UGJM4W^@z_?rpl?oe&vSSFg=_Fb_0dO24G`Fr^t`rm*P^&A z&0=mGqd#>%&h`1}$%WR!Zo|avzH18|wa>06Ra7mv@vE)|#rJvuOF%dC&og({>~t{y NzD0sWem6Ix?B5(UF@FF6 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_recent_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_recent_active.png new file mode 100755 index 0000000000000000000000000000000000000000..40283e4c35748f27a1f8f9319391209f2e0651b1 GIT binary patch literal 2082 zcmbVNc~ld39#0^TB_K+w;(;#=;qri7kPu=bPDlcX0St!;Y9Yr6fg}@?!31Piz;Km{ z;wr0FMGkGYrIuwYq5|bnEh#EiJgCx#pz?rnqrE(L0^;@$U-!M8H#5IuKA+F`_l%IRr#%WT}uC zk}0!xeFt$c82g>7cnKmAZDuQA4OwQxkWCsL%En+gp(dS7kpUrq97cg8%oo13g|4`yGz8JHDHNm8NHzwNVSOrv77`L-)1cD>P(*+sON+=%0a}CC zyaFFGDD)~FqJp)6O;IL?GZ8Kc^>i)-jZP$bC#*HRO%$3kib7HvSp z(0|={FWL~FrGqG9$N*>R73g{F^qME5x%+cNHX!N^J4UZU4@IWt!-`A|q(vh6ToU?) ztW+u4!9gI%4-)XHOcq1Hq@m&SLs+yBULXSu<}sIzyyPs zEEXta1@Qs}fmAv;&yCa?5Sdm1&D&Mk?9Oqif68Tt=^+^c>*HZqJzoK_X)ppC(qJ7B z7RLluZ&hiPu+gx_c06;@@*%xyH>4EmVGS^wU$*Lf_8I>x?m4dV|H&Bzb%tUqjz1L3 z{1#e)w&}alM;Gs!2hyS)qeojq&fg)$U~u9{J{WI$FqR~WNC1}*UwmU{*iu2>>AXIHJl2uFz%xxn0N+T?Ci2J)4OVj5jT0@YT{%w;Lnn^a4h+Z`<;^~~+sgmynCccT+6#m-^(XKr|bN1qkNzVAo z_)*8wH#5Y=G><2TJtutzm;-iIPm|s4R+w*_KQ+JFvNp8Bzx_f?)jF?(VL<*EaL2XV zi!&{MIyZB>TjWMWFUTE`utYvpp61=t&A(WBRa zNjm$OJH%(LZQe;vC(D-9T;J%bb8`skE=h!=`@c^w>{?iUfe7t67Iw=1=+Uom3-zP-7 zBEg_^_f^U7i_PG61%a&iv?~n)Z>V5XNk-ws&w05Y_Eet5HL51DWA)0C7rq`X zQt56t_3h}kl|2ty?}pnY$-=yQzarH0YbP)H2HvJGa9<@&&&Q1XGZP0`yfjuO*tV*C zVi5+L%+GGb8(9gpe+f!hTS0dauzgk&s!ZQDT-lnJw(jaf68An1Yp?j~F!}zn!K}{Z zEucHrqvhj}p5uSx=zTk%29>`~kuMx}b1vg7!YO?%MNclOZ}-`sDn(=`$~ISfrr*&qRG;ePq2Z+;`;RX<;?!pIIMy>?f?hUjhpl ziP%?FMNQt{=Pz?lf0W=Bj4f_YyyPa}I1i=Q<&ZlMmR5F}yxLFw6?^4z#*QxxQE@TF zwU_T*JGHU;L{-b$=70EY8==Xf?A9eaooq0kKdl}N#&&%TbIGwu5Z-`n zFNhA;T5jb@AL1PcDz{H|QiRtSBIl3irHKEY&c@Ac>_hCof*ooo( zqpx=7Ug#!Trlyzu@?-13$z$e=I<@Ids5q_EkKKoLdWOXpR6KUMZojH!ba*Z9b*Y?+r6h!mS I@lx{t12Y*e@c;k- literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_smile.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_smile.png new file mode 100755 index 0000000000000000000000000000000000000000..c562e241e052aadad42276496fbfef98ccda92b3 GIT binary patch literal 2378 zcmbVO4LnnOA3q~YAt@@oXf2hz?S&0%vzd7}F`k(#U28jI&35K&m_q+8LIUP&dD z+`6UrsOU!NwmFCVsvw4l*+)9z!(pJ|T{8M3*w4HaWIb_=!(u)|loA^D zi%~pwFvb&tK@7>!$w7c85HMu2Bf*(OCKK#2L_C3r!y`A@f#6IbktswM%-0KxXoH0! z3Ww$WRTr|OVPlm_IR%GHN=kA}a&m;=7#zXP&255%NOV9D4vJ)%lCN@*DV9z$ut0?X z7R!}lNQRkU?aKz)J(h0vlqZLXH_#ZRA zi&lgs%Rw9mR6q%^0Lh1F>7+0cyT4a70Yt2!tcJx%QuuK!NRS`}WlBF54U2qn6pDou z7iSL-ma`WNPj)4FkqL2$&(!4lSPm&-Y!lgR}!8@Ab648Ts&AF zo+K~42Z6xy_8?8l`pFbZzDxj4>J=k;zsfrQtt`b82Kh<|4uhb$$qERLg_MvY7LsE; zL&+GMaIs7XB`H=;r00vbED#nafa-eizdJ^81Ud@c)S!4lxEdQ5^qO zER#n_1x_r#l|Hih);ypL=@=Mkje?8I=m21#_G5X3saoGerp6Y4=4rCUN2Ogia?>d`TY)>Xt+n-zL^E?AS_zn< zdVy;{X)GBuIlVa5G!E6S7gQvPWV~=UHrD$!)3`nN_c%Ku_g1N7Arll2qaa{+dG{ZM z4-*ff_Dl<0CelT$O0N6IsvT#{MhYwJT7dw~CPu!RjES^3u1`r{RJ|nH+?Bmm*D^!b zc;>$5=SRLR0k)5Ufb`r;yBDdaT$=GDBD1O}uC46A{piI3cJ~1X81rE7v?5@R{{E$T zSF zZL0=7ee>yShQ}W$D#e9b=WUs{n^GIHWph`Y(L2TMvyLe??&|2jGCtGwbe2I#3>Q4kfBECEpByKr{W{m%`O%QOo$JY<%yd?TN8!bvH$Saz zTktsKNXb=GUhR&E(OqX%7E3%DmVL6@2k>hBg0j6T)b2V#F)MI$oH{-As6`*NGNq^H*I{Z#kD zebcsbDnm3X>a+?k5N~_uc;;E{HIsy1_7!Yn7QLZ7V{=DyakIY-ugaL(I}miC=xlf8 z>DslvSFqY+Ohq3PaHfrrtW+HpAR;`6@!RNmPal0o^d zwaU!+%#N+(%g@sjYMb;+46}ZmI^+1L%qnW_AW6TlE&ZZ+D*+t=!gR4lB0Lm^4>gKo1rT& z4X1Vl?)_(H!|8@Y90Q*MlRIYTZoIfQNGbg#wYtRYcK;FkW7NcbsYBj}R6Bd+rVTGc zcIS>*@{nFE7&Q5)|Jr7>C&$0{cpCOmfX|SX+^#svs0xA?J6+h}L%b<4&Nmsza9bWO ziRw>soj6U1`0AXYTTlApe$e%M)+~ i`t)DMaqh>}8Wf;Y`*Y;d)nyZZH-270tW(VBjDG`&q0*KB literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_smile_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_smile_active.png new file mode 100755 index 0000000000000000000000000000000000000000..6a3c0a6067f277eb3a1bbec5c45968279958c043 GIT binary patch literal 2368 zcmbVO2UHVj9#1F=2=1a33qlO2i-c4Xl1M^Jz}y;)0Zb4JF&QL6l3@}c^s+XNQ#>FW zbg^*90iq%&AU=tTx{4sUf`APnBFdtuGz*KuO;o&l`+R%v?R+!ymHGdE|Nh=&^MV4c zEEZWH5C|*IY8D@!eGHG;Ecjg^jqQP_g(|jC6|9IM3ThV zCcq1UFpiXl2vtJv8oF2^!-@w;B|QqX89aE3i!}XP{rzUqqv%5(Zj8 z=Hj`aKM*Bdodf~FNkJjvq-Zfsg7#*jywr4U19?D+<0Vpz-^3i!x3mSnt_8zbcZF}m5FkdNbN3HI?ph$ z0Hqj`f-0#(jxsQcwkqOO3^Z)%Cl_QOm-~fSuKXM*IAl1r2*eSvc$`dT@av6xkQ7deD2AmF$H@S>io;@{;V)Q; zR6_Uk@bzVRuvvHtmCU9PVE0)xDuL!lBKvy!QSg)*j;~>1Ak4Bxra^y;tNG=9u^h#m9pRwdW#M1pCK%`PYAqqvzOa<_w6e@)>N&%w$ zgDI%*1X8&~k)U)nr00{jEC79RtCwF>vVnwFrbM$YJ@0sP7Mjr$(&@Y|?v(x6gpZm1g-v z#{Yg3aN8TQ{HeuGm|ilcf}?jjsX6Ym)I#E7XZ^w254h2S`VHdeo7<-1Rjj>H=Cv59 ztfr(xC_9Vio=MyNHsR6ma8Gh?Zt|%5Bn%n zN0WABioNkz<_0};^Q7ZlE8W~8X75Iyex`|~F>V*8C%4_fjd=g@!Dt7+t2L7uf=suL z*X9@6>>_AYh(dpizSeGZO?fO@ykgiC(AF4rA$pBoKfC`eh~t^oAd@q%G%NsjEqGje zzW-QX;nHPg`%d2}s4(h6I<;#VNej+8-W6o%QXL+YR<;h1x-yC_ zoK6VtGPlLoziY|kHOxD@xbWnfsUSUXM_1e)B12o)x((~P9;_%ljDj-4EQ9KX+c^>L zspPqNJ`)69>sVTZEtIJw0mv8INBmj|*dAVdHGNAH%|(G!PikXxEBlsl)Nfo0E}bD# z%=YHEHCSBBKa&yI**AOsMx7|0dR=_rigWfkM9pd2~xM}dTE6XX;a%dLwygdKDMS#Q#g(5{vt-fb|APR>m; zTR2)4H-&Sq8@>A1vbt8_3&>I);LmzJC=q;Doq0Pdlx~MV;UV7yVH8 zV{|?*0~?z=&@k;f>`~9mYnPkrANn2U?3=*Mo@h*cY8M_@&R??jDK&Dj2m-a8i8lwF z;x?{Zxuke(m&LkC>0kB9ChxM>CEs0P_RRF5d83wp&DDo8ZKX){Ad~KzqxqO)$#XqU%&lR$NG}$ z^Kb86{d?UTtKPoO9WD&*=qXGeW?0)aJ}WR|%Y@)ry7btVpaT!Pl#-F&L>hAC<%2F5 zpYpY?5vg{j?r>kg){^Nr-je_8=%>4yATvLd!?C9d^Ztq6V6_FEO!{)t_%tKBK z#~kLDOs4i-yXM6oU2S`7&ihK@mD(_MN$43(BfrzCYGjJc0nbmSM1&WA zX!wr*Nbqa5W87?$`cnt=-LrJQz~4w=c^{I$d7e=-GF@8Lecxh|wmZu;bV#w&dX6OB zyCq`zcurHwoyB{oPc%C!zSrp5z00pYaN?Y^tKuxb)grkDX0@M+-UE(U6%4vhVUE!F zC-mhNzW1_T5)R)Si*+s3UnJzB8ov0J`$mm~KdhYFx+QpnSO8~yJFuX6k%!WeOb W@7vMMiANg#X*ld4R;6D=)_(xxd(&J1 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_stickers.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_stickers.png new file mode 100755 index 0000000000000000000000000000000000000000..288723cf3a3331d1463bbc94eccfcb15a85e2681 GIT binary patch literal 2571 zcmbVOc~nyQ9w#EFG{Y9ta)~I-90gGU!6i_@Tp(23vPKcEfy#bWFiovyvNEU4B~7z5 z+ooJevqgDLE~U0$SyO4IHkDc~qc!dCTG@MlbmpD&?z#8=w(sZj-S4?O*(^_e-KDxP z7);-5EzKVqDO1mE9q4^ZDC>cSB_KTn43I>D30yex#U zW=07)Az%p8m&}uhFx)8_j8Y_p&@h}{<6z6P!{JZ_0tV-ZClGKpD0@4cJ=PAo3AQ*#GM+%TC!)SyXh@r! zA4T@3F}~`8R<39P2ujIVY(hc;CcyzCk#EA{NF>q}hrPWmBw?#ii9xQ?R;*Yt%|HVb zJh@N`3MFFH6eBlM5(m1XAxpowAd)hf--yMEuYrO>hE;NGRT zd@|9IN~Jl{X?6rBJe`1p+^3P8a3psJJeBB9up>-!d=HB!ksOIcJkAMkN5|pl1b25l z!-+v)&^<^DB91|t#(IerAXm%-ru7OTy z9svZDRj^RZmn0}wPo?LJw=_U5j0gA(xkQBe9AC2VJNk+E|K;}=EdT$B85S}IJ5?P2 zRV>q6Pz6p+zm-0;_|`mt80r`~)Ed(CS~(1+i=TVl~r=?Fio_2IlUjlko^`mfsB60{&d*DXpzwstCK!=1r`i?YnX@9oT8gN|FP!aUeBe4Ie!eulMJ1x(*?OmaACn$DH>a!1ccD`bcI1DwgjeSYo>#hTghz5s(CiJ_mkwG!qxY^S<#>NGuG(#;3rZi_ zic_Pdd2xEFeUb7TFru<>+_o~~&r5$qM!Y~YM7=U*-1Vt9NAA}thTPGMm}jsF6V4A+ zdFBfHe#l}bbPDi=OUyd3JDcW-5{k0|NLEO>3b>B17d&Mj!3U*xKHn9P@w(jWxRq|eoI&KN3DWE6E?t#oESA^3 z_-J30_x|(!$Wnfa!GSB+0xFD7b?%(Wog1?rMm zn?A}BL&zpkv-}mjIPSvgHybqDbGU`c^rrB*=f-8jI^4}$6UT54S5<9k$(WXe;}ng* ztyve&sldM|I?y;bH39A>z>lWNhJ)i3ms@@2X1pEl>6iED+5(w7Ofst6VGj?}W29GH zt)04`TF4tUWfP&A#^vU(k9mVBOqIJuV&+K}YyDya!XTk~2P!T(O!ICTED71J&HQk3 z!JYt5@wn{962hFdKaRX@&9S~^>qd9Bocy@tH06T&>7T1q6<4L(;9-dL6iJ_wV|^!Y zxz?`%{&&WFw{`DcY&?J6@)hj<*+;&!UXPh){!|t;n_~J5cMtQIA8S`$XJB7xtAH_4 z6MFNa&il)Y^WHpGGE8FYb4G*%x=rr2@Ne+q3=A%c z&tk4Vb7N59rc*s`pE#GZ#k^yebSux{q1bPp&mR;vv)BbA{uAlIX?U}sq5EHkgI3j$96cw^>3EN%6w zN_EZ$YQM|%eZY8&2Hu{;J8-Z?+l~1(mVMmNOp%dPbSk4%Ta(c$KK45@H2Y4K$Y_0u zK-@*6QE;6?Qs=RQAnqkcAyYea@5%BrxT(n|Zod=uuyn0WWAxIHn{jbb{z-NiXNb!vA3BQ(t0}Rl5tFYW lVn}c~;`4X=&Ui6wCQL^u+Y$97rE2Q;%!|&VmAgl5{WlxqDp~*l literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_stickers_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/ic_smiles2_stickers_active.png new file mode 100755 index 0000000000000000000000000000000000000000..2b6917aebb5ea9eb2dd31f7ea5233f743282ed6f GIT binary patch literal 2580 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/stickers_back_arrow.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/stickers_back_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..4579d546af9ec4223085da9b3b60d08908d0aad5 GIT binary patch literal 1272 zcmeAS@N?(olHy`uVBq!ia0vp^DnKm2!3HGjUf)#)Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_naLn2Bde0{8v^KDjP)EVYz|dIVz*yhVSl7_V%D~df&{P2mlz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij`p|xTF>*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu09svx0_iVsd64 zh_4CO;OlGUnO9trn3tUD>0+w{G(s;kGsViy+``z<)!4+s*wxt3(AC7r&BV>p!pY6R z)!5k7#K{S!*Cju>G&eP`1g19yq1P0rUQk-dEdbi=l3J8mmYU*Ll%J~r_On$cZnqfW zG!Lpb1-Dy_aq86vIz}H9vq&)w69Oh55EGtmfgE_sPt5}+_ab1r{=4_&a|Q;+Y)==* zkcwM(uAcTf>>$GSp!02q%F>%H*Gdbgw?@?%$RABFc<3a+)uix4idV5kz)9|)^en4+ z^8N}ulW#}FSQL1iIP>%TbfFaiUYsIpnO8Zlvb<_|)l+~)JT=m8rLAs?qVP?dnw@1=k^;jMS`)@Sp)Gwr$FYS<{V zcvGrnAM=%#{jB}>?9{dU-3&!W@ZSB>NCSCpANUafpt?g*pD45L#|tscECUlp#G zpmo*Qf!+7$iB?9DAXE9k+E2Cu`Ob!J3pT`m)mN3)4>MeswBm<%z+L;yKdcX;Z{AG$ k#%PqP@p1mO?F`HeACB#pUtUsm0#p`xy85}Sb4q9e0GbK7HUIzs literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_car.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_car.png new file mode 100755 index 0000000000000000000000000000000000000000..4a0177503c7fcdae7bfd9ec655aff9d14cc460d5 GIT binary patch literal 2938 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_car_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_car_active.png new file mode 100755 index 0000000000000000000000000000000000000000..417c46f15862bf0e5e1c7a6557374db47ba311d9 GIT binary patch literal 2941 zcmaJ@2|UyNAKx5VaxKjfYPN*JjBVJQ*&I1z)l_6=*$SA?cPQ>2QSB zBSLweLOGk_sT>WR^7v0r_55G|*VF&^`u%?2}XSs4IgULiM4NgJZ(msn!61G>lFp zaY-KTSPF|_LSDw0L^IeDHUMC47tJP9LaAJ65H*C(w1Lgk--SWx!8Wj+Xb)2lwj-5B zcZuatePca|l-N*;RWQuX7HS=hl?X7XTrxD85yp(bM%%!?>0%}Gd4|yp=c9xV~Qyf3B_PckSH_;gEWGgnIg>)rji?Dj6`A47_6BE^!o*qSmOlm z!}{QzzT1+lY+y7lmyJarcs!m7&)kH?2|*yOtgMzb%*>1>2;+ztCYKy-%#48lP{30o zC>%PQOJ^~m%ZlV6RwUO3Ch_#|5E$&AvdoC@X_6!i5lvI4TgYgp` z!S$j3vXVTo#AOVuk(4qBo7jWkt|fY^b9z z25PXA&J1SpA`HLbJv^|k%m^--Nuj#pZD0}w6FNN@ORz9Q$ zv=tgfFgHVE@TebLJc|;^pfb5XxWWH$(ZA#_w*rGLv5cp3=uy;QCk~4N{T4Eo{%c>% zeyR7J8~kfu%zw#6NSr||7xupj{bNhgJ^O0x5?oRJ2B5*Mg=GX!XPL}Q6Bpnijig$@WMJnv_ z{Ny7F5i*3%Qej>^Q1~H|YlEehEXm#4rJ;>5bV7&~nMf<&TZy}`5Tq#X4a-m3DkxTQ z)@K`QeRdW-67Clj3md~>I@4W?X~}7D0X%Ii&7bk6in5eVa@cdMT`H$}rP7Vt<9kJB z?jE}Z6MHhUMp{m$%*5!39YjPeWWfEmN$y2Swl&DVlr#i!W7eX5>c8FGVh$_e1R=w- zJV+fd_lJ0(8n}(t;RT*poeH+wct(6%r>*Cd4}J@_iZY$=D#d<+90EUbq=sQ zD5oI2e*Hls(fGRRnvMevuf;Or*r&E9ANoFA0qGihl6M&mReXG|Rawbqsn>D@`6r2z zroOhrYSn^t_-je|J(}e0f15baKO-m$GZ}mGPVamTM7Xg1OQ2!+osID(wU_2riC3(C zVP|)tWJ08|m!9#+^4#yMiifd!#7?|o9Q#zY{x&<{ zgL?;+?W(*chm^GIJW~#Q^_PQcca`QQ3U3NjQMp8T&H`l4=)%S?E$#0K8U7hD*ps6= zx8Wd=68y`H;-$oGR==%ZF@pB-Exx;6Uz?XL)AtKx6BY%~|~G6Mbc$ZUIg#9z52mNp}B3@Qtoc&6V-ss5!sjvgO=S5cD>S0FQJFf#mK4Y z4UnQvkVdKD!1?(Lr{whC#oT5OI|O-akF~WvYf&>yRV2ap@u5#_h19^!TYH(7gWMm+bRv;f^z^?YIA2H!@fQKu(=d8ZpeB2K;{|;ir!yM&v@au z;w|+RkF!hs(hK^jMReEB7c%3%Kyb*i#T-^DqLY^7uV+RmJIjkKc?h00geG|y|;GJOu4UXxD} z7o}&?11GawwkfpnUKUkdsgA8{y^vTAQ!q>`CeDBG(hr5GogWq(uuoQw=z+mNnJhd%3RSUVoHGGud1J z9qz)KppfLC-MI}#etfi>GM@gGCNq3ux_q#hWtKdLHy_-QwP8V7o3`ei?$fQEi_cax zm7O1?OLeCkJP`ar>NM)u0zAKw5??7(wfpqS_z%E)nBQ+=by>*aueh4kuY zoA}~OI~rPA2KbFHF0LXD_?7kp2dq!r>q>^(GTEJ{?Z@V$idqu;$a>xSUz7@*CclQM zH4B`cemHmHDnHk@>1lc=KoPw`Qh?Zz=(e5M3SXNt?+Q_9yA^L6I?l^?YEd% z=QVqI3jBF*cD}0Y%KtetVf=qTRs&m?q!a*UzWuqdcfZdp{}8(pJn`4I1Sb6lbW!SC literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_food.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_food.png new file mode 100755 index 0000000000000000000000000000000000000000..0b1a1a1b31cd8b075dad3c484aa02a086b68ebc0 GIT binary patch literal 2774 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_nature.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_nature.png new file mode 100755 index 0000000000000000000000000000000000000000..2558d32e4099dbc2e1c86ac6e8ee97d2e3dacb5a GIT binary patch literal 3280 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_objects_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_objects_active.png new file mode 100755 index 0000000000000000000000000000000000000000..f159f569d2336bd6f74f6f98f0a5488cd668fb5e GIT binary patch literal 2676 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 P0RVrWP2T06F&X~>#&8%( literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_recent_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_recent_active.png new file mode 100755 index 0000000000000000000000000000000000000000..ed16a56eb51583856eeed1be40c4f969bb4e3a13 GIT binary patch literal 2582 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 Wtzb4Mm-c1(+Tu)hv%j)ADCu7glZ%!B literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_stickers_active.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/ic_smiles2_stickers_active.png new file mode 100755 index 0000000000000000000000000000000000000000..925c02c34f43e9822ea0246470e3e3e00f7009b0 GIT binary patch literal 3317 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 dk3oVZAl;|ip4L}Ngo_suf};oi;+Ej#{{o0 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/stickers_back_all.9.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/stickers_back_all.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7b0ed60d124523569638ad93a678d5892be81acd GIT binary patch literal 2280 zcmaJ@c~nzZ9uB(#@d!tdMTTdBvI$v82nh+0jYSEYfXE_*k5m81FO>qQ@SinF*MV*HgJAVvw&w20O-#y>={nkJ3p@^^` zq^X@L0)aq=1hb;x9S?u36~^%YN0vYYZ?+IS4%#XaK-pXwh@kT&sUQ#{;--O7AeWz$ z`4dP*APmsL=r|~j6H4JpM4sG5jHf~*h1m!M)n6gy@-jdONCne`Vj60)tpf!J`83ov zA_vQnGQo6VaIOs8nj03)%gx}C`6z!sfU2Ot0wNIN0t(SCv7Dlyp+4$T;Pc`&1_gYC zKp8aDA3?=&A^@gD1_DG+q6ZI)BLF0_Cyt0C_~14Hcr4BfgZ0ATygYDt3YJX45rIz& z1$&e61(YaO;3r?OMMI@Skd%VKWM^l4W_x)`WN8>2nM}rD@fbYb14ekrbHor=;USiz zmlRl_oF@}XA)!PJEGlwSC0P&+1xNZv3L@!eS+V?6nc#w96kI6==ZRfRX$i>T{C}uO z^cgLOqQF1n{hz|}=o~4Ci2~)4EEx}OoB+M(N=jkMKrSSaMN1^RmZ}($E`cQSbcqyT zG65G3mnRf2+O8i791bN!EQh#a9vH%+p}3nRj-W%ay_4l{am~PvtCfd4f)1we=fAV7I+cV*oMNlj zxQsux7%9()iTu84-%-75seN~>^-K?&D-Q&9pZHR+ZJo>tVa;&XoYf2se~~7Wy*i^( zsT{+?!oD8Wy?&ZF@UBbOu5TusvYp?QXL8kSPe5|7^Y5y_WJ5$Bu@#acPOTQcrE19UYo9WrJ zK&4O~8Tj4JMj38g%__WnrM-P&dv(OTirA2kIr6i}DAZ{+&UsirH7je@-mk7KZomD! z;Zw`d#7eJx;8kbg^g~T+E1}z$D&XwY+7qrx4BAb_$XX|9~? z5u7|FP-es%iy9(XXU$pW?s3CnPH5=NefjyO(Ylq7q-v+yUv7-G6vX_Znw_0>JY9!u z%@6E%D_nbiO`B$DXz1MuH72s5r>?D?JrewDqqi!||E`tcg`dKofIyx3@z9OCvyA8> z>-%A7{aRet_Y?@WaIS8*iz{L=@9~ZU^HurcLMw~%N8_=t_cZZ#{YP#65`~kziD8ZWwg* zXoQA@$KyM14r|2qM-uOKR3Qm94-EHo5vR+fb#MGG6~U`x+*rRdz<%eN(GIJiI@BmK z=eLsAuV1Gvw3P;Ssn55xOqsXZp42G7y3MtN0C8dcrJD%}3ARZ!-(9()(&IF|EX_P! z*yN)u8ml-)ef)!lHa0ow=;!M@DDpN;x3RI==XA%Qf8#NlmCz{X`bkULV<2r#k(-;_ z9=GZJ(54krNIR_EoU)4*em%k|mldt05;w4)^TgkD_w?+!u=D6R%uE8YpQS?|#bMs`E zQmMT0BJ>#Jsn#HGeJ8qKx|VphHbiWgUlBvoRt}XoFp7)jRd2+5_kJ+i6_NFL;+2Vs z38qRi^^ccZXC9W=6`XUdu!8gh`)fLVZZYrie%E9V${Av8*`y(zTg)2qTy=i zjn0Xo%<@Ys6s|Qfa`nHC9J1QrGcZctvfb3hPwV=gqlV;85nU1W8ww65r`uMY*_Vk5 zsHk+14NzZ^w*9c%yTHfEGV+cd^~Ra9g)zgSFLiT#)ppL=#&g&E(H8ZH>a3Fc>#XnLAI1aMQ=-B1TxZ{ywb-}!-#=*D zcY0NIL(o>@$%?lzydw7Bj9CA~?rhe9vp#d*4m_NWS!Mh%LDymR|NGbRaw$rA5 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/stickers_back_arrow.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/stickers_back_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..43d89e76e702ee9c526d9496fe9050037b1205b5 GIT binary patch literal 1451 zcmeAS@N?(olHy`uVBq!ia0vp^W|6H_V+Po~;1Ffc1;hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo~drKfuV_lxuu?= zsiBF5p^k!)fuXU!fw8`!v96(!m4T&|p{W8CC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3YHG80i}s=>k>g7FXt#Bv$C=6)VF`a7isrF3Kz@$;{7F0GXJW zlwVq6s|0i@#0$9vaAWg|p}_Mv>2~2MaLa!xGy`Z#^TL84#CABECEH%ZgC_h&L>}RV?+-@<$ zX&zK>3U0RmeS^av`as9%gJKpbreQ+BD(=Ct#Px+~Nz~o*8OxK$(8ZKpEV3PB6 zaSW-rb>{kOFD6G3_79Pzy4)cGpS!=U{I%e#=B_=#>n}6A1T?w?xQN8gJ0z{7q-5tT z9&Ww-+@TF;Qq#+?N&R@d2gk*+=vw_>^PtBoGE>nA9FO>Rn#;J9NZrZd&cee%gCsW&wuK8s#gyRuEJl{r!9 z&Mc1U=b!T*fBfogtLat7MyFug0}T(R6^g~AyTbE#grNluAxPiP1Nh3y!x z)ap#(Q9F>DYH_`kzwPkDxw<0PPCYHs3JL2DI_UIhTg{yWgB`uyhomC91EQ@&zGmB3R4lm4@Xn^=P%dML zDc310pJr|L!nI+q&$vH~Y0z?aT$%9dKGWHP1c3_+(>{2=3o8CmvcaoZJa4b?o%M0+ z=O214{zUi_-_He>d9xjDZ0_%W9&`UrKKHal#X`MuQ3=y`&PfYHHuStde&s SR73+*e0sY2xvX + + + + + + diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_car.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_car.xml new file mode 100644 index 0000000000..0d6e59f9ff --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_car.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_flower.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_flower.xml new file mode 100644 index 0000000000..0a21067f14 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_flower.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_recent.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_recent.xml new file mode 100644 index 0000000000..e3c60248fd --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_recent.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_smile.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_smile.xml new file mode 100644 index 0000000000..71c0563d83 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_smile.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_symbol.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_symbol.xml new file mode 100644 index 0000000000..60c0d3c4f6 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_symbol.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/list_selector.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/list_selector.xml new file mode 100644 index 0000000000..f311824b83 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/list_selector.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-sw600dp/values.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-sw600dp/values.xml new file mode 100644 index 0000000000..d3a0e92c97 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-sw600dp/values.xml @@ -0,0 +1,4 @@ + + + true + \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-sw720dp/values.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-sw720dp/values.xml new file mode 100644 index 0000000000..d3a0e92c97 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-sw720dp/values.xml @@ -0,0 +1,4 @@ + + + true + \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/values.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/values.xml new file mode 100644 index 0000000000..f855de6a27 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/values.xml @@ -0,0 +1,4 @@ + + + false + \ No newline at end of file diff --git a/actor-sdk/sdk-core/runtime/runtime-android/src/main/java/im/actor/runtime/android/AndroidContext.java b/actor-sdk/sdk-core/runtime/runtime-android/src/main/java/im/actor/runtime/android/AndroidContext.java index 1d36a3ce94..a50297a5d5 100644 --- a/actor-sdk/sdk-core/runtime/runtime-android/src/main/java/im/actor/runtime/android/AndroidContext.java +++ b/actor-sdk/sdk-core/runtime/runtime-android/src/main/java/im/actor/runtime/android/AndroidContext.java @@ -1,10 +1,12 @@ package im.actor.runtime.android; import android.content.Context; +import android.os.Handler; public final class AndroidContext { private static Context context; + private static volatile Handler applicationHandler; public static Context getContext() { return context; @@ -14,6 +16,13 @@ public static void setContext(Context context) { AndroidContext.context = context; } + public static Handler applicationHandler(){ + if(applicationHandler == null) + applicationHandler = new Handler(getContext().getMainLooper()); + + return applicationHandler; + } + private AndroidContext() { } } From ef57a7e6f4e6e60ce8258b0cd72351655b4b05d5 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sun, 8 Jan 2017 12:45:35 -0200 Subject: [PATCH 203/253] fix emoji class --- .../java/im/actor/sdk/util/AndroidUtils.java | 31 ++ .../java/im/actor/sdk/util/LayoutHelper.java | 127 +++++ .../java/im/actor/sdk/util/Utilities.java | 77 +++ .../actor/sdk/view/PagerSlidingTabStrip2.java | 336 ++++++++++++ .../view/emoji/keyboard/emoji/EmojiView.java | 497 +----------------- .../src/main/res/drawable-hdpi/bluecircle.png | Bin 0 -> 1110 bytes .../src/main/res/drawable-mdpi/bluecircle.png | Bin 0 -> 1036 bytes .../main/res/drawable-xhdpi/bluecircle.png | Bin 0 -> 1193 bytes .../main/res/drawable-xxhdpi/bluecircle.png | Bin 0 -> 1315 bytes 9 files changed, 600 insertions(+), 468 deletions(-) create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/LayoutHelper.java create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/PagerSlidingTabStrip2.java create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/bluecircle.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-mdpi/bluecircle.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/bluecircle.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xxhdpi/bluecircle.png diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/AndroidUtils.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/AndroidUtils.java index e8bd366a23..981f0f23a3 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/AndroidUtils.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/AndroidUtils.java @@ -1,5 +1,12 @@ package im.actor.sdk.util; +import android.os.Build; +import android.widget.AbsListView; +import android.widget.EdgeEffect; + +import java.lang.reflect.Field; + +import im.actor.runtime.Log; import im.actor.runtime.android.AndroidContext; import im.actor.sdk.ActorSDK; import im.actor.sdk.R; @@ -12,6 +19,8 @@ public class AndroidUtils { private static Boolean isTablet = null; + private static String TAG = AndroidUtils.class.getName(); + public static boolean isTablet() { if (isTablet == null) { isTablet = AndroidContext.getContext().getResources().getBoolean(R.bool.isTablet); @@ -30,4 +39,26 @@ public static void runOnUIThread(Runnable runnable, long delay) { public static void runOnUIThread(Runnable runnable) { runOnUIThread(runnable, 0); } + + public static void setListViewEdgeEffectColor(AbsListView listView, int color) { + if (Build.VERSION.SDK_INT >= 21) { + try { + Field field = AbsListView.class.getDeclaredField("mEdgeGlowTop"); + field.setAccessible(true); + EdgeEffect mEdgeGlowTop = (EdgeEffect) field.get(listView); + if (mEdgeGlowTop != null) { + mEdgeGlowTop.setColor(color); + } + + field = AbsListView.class.getDeclaredField("mEdgeGlowBottom"); + field.setAccessible(true); + EdgeEffect mEdgeGlowBottom = (EdgeEffect) field.get(listView); + if (mEdgeGlowBottom != null) { + mEdgeGlowBottom.setColor(color); + } + } catch (Exception e) { + Log.e(TAG, e); + } + } + } } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/LayoutHelper.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/LayoutHelper.java new file mode 100644 index 0000000000..a2b1e9d30c --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/LayoutHelper.java @@ -0,0 +1,127 @@ +package im.actor.sdk.util; + +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.ScrollView; + +/** + * Created by 98379720172 on 08/01/17. + */ + +public class LayoutHelper { + + public static final int MATCH_PARENT = -1; + public static final int WRAP_CONTENT = -2; + + private static int getSize(float size) { + return (int) (size < 0 ? size : Screen.dp(size)); + } + + public static FrameLayout.LayoutParams createScroll(int width, int height, int gravity) { + return new ScrollView.LayoutParams(getSize(width), getSize(height), gravity); + } + + public static FrameLayout.LayoutParams createFrame(int width, float height, int gravity, float leftMargin, float topMargin, float rightMargin, float bottomMargin) { + FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(getSize(width), getSize(height), gravity); + layoutParams.setMargins(Screen.dp(leftMargin), Screen.dp(topMargin), Screen.dp(rightMargin), Screen.dp(bottomMargin)); + return layoutParams; + } + + public static FrameLayout.LayoutParams createFrame(int width, int height, int gravity) { + return new FrameLayout.LayoutParams(getSize(width), getSize(height), gravity); + } + + public static FrameLayout.LayoutParams createFrame(int width, float height) { + return new FrameLayout.LayoutParams(getSize(width), getSize(height)); + } + + public static RelativeLayout.LayoutParams createRelative(float width, float height, int leftMargin, int topMargin, int rightMargin, int bottomMargin, int alignParent, int alignRelative, int anchorRelative) { + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(getSize(width), getSize(height)); + if (alignParent >= 0) { + layoutParams.addRule(alignParent); + } + if (alignRelative >= 0 && anchorRelative >= 0) { + layoutParams.addRule(alignRelative, anchorRelative); + } + layoutParams.leftMargin = Screen.dp(leftMargin); + layoutParams.topMargin = Screen.dp(topMargin); + layoutParams.rightMargin = Screen.dp(rightMargin); + layoutParams.bottomMargin = Screen.dp(bottomMargin); + return layoutParams; + } + + public static RelativeLayout.LayoutParams createRelative(int width, int height, int leftMargin, int topMargin, int rightMargin, int bottomMargin) { + return createRelative(width, height, leftMargin, topMargin, rightMargin, bottomMargin, -1, -1, -1); + } + + public static RelativeLayout.LayoutParams createRelative(int width, int height, int leftMargin, int topMargin, int rightMargin, int bottomMargin, int alignParent) { + return createRelative(width, height, leftMargin, topMargin, rightMargin, bottomMargin, alignParent, -1, -1); + } + + public static RelativeLayout.LayoutParams createRelative(float width, float height, int leftMargin, int topMargin, int rightMargin, int bottomMargin, int alignRelative, int anchorRelative) { + return createRelative(width, height, leftMargin, topMargin, rightMargin, bottomMargin, -1, alignRelative, anchorRelative); + } + + public static RelativeLayout.LayoutParams createRelative(int width, int height, int alignParent, int alignRelative, int anchorRelative) { + return createRelative(width, height, 0, 0, 0, 0, alignParent, alignRelative, anchorRelative); + } + + public static RelativeLayout.LayoutParams createRelative(int width, int height) { + return createRelative(width, height, 0, 0, 0, 0, -1, -1, -1); + } + + public static RelativeLayout.LayoutParams createRelative(int width, int height, int alignParent) { + return createRelative(width, height, 0, 0, 0, 0, alignParent, -1, -1); + } + + public static RelativeLayout.LayoutParams createRelative(int width, int height, int alignRelative, int anchorRelative) { + return createRelative(width, height, 0, 0, 0, 0, -1, alignRelative, anchorRelative); + } + + public static LinearLayout.LayoutParams createLinear(int width, int height, float weight, int gravity, int leftMargin, int topMargin, int rightMargin, int bottomMargin) { + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height), weight); + layoutParams.setMargins(Screen.dp(leftMargin), Screen.dp(topMargin), Screen.dp(rightMargin), Screen.dp(bottomMargin)); + layoutParams.gravity = gravity; + return layoutParams; + } + + public static LinearLayout.LayoutParams createLinear(int width, int height, float weight, int leftMargin, int topMargin, int rightMargin, int bottomMargin) { + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height), weight); + layoutParams.setMargins(Screen.dp(leftMargin), Screen.dp(topMargin), Screen.dp(rightMargin), Screen.dp(bottomMargin)); + return layoutParams; + } + + public static LinearLayout.LayoutParams createLinear(int width, int height, int gravity, int leftMargin, int topMargin, int rightMargin, int bottomMargin) { + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height)); + layoutParams.setMargins(Screen.dp(leftMargin), Screen.dp(topMargin), Screen.dp(rightMargin), Screen.dp(bottomMargin)); + layoutParams.gravity = gravity; + return layoutParams; + } + + public static LinearLayout.LayoutParams createLinear(int width, int height, float leftMargin, float topMargin, float rightMargin, float bottomMargin) { + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height)); + layoutParams.setMargins(Screen.dp(leftMargin), Screen.dp(topMargin), Screen.dp(rightMargin), Screen.dp(bottomMargin)); + return layoutParams; + } + + public static LinearLayout.LayoutParams createLinear(int width, int height, float weight, int gravity) { + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height), weight); + layoutParams.gravity = gravity; + return layoutParams; + } + + public static LinearLayout.LayoutParams createLinear(int width, int height, int gravity) { + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height)); + layoutParams.gravity = gravity; + return layoutParams; + } + + public static LinearLayout.LayoutParams createLinear(int width, int height, float weight) { + return new LinearLayout.LayoutParams(getSize(width), getSize(height), weight); + } + + public static LinearLayout.LayoutParams createLinear(int width, int height) { + return new LinearLayout.LayoutParams(getSize(width), getSize(height)); + } +} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Utilities.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Utilities.java index 372691f098..96471417e0 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Utilities.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/util/Utilities.java @@ -1,12 +1,89 @@ package im.actor.sdk.util; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import im.actor.runtime.Log; + /** * Created by 98379720172 on 06/01/17. */ public class Utilities { + private static String TAG = Utilities.class.getName(); + + public static Pattern pattern = Pattern.compile("[\\-0-9]+"); public static volatile DispatchQueue globalQueue = new DispatchQueue("globalQueue"); + final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); + + public static Integer parseInt(String value) { + if (value == null) { + return 0; + } + Integer val = 0; + try { + Matcher matcher = pattern.matcher(value); + if (matcher.find()) { + String num = matcher.group(0); + val = Integer.parseInt(num); + } + } catch (Exception e) { + Log.e(TAG, e); + } + return val; + } + + public static Long parseLong(String value) { + if (value == null) { + return 0L; + } + Long val = 0L; + try { + Matcher matcher = pattern.matcher(value); + if (matcher.find()) { + String num = matcher.group(0); + val = Long.parseLong(num); + } + } catch (Exception e) { + Log.e(TAG, e); + } + return val; + } + + public static String parseIntToString(String value) { + Matcher matcher = pattern.matcher(value); + if (matcher.find()) { + return matcher.group(0); + } + return null; + } + + public static String bytesToHex(byte[] bytes) { + if (bytes == null) { + return ""; + } + char[] hexChars = new char[bytes.length * 2]; + int v; + for (int j = 0; j < bytes.length; j++) { + v = bytes[j] & 0xFF; + hexChars[j * 2] = hexArray[v >>> 4]; + hexChars[j * 2 + 1] = hexArray[v & 0x0F]; + } + return new String(hexChars); + } + + public static byte[] hexToBytes(String hex) { + if (hex == null) { + return null; + } + int len = hex.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + Character.digit(hex.charAt(i + 1), 16)); + } + return data; + } } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/PagerSlidingTabStrip2.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/PagerSlidingTabStrip2.java new file mode 100644 index 0000000000..b8ff9c7365 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/PagerSlidingTabStrip2.java @@ -0,0 +1,336 @@ +package im.actor.sdk.view; + +/** + * Created by 98379720172 on 08/01/17. + */ + + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Paint.Style; +import android.os.Build; +import android.support.v4.view.ViewPager; +import android.support.v4.view.ViewPager.OnPageChangeListener; +import android.view.View; +import android.view.ViewTreeObserver.OnGlobalLayoutListener; +import android.widget.FrameLayout; +import android.widget.HorizontalScrollView; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import im.actor.sdk.util.LayoutHelper; +import im.actor.sdk.util.Screen; + +public class PagerSlidingTabStrip2 extends HorizontalScrollView { + + public interface IconTabProvider { + int getPageIconResId(int position); + void customOnDraw(Canvas canvas, int position); + } + + private LinearLayout.LayoutParams defaultTabLayoutParams; + + private final PageListener pageListener = new PageListener(); + public OnPageChangeListener delegatePageListener; + + private LinearLayout tabsContainer; + private ViewPager pager; + + private int tabCount; + + private int currentPosition = 0; + private float currentPositionOffset = 0f; + + private Paint rectPaint; + + private int indicatorColor = 0xff666666; + private int underlineColor = 0x1a000000; + + private boolean shouldExpand = false; + + private int scrollOffset = Screen.dp(52); + private int indicatorHeight = Screen.dp(8); + private int underlineHeight = Screen.dp(2); + private int dividerPadding = Screen.dp(12); + private int tabPadding = Screen.dp(24); + + private int lastScrollX = 0; + + public PagerSlidingTabStrip2(Context context) { + super(context); + + setFillViewport(true); + setWillNotDraw(false); + + tabsContainer = new LinearLayout(context); + tabsContainer.setOrientation(LinearLayout.HORIZONTAL); + tabsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + addView(tabsContainer); + + rectPaint = new Paint(); + rectPaint.setAntiAlias(true); + rectPaint.setStyle(Style.FILL); + + defaultTabLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutHelper.MATCH_PARENT); + } + + public void setViewPager(ViewPager pager) { + this.pager = pager; + if (pager.getAdapter() == null) { + throw new IllegalStateException("ViewPager does not have adapter instance."); + } + pager.setOnPageChangeListener(pageListener); + notifyDataSetChanged(); + } + + public void setOnPageChangeListener(OnPageChangeListener listener) { + this.delegatePageListener = listener; + } + + public void notifyDataSetChanged() { + tabsContainer.removeAllViews(); + tabCount = pager.getAdapter().getCount(); + for (int i = 0; i < tabCount; i++) { + if (pager.getAdapter() instanceof IconTabProvider) { + addIconTab(i, ((IconTabProvider) pager.getAdapter()).getPageIconResId(i)); + } + } + updateTabStyles(); + getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + if (Build.VERSION.SDK_INT < 16) { + getViewTreeObserver().removeGlobalOnLayoutListener(this); + } else { + getViewTreeObserver().removeOnGlobalLayoutListener(this); + } + currentPosition = pager.getCurrentItem(); + scrollToChild(currentPosition, 0); + } + }); + } + + private void addIconTab(final int position, int resId) { + ImageView tab = new ImageView(getContext()) { + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (pager.getAdapter() instanceof IconTabProvider) { + ((IconTabProvider) pager.getAdapter()).customOnDraw(canvas, position); + } + } + }; + tab.setFocusable(true); + tab.setImageResource(resId); + tab.setScaleType(ImageView.ScaleType.CENTER); + tab.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + pager.setCurrentItem(position); + } + }); + tabsContainer.addView(tab); + tab.setSelected(position == currentPosition); + } + + private void updateTabStyles() { + for (int i = 0; i < tabCount; i++) { + View v = tabsContainer.getChildAt(i); + v.setLayoutParams(defaultTabLayoutParams); + if (shouldExpand) { + v.setPadding(0, 0, 0, 0); + v.setLayoutParams(new LinearLayout.LayoutParams(-1, -1, 1.0F)); + } else { + v.setPadding(tabPadding, 0, tabPadding, 0); + } + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + if (!shouldExpand || MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED) { + return; + } + int myWidth = getMeasuredWidth(); + tabsContainer.measure(MeasureSpec.EXACTLY | myWidth, heightMeasureSpec); + } + + private void scrollToChild(int position, int offset) { + if (tabCount == 0) { + return; + } + int newScrollX = tabsContainer.getChildAt(position).getLeft() + offset; + if (position > 0 || offset > 0) { + newScrollX -= scrollOffset; + } + if (newScrollX != lastScrollX) { + lastScrollX = newScrollX; + scrollTo(newScrollX, 0); + } + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + if (isInEditMode() || tabCount == 0) { + return; + } + + final int height = getHeight(); + + // draw underline + rectPaint.setColor(underlineColor); + canvas.drawRect(0, height - underlineHeight, tabsContainer.getWidth(), height, rectPaint); + + // default: line below current tab + View currentTab = tabsContainer.getChildAt(currentPosition); + float lineLeft = currentTab.getLeft(); + float lineRight = currentTab.getRight(); + + // if there is an offset, start interpolating left and right coordinates between current and next tab + if (currentPositionOffset > 0f && currentPosition < tabCount - 1) { + + View nextTab = tabsContainer.getChildAt(currentPosition + 1); + final float nextTabLeft = nextTab.getLeft(); + final float nextTabRight = nextTab.getRight(); + + lineLeft = (currentPositionOffset * nextTabLeft + (1f - currentPositionOffset) * lineLeft); + lineRight = (currentPositionOffset * nextTabRight + (1f - currentPositionOffset) * lineRight); + } + + // draw indicator line + rectPaint.setColor(indicatorColor); + canvas.drawRect(lineLeft, height - indicatorHeight, lineRight, height, rectPaint); + } + + private class PageListener implements OnPageChangeListener { + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + currentPosition = position; + currentPositionOffset = positionOffset; + scrollToChild(position, (int) (positionOffset * tabsContainer.getChildAt(position).getWidth())); + invalidate(); + if (delegatePageListener != null) { + delegatePageListener.onPageScrolled(position, positionOffset, positionOffsetPixels); + } + } + + @Override + public void onPageScrollStateChanged(int state) { + if (state == ViewPager.SCROLL_STATE_IDLE) { + scrollToChild(pager.getCurrentItem(), 0); + } + if (delegatePageListener != null) { + delegatePageListener.onPageScrollStateChanged(state); + } + } + + @Override + public void onPageSelected(int position) { + if (delegatePageListener != null) { + delegatePageListener.onPageSelected(position); + } + for (int a = 0; a < tabsContainer.getChildCount(); a++) { + tabsContainer.getChildAt(a).setSelected(a == position); + } + } + } + + public void onSizeChanged(int paramInt1, int paramInt2, int paramInt3, int paramInt4) { + if (!shouldExpand) { + post(new Runnable() { + public void run() { + PagerSlidingTabStrip2.this.notifyDataSetChanged(); + } + }); + } + } + + public void setIndicatorColor(int indicatorColor) { + this.indicatorColor = indicatorColor; + invalidate(); + } + + public void setIndicatorColorResource(int resId) { + this.indicatorColor = getResources().getColor(resId); + invalidate(); + } + + public int getIndicatorColor() { + return this.indicatorColor; + } + + public void setIndicatorHeight(int indicatorLineHeightPx) { + this.indicatorHeight = indicatorLineHeightPx; + invalidate(); + } + + public int getIndicatorHeight() { + return indicatorHeight; + } + + public void setUnderlineColor(int underlineColor) { + this.underlineColor = underlineColor; + invalidate(); + } + + public void setUnderlineColorResource(int resId) { + this.underlineColor = getResources().getColor(resId); + invalidate(); + } + + public int getUnderlineColor() { + return underlineColor; + } + + public void setUnderlineHeight(int underlineHeightPx) { + this.underlineHeight = underlineHeightPx; + invalidate(); + } + + public int getUnderlineHeight() { + return underlineHeight; + } + + public void setDividerPadding(int dividerPaddingPx) { + this.dividerPadding = dividerPaddingPx; + invalidate(); + } + + public int getDividerPadding() { + return dividerPadding; + } + + public void setScrollOffset(int scrollOffsetPx) { + this.scrollOffset = scrollOffsetPx; + invalidate(); + } + + public int getScrollOffset() { + return scrollOffset; + } + + public void setShouldExpand(boolean shouldExpand) { + this.shouldExpand = shouldExpand; + tabsContainer.setLayoutParams(new FrameLayout.LayoutParams(-1, -1)); + updateTabStyles(); + requestLayout(); + } + + public boolean getShouldExpand() { + return shouldExpand; + } + + public void setTabPaddingLeftRight(int paddingPx) { + this.tabPadding = paddingPx; + updateTabStyles(); + } + + public int getTabPaddingLeftRight() { + return tabPadding; + } +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java index 68600840e0..3697c7b71d 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java @@ -43,7 +43,11 @@ import im.actor.runtime.Log; import im.actor.sdk.R; import im.actor.sdk.util.AndroidUtils; +import im.actor.sdk.util.LayoutHelper; import im.actor.sdk.util.Screen; +import im.actor.sdk.util.Utilities; +import im.actor.sdk.view.PagerSlidingTabStrip; +import im.actor.sdk.view.PagerSlidingTabStrip2; import im.actor.sdk.view.emoji.EmojiData; /** @@ -52,6 +56,8 @@ public class EmojiView extends FrameLayout { + private static String TAG = EmojiView.class.getName(); + public interface Listener { boolean onBackspace(); void onEmojiSelected(String emoji); @@ -509,7 +515,7 @@ protected void onDraw(Canvas canvas) { private ArrayList views = new ArrayList<>(); private ArrayList emojiGrids = new ArrayList<>(); private ImageView backspaceButton; - private StickersGridAdapter stickersGridAdapter; +// private StickersGridAdapter stickersGridAdapter; private LinearLayout emojiTab; // private ScrollSlidingTabStrip stickersTab; // private RecyclerListView stickersGridView; @@ -522,7 +528,7 @@ protected void onDraw(Canvas canvas) { // private GridLayoutManager trendingLayoutManager; // private TrendingGridAdapter trendingGridAdapter; // private RecyclerListView.OnItemClickListener stickersOnItemClickListener; - private PagerSlidingTabStrip pagerSlidingTabStrip; + private PagerSlidingTabStrip2 pagerSlidingTabStrip; private boolean trendingLoaded; @@ -579,7 +585,7 @@ public void getOutline(View view, Outline outline) { } gridView.setNumColumns(-1); EmojiGridAdapter emojiGridAdapter = new EmojiGridAdapter(i - 1); - AndroidUtilities.setListViewEdgeEffectColor(gridView, 0xfff5f6f7); + AndroidUtils.setListViewEdgeEffectColor(gridView, 0xfff5f6f7); gridView.setAdapter(emojiGridAdapter); adapters.add(emojiGridAdapter); emojiGrids.add(gridView); @@ -614,7 +620,7 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { emojiTab.setOrientation(LinearLayout.HORIZONTAL); addView(emojiTab, LayoutHelper.createFrame(LayoutParams.MATCH_PARENT, 48)); - pagerSlidingTabStrip = new PagerSlidingTabStrip(context); + pagerSlidingTabStrip = new PagerSlidingTabStrip2(context); pagerSlidingTabStrip.setViewPager(pager); pagerSlidingTabStrip.setShouldExpand(true); pagerSlidingTabStrip.setIndicatorHeight(Screen.dp(2)); @@ -662,7 +668,7 @@ public boolean onTouchEvent(MotionEvent event) { } }; backspaceButton.setImageResource(R.drawable.ic_smiles_backspace); - backspaceButton.setBackgroundResource(R.drawable.ic_emoji_backspace); + backspaceButton.setBackgroundResource(R.drawable.ic_backspace); backspaceButton.setScaleType(ImageView.ScaleType.CENTER); frameLayout.addView(backspaceButton, LayoutHelper.createFrame(52, 48)); @@ -671,7 +677,7 @@ public boolean onTouchEvent(MotionEvent event) { frameLayout.addView(view, LayoutHelper.createFrame(52, 1, Gravity.LEFT | Gravity.BOTTOM)); TextView textView = new TextView(context); - textView.setText(LocaleController.getString("NoRecent", R.string.NoRecent)); + textView.setText("Nada de recente"); textView.setTextSize(18); textView.setTextColor(0xff888888); textView.setGravity(Gravity.CENTER); @@ -704,39 +710,11 @@ public boolean onKey(View v, int keyCode, KeyEvent event) { loadRecents(); } - private void checkStickersTabY(View list, int dy) { - if (list == null) { - stickersTab.setTranslationY(minusDy = 0); - return; - } - if (list.getVisibility() != VISIBLE) { - return; - } - minusDy -= dy; - if (minusDy > 0) { - minusDy = 0; - } else if (minusDy < -Screen.dp(48 * 6)) { - minusDy = -Screen.dp(48 * 6); - } - stickersTab.setTranslationY(Math.max(-Screen.dp(47), minusDy)); - } - - private void checkScroll() { - int firstVisibleItem = stickersLayoutManager.findFirstVisibleItemPosition(); - if (firstVisibleItem == RecyclerView.NO_POSITION) { - return; - } - checkStickersScroll(firstVisibleItem); - } private void saveNewPage() { int newPage; if (pager.getCurrentItem() == 6) { - if (gifsGridView != null && gifsGridView.getVisibility() == VISIBLE) { - newPage = 2; - } else { - newPage = 1; - } + newPage = 1; } else { newPage = 0; } @@ -757,40 +735,24 @@ public void clearRecentEmoji() { private void onPageScrolled(int position, int width, int positionOffsetPixels) { - if (stickersTab == null) { - return; - } - if (width == 0) { - width = AndroidUtilities.displaySize.x; + width = Screen.displaySize.x; } int margin = 0; if (position == 5) { margin = -positionOffsetPixels; - if (listener != null) { - listener.onStickersTab(positionOffsetPixels != 0); - } } else if (position == 6) { margin = -width; - if (listener != null) { - listener.onStickersTab(true); - } - } else { - if (listener != null) { - listener.onStickersTab(false); - } } if (emojiTab.getTranslationX() != margin) { emojiTab.setTranslationX(margin); - stickersTab.setTranslationX(width + margin); - stickersTab.setVisibility(margin < 0 ? VISIBLE : INVISIBLE); } } private void postBackspaceRunnable(final int time) { - AndroidUtilities.runOnUIThread(new Runnable() { + AndroidUtils.runOnUIThread(new Runnable() { @Override public void run() { if (!backspacePressed) { @@ -937,7 +899,7 @@ public void loadRecents() { sortEmoji(); adapters.get(0).notifyDataSetChanged(); } catch (Exception e) { - FileLog.e("tmessages", e); + Log.e(TAG, e); } try { @@ -951,7 +913,7 @@ public void loadRecents() { } } } catch (Exception e) { - FileLog.e("tmessages", e); + Log.e(TAG, e); } } @@ -966,30 +928,19 @@ public void requestLayout() { @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { isLayout = true; - if (AndroidUtilities.isInMultiwindow) { - if (currentBackgroundType != 1) { - if (Build.VERSION.SDK_INT >= 21) { - setOutlineProvider((ViewOutlineProvider) outlineProvider); - setClipToOutline(true); - setElevation(Screen.dp(2)); - } - setBackgroundResource(R.drawable.smiles_popup); - emojiTab.setBackgroundDrawable(null); - currentBackgroundType = 1; - } - } else { - if (currentBackgroundType != 0) { - if (Build.VERSION.SDK_INT >= 21) { - setOutlineProvider(null); - setClipToOutline(false); - setElevation(0); - } - setBackgroundColor(0xfff5f6f7); - emojiTab.setBackgroundColor(0xfff5f6f7); - currentBackgroundType = 0; + + if (currentBackgroundType != 0) { + if (Build.VERSION.SDK_INT >= 21) { + setOutlineProvider(null); + setClipToOutline(false); + setElevation(0); } + setBackgroundColor(0xfff5f6f7); + emojiTab.setBackgroundColor(0xfff5f6f7); + currentBackgroundType = 0; } + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) emojiTab.getLayoutParams(); FrameLayout.LayoutParams layoutParams1 = null; layoutParams.width = View.MeasureSpec.getSize(widthMeasureSpec); @@ -1024,48 +975,12 @@ public void invalidateViews() { } public void onOpen(boolean forceEmoji) { - if (stickersTab != null) { - if (currentPage == 0 || forceEmoji) { - if (pager.getCurrentItem() == 6) { - pager.setCurrentItem(0, !forceEmoji); - } - } else if (currentPage == 1) { - if (pager.getCurrentItem() != 6) { - pager.setCurrentItem(6); - } - if (stickersTab.getCurrentPosition() == gifTabNum + 1) { - if (recentTabBum >= 0) { - stickersTab.selectTab(recentTabBum + 1); - } else if (gifTabNum >= 0) { - stickersTab.selectTab(gifTabNum + 2); - } else { - stickersTab.selectTab(1); - } - } - } else if (currentPage == 2) { - if (pager.getCurrentItem() != 6) { - pager.setCurrentItem(6); - } - if (stickersTab.getCurrentPosition() != gifTabNum + 1) { - if (gifTabNum >= 0 && !recentGifs.isEmpty()) { - stickersTab.selectTab(gifTabNum + 1); - } else { - switchToGifTab = true; - } - } - } - } + } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - if (stickersGridAdapter != null) { - NotificationCenter.getInstance().addObserver(this, NotificationCenter.stickersDidLoaded); - NotificationCenter.getInstance().addObserver(this, NotificationCenter.recentImagesDidLoaded); - NotificationCenter.getInstance().addObserver(this, NotificationCenter.featuredStickersDidLoaded); - - } } @Override @@ -1074,23 +989,6 @@ public void setVisibility(int visibility) { if (visibility != GONE) { sortEmoji(); adapters.get(0).notifyDataSetChanged(); - if (stickersGridAdapter != null) { - NotificationCenter.getInstance().addObserver(this, NotificationCenter.stickersDidLoaded); - NotificationCenter.getInstance().addObserver(this, NotificationCenter.recentDocumentsDidLoaded); - updateStickerTabs(); - reloadStickersAdapter(); - if (gifsGridView != null && gifsGridView.getVisibility() == VISIBLE && listener != null) { - listener.onGifTab(pager != null && pager.getCurrentItem() >= 6); - } - } - if (trendingGridAdapter != null) { - trendingLoaded = false; - trendingGridAdapter.notifyDataSetChanged(); - } - checkDocuments(true); - checkDocuments(false); - StickersQuery.loadRecents(StickersQuery.TYPE_IMAGE, true, true); - StickersQuery.loadRecents(StickersQuery.TYPE_IMAGE, false, true); } } @@ -1099,11 +997,6 @@ public int getCurrentPage() { } public void onDestroy() { - if (stickersGridAdapter != null) { - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.stickersDidLoaded); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.recentDocumentsDidLoaded); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.featuredStickersDidLoaded); - } } @Override @@ -1115,338 +1008,6 @@ protected void onDetachedFromWindow() { } - @SuppressWarnings("unchecked") - @Override - public void didReceivedNotification(int id, Object... args) { - if (id == NotificationCenter.stickersDidLoaded) { - if ((Integer) args[0] == StickersQuery.TYPE_IMAGE) { - if (trendingGridAdapter != null) { - if (trendingLoaded) { - updateVisibleTrendingSets(); - } else { - trendingGridAdapter.notifyDataSetChanged(); - } - } - updateStickerTabs(); - reloadStickersAdapter(); - checkPanels(); - } - } else if (id == NotificationCenter.recentDocumentsDidLoaded) { - boolean isGif = (Boolean) args[0]; - if (isGif || (Integer) args[1] == StickersQuery.TYPE_IMAGE) { - checkDocuments(isGif); - } - } else if (id == NotificationCenter.featuredStickersDidLoaded) { - if (trendingGridAdapter != null) { - if (trendingLoaded) { - updateVisibleTrendingSets(); - } else { - trendingGridAdapter.notifyDataSetChanged(); - } - } - if (pagerSlidingTabStrip != null) { - int count = pagerSlidingTabStrip.getChildCount(); - for (int a = 0; a < count; a++) { - pagerSlidingTabStrip.getChildAt(a).invalidate(); - } - } - updateStickerTabs(); - } - } - - private class TrendingGridAdapter extends RecyclerView.Adapter { - - private Context context; - private int stickersPerRow; - private HashMap cache = new HashMap<>(); - private ArrayList sets = new ArrayList<>(); - private HashMap positionsToSets = new HashMap<>(); - private int totalItems; - - public TrendingGridAdapter(Context context) { - this.context = context; - } - - @Override - public int getItemCount() { - return totalItems; - } - - public Object getItem(int i) { - return cache.get(i); - } - - @Override - public int getItemViewType(int position) { - Object object = cache.get(position); - if (object != null) { - if (object instanceof TLRPC.Document) { - return 0; - } else { - return 2; - } - } - return 1; - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = null; - switch (viewType) { - case 0: - view = new StickerEmojiCell(context) { - public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Screen.dp(82), MeasureSpec.EXACTLY)); - } - }; - break; - case 1: - view = new EmptyCell(context); - break; - case 2: - view = new FeaturedStickerSetInfoCell(context, 17); - ((FeaturedStickerSetInfoCell) view).setAddOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - FeaturedStickerSetInfoCell parent = (FeaturedStickerSetInfoCell) v.getParent(); - TLRPC.StickerSetCovered pack = parent.getStickerSet(); - if (installingStickerSets.containsKey(pack.set.id) || removingStickerSets.containsKey(pack.set.id)) { - return; - } - if (parent.isInstalled()) { - removingStickerSets.put(pack.set.id, pack); - listener.onStickerSetRemove(parent.getStickerSet()); - } else { - installingStickerSets.put(pack.set.id, pack); - listener.onStickerSetAdd(parent.getStickerSet()); - } - parent.setDrawProgress(true); - } - }); - break; - } - - return new Holder(view); - } - - @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { - switch (holder.getItemViewType()) { - case 0: - TLRPC.Document sticker = (TLRPC.Document) cache.get(position); - ((StickerEmojiCell) holder.itemView).setSticker(sticker, false); - break; - case 1: - ((EmptyCell) holder.itemView).setHeight(Screen.dp(82)); - break; - case 2: - ArrayList unreadStickers = StickersQuery.getUnreadStickerSets(); - TLRPC.StickerSetCovered stickerSetCovered = sets.get((Integer) cache.get(position)); - boolean unread = unreadStickers != null && unreadStickers.contains(stickerSetCovered.set.id); - FeaturedStickerSetInfoCell cell = (FeaturedStickerSetInfoCell) holder.itemView; - cell.setStickerSet(stickerSetCovered, unread); - if (unread) { - StickersQuery.markFaturedStickersByIdAsRead(stickerSetCovered.set.id); - } - boolean installing = installingStickerSets.containsKey(stickerSetCovered.set.id); - boolean removing = removingStickerSets.containsKey(stickerSetCovered.set.id); - if (installing || removing) { - if (installing && cell.isInstalled()) { - installingStickerSets.remove(stickerSetCovered.set.id); - installing = false; - } else if (removing && !cell.isInstalled()) { - removingStickerSets.remove(stickerSetCovered.set.id); - removing = false; - } - } - cell.setDrawProgress(installing || removing); - break; - } - } - - @Override - public void notifyDataSetChanged() { - if (trendingLoaded) { - return; - } - int width = getMeasuredWidth(); - if (width == 0) { - width = AndroidUtilities.displaySize.x; - } - stickersPerRow = width / Screen.dp(72); - trendingLayoutManager.setSpanCount(stickersPerRow); - cache.clear(); - positionsToSets.clear(); - sets.clear(); - totalItems = 0; - int num = 0; - - ArrayList packs = StickersQuery.getFeaturedStickerSets(); - - for (int a = 0; a < packs.size(); a++) { - TLRPC.StickerSetCovered pack = packs.get(a); - if (StickersQuery.isStickerPackInstalled(pack.set.id) || pack.covers.isEmpty() && pack.cover == null) { - continue; - } - sets.add(pack); - positionsToSets.put(totalItems, pack); - cache.put(totalItems++, num++); - int startRow = totalItems / stickersPerRow; - int count; - if (!pack.covers.isEmpty()) { - count = (int) Math.ceil(pack.covers.size() / (float) stickersPerRow); - for (int b = 0; b < pack.covers.size(); b++) { - cache.put(b + totalItems, pack.covers.get(b)); - } - } else { - count = 1; - cache.put(totalItems, pack.cover); - } - for (int b = 0; b < count * stickersPerRow; b++) { - positionsToSets.put(totalItems + b, pack); - } - totalItems += count * stickersPerRow; - } - if (totalItems != 0) { - trendingLoaded = true; - } - super.notifyDataSetChanged(); - } - } - - private class StickersGridAdapter extends RecyclerView.Adapter { - - private Context context; - private int stickersPerRow; - private HashMap rowStartPack = new HashMap<>(); - private HashMap packStartRow = new HashMap<>(); - private HashMap cache = new HashMap<>(); - private int totalItems; - - public StickersGridAdapter(Context context) { - this.context = context; - } - - @Override - public int getItemCount() { - return totalItems != 0 ? totalItems + 1 : 0; - } - - public Object getItem(int i) { - return cache.get(i); - } - - public int getPositionForPack(TLRPC.TL_messages_stickerSet stickerSet) { - return packStartRow.get(stickerSet) * stickersPerRow; - } - - @Override - public int getItemViewType(int position) { - if (cache.get(position) != null) { - return 0; - } - return 1; - } - - public int getTabForPosition(int position) { - if (stickersPerRow == 0) { - int width = getMeasuredWidth(); - if (width == 0) { - width = AndroidUtilities.displaySize.x; - } - stickersPerRow = width / Screen.dp(72); - } - int row = position / stickersPerRow; - TLRPC.TL_messages_stickerSet pack = rowStartPack.get(row); - if (pack == null) { - return recentTabBum; - } - return stickerSets.indexOf(pack) + stickersTabOffset; - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = null; - switch (viewType) { - case 0: - view = new StickerEmojiCell(context) { - public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Screen.dp(82), MeasureSpec.EXACTLY)); - } - }; - break; - case 1: - view = new EmptyCell(context); - break; - } - - return new Holder(view); - } - - @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { - switch (holder.getItemViewType()) { - case 0: - TLRPC.Document sticker = cache.get(position); - ((StickerEmojiCell) holder.itemView).setSticker(sticker, false); - break; - case 1: - if (position == totalItems) { - int row = (position - 1) / stickersPerRow; - TLRPC.TL_messages_stickerSet pack = rowStartPack.get(row); - if (pack == null) { - ((EmptyCell) holder.itemView).setHeight(1); - } else { - int height = pager.getHeight() - (int) Math.ceil(pack.documents.size() / (float) stickersPerRow) * Screen.dp(82); - ((EmptyCell) holder.itemView).setHeight(height > 0 ? height : 1); - } - } else { - ((EmptyCell) holder.itemView).setHeight(Screen.dp(82)); - } - break; - } - } - - @Override - public void notifyDataSetChanged() { - int width = getMeasuredWidth(); - if (width == 0) { - width = AndroidUtilities.displaySize.x; - } - stickersPerRow = width / Screen.dp(72); - stickersLayoutManager.setSpanCount(stickersPerRow); - rowStartPack.clear(); - packStartRow.clear(); - cache.clear(); - totalItems = 0; - ArrayList packs = stickerSets; - for (int a = -1; a < packs.size(); a++) { - ArrayList documents; - TLRPC.TL_messages_stickerSet pack = null; - int startRow = totalItems / stickersPerRow; - if (a == -1) { - documents = recentStickers; - } else { - pack = packs.get(a); - documents = pack.documents; - packStartRow.put(pack, startRow); - } - if (documents.isEmpty()) { - continue; - } - int count = (int) Math.ceil(documents.size() / (float) stickersPerRow); - for (int b = 0; b < documents.size(); b++) { - cache.put(b + totalItems, documents.get(b)); - } - totalItems += count * stickersPerRow; - for (int b = 0; b < count; b++) { - rowStartPack.put(startRow + b, pack); - } - } - super.notifyDataSetChanged(); - } - } - private class EmojiGridAdapter extends BaseAdapter { private int emojiPage; @@ -1503,7 +1064,7 @@ public void unregisterDataSetObserver(DataSetObserver observer) { } } - private class EmojiPagesAdapter extends PagerAdapter implements PagerSlidingTabStrip.IconTabProvider { + private class EmojiPagesAdapter extends PagerAdapter implements PagerSlidingTabStrip2.IconTabProvider { public void destroyItem(ViewGroup viewGroup, int position, Object object) { View view; diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/bluecircle.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-hdpi/bluecircle.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc7e9f99e5569f7f2ec0f39978a52d0ba1c6b8c GIT binary patch literal 1110 zcmaJ=UuYCZ7~hyG@i1ydkrpY_jg6+{Zg+39d$*gM=63h2CteJfBRRoTH@lN$o9xbZ zchbA0DiWXcO~s&X`c$P4LTHsdXd#NAAu5Oxl!(-bNKlYM|L8*rbT;0_KBO+p&dkT} z_kF+b&m3!Q`Jy`XafqU*>hw-6OZGLvs#-z*jSo)mBHKqemB($U8y9pBQb`kaL6Elf z9+-u?Ir#MyY@(=2+REi|KC@dkkR8zjOr&VLgiTRR+l#Jl^g#@|V2|Y_=-+?6N(0MG z&>cdC&A2M;wRR49ux+R%XAJcjl1Xph2AYa8abQENgQDH<_;N8pFZh+oIWRLcSb*TZ z1pQW2KGOG*S9C1>4PJ79Bf&sZgY3Oi_0kF2XXl9ptru_Hh=zld&Y)&keee$wD6ucn0Z5 zcTJg0YWMy?0g$MXHDnCf(7|afK@&^Fv`jfF2yBvzrNopfa$HJ`lf>hSDoQ-3BvUb= z%uPE!)*SPPthi3qH-ESp zG&ZknIq`x%(LA;8$Op?SuTd-aR{Xg~u3WzL>BL{=#y1DsJ@L11Lwnbc-?+G}?#yu2 z^eh$ndFK4Rn(6O>x~Xes_{`zCRU`4)*C$htk5-KTw2a?&?aspu`~R-GIi1+T>i6dB zPEI$D@b^EvbbRd7nvs8YU7q}-vo6*?F!gT^I_nRBfL!KHKr*x!|RzQ!UzaW3ecQUxhDo+|xFwE^u>>wAmiECKXkTd`Zs0-u zb1_ll!GkAG#262pNIV#$M>r7m1TiKmYGUHQt1%?_3LAJpdg%M!m*4OEe&3&WJKuky zHFz}0FidMUqZa7t+rg$r`o9}~^_(6ZBt1+9@hB;4E@F}f9zh^$X=A8>G-G;l8TBws zfHjN5WH@(G*0IHDK8CAU4rMb;PjAK1^l?PM2pTi(1pDjR3l^A0f*lfbLe5c8$;`~S zXmF;#sLzb+lEL<#2R#*;2Cxv(K*gG{J-L!#x8lmw_T4-Swjg9Y!ETEh&gFrET?9l< z4Cw-lg1E#%5k|Y=IS>|Lgcl+_jD%oV79<&pp!%^in`?~91+}l5i{27!i4aHT`Et3; zl_MN>$9O175-)`La5zK}A#d6yS|wzAowW!m@^sg9h>30BN7P2}6iKjD>2?X0lgsS{ zw!LbjXv_GD=J1dcc+2wZ+CqDzfOciQ!&9zK=P}w@Bh%jPpU4MNHL{BJ zDGS*ot0q|L;SAG|!=fl8VLTa2D=`Suv2I#;cS?y#5tvG*<6@1QwLPNQI;wHaU9Pk* zS5{o45$qN*o~TVPU%~`?CF}rYFb2*JnYMw;UYFn6s#4^dSCG-?Vhe2bMmG1z4^
    _38VbkLLN{^|c3e_5Fd#_m47fLf~L$=0tv= z`TnJq*<*|KM^=SD+|@6E&l96B4{bc0RSyTWd{d#6x|M1>-MG$lWKd7QUr&9yxxBdQzt3#CUtLID GzVR0}en%Vt literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/bluecircle.png b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable-xhdpi/bluecircle.png new file mode 100644 index 0000000000000000000000000000000000000000..93c4e092bd823d548c98c6dc4ea00cb3e25928eb GIT binary patch literal 1193 zcmaJ>O>Em_7*~AYGJ1OC~79vA;G}=O1i$ zNehRjqC=}Tv}s7F;()dT>Hv-Q00SYkAX1TS656E#p`CgGX@_x`5YiChbC+}+%09{8 z&#UKo-{<|2PiMzo@_Gh67>0S%N0K>o?s2|;H`>ph-seTfUOQE?^ZJBc6HSQ4WxWDH zS`{Z@4vO;3Ti4+ThPiO1P_j#zS9wWSgQ9~8)>Q+sF>K^;-4LZIXoCuzRJ165_uFeY zP~<3HWHMyN5MWg~GHb&8>{vmXosu{iKl~yXsq@Hz3T+Y8)f1Y<*Q5BRUmo2ZGl7Fm zh&>g>ABZYtvOv&H2$&!fkVq;FB3zJSsPHg#2!u$ACPoDx%duv43WZ8W)J21!f+V4;PF|a6%g(`vGPXrqg&6}9IcVwA zriA)2vA;`3wR?0R2Z+@0NnM&&p=PI(Q5;!gCydf5dX!BGEJdZ*VU+lALSQ+X zO2ktUrprxhmMv-$>~fWd+|(nvykJ7n*3E*hpXhckTh(pds_F(1@+|Nd6;0M_)&Zxq z9i`AzPC|Lq)K#!q8(!HaKE=@NFiXV~BpE^4nFO0a$s|aM<-!pml*Bt+d7HdD+{FKK z2_%Ma8vCC{cTH$|oa@%uqQ}HgMu?DP4xC%pdmdpBN)y}rA3=iF1& z(CSj->nA^rEi_2%^6@)Y|DJx%M@yFYjPFD0-0t%1jq~FJiBCjBXk6)C`o7tJW>5B) z+kKV2?idf{xXKOWBG%F)g7Vi{G$8iP~5`Sv3B#fLijG% zZoX0o|M7Uc=`Dl}SG&1>EB9{0v-54{P;PO#Tpn8S-`{!jCMcfFmrIdbE9<|n6`%DT z9r|JAa`wA{wV&SvKlN?6Vz=YTrT&BE=NrM-gyq&7yILPzTyQVnV^2-IQ)+&^aIELE cRp^<+T-cfG(S_oDjd6Y+>C{;AN}@dfFAc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc&_u!9QqR!T z(8R(}N5ROz&{*HVSl`fC*U-qyz|zXlQ~?TIxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvC)H&m}VPQCg-$LND17Ac}(Lcr7m zV#1RxkONQnsd>QEUIa|m4_Tg>GcYht_jGX#skn7y`d&XKN0HWc*W80HE7tf-nRmp! zVC9w#3^gqO511Q#FEiv1JZT`TzM}N{q)0&=l&mCojw@g+DDOk(5 z>pWYdY(=<={;JA#OxGVMPn^ehvGgqevb(p1Uan@Xh-14vQ8SA{eCF59tEYeXDfjur zA9v-7saD%eome;L@UMv$Wtz_0aGK?w0YjX6!8rztbWUfb4_6q Date: Sun, 8 Jan 2017 13:09:24 -0200 Subject: [PATCH 204/253] alteracoes --- .../sdk/controllers/conversation/inputbar/InputBarFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java index b4c8df0f88..1742d4dc99 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java @@ -44,6 +44,7 @@ import im.actor.sdk.view.emoji.SmileProcessor; import im.actor.sdk.view.emoji.keyboard.KeyboardStatusListener; import im.actor.sdk.view.emoji.keyboard.emoji.EmojiKeyboard; +import im.actor.sdk.view.emoji.keyboard.emoji.EmojiView; import im.actor.sdk.view.markdown.AndroidMarkdown; import static im.actor.sdk.util.ActorSDKMessenger.messenger; @@ -92,6 +93,7 @@ public class InputBarFragment extends BaseFragment implements MessagesDefaultFra // Emoji keyboard protected EmojiKeyboard emojiKeyboard; + protected EmojiView emojiView; protected ImageView emojiButton; private Message lastMessage; From 6ca76ec40f632b7459052df846a89a88e0fd9b56 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 10 Jan 2017 15:12:11 -0200 Subject: [PATCH 205/253] alteracoes --- .../main/assets/emoji/v10_emoji2.0x_0_0.png | Bin 0 -> 152791 bytes .../main/assets/emoji/v10_emoji2.0x_0_1.png | Bin 0 -> 183501 bytes .../main/assets/emoji/v10_emoji2.0x_0_2.png | Bin 0 -> 195793 bytes .../main/assets/emoji/v10_emoji2.0x_0_3.png | Bin 0 -> 165817 bytes .../main/assets/emoji/v10_emoji2.0x_1_0.png | Bin 0 -> 53880 bytes .../main/assets/emoji/v10_emoji2.0x_1_1.png | Bin 0 -> 49842 bytes .../main/assets/emoji/v10_emoji2.0x_1_2.png | Bin 0 -> 46060 bytes .../main/assets/emoji/v10_emoji2.0x_1_3.png | Bin 0 -> 40456 bytes .../main/assets/emoji/v10_emoji2.0x_2_0.png | Bin 0 -> 127175 bytes .../main/assets/emoji/v10_emoji2.0x_2_1.png | Bin 0 -> 82081 bytes .../main/assets/emoji/v10_emoji2.0x_2_2.png | Bin 0 -> 118552 bytes .../main/assets/emoji/v10_emoji2.0x_2_3.png | Bin 0 -> 103630 bytes .../main/assets/emoji/v10_emoji2.0x_3_0.png | Bin 0 -> 115376 bytes .../main/assets/emoji/v10_emoji2.0x_3_1.png | Bin 0 -> 97234 bytes .../main/assets/emoji/v10_emoji2.0x_3_2.png | Bin 0 -> 85576 bytes .../main/assets/emoji/v10_emoji2.0x_3_3.png | Bin 0 -> 87052 bytes .../main/assets/emoji/v10_emoji2.0x_4_0.png | Bin 0 -> 63296 bytes .../main/assets/emoji/v10_emoji2.0x_4_1.png | Bin 0 -> 54027 bytes .../main/assets/emoji/v10_emoji2.0x_4_2.png | Bin 0 -> 46276 bytes .../main/assets/emoji/v10_emoji2.0x_4_3.png | Bin 0 -> 44079 bytes .../inputbar/InputBarFragment.java | 11 +- .../messages/content/TextHolder.java | 7 +- .../preprocessor/ChatListProcessor.java | 20 +- .../controllers/dialogs/view/DialogView.java | 22 +- .../view/emoji/keyboard/BaseKeyboard2.java | 368 ++++++++++++++++++ .../emoji/keyboard/emoji/EmojiKeyboard2.java | 143 +++++++ .../view/emoji/keyboard/emoji/EmojiView.java | 10 +- .../main/res/drawable/ic_emoji_backspace.xml | 11 + 28 files changed, 564 insertions(+), 28 deletions(-) create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_0_0.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_0_1.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_0_2.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_0_3.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_1_0.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_1_1.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_1_2.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_1_3.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_2_0.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_2_1.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_2_2.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_2_3.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_3_0.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_3_1.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_3_2.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_3_3.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_4_0.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_4_1.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_4_2.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_4_3.png create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/BaseKeyboard2.java create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_backspace.xml diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_0_0.png b/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..eab1dd0b0416179e9bc13d93549c08712916eaba GIT binary patch literal 152791 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

    j^P5S_d_3mINVSHoDM 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 Eg6vw-qyPW_ literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_0_2.png b/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_0_2.png new file mode 100644 index 0000000000000000000000000000000000000000..bab02c9c776cdad5111a26599af3919c854a648d GIT binary patch literal 195793 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"bU6eZ;5*IOM( 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­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

    g+e9yE5Q!>wEIn`A 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

    T|Z?X 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_1_0.png b/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..089b9c65e2b45c682498e9b3a651e987a1a595aa GIT binary patch literal 53880 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 cIUJ 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 IM6N<$f>git4FCWD literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_1_3.png b/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_1_3.png new file mode 100644 index 0000000000000000000000000000000000000000..49d952e2536239bc8398a19241bbedfe2fcc0cd6 GIT binary patch literal 40456 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 UEHOM^SO5S307*qoM6N<$f{sTG$p8QV literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_2_0.png b/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_2_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae8c7eca27c8e993b3b408cb36f3d26480e9453 GIT binary patch literal 127175 zcmV)kK%l>gP)r>IYHQl0I+mE6G7<)Lbas=H zk%)s9a)M>>ER*Wia*8+OUbXR2E|;9vjl^`m;VaDIyzf zb$o$69160AVPi~Pny7P09BY9POHoz1l_H3WkgdsHgs(kzdVy?}Op1z$CtwqMH5!Gg zWXHOub#rhbARCTMElzF~c5`rXEf}|VK~aG??DYFfR!cxh6?tYntZ6Wwc|)L`me<6e zw}3{aTqv4aR6$*FbVDG9c~@E;4x*l)td>U0n@82FTcct`O&fwtS)z#Je`}*11+qbs2$H&LLzQL!csPxTld>BgS_W$s)KBP>~#8JaNA>4{oy3+KokFgNzA~u%_IsZS%CU@ zgtZi`=6qhwS{31I7JEH|z{uC*=kopNk&|PZ{O`rdMTZ6Au{3d-w}y+JEoLr#zBH-S zt=sgNzD;hPBa5FHc(x&yz#>_S8?&!9n|>g?%0AhYAEw$VTrm-yUoFzwR@B9WztV2Q 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�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%0AZrVIhO!Jv)kdk>xpre#v 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 cT=?Y)J!iQZ01&1X#-p%FicDYkADx+pmH7qA3 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

    bT5nkcr7&qZDe!J!- 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 z z)pQ|D8mJ|NN{@LzT=oc$hA#RTa1$#8>_E3B1goVG%-A$dSr~ITQgV`6f_-J$i#&OX zt&~b+8e1j(=ZvKV#~WvaphWZ4ggUlThb{z)17F95AfZUzbR%FZb?iiFLX}!ZsPw&H z)yr!zw9?$hMR}M%Yvo}Go$;CwCYp$XM_icL_ASv=Qv-{yx>8Siwr6$YHndU`=@DbH ztV`wK8RIt2rjf5WAyTa-G!LPbnz|4g?e^ZD8=*CBjh(JSL!!3a2-r$3B~*GcD-q~t zsdN1NM{la~P`=16+nDtrOgvI#rr^GcrXrNuFK}zp-UM$%n(-02dwKVT)d`1xGPdyL zV8Bh6QpF21CA9k)1ni~U2<^jm+lfFA_Qrc|gqyA1R^~*g@6=x|B~-eOC8G3mA@r{@ zvQ#yv8}xsI)7FHbG%1d84Rpb&^l3MJ9Yf{r6;jvZwCIP;@YSt+k|eBWtqnt__tnVn z7RK5%HH6YHMfgg1zeJRNf}@|(t2c8u^Dw}j3)X}{JW>>RE7GhhrBXyqO=j^%?8KS4 zbxg^vZ-kdKt65;)+xu{Z(7!FY*y7HH8Lj zqC*63VVj#`3l$mRUDmm@hPdz>VTRq|!Op;98|m4A5sJ7Gd(uD|EP?k5FdLuX*G}si zylEzJJzz143ynao=_Oj-*$U85YBsTicX*mVusmIL3+J9OFNTnHW~l+b$z0 z$U95c?K(muK}J!YR<0zYBwQu1j-PfP_dY7j-~qXNMtL)tVKIz(xph3xa)Zp=j~NfM zJh_)G0Ndd%W+sNN5}H6t>NL-8Go~}?fJd;Obi&K(ttTrHZo@e#92o^R*obpNg*P5AVa+^Jt34zth(t8i{a@!!8vQ&Lt%58>1n7X4%?>Z zg4@$O%9$7_TnX<8iBR%|&>&^w#TxfP`M8ck678`n?J^2ViM7OZ#sU650l~+JG?`&B zJmrIIo4&W_t=;3nmaMfrO>_Q#n27l7Pm5j47=GGnrvAjCt{_OHD1=y3_?Nm$B9miZpFaPz|JQnudS`E1p(S1ATI@pz_P1} zZ-5H3t-!oNVuGa}7+UIicsvC`0|O&HT)Y9@@DfDEkWeG|;i z4oi}R#4ZS6yIv~h>b2S*j|FQX(K$#=P(lC~FeC_2l~B!uQ4^2=yLnk-WpJ>g6o9=m z3~l2)<}aJ`7os&TYMb z({?t}2n+!lKp4<{auNO{p<#evFafgyG#9*~o>SW-S&p*`IMW5np69)jtQJLgr?zl` z{O@vl{rK*|j(++-PhKhSISh1edVD&ao(?qe7?Rn+%Eq{k#)esB?%8b5s63dI>zA5NE_uBWbr zQmn&_Ql~Fn3I<>M+efc|r0exRKkYhwDR{oc^)z?(B9JmWE2vUJR8?3lThKO;Hh_?- ziU~;+c4vX9i)Y)iDQDm&Oh3GLEuDVv?OV}w;N{4`hR0{_-=7&jL$?c5Pvrfpp-}eY z+haXuo1Z%X6l~ooS5u9g9rfc&e`ujXdn!HF+V zEIk+9_Ph)knDE0dhz7X!YFN)?2$U_wE0xOfugy6t{mvSZ+nr*X6O{*`jIm%TO(##} z>WEN52;hM+iPYz?0a8DyGxbwrr22SOd32riEyzh8j7U*{A!JGc!2^sRKZB|$@yXvT z_}J@@6qWC@_SbrD1#F>Md@?r^&?hTgD|69R+Wr~XGy64NVB09OJ)gt@s8Xl|NF5yP z#XlZ1^-Kn8NV#*KZy6O5wFKb;wCBby<;an<@ZhXLhD4!q4pX|Jxztl+sRaAh#)j@v zH(FdZ&Z|Nhd}sJfZ&I@viHm|cv@Ld`EiF8#fsb8#p2t=;>61F z+*h=?1lYf{mHsdjVym%3e{W+bWkcqOfW?|HwjXCcRqhN=f_p&N!Z1nUtj9Z z=ktgZbW?^%ag?r_P37t)W$pz+*O4OH+UW1!xU3hFsTyo zRN1Rk;-%YWe5wn8Dy$XqphDN3Tq=ckG&q&Ybaxdn=-xz^GQmYguY6RuX3QEZ+hZ? zM^C^cK4@%RZhF(S-7^gA|8-uO7k8uwJ2HIigtP2XUspmzXi^8b$19}>ZK6L1pb#lk z0kug413k7xDw-jkDLf5zB1OKeBbBm-)KNe969Tnm3Mt>9sA?`nPbDQ$6)r=Ej!adn z#HOBMb1q8BDOz(WRUEX~p8IFsn0pf4F237XW@28i-{u*Z{r$7@j;w;@f5S>X9oAk+ z%dkvoNh2zYb*~CYp-+t&U%LuG!H)3YUZ@F&7}=yq;WNzRqE6~Ig>{O~1cQJR9_Y4^ zLe-IKk%AkNR9S;0oW#l}D6@np5F(}Q5|c`XH2`H*8saQgfWX28tW)~IyQdn0fvESC z-81}UVBim*!sl=Yz9_!2Z_%Y(p8!#N*?KDlP@&*4Yh3zr1%eb1)J*xcE(*2eFiwO> z5kZ5_YD5u}vWgT43ty#jv+tG|3WxBZLw1&0;&>>*O2&_AJ>!d8k@y?7Ol z@rWs;kg9wWrZ7h45X>}0Y@?M19j?=B-z*h?j^z8?YI&SFD_LFmxUBBe8>c~-sbt>wG*nNDM+bejrN zEEhykpW`&8d6)VZT=VoPw&ti3B4zAS4t8o(mKTtz@I9z}$P{7(s#bA$5$fK(Fd<5o zN2l24pT=;xjQ&j>XmS&G8)Rsu$-_e_nH)?U9%ijhAb?;Z>fY4|qlY4kp$b~pLFKj) zkGTTsJ51>&1u-{8WXd*=D_;&^0-stBW*nAX3TV;`pN`b&4BPTT4w>4SiXzs%4u+fDk)_e8W@XRm55!`p{7$1c#+y8yHp$Rj|0m}BL)tjQIDTT>-8E6# zrXWsDZ@Tp_X*^FV8UpJoNyH4>OkLMsTR+Rui>aV$m?iFiwnoQm{oGZSOGsD(j6jTc>{KksjRfJry>mFcFfv^oYj z+3v=`q-b3VkwTubNa4P5A+aUCRvBoiDt?a}!keT0H1JKFj_lNaWf;K}W9U!R$$K&q3N)Z*eh69X2I0;U%9km4+g zGikLit4aLqzA`%x;P){)N3c}`Qg>tIW@(TDrT{6e?iq9`l(}7W$bPY_4l3UX6{&H! zPT_hM>Rw%!=$9R0`#NUJwMD|=NQ7jxf;OF7A0fX=E_+j6@6#FS;7hkVm2~f?K&lP< z@WnMXt_6rfrbhJ=X_*9|2vVz=npCZ8XDLwt-Nx7)!A5SN36Z+Q(7TihRJJ`wm(mgM zl0;}4#Hb&bO2A2$adH7uCx9q_6n^O!B^SS5(;F7T5t7bGWVo1ga$6c9uh^?FjPg!D zD6{V(f!P2F3 z>m%e>yBGHM+$aBtzj)zJQX*Beh(y8Nx%w$Et?0T=$*>?&NEC<^z_K#shZMv6r9{^E z0>;J~LCvPBYX<1Q*nO&h!2$_;q zqCm4U5CtE*%z2KD2tq_jryzuzXNIVXPHu$qf3Ivb!s|MIb6g6MvL|~_+RvQ9vk2b9 z426b>N5M-=j!C7Rg_|FX#iAjlNn4WUTyrU_b;4+aZbPQfrfR{Y=zA&6r81e!)E93a z#%!_J0pP(PR9BHH6fy-DA?j*Apcobn0u>e-1mTsVzlJ8Axe=a9=QkMPiN{y6iAdSq zy{X@O?MXn2=1dPe3J!G&sT$L4sx7UlrXT@UAWErxc;(2VHs@AQfHOQtupw5p+XpT& zG-}aYYKoXt<|73uVCn;-NMZQ{ru?#>2p2$9eSVXB9}NN}2n~@|DRJ;LO*(TUgd9@W zh9WfCn;Jjd9Hi(L0ZpKVrA6mjlNw|SiXf%UI@jtKJlBE(pe)va zv6N~JI#j*^o}tmUhw2bvO7*DBZA1zbr0MdJDbyZ6kr=9H^6Lha8q&nT+l-hH6aAd= zbml~OC5e)FenSyFjh;pyzbQynDoA;!-N_`j=ldB7IdM}Dv6>&_)Jc_w)EHAx{{c~X znZgMI(Jmm*vdh?`LeQo)=-b;(3>{OSYlmCVp)ylbw|fXu2WW_58COU|mZESWQ7)Fr zuWJohbRe4o@Q_G!^d#C?!|BY8;BYv)9nRt-GOHDnM=i!DLc^A>rKYvsg%8s zp%6EYJT2j_UZ;9|DsAk6FG%X1R{08;)TAY7?BLdAv?g;htumqw|lr>FaIe~Z4$a3&Vhxi&&5)ZHyh;uUkT5d^yj zfC8H`^Ar*C$&5(ZlW}jHAQi7fhC(bmxPnx=%``Z_!c?1{D(MG=?!m}iPnNhm7aiAvE>iC+1*_WI@D&*$F0o%`y`KbOy)d-klSpZph# zJRA2_BO}8j!$0g8xp4Er$eIXqbLXDHNt%wwSBj7D{N+sI)zc?+6cO_4Qxz!?B2~js z>Cg&M>A^8vz!KN2o+(%-wJCx|lr~4-xyqyvDMJN_Zy8!%Uj7>N*V1yovlt*MzW-Ta z3S6p_DN-)1deNv$uk}0jKXd2z+D3N8@f8Uj%Mym*7}r5yNEU-P(69uQ-Ma2>=;94* zf^qgK&MHW`&8FDNXkCJf9fUF1b(;`^O_>*i{sbXRfh-C|5caW;?z}9`V2>xY5zJ^7 zJH9g%dd|HXjpUUzKVCZDnUN7j*GA{V_nv#_&biCG2etO?wQHNd{e1MJ;R{17swcww zeEOfo)qhRbzW@H*xg6sm0xg^(;no#I3OtG<6>!OYDx+x*M`}Y=OwK)#>f}<$RC(!4 z(i!d{Q@)T&-L-A1ss@*6-wjhtBL4axzd^nJ?_^k_gxJS8-uu|gq`twuA*XrGeZEDc z8`{my&p#WzjA4biVqkj&L0CR6%rD$uSXj7UC@e&xg)W+Zi)B`~dB?X?3|fR?UE@Ht zGG(ru^+c*|uJe^+RG?&=NhQnu-be}87T?o4u#Gs0hN>C+i`POhwQj`{=~!Z&01+V- zgGo*}y&8D&E$k6eDCBav85Ao%%y)CIwK@jG73#a&#itFi553YCX?TDZF#)&K2il*2M?#xVX_E{ua=%xlzJKN#D$_>-3wsd_fsW3?Kg?DbZ z_Xd8;nDV@9ytuC#9I1+Cn#La~5G9(brmqRX9BTZ*qD(;YcMnq`r=>nsENDWuluvzR z_|L#1nht^D0d)oMnq3X;Sy+Wm7zyH5Sh!ewU*(esSJS?#qRirKqZ`hj z`vbmpg2_z+wv3$Vi%1Jy*Gz3AQhV3K6j-0CWTXnq(5p?R&iZnxa)YTdUMKGD;d_5B zwWwoqP5>j(P?=1zBx{J&qTo9*|EnbtB0;yO15zka58+dBsIjPI;dIdef(nfo{aNSM3(P8x;P&9 zOsM*D1!oBF4&XcGF}%y+;mkdcL<`;3+iRhO0r9>rqSnNe8KN z(i^EYQ3Ighl+mWxnD2GHt^!^AzB|6_`4Mm_I3&A76iPLs0aI4Y{}&POO;3&~GOyfn z4}U6Slj&YBs-Dlz6uS-KF`#Z91JOi>7>+~>-6g!-*#o3rCISzDJ4XrbG_bQ!r;Vh zsLg`g$m9VgU5Assh`OD}4P>CM%k7E5Q<)k@i{SBeh4FI($<(~3yE=0@5-oUX{^)4> z=x9C!QFVR-Q&I}=%(%UuYOb8N4o-mm7n0pPs?DVydnHr*ILH&JUV;#^a=zf0@E`fV zAv2hlSS@_f7A^D|UT#bxa|s_SgRe56kSP6xz^h~i)z!bny4e(uC+Ofb?H)8&2^3e) zMxq5TeRzEE_T9n7AVj6sHKeI22`$0(DHV^E&d(7EiLI@_Cp#0x*B`hxHMsrd%`b0G1R-ieQ#B41zgQ>J)8bPqNc*az`YWUQ{H7Z;&(Vxe8h)P!GNJe0@O4369t|q_L{n` z08d=xLmxEm?cIRBkLOZoPbl8&<*i1qccbeD1%1T=#1j)_&~7JTC~@SDO8|W(TOjVI5u8nvnfVa@4kf>j_5yjR>y=pS$4=L36kB6daid;B1 zrO|yW$ZDxcJHvqDNJ$Nm|1oz)uWcJ~9JirNwlo5EXS6w?0XzoGV8=FN*m)`&jt7`+ zxCn5&QKf7t5?-Z!Lu~AZ^l&vG4CL zLQ7LA5;R61DTzSJIpjY4?x)k;DdQuvw}=|F!cE^tw5Tva+1Tf}-Gff>2}C_2W?C~; zT}!B#TY$kMwA<{^&cK^(t_ZVR=07|bZ-=M<#)qrKm+USmS}$syQfb3zk`XRgp9)h6-Uvj% zX$*h!IEDMV7mC^>qdZ0o^Ou4m{;VBKqmsY!(No8w6dT>*hfh}?(5qh`KHS^8z7cqc zaC8|@iW$qe?<1$K9-RKhbeX~vvx?{gW)wv!*ahq;Mc-wwX?+WtIvVND(C+_NEFEb& zYV*tWSg1>I5aMxBB1ADBM61p5NuxNMyPWr3mHHRc6evVF-BG`sFv?D*dVbTp%PT*C zmCINZCorie2aZzY)bnrT(=$-3HrJo4F@CPuQ3^%@M<~dKi!6_r7mJPd)uEyo7~q}2 zzRx#@!AKby#$qfMni9N`c@$jDMWNQOQhyNooa6cgwU~a&sUcF!rV$pMKV$=|PZ@=U5?u6&8u#@9SH`*?dkS45i!IEwav45R{+>6@s^~rdU48mEaZg{U;J+eFrDwC*?7N&SF`MQU*uJkm z#)Wz%EG2jom!gCu#$RPi;(b<#h__oJZ^)s~775gnM1gJ-j(%GJkqIM$ARo%}h8oiJ zVkt*fZEs(~2BDB*73ZLoY1TbsUS;q!q3g=xTPJS4og;AN{?ORpNf?z-ln`D79|DFS zNv_sAw0tU@vY|EQU{t4Gm7{|9sx$5N)kfoDI&un2Z-3b6b{pw4Dxndig#Xw(yU;|g zD2^+#%v@&|teE6wBD+bN3KT+L0+h^CA!TW^_5x)oU=Z*z#TFD69ArTd`X~$YxIl_6 z1(KIOML|lOfcYaD#lq_R)QnRSdYKdK=OZNyXb(bPdl)D<*QlEQ!A4r8@{Jl#)WP}a$!02* z@;r75?c<{eJ@}~5U<_}G2!w&p6G5ur=W~p({#%q)Ere)52*_(0ckh8uB+I9Et0dyM z8DP51EWFofGFya{#Ut0!tQC`R2-Q10gDDCKO5(2;j0-+pX2C7Xci>aK) zew-OCcT3-*(No1Uq!s{CGA9SiG zr3A_&irE7`*}33Sm4?=-84oiGgklf)wZ+t`-5iLi6}eNLq2&S8rdnmK)MecRSV+NYO-s&wBdXw%q~e`-hE*4y8(i|KU)T759&Oj z^b+!BbhMok!Kg~50s@7&Qy>*k;WG%9QB~ZcQVk`TK9>J-(g%}}abIt40mpDd#)%}uJBa&-sTnOjEf>K)m& zoWdTR+A2mbblj}<^qMcA&h`#C^+BsstI$h9Gvz%#0d{Ty$))Ez(4T)FkE2q~_GYT^ zr9El|K6?<2n3hs|dwXx2XpwpN(?|E~CVO5-qmV)roq`@+aEu~}f4Dol&^EFwj>p3; zPV5D0lT5bMFG(6{URIJv&_$d0txc4WW#yo>1fpPY>66KXC4SoAdMPyo7P@6KCeLde z1xn>*-@FbcC^8n#ip2$2@hGUl>nmE~K^wD4@R*qX&$*fpS-X-iJ-YcL8}EF0Rnv;nW{R&i|1vc7QXrl>h8#kvcVUg3oe(8LYOVL(#y#H;JG+qT z1X9_7rk3vb&>6>gME>mi?-?kV4UT9Xa%{vCs`JYY%Q|SpeP4ffTSiiowFXfHjK|cy zr}yYRejtiP%I&dPo9x^bm$KV~Mr^!}r~(tWfr4FMr$5g8n`3XbLx&F^YHjmUJ69<| zKNBW@Rw!yHA82GKg9R>x!^HxX=mk3)Od`PZ%?hl8eC}Lyje@DtyIvZBkqTNXQb(mo zF;dc2tji8*lu?&w+8xD3Y6{ngsiC9o==!=QS)`a4mMI`aFx6mGg=JWzBvbb$59|^t zg%VQIwW$~@mOI_)A&u}t#g#^zD%~RG(WgC`>N=cz3o}0c*n43lm)LWL_i`gjUPwy9 zT;L;4T&T4BB_YKHGv+h$3ks%2#mem-jK5hV{UyGUj4@>PdiUmGGdkYS=EQf|Tk2bm{QtWr{@GJP$PltRBy z0;X8tjrj8H1un{s8a4b*mlZ#n>OPix8#9btE&+@9RyDjw6F)qQxWA~vsCbRRJ%;HV zre0_LH?W-4DSJK|C70KlKyN|n`fj8S^*=u2$XCT}m%qfK@4q8t;P!C(BT54$u6;Vi zKq*sqF3T3k)U`I0slkTdyTYMTEyFV9*;CqT5~(ZF^9?rp%?T+|xTkwoC;}YTqb5_` zcJ9M6HF3a2>Xdv7B%p!vP>qTfqgIiO*upp4L#ng$of|GofaP_j6*caK;%Z>_?)AIm z`3{c$bIi}5OPT5cQb;1a0jb{tsS6jKi_RkmRrxVF!R^*gk04Wr z+Aq)fnapfnktzkI=6qweGBq@>`$#p%=L683f)pu@$icx9wUH-Zliy&WLNl4{R4Cv} z+)$*0k+SV-#7fj7ImfcBT%?7m`uX$qdQ@16q!o!-iD<-13cFdQfNEF`hncL!MLsR& zxhfBwQR2H(FO7O#@>ObJehr?Fry;!CJkYm5NPTsn1*xf~SSpTnRxXfCVFM>FQ2t47 z&gHu!cSlBeAkg9NZ7EZI8HrSbD9S@IN|Z$43dic}=;Q@cO`Z?I`3#650V+y+A@iE@ zgUo*BsaAA*g{KjqHz8HAfKkMb7`A0aomQlb@o}RrVz#h#+k#c?1d#IH$HE@35H`c6 zNh)RPdMaAb4P)m6P;P3hsZ-mj;*&fxM{@lP1E(!$8Qt`Cw3|r%o!3Z_evgP+ZzQ77wpl}snOX;IvJcBt zXW;86mKE}8tUqk(b9RBQvAcV&`Z7f>P+4||@;g3el}Z33%hs)kW!VwE)$=(H9G`6^ z6ILaXh$JeBWGhmdy2!CqUKb+yEG42zVg5-7GbV%<6J|mPkya5)z+ylWva7Jf!{06fTN8DK}1w@c8Hj2Fb2s|XNmLh}17HF-sae8VYqyh-lsv=~c0s5~3e{ zRb7}MEtS`b=oFSnT?(vY+ja5;qA7QruT<(8E6w(RtCAR9IJh%DK7Q&@H>QmTkm}xr z)WdQWC_OAc#2oV!Gz+mh@G%@Z%Z)y|6{oy)CHGU=Vb9lQNL|mkqr@yyc%3d&BthHE zxUP>bZMsMWvz-IVvI1Q4j0!-S$rC?Ro#q4QY06l=;3h)v8L*pHltEvm>Q)7ZW#sIf zQLWbNb}Lci97_c)h}3?B=j8abut`XXWL&7GNTh_B5=jw@GEy75_&Ki?j+?4!5>lVP zvp*=d^D(;VlQUdOvw(_(>b4N47w+%ej4#2i9qIs8uSDuh`OHJ`G}3?Vlfh3ApnEtO zE?IPN6(B*Ru!u*Qkm_$UzZatMJc*PX)8l{~v!+<3YMG1-(A{1D4V^-PdnF}H>;M{V zhO9^)PysT_^9aJ}JU^|Fze6W%VW=5OA1SERn~h^B7bz>+g49P}kmFOsWW{_~=qE&2 zB2^J_5sL*?iu!1*QeS-3l)b#mxv2%H6d41BQRC<=kXpjZ2AGEt3gHo#K0J_jJ)3Pt z>Sq7Ypc?C$JqH)Nwssov`RGz;^63@~kD`S}KKo?g+SG2Ou!zCX&uR$-7frkNfMK2FI} zt(f1~$QMyZ2Y5q``Y8>#&^8fJDJN<;5xb&S6PBH`BZi?@4Xa{U38NaZEiaamBvq<= zBE^o+G=WrFBz2K6MUunwl<03D6(ghyCON*A@SNvBjbre5;cEhE4c`mp%F1cn^8FB5 z3T1#4Y#RsEYH8_%e{=-b%{+gz9~M9F&Z_G=!Jg0MXxpQSD`j^qVx5s1X|n;o5MXhQ zMq!>xq_E=xm-iT{V7E+YzmF6%1EijTt!y?+@Nfkf_3ZTayhL4sCR?8YsVsG!@Kp*F z*-oNrMT`bgb=^jMRky8rHIa)M!B{HlBHP4QZ>p;t;Wo7EM@Ato=|_*&4gLe zkwh@_=@oP+nh4HWr4|vMH;u8(U;pa6gS{oD30SSbMv3r<(iP{Af{$9p2Bu+v;+^h zaR1*+Bl!7Qqqbq%woBDb??L1Pr_P@OP%cp&G>H64yD%)*w*A*;t^FJytlNFM*iCW5 zYV6?LW3FLdzf7nrfE4pVD#exT3n0Uk&BGV&;FY@Xy>yY{4*zqn2UO~bor_eg9A(XI z>%VrwFzl*j*+#`8$5&~JrJR^Z7%k!XSwJFFojy|OWU?QpFz?B@i_~#)kFDW3Bek#N ztDXA`y|e!r{r%|ek{mqlJs1a4?DvQ$6$ferRcPeqxaa#&@vQsWYelMD&R{kp4}L+U zI6QB+XbP~vC|^La(7?XkDs>!4afKZpv!ej69a>E6z4MW`Bv+yk|ySSkUpB< z=gmm%I}E0Jkw)-r3?fCL)UXsOX%eZq&{DEvuVCV6t4M(z$kP_iTNIvWYGlL1gw#;G zA+>*SPMS{?9U5eajyi|;kN-d(bX>tq6R1m4DdHyFs zrw;bAKFOiu-W?LDk)(*mK~$4U%}tKnJhlf>G{KXNVcNQY9UK8C$rfQWJei^8H>i4f zDBfmysR7X91BE&$;v$ee4@soFj&lReNU@iDKF>0AT-Ic(a%bf)zk2_h(#s!l-*n{2 zw?~fr0l%)75~)|_rRsa-rTzxpYPK9BC9RKwC^Ho{Q-xxf*->$)mlmnCfSGY2;;P2T z6i^uGO=ufO6vyj2;QE6GNiz`G6PKk^{|L@IcKO}|ttpDuCXl8+s{PNzLw==UIQl}b;8ZhAYJb@xb z(hJH*Q4LDO6L^Sz6pe{i8}a?)N=;-@Os!Cejv5E&vdh(Ar*EXh;(;8*p6$qdP3hYQ ziK(8@d!bM}E7Tr3|NAn!eA)AgQ*x37PG!LXDH!!Ns8aEGQ_T60I?y*A7V9R(Qesil z7^%+`Qo}&%*!D3qtdJ5Wt`;Hn_JKyEmxq_TzqoS^N9M-&I>&5-Im zoMobDTPd7zhKdd@!0EK6oko>~8<6U6wE>@^gmdO_@hW_RnOb2Z#YEBkPV{=FY}^-v zu<)W~O4c-(Dd91d)|n~5)Z5+*;Rc;woND? zb{0wnyAG){nx+v;ro}fa4615K>5NoN5@l(N7KKulz!TTbG(`%SfAHJOLx0dlK%X8S zO=SmD!@x>U4UbC4cUjkuzY3`i5LJ|$Nf{Bt09Bi0nsAWs14HJc$N5JH-nl^Wi`k>C zg;dQ*QRq!mTd??wm}1p#s*5{nX3DpgfzhE{=e%pCb~81ipkJ?qkW1+G3s`;L?Te)_ z1EGW|nwlM+(T|UP*A(?VU91I7ebx3JpLdvX~A}1CtOT!VCIrPYO4A&8u z89YNhi`6aDGzlrFIZ`~=^k-;npsSmZ%JP7(m;zEzik)DB(g+Q)RL4=Bh)NUPYDl0^yE?gaXxSI?-wX|QtxUpq}&Z#{*ueCR+uR^PkgyBOGH8cqPUwQ4El$B zP?~}%iz+gj+7&KSx8MBb%2GR+qHjDY5mY~Qd9jp}1SrThJ5CAYIOUxZxN+)YDZWRC z3Z-%-+F+$DLMmp8n8*Me6f3-SEENmKB4#XN#Ugsd3RA1OSd9TaAf<(`ebo#pZ=D4t zGTTOV1Aj+^)HiXRh#J}+CMTHU%+zR|g=y0{G%sH4?~;gNZy;%>AP}^9E1w5bx8ej8 z>tgm)t4+YWfzVqKB^OmmbHo;kot|7a%Dv1K??UB^Y{!8SH1+)XpQzEH@#J7-s4~{> zJE5hecHl%`eY$gJZ4Dn0W2QRyJ>v6Xsd9ny>p`TTX-!lu6DN=|Emj!96?au7*367B zg{cW36d#r8-|ws5>nTL7N&awp*b5Vx4n&9fD_xQ zCwZwSk|#D&t+(t7yS2{FGEop=BYhvftBgZAJ?@oEJ-}Xh!J!h{rnDe4m6lLxJUe*x zsir+$MfIIfJ2M5IARwjO;LQ$q#K%+5lXO|YjZV~{hFA(+^jIBIeSNSyRYJ+kWh@C# zP^!rk8G#!kb*=9}5UKR|YmnN5&TSz)-#nh$Ht<)Zj|D^XlW==+illrI_gR=J3ZmF9 znRyn>l%%W(Bh`}IzK$y+rLf_+Nlj{DqP#v{Y+UzQk*h=$r_KM)phiUmwgY+?YVQqE z((}Fo3h7S{sNQwo@!1vIc7`g2ox*|*-{%ZD(NcgYHyAWu=lsQOAx}Y{%ZQ%R{zPriN%kUJAn7z+^cZE!aV%rU|KK03~uj z%3Mc6VSSSBxpg7dbL*zSNky2;RS*XcX=?jIs>_E|AT5=heNgZBx>Jl4nBt9oJS&v| zJQAU=^EGWLw+AR&Q772(fhqqw8M#6fRj(bdlA9pa`H5tTLMSbb8V;O7J2EwOL=*FA zose34xD-N=u442a>H3tFN@AL@V>?ltcG(6}j$N`#O=BsLhw&gfgL$bFmn;ETh^XaU zRpe0Ql`nkAQpHnH6;|rUkN4sDIZ$Y=m>Kl~v@O;*2MOvv9pV#B&XUK9knkm-&s>>8kPxBv! zz|;x%e0N$D`P42a;HMd^WK->@;u$c!539`3+e>jJ=6N~ zjgC573#1w~LrBqxFD@OQmppF>&Sz2)Mk-OHtW^JD?Ap+FmRb^h9Xz9vP%d`H*_O zcpYCuqqmL^>LS}iX2>g5!6!9W@l)WWb^#&2daKS-<4@dd>*+C_kOD)OBb&-f?Wvc> z^+~BQa(skJku#my2*ixV6SY#@U>%Gc2X=-&(bdA6o`WgKV`_!hTRmf>6i~crXQPqg ze-4sjYATafa>05Z`SKppOEvJLm`WklJ&@dore|iH#zr9J=?6>fTb5;As{fKeI^7hh zft0~W5mfPWr(89I9C+7{BalcAK77S{y&zxP*>i6oS| z9!#uH^0Os8c=-6=)Bm2|-?<TRr~YCiyL;Ox+RVJU5Bg7 z>Ru$ALT?ZerKXiiRuM;gtB^%7?bN7GA|;6NISM7V0Dpq;9jO#dV`ktXf z0>6{OxRcLsK*Z>SgM(caQm|O5m*YvZ*?irU{hrA7h8IWHS|_wCWDya6*p!_iHCt6& zr7ovyY*&Y?jOsnWKqVoANGZBR)nuplz=LeGbElrmhrB*Ts`%zVB1(zl+R;xqphCN( zQIDBF(0bzFjJHgSt6gho!i(K`P8rLgg+xC8SEUqBn8S zXVK-^p`*hxKu>=0`ttXPMc4GCr$V7q#My~7DdF_PZ8GYbNK7eD{=conLV>DXip=k+ zFh_XKU`p!@BfpJFgg+``YVYnlp_DZ=AsfRD6RR##_5F$v%4N$_k}rtf60|~rreu&P zfFhW5ia73{;2wCR(MNneKj}Zi0Xl(7DGECEA1oegIGCzI8k5$x{EPE@RSZ;^l`M32fkl2PcC)e=}eD24|I13c(Nttd@>9H*uP7^QA0 z3Z5D)9v=Ssti7J}hSmD|kE>6wHr8K`$4`fj3i$wYIw4{s6~xDvT@f}R4U>TiOGPcP ztoyxQtW?jlEUTzWW>Qv+{Glc}5DHV6L7;b7K=@!SIIOSahN%gHPL0P=fl-LYOt%pd zwm2mX*JK(j9V%$L1`v@_5zytOeI$dZl}&v03n_I=zU{*z5*%u^%z6o~-=Zk>^QXz? zIPy&>BuqBSN0X6%V9yuE!VF(z7-*Uox#kM^gNgqRY$D|&#NWd=I?ivZg*z| z7MA={p8RILUN<;=4<+gx)*xSol9G~=l9G~=l9G}y?_ah0@Skhm00000NkvXXu0mjf D_>DNH literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_2_2.png b/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_2_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b47e6c2ac646c1ca7f7fc752aa20ec3a13d970ca GIT binary patch literal 118552 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

    *_DX!7T%Z&zyGoV<#!S^%;U8ay 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ƀND{Jn}I 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

    ^9+!-uN3<` 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 z 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_3_3.png b/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_3_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d1aaaca7d9f4db931cd899be9a46a19d5f93d086 GIT binary patch literal 87052 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≷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 Y0WRDp)JCdXmjD0&07*qoM6N<$f~L2}4gdfE literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_4_0.png b/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_4_0.png new file mode 100644 index 0000000000000000000000000000000000000000..57b9fafa4fca14a73c88ffcf312512adc2600dad GIT binary patch literal 63296 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 literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_4_1.png b/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji/v10_emoji2.0x_4_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9c525df8be07495524f0eb15327863f26b3c8d49 GIT binary patch literal 54027 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 DqjtDo literal 0 HcmV?d00001 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java index 1742d4dc99..c0c2103e12 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java @@ -44,7 +44,7 @@ import im.actor.sdk.view.emoji.SmileProcessor; import im.actor.sdk.view.emoji.keyboard.KeyboardStatusListener; import im.actor.sdk.view.emoji.keyboard.emoji.EmojiKeyboard; -import im.actor.sdk.view.emoji.keyboard.emoji.EmojiView; +import im.actor.sdk.view.emoji.keyboard.emoji.EmojiKeyboard2; import im.actor.sdk.view.markdown.AndroidMarkdown; import static im.actor.sdk.util.ActorSDKMessenger.messenger; @@ -92,8 +92,7 @@ public class InputBarFragment extends BaseFragment implements MessagesDefaultFra protected KeyboardHelper keyboardUtils; // Emoji keyboard - protected EmojiKeyboard emojiKeyboard; - protected EmojiView emojiView; + protected EmojiKeyboard2 emojiKeyboard; protected ImageView emojiButton; private Message lastMessage; @@ -273,8 +272,8 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { } @NonNull - protected EmojiKeyboard getEmojiKeyboard() { - return new EmojiKeyboard(getActivity(), messageEditText); + protected EmojiKeyboard2 getEmojiKeyboard() { + return new EmojiKeyboard2(getActivity(), messageEditText); } public void requestFocus() { @@ -620,7 +619,7 @@ public void onSaveInstanceState(Bundle outState) { @Override public void onDestroyView() { super.onDestroyView(); - emojiKeyboard.release(); + //emojiKeyboard.release(); emojiKeyboard = null; } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java index bb38af7ec4..2fd7ef6c99 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java @@ -1,6 +1,7 @@ package im.actor.sdk.controllers.conversation.messages.content; import android.text.Spannable; +import android.text.SpannableStringBuilder; import android.text.method.LinkMovementMethod; import android.view.MotionEvent; import android.view.View; @@ -16,7 +17,9 @@ import im.actor.sdk.controllers.conversation.messages.content.preprocessor.PreprocessedData; import im.actor.sdk.controllers.conversation.messages.content.preprocessor.PreprocessedTextData; import im.actor.sdk.util.Fonts; +import im.actor.sdk.util.Screen; import im.actor.sdk.view.TintImageView; +import im.actor.sdk.view.emoji.keyboard.emoji.Emoji; import static im.actor.sdk.util.ActorSDKMessenger.myUid; @@ -64,9 +67,9 @@ protected void bindData(final Message message, long readDate, long receiveDate, Spannable reactions = preprocessedData.getReactionsSpannable(); CharSequence text; if (textData.getSpannableString() != null) { - text = textData.getSpannableString(); + text = Emoji.replaceEmoji(textData.getSpannableString(), this.text.getPaint().getFontMetricsInt(), Screen.dp(20), true); } else { - text = textData.getText(); + text = Emoji.replaceEmoji(new SpannableStringBuilder(textData.getText()), this.text.getPaint().getFontMetricsInt(), Screen.dp(20), false); } bindRawText(text, readDate, receiveDate, reactions, message, false); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java index ee473ccdb9..baffa0dd4c 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java @@ -2,10 +2,12 @@ import android.content.Context; import android.graphics.Color; +import android.graphics.Paint; import android.text.Spannable; import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.Spanned; +import android.text.TextPaint; import android.text.style.ForegroundColorSpan; import android.text.style.URLSpan; import android.text.util.Linkify; @@ -35,8 +37,10 @@ import im.actor.sdk.R; import im.actor.sdk.controllers.conversation.view.MentionSpan; import im.actor.sdk.controllers.conversation.view.ReactionSpan; +import im.actor.sdk.util.Screen; import im.actor.sdk.view.BaseUrlSpan; import im.actor.sdk.view.emoji.SmileProcessor; +import im.actor.sdk.view.emoji.keyboard.emoji.Emoji; import im.actor.sdk.view.markdown.AndroidMarkdown; import im.actor.runtime.generic.mvvm.ListProcessor; @@ -130,7 +134,7 @@ public Object process(@NotNull List items, @Nullable Object previous) { boolean hasSpannable = false; // Wait Emoji to load - emoji().waitForEmoji(); + //emoji().waitForEmoji(); // Process markdown Spannable markdown = AndroidMarkdown.processText(text.getText()); @@ -181,10 +185,16 @@ public Object process(@NotNull List items, @Nullable Object previous) { } // Process Emoji - if (SmileProcessor.containsEmoji(spannableString)) { - spannableString = emoji().processEmojiCompatMutable(spannableString, SmileProcessor.CONFIGURATION_BUBBLES); - hasSpannable = true; - } +// if (SmileProcessor.containsEmoji(spannableString)) { +// spannableString = emoji().processEmojiCompatMutable(spannableString, SmileProcessor.CONFIGURATION_BUBBLES); +// hasSpannable = true; +// } + + + spannableString = new SpannableString(Emoji.replaceEmoji(spannableString, + new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG).getFontMetricsInt(), Screen.dp(20), true)); + hasSpannable = true; + updatedTexts.put(msg.getRid(), updatedCounter); preprocessedTexts.put(msg.getRid(), new PreprocessedTextData(reactions, text.getText(), hasSpannable ? spannableString : null)); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java index 146cc812a2..1c80c48f03 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java @@ -45,6 +45,7 @@ import im.actor.sdk.view.ListItemBackgroundView; import im.actor.sdk.view.TintDrawable; import im.actor.sdk.view.emoji.SmileProcessor; +import im.actor.sdk.view.emoji.keyboard.emoji.Emoji; import static im.actor.sdk.util.ActorSDKMessenger.messenger; import static im.actor.sdk.view.emoji.SmileProcessor.emoji; @@ -442,15 +443,18 @@ public void layoutReady(DialogLayout res) { private CharSequence handleEmoji(CharSequence... args) { StringBuilder builder = new StringBuilder(); for (CharSequence seq : args) { - if (SmileProcessor.containsEmoji(seq)) { - if (emoji().isLoaded()) { - builder.append(emoji().processEmojiCompatMutable(seq, SmileProcessor.CONFIGURATION_BUBBLES)); - } else { - builder.append(seq); - } - } else { - builder.append(seq); - } +// if (SmileProcessor.containsEmoji(seq)) { +// if (emoji().isLoaded()) { +// builder.append(emoji().processEmojiCompatMutable(seq, SmileProcessor.CONFIGURATION_BUBBLES)); +// } else { +// builder.append(seq); +// } +// builder.append(Emoji.replaceEmoji(seq, textPaint.getFontMetricsInt(), Screen.dp(20), true)); +// } else { +// builder.append(seq); +// } + + builder.append(Emoji.replaceEmoji(seq, textPaint.getFontMetricsInt(), Screen.dp(20), true)); } return builder; } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/BaseKeyboard2.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/BaseKeyboard2.java new file mode 100644 index 0000000000..f4e3d5b200 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/BaseKeyboard2.java @@ -0,0 +1,368 @@ +package im.actor.sdk.view.emoji.keyboard; + +import android.app.Activity; +import android.content.Context; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.os.Build; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import java.lang.reflect.Field; + +import im.actor.runtime.Log; +import im.actor.sdk.R; +import im.actor.sdk.controllers.conversation.KeyboardLayout; +import im.actor.sdk.util.KeyboardHelper; +import im.actor.sdk.util.Screen; + +public class BaseKeyboard2 implements + ViewTreeObserver.OnGlobalLayoutListener { + + + private static final String TAG = "BaseKeyboard"; + protected Activity activity; + private View decorView; + private boolean softKeyboardListeningEnabled = true; + private boolean showRequested = false; + private boolean emojiKeyboardIsOpening; + private InputMethodManager inputMethodManager; + private View emojiKeyboardView; + protected EditText messageBody; + protected KeyboardLayout root; + protected RelativeLayout container; + public static final int OVERLAY_PERMISSION_REQ_CODE = 735; + + Boolean pendingOpen = false; + + protected KeyboardStatusListener keyboardStatusListener; + + final WindowManager windowManager; + int keyboardHeight; + private boolean showingPending; + + private boolean showing = false; + // private boolean dismissed; + private boolean softwareKeyboardShowing; + private KeyboardHelper keyboardHelper; + private boolean keyboardMeasured = false; + private int keyboardTriggerHeight = Screen.dp(150); + + public BaseKeyboard2(Activity activity, EditText messageBody) { + this.activity = activity; + this.windowManager = activity.getWindowManager(); + this.inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); + this.decorView = activity.getWindow().getDecorView(); + decorView.getViewTreeObserver().addOnGlobalLayoutListener(this); + //setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); + //default size + keyboardHeight = (int) activity.getResources().getDimension(R.dimen.keyboard_height); + keyboardHelper = new KeyboardHelper(activity); + this.messageBody = messageBody; + + messageBody.setOnClickListener(view -> { + if (showing) { + dismiss(); + } + }); + messageBody.setOnFocusChangeListener((view, b) -> { + if (b && showing) { + dismiss(); + } + }); + + } + + + public int getHeight() { + return keyboardHeight; + } + + public void setKeyboardStatusListener(KeyboardStatusListener keyboardStatusListener) { + this.keyboardStatusListener = keyboardStatusListener; + } + + + public void show() { + if (isShowing()) { + return; + } + + softKeyboardListeningEnabled = true; + this.root = (KeyboardLayout) messageBody.getRootView().findViewById(R.id.container).getParent(); + this.container = (RelativeLayout) messageBody.getRootView().findViewById(R.id.container); + + root.showInternal(keyboardHeight); + showRequested = true; + if (softwareKeyboardShowing) { + keyboardHelper.setImeVisibility(messageBody, false); + } else { +// messageBody.setFocusableInTouchMode(true); +// messageBody.requestFocus(); +// inputMethodManager.showSoftInput(messageBody, InputMethodManager.SHOW_IMPLICIT); + container.setPadding(0, 0, 0, keyboardHeight); + showInternal(); + } + + } + + protected void showInternal() { + if (isShowing()) { + return; + } + + showRequested = false; + showing = true; + + emojiKeyboardView = createView(); + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, keyboardHeight); + params.gravity = Gravity.BOTTOM; + root.addView(emojiKeyboardView, params); + + if (keyboardStatusListener != null) { + keyboardStatusListener.onShow(); + } + onShow(); + } + + private void update() { + if (emojiKeyboardView != null) { + WindowManager.LayoutParams params = new WindowManager.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + (keyboardHeight), + WindowManager.LayoutParams.TYPE_PHONE, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + PixelFormat.TRANSLUCENT); + params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; + windowManager.updateViewLayout(emojiKeyboardView, params); + } else { + + } + } + + public void dismiss() { + dismissInternally(false); + } + + public void dismiss(boolean dismissAll) { + dismissInternally(dismissAll); + } + + private void dismissInternally(boolean dismissAll) { + showing = false; + if (messageBody != null) { + if (dismissAll) { + keyboardHelper.setImeVisibility(messageBody, false); + } else if (!softwareKeyboardShowing) { + keyboardHelper.setImeVisibility(messageBody, true); + } + } + if (root != null) { + root.dismissInternal(); + } + if (emojiKeyboardView != null && root != null && keyboardHelper != null) { + final View emojiKeyboardViewCopy = emojiKeyboardView; +// emojiKeyboardView +// .animate() +// .y(140) +// .alpha(0.2f) +// .setDuration(200) +// .setStartDelay(0) +// .setInterpolator(new AccelerateInterpolator(1.5f)) +// .setListener(new AnimatorListenerAdapter() { +// @Override +// public void onAnimationEnd(Animator animation) { +// emojiKeyboardViewCopy.setVisibility(View.GONE); +// windowManager.removeView(emojiKeyboardViewCopy); +// } +// }) +// .start(); + emojiKeyboardViewCopy.setVisibility(View.GONE); + root.removeView(emojiKeyboardViewCopy); + emojiKeyboardView = null; + if (keyboardStatusListener != null) { + keyboardStatusListener.onDismiss(); + } + if (dismissAll) { + container.setPadding(0, 0, 0, 0); + } + onDismiss(); + } + } + + + public void toggle() { + if (isShowing()) { + dismiss(); + } else { + show(); + } + } + + public boolean isShowing() { + return showing && emojiKeyboardView != null; + } + + + public void destroy() { + dismiss(true); + + if (keyboardStatusListener != null) { + keyboardStatusListener.onDismiss(); + } + } + + @Override + public void onGlobalLayout() { + + Log.d(TAG, "onGlobalLayout"); + if (!softKeyboardListeningEnabled) { + return; + } + Rect r = new Rect(); + messageBody.getWindowVisibleDisplayFrame(r); + + int screenHeight = messageBody.getRootView() + .getHeight(); + + +// int widthDiff = decorView.getRootView().getWidth() - (r.right - r.left); +// if (Math.abs(widthDiff) > 0) { +// return; +// } + int resourceId = activity.getResources() + .getIdentifier("status_bar_height", + "dimen", "android"); + int statusBarHeight = 0; + + if (resourceId > 0) { + statusBarHeight = activity.getResources() + .getDimensionPixelSize(resourceId); + screenHeight -= statusBarHeight; + } + + + screenHeight -= getViewInset(root, statusBarHeight); + + int heightDifference = screenHeight - (r.bottom - r.top); + + boolean changed = softwareKeyboardShowing; + + if (heightDifference > keyboardTriggerHeight) { + + softwareKeyboardShowing = true; + + Log.d(TAG, "onGlobalLayout: " + heightDifference); + + keyboardHeight = heightDifference; + + dismiss(); + + } else { + + softwareKeyboardShowing = false; + + if (showRequested) { + root.showInternal(keyboardHeight); + showInternal(); + } else if (changed) { + if (root != null) { + root.dismissInternal(); + } + } + Log.d(TAG, "onGlobalLayout: " + heightDifference); + Log.d(TAG, "onGlobalLayout: " + "dismiss?"); + // dismiss not wirk +// softwareKeyboardShowing = false; + // keyboard showing or not? +// dismissed = true; +// dismissInternally(); + } + + changed = changed != softwareKeyboardShowing; + Log.d(TAG, "keyboard state change: " + changed); + + // FIXME verify root view applied new padding after keyboard state change + // workaround for [some of android versions] bug, when keyboard closing not causing relayout, or causing it with delay + if (changed && root != null) { + + root.postDelayed(() -> { + if (!root.isSync()) { + root.requestLayout(); + } + }, 30); + } + + + + } + + public Activity getActivity() { + return activity; + } + + protected void onDismiss() { + // override it + } + + protected void onShow() { + // override it + } + + protected View createView() { + TextView view = new TextView(activity); + view.setText("Example of keyboard"); + view.setGravity(Gravity.CENTER); + view.setBackgroundColor(0xffdadddf); + + return view; + } + + public void onConfigurationChange() { +// dismiss(true); +// softwareKeyboardShowing = false; + } + + public boolean onBackPressed() { + if (showing) { + dismiss(true); + return true; + } + return false; + } + + public static int getViewInset(View view, int statusBarHeight) { + if (view == null || view.getRootView() == null) { + return 0; + } + + view = view.getRootView(); + + if (Build.VERSION.SDK_INT < 21 || view.getHeight() == Screen.getHeight() || view.getHeight() == Screen.getHeight() - statusBarHeight) { + return 0; + } + + try { + Field mAttachInfoField = View.class.getDeclaredField("mAttachInfo"); + mAttachInfoField.setAccessible(true); + Object mAttachInfo = mAttachInfoField.get(view); + if (mAttachInfo != null) { + Field mStableInsetsField = mAttachInfo.getClass().getDeclaredField("mStableInsets"); + mStableInsetsField.setAccessible(true); + Rect insets = (Rect) mStableInsetsField.get(mAttachInfo); + return insets.bottom; + } + } catch (Exception e) { + e.printStackTrace(); + } + return 0; + } +} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java new file mode 100644 index 0000000000..62f04c2b36 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java @@ -0,0 +1,143 @@ +/* + * Copyright 2014 Ankush Sachdeva + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.actor.sdk.view.emoji.keyboard.emoji; + +import android.animation.ObjectAnimator; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.support.v4.view.ViewPager; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.LinearLayout; + +import im.actor.core.entity.Sticker; +import im.actor.sdk.ActorSDK; +import im.actor.sdk.R; +import im.actor.sdk.util.Screen; +import im.actor.sdk.view.MaterialInterpolator; +import im.actor.sdk.view.PagerSlidingTabStrip; +import im.actor.sdk.view.emoji.SmileProcessor; +import im.actor.sdk.view.emoji.keyboard.BaseKeyboard; +import im.actor.sdk.view.emoji.keyboard.BaseKeyboard2; +import im.actor.sdk.view.emoji.keyboard.emoji.smiles.OnBackspaceClickListener; +import im.actor.sdk.view.emoji.keyboard.emoji.smiles.OnSmileClickListener; +import im.actor.sdk.view.emoji.keyboard.emoji.smiles.RepeatListener; +import im.actor.sdk.view.emoji.keyboard.emoji.smiles.SmilePagerAdapter; +import im.actor.sdk.view.emoji.smiles.SmilesPack; + +public class EmojiKeyboard2 extends BaseKeyboard2 implements OnSmileClickListener, + OnBackspaceClickListener { + + private static final String TAG = "EmojiKeyboard"; + private OnStickerClickListener onStickerClickListener; + + private static final long BINDING_DELAY = 150; + + public EmojiKeyboard2(Activity activity, EditText messageBody) { + super(activity, messageBody); + } + + + @Override + protected View createView() { + + + EmojiView emojiView = new EmojiView(getActivity()); + emojiView.setVisibility(View.VISIBLE); + + emojiView.setListener(new EmojiView.Listener() { + public boolean onBackspace() { + if (messageBody == null) { + return true; + } + KeyEvent event = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_DEL, 0, 0, 0, 0, KeyEvent.KEYCODE_ENDCALL); + messageBody.dispatchKeyEvent(event); + return true; + } + + public void onEmojiSelected(String symbol) { + if (messageBody == null) { + return; + } + int selectionEnd = messageBody.getSelectionEnd(); + if (selectionEnd < 0) { + selectionEnd = messageBody.getText().length(); + } + + CharSequence localCharSequence = Emoji.replaceEmoji(symbol, messageBody.getPaint().getFontMetricsInt(), Screen.dp(20), false); + + messageBody.getText().insert(selectionEnd, localCharSequence); + } + + + @Override + public void onClearEmojiRecent() { + if (getActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle(ActorSDK.sharedActor().getAppName()); + builder.setMessage("Remover emojis recentes"); + builder.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + emojiView.clearRecentEmoji(); + } + }); + builder.setNegativeButton("Cancelar", null); + builder.create().show(); + } + }); + return emojiView; + } + + @Override + protected void onDismiss() { + SmileProcessor.emoji().getRecentController().saveRecents(); + } + + void animateView(View view) { + view.animate() + .setInterpolator(MaterialInterpolator.getInstance()) + .alpha(150) + .setDuration(300) + .start(); + } + + @Override + public void onBackspaceClick(View v) { + + } + + @Override + public void onEmojiClicked(String smile) { + + } + + public OnStickerClickListener getOnStickerClickListener() { + return onStickerClickListener; + } + + public void setOnStickerClickListener(OnStickerClickListener onStickerClickListener) { + this.onStickerClickListener = onStickerClickListener; + } +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java index 3697c7b71d..a894b5c806 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java @@ -61,8 +61,8 @@ public class EmojiView extends FrameLayout { public interface Listener { boolean onBackspace(); void onEmojiSelected(String emoji); - void onStickersSettingsClick(); - void onGifTab(boolean opened); + //void onStickersSettingsClick(); + //void onGifTab(boolean opened); void onClearEmojiRecent(); } @@ -555,14 +555,12 @@ protected void onDraw(Canvas canvas) { private boolean backspacePressed; private boolean backspaceOnce; - private boolean showGifs; private int minusDy; - public EmojiView(boolean needStickers, boolean needGif, final Context context) { + public EmojiView(final Context context) { super(context); - showGifs = needGif; dotDrawable = context.getResources().getDrawable(R.drawable.bluecircle); @@ -668,7 +666,7 @@ public boolean onTouchEvent(MotionEvent event) { } }; backspaceButton.setImageResource(R.drawable.ic_smiles_backspace); - backspaceButton.setBackgroundResource(R.drawable.ic_backspace); + backspaceButton.setBackgroundResource(R.drawable.ic_emoji_backspace); backspaceButton.setScaleType(ImageView.ScaleType.CENTER); frameLayout.addView(backspaceButton, LayoutHelper.createFrame(52, 48)); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_backspace.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_backspace.xml new file mode 100644 index 0000000000..c515f6be7c --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/drawable/ic_emoji_backspace.xml @@ -0,0 +1,11 @@ + + + + + + + + + From 8c0d6a6ae342c81cc12630fe35c3968dfa2bef65 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 11 Jan 2017 15:00:28 -0200 Subject: [PATCH 206/253] alteracoes --- .../messages/content/TextHolder.java | 2 +- .../preprocessor/ChatListProcessor.java | 3 +- .../controllers/dialogs/view/DialogView.java | 48 ++++++++++--------- .../sdk/view/emoji/keyboard/emoji/Emoji.java | 17 +------ .../emoji/keyboard/emoji/EmojiKeyboard2.java | 13 +---- 5 files changed, 29 insertions(+), 54 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java index 2fd7ef6c99..10b23d7760 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java @@ -67,7 +67,7 @@ protected void bindData(final Message message, long readDate, long receiveDate, Spannable reactions = preprocessedData.getReactionsSpannable(); CharSequence text; if (textData.getSpannableString() != null) { - text = Emoji.replaceEmoji(textData.getSpannableString(), this.text.getPaint().getFontMetricsInt(), Screen.dp(20), true); + text = Emoji.replaceEmoji(textData.getSpannableString(), this.text.getPaint().getFontMetricsInt(), Screen.dp(20), false); } else { text = Emoji.replaceEmoji(new SpannableStringBuilder(textData.getText()), this.text.getPaint().getFontMetricsInt(), Screen.dp(20), false); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java index baffa0dd4c..fff2c091ac 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java @@ -191,8 +191,7 @@ public Object process(@NotNull List items, @Nullable Object previous) { // } - spannableString = new SpannableString(Emoji.replaceEmoji(spannableString, - new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG).getFontMetricsInt(), Screen.dp(20), true)); + spannableString = new SpannableString(Emoji.replaceEmoji(spannableString, new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG).getFontMetricsInt(), Screen.dp(20), false)); hasSpannable = true; updatedTexts.put(msg.getRid(), updatedCounter); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java index 1c80c48f03..ffa27f35bd 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java @@ -12,6 +12,7 @@ import android.text.Layout; import android.text.Spannable; import android.text.SpannableStringBuilder; +import android.text.StaticLayout; import android.text.TextPaint; import android.text.style.ForegroundColorSpan; import android.util.AttributeSet; @@ -397,7 +398,7 @@ public void onDownloaded(FileSystemReference reference) { if (arg.getPeer().getPeerType() == PeerType.GROUP) { if (messenger().getFormatter().isLargeDialogMessage(arg.getMessageType())) { - res.setTextLayout(singleLineText(handleEmoji(contentText), textActivePaint, maxWidth)); + res.setTextLayout(singleLineText(Emoji.replaceEmoji(contentText, textActivePaint.getFontMetricsInt(), Screen.dp(17), false), textActivePaint, maxWidth)); } else { String senderName = messenger().getFormatter().formatPerformerName(arg.getSenderId()) + ": "; if (arg.getMessageType() == ContentType.TEXT) { @@ -407,15 +408,16 @@ public void onDownloaded(FileSystemReference reference) { builder.append(contentText); res.setTextLayout(singleLineText(builder, textPaint, maxWidth)); } else { - CharSequence contentResult = handleEmoji(senderName, contentText); + CharSequence contentResult = new StringBuilder(Emoji.replaceEmoji(senderName, textActivePaint.getFontMetricsInt(), Screen.dp(17), false)) + .append(Emoji.replaceEmoji(contentText, textActivePaint.getFontMetricsInt(), Screen.dp(17), false)); res.setTextLayout(singleLineText(contentResult, textActivePaint, maxWidth)); } } } else { if (arg.getMessageType() == ContentType.TEXT) { - res.setTextLayout(singleLineText(handleEmoji(contentText), textPaint, maxWidth)); + res.setTextLayout(singleLineText(Emoji.replaceEmoji(contentText, textPaint.getFontMetricsInt(), Screen.dp(17), false), textPaint, maxWidth)); } else { - res.setTextLayout(singleLineText(handleEmoji(contentText), textActivePaint, maxWidth)); + res.setTextLayout(singleLineText(Emoji.replaceEmoji(contentText, textActivePaint.getFontMetricsInt(), Screen.dp(17), false), textActivePaint, maxWidth)); } } } @@ -440,24 +442,24 @@ public void layoutReady(DialogLayout res) { } } - private CharSequence handleEmoji(CharSequence... args) { - StringBuilder builder = new StringBuilder(); - for (CharSequence seq : args) { -// if (SmileProcessor.containsEmoji(seq)) { -// if (emoji().isLoaded()) { -// builder.append(emoji().processEmojiCompatMutable(seq, SmileProcessor.CONFIGURATION_BUBBLES)); -// } else { -// builder.append(seq); -// } -// builder.append(Emoji.replaceEmoji(seq, textPaint.getFontMetricsInt(), Screen.dp(20), true)); -// } else { -// builder.append(seq); -// } - - builder.append(Emoji.replaceEmoji(seq, textPaint.getFontMetricsInt(), Screen.dp(20), true)); - } - return builder; - } +// private CharSequence handleEmoji(CharSequence... args) { +// StringBuilder builder = new StringBuilder(); +// for (CharSequence seq : args) { +//// if (SmileProcessor.containsEmoji(seq)) { +//// if (emoji().isLoaded()) { +//// builder.append(emoji().processEmojiCompatMutable(seq, SmileProcessor.CONFIGURATION_BUBBLES)); +//// } else { +//// builder.append(seq); +//// } +//// builder.append(Emoji.replaceEmoji(seq, textPaint.getFontMetricsInt(), Screen.dp(20), true)); +//// } else { +//// builder.append(seq); +//// } +// +// builder.append(Emoji.replaceEmoji(seq, textPaint.getFontMetricsInt(), Screen.dp(20), true)); +// } +// return builder; +// } private CharSequence buildShortName(String name) { if (name == null) { @@ -476,7 +478,7 @@ private CharSequence buildShortName(String name) { } } - return handleEmoji(name); + return Emoji.replaceEmoji(name, textPaint.getFontMetricsInt(), Screen.dp(17), false); } private AvatarImage getAvatarImage(Avatar avatar) { diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java index 58120ed30f..e8f4ade12f 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java @@ -101,21 +101,6 @@ private static void loadEmoji(final int page, final int page2) { scale = 2.0f; } - /*String q = ""; - for (int a = 0; a < EmojiData.data.length; a++) { - String arr[] = EmojiData.data[a]; - for (int b = 0; b < arr.length; b++) { - String emoji = arr[b]; - for (int c = 0; c < emoji.length(); c++) { - if (emoji.charAt(c) == '\ufe0f') { - q += String.format("0x%x, ", (int) emoji.charAt(0)); - break; - } - } - } - } - FileLog.e("tmessages", q);*/ - String imageName; File imageFile; @@ -463,7 +448,7 @@ public static CharSequence replaceEmoji(CharSequence cs, Paint.FontMetricsInt fo } } } catch (Exception e) { - //FileLog.e("tmessages", e); + Log.e(Emoji.class.getName(), e); return cs; } return s; diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java index 62f04c2b36..7a15bb7c2b 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java @@ -44,8 +44,7 @@ import im.actor.sdk.view.emoji.keyboard.emoji.smiles.SmilePagerAdapter; import im.actor.sdk.view.emoji.smiles.SmilesPack; -public class EmojiKeyboard2 extends BaseKeyboard2 implements OnSmileClickListener, - OnBackspaceClickListener { +public class EmojiKeyboard2 extends BaseKeyboard2 { private static final String TAG = "EmojiKeyboard"; private OnStickerClickListener onStickerClickListener; @@ -123,16 +122,6 @@ void animateView(View view) { .start(); } - @Override - public void onBackspaceClick(View v) { - - } - - @Override - public void onEmojiClicked(String smile) { - - } - public OnStickerClickListener getOnStickerClickListener() { return onStickerClickListener; } From de0ec1bb212e1fbb0f88caf6aaf6a67eb657f0a5 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 12 Jan 2017 10:02:59 -0200 Subject: [PATCH 207/253] alteracoes --- .../messages/content/TextHolder.java | 7 +- .../preprocessor/ChatListProcessor.java | 6 +- .../controllers/dialogs/view/DialogView.java | 1 - .../view/emoji/keyboard/BaseKeyboard2.java | 368 ------------------ .../sdk/view/emoji/keyboard/emoji/Emoji.java | 138 +++++-- .../emoji/keyboard/emoji/EmojiKeyboard2.java | 18 +- .../view/emoji/keyboard/emoji/EmojiView.java | 1 - 7 files changed, 120 insertions(+), 419 deletions(-) delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/BaseKeyboard2.java diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java index 10b23d7760..ae44291eef 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java @@ -1,7 +1,9 @@ package im.actor.sdk.controllers.conversation.messages.content; +import android.graphics.Paint; import android.text.Spannable; import android.text.SpannableStringBuilder; +import android.text.TextPaint; import android.text.method.LinkMovementMethod; import android.view.MotionEvent; import android.view.View; @@ -28,6 +30,7 @@ public class TextHolder extends MessageHolder { protected ViewGroup mainContainer; protected FrameLayout messageBubble; protected TextView text; + protected TextView time; protected TintImageView status; @@ -67,9 +70,9 @@ protected void bindData(final Message message, long readDate, long receiveDate, Spannable reactions = preprocessedData.getReactionsSpannable(); CharSequence text; if (textData.getSpannableString() != null) { - text = Emoji.replaceEmoji(textData.getSpannableString(), this.text.getPaint().getFontMetricsInt(), Screen.dp(20), false); + text = Emoji.replaceEmoji(textData.getSpannableString(), this.text.getPaint().getFontMetricsInt(), Screen.sp(40), false); } else { - text = Emoji.replaceEmoji(new SpannableStringBuilder(textData.getText()), this.text.getPaint().getFontMetricsInt(), Screen.dp(20), false); + text = Emoji.replaceEmoji(new SpannableStringBuilder(textData.getText()), this.text.getPaint().getFontMetricsInt(), Screen.sp(40), false); } bindRawText(text, readDate, receiveDate, reactions, message, false); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java index fff2c091ac..3495e9a52b 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java @@ -134,7 +134,7 @@ public Object process(@NotNull List items, @Nullable Object previous) { boolean hasSpannable = false; // Wait Emoji to load - //emoji().waitForEmoji(); + // Emoji.waitForEmoji(); // Process markdown Spannable markdown = AndroidMarkdown.processText(text.getText()); @@ -191,8 +191,8 @@ public Object process(@NotNull List items, @Nullable Object previous) { // } - spannableString = new SpannableString(Emoji.replaceEmoji(spannableString, new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG).getFontMetricsInt(), Screen.dp(20), false)); - hasSpannable = true; +// spannableString = new SpannableString(Emoji.replaceEmoji(spannableString+"ffff", new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG).getFontMetricsInt(), Screen.dp(20), false)); +// hasSpannable = true; updatedTexts.put(msg.getRid(), updatedCounter); preprocessedTexts.put(msg.getRid(), new PreprocessedTextData(reactions, text.getText(), diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java index ffa27f35bd..e4b18558fb 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java @@ -477,7 +477,6 @@ private CharSequence buildShortName(String name) { } } } - return Emoji.replaceEmoji(name, textPaint.getFontMetricsInt(), Screen.dp(17), false); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/BaseKeyboard2.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/BaseKeyboard2.java deleted file mode 100644 index f4e3d5b200..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/BaseKeyboard2.java +++ /dev/null @@ -1,368 +0,0 @@ -package im.actor.sdk.view.emoji.keyboard; - -import android.app.Activity; -import android.content.Context; -import android.graphics.PixelFormat; -import android.graphics.Rect; -import android.os.Build; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewTreeObserver; -import android.view.WindowManager; -import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; -import android.widget.FrameLayout; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import java.lang.reflect.Field; - -import im.actor.runtime.Log; -import im.actor.sdk.R; -import im.actor.sdk.controllers.conversation.KeyboardLayout; -import im.actor.sdk.util.KeyboardHelper; -import im.actor.sdk.util.Screen; - -public class BaseKeyboard2 implements - ViewTreeObserver.OnGlobalLayoutListener { - - - private static final String TAG = "BaseKeyboard"; - protected Activity activity; - private View decorView; - private boolean softKeyboardListeningEnabled = true; - private boolean showRequested = false; - private boolean emojiKeyboardIsOpening; - private InputMethodManager inputMethodManager; - private View emojiKeyboardView; - protected EditText messageBody; - protected KeyboardLayout root; - protected RelativeLayout container; - public static final int OVERLAY_PERMISSION_REQ_CODE = 735; - - Boolean pendingOpen = false; - - protected KeyboardStatusListener keyboardStatusListener; - - final WindowManager windowManager; - int keyboardHeight; - private boolean showingPending; - - private boolean showing = false; - // private boolean dismissed; - private boolean softwareKeyboardShowing; - private KeyboardHelper keyboardHelper; - private boolean keyboardMeasured = false; - private int keyboardTriggerHeight = Screen.dp(150); - - public BaseKeyboard2(Activity activity, EditText messageBody) { - this.activity = activity; - this.windowManager = activity.getWindowManager(); - this.inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); - this.decorView = activity.getWindow().getDecorView(); - decorView.getViewTreeObserver().addOnGlobalLayoutListener(this); - //setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); - //default size - keyboardHeight = (int) activity.getResources().getDimension(R.dimen.keyboard_height); - keyboardHelper = new KeyboardHelper(activity); - this.messageBody = messageBody; - - messageBody.setOnClickListener(view -> { - if (showing) { - dismiss(); - } - }); - messageBody.setOnFocusChangeListener((view, b) -> { - if (b && showing) { - dismiss(); - } - }); - - } - - - public int getHeight() { - return keyboardHeight; - } - - public void setKeyboardStatusListener(KeyboardStatusListener keyboardStatusListener) { - this.keyboardStatusListener = keyboardStatusListener; - } - - - public void show() { - if (isShowing()) { - return; - } - - softKeyboardListeningEnabled = true; - this.root = (KeyboardLayout) messageBody.getRootView().findViewById(R.id.container).getParent(); - this.container = (RelativeLayout) messageBody.getRootView().findViewById(R.id.container); - - root.showInternal(keyboardHeight); - showRequested = true; - if (softwareKeyboardShowing) { - keyboardHelper.setImeVisibility(messageBody, false); - } else { -// messageBody.setFocusableInTouchMode(true); -// messageBody.requestFocus(); -// inputMethodManager.showSoftInput(messageBody, InputMethodManager.SHOW_IMPLICIT); - container.setPadding(0, 0, 0, keyboardHeight); - showInternal(); - } - - } - - protected void showInternal() { - if (isShowing()) { - return; - } - - showRequested = false; - showing = true; - - emojiKeyboardView = createView(); - FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, keyboardHeight); - params.gravity = Gravity.BOTTOM; - root.addView(emojiKeyboardView, params); - - if (keyboardStatusListener != null) { - keyboardStatusListener.onShow(); - } - onShow(); - } - - private void update() { - if (emojiKeyboardView != null) { - WindowManager.LayoutParams params = new WindowManager.LayoutParams( - WindowManager.LayoutParams.MATCH_PARENT, - (keyboardHeight), - WindowManager.LayoutParams.TYPE_PHONE, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, - PixelFormat.TRANSLUCENT); - params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; - windowManager.updateViewLayout(emojiKeyboardView, params); - } else { - - } - } - - public void dismiss() { - dismissInternally(false); - } - - public void dismiss(boolean dismissAll) { - dismissInternally(dismissAll); - } - - private void dismissInternally(boolean dismissAll) { - showing = false; - if (messageBody != null) { - if (dismissAll) { - keyboardHelper.setImeVisibility(messageBody, false); - } else if (!softwareKeyboardShowing) { - keyboardHelper.setImeVisibility(messageBody, true); - } - } - if (root != null) { - root.dismissInternal(); - } - if (emojiKeyboardView != null && root != null && keyboardHelper != null) { - final View emojiKeyboardViewCopy = emojiKeyboardView; -// emojiKeyboardView -// .animate() -// .y(140) -// .alpha(0.2f) -// .setDuration(200) -// .setStartDelay(0) -// .setInterpolator(new AccelerateInterpolator(1.5f)) -// .setListener(new AnimatorListenerAdapter() { -// @Override -// public void onAnimationEnd(Animator animation) { -// emojiKeyboardViewCopy.setVisibility(View.GONE); -// windowManager.removeView(emojiKeyboardViewCopy); -// } -// }) -// .start(); - emojiKeyboardViewCopy.setVisibility(View.GONE); - root.removeView(emojiKeyboardViewCopy); - emojiKeyboardView = null; - if (keyboardStatusListener != null) { - keyboardStatusListener.onDismiss(); - } - if (dismissAll) { - container.setPadding(0, 0, 0, 0); - } - onDismiss(); - } - } - - - public void toggle() { - if (isShowing()) { - dismiss(); - } else { - show(); - } - } - - public boolean isShowing() { - return showing && emojiKeyboardView != null; - } - - - public void destroy() { - dismiss(true); - - if (keyboardStatusListener != null) { - keyboardStatusListener.onDismiss(); - } - } - - @Override - public void onGlobalLayout() { - - Log.d(TAG, "onGlobalLayout"); - if (!softKeyboardListeningEnabled) { - return; - } - Rect r = new Rect(); - messageBody.getWindowVisibleDisplayFrame(r); - - int screenHeight = messageBody.getRootView() - .getHeight(); - - -// int widthDiff = decorView.getRootView().getWidth() - (r.right - r.left); -// if (Math.abs(widthDiff) > 0) { -// return; -// } - int resourceId = activity.getResources() - .getIdentifier("status_bar_height", - "dimen", "android"); - int statusBarHeight = 0; - - if (resourceId > 0) { - statusBarHeight = activity.getResources() - .getDimensionPixelSize(resourceId); - screenHeight -= statusBarHeight; - } - - - screenHeight -= getViewInset(root, statusBarHeight); - - int heightDifference = screenHeight - (r.bottom - r.top); - - boolean changed = softwareKeyboardShowing; - - if (heightDifference > keyboardTriggerHeight) { - - softwareKeyboardShowing = true; - - Log.d(TAG, "onGlobalLayout: " + heightDifference); - - keyboardHeight = heightDifference; - - dismiss(); - - } else { - - softwareKeyboardShowing = false; - - if (showRequested) { - root.showInternal(keyboardHeight); - showInternal(); - } else if (changed) { - if (root != null) { - root.dismissInternal(); - } - } - Log.d(TAG, "onGlobalLayout: " + heightDifference); - Log.d(TAG, "onGlobalLayout: " + "dismiss?"); - // dismiss not wirk -// softwareKeyboardShowing = false; - // keyboard showing or not? -// dismissed = true; -// dismissInternally(); - } - - changed = changed != softwareKeyboardShowing; - Log.d(TAG, "keyboard state change: " + changed); - - // FIXME verify root view applied new padding after keyboard state change - // workaround for [some of android versions] bug, when keyboard closing not causing relayout, or causing it with delay - if (changed && root != null) { - - root.postDelayed(() -> { - if (!root.isSync()) { - root.requestLayout(); - } - }, 30); - } - - - - } - - public Activity getActivity() { - return activity; - } - - protected void onDismiss() { - // override it - } - - protected void onShow() { - // override it - } - - protected View createView() { - TextView view = new TextView(activity); - view.setText("Example of keyboard"); - view.setGravity(Gravity.CENTER); - view.setBackgroundColor(0xffdadddf); - - return view; - } - - public void onConfigurationChange() { -// dismiss(true); -// softwareKeyboardShowing = false; - } - - public boolean onBackPressed() { - if (showing) { - dismiss(true); - return true; - } - return false; - } - - public static int getViewInset(View view, int statusBarHeight) { - if (view == null || view.getRootView() == null) { - return 0; - } - - view = view.getRootView(); - - if (Build.VERSION.SDK_INT < 21 || view.getHeight() == Screen.getHeight() || view.getHeight() == Screen.getHeight() - statusBarHeight) { - return 0; - } - - try { - Field mAttachInfoField = View.class.getDeclaredField("mAttachInfo"); - mAttachInfoField.setAccessible(true); - Object mAttachInfo = mAttachInfoField.get(view); - if (mAttachInfo != null) { - Field mStableInsetsField = mAttachInfo.getClass().getDeclaredField("mStableInsets"); - mStableInsetsField.setAccessible(true); - Rect insets = (Rect) mStableInsetsField.get(mAttachInfo); - return insets.bottom; - } - } catch (Exception e) { - e.printStackTrace(); - } - return 0; - } -} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java index e8f4ade12f..21ae720cb7 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java @@ -8,7 +8,10 @@ import java.io.File; import java.io.InputStream; import java.util.HashMap; +import java.util.Iterator; import java.util.Locale; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -19,6 +22,9 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.os.Process; import android.text.Spannable; import android.text.Spanned; import android.text.TextPaint; @@ -33,8 +39,12 @@ import im.actor.sdk.util.AndroidUtils; import im.actor.sdk.util.Screen; import im.actor.sdk.util.Utilities; +import im.actor.sdk.view.emoji.keyboard.emoji.smiles.SmilesListener; public class Emoji { + + private static final String TAG = Emoji.class.getName(); + private static HashMap rects = new HashMap<>(); private static int drawImgSize; private static int bigImgSize; @@ -44,6 +54,12 @@ public class Emoji { private static Bitmap emojiBmp[][] = new Bitmap[5][splitCount]; private static boolean loadingEmoji[][] = new boolean[5][splitCount]; + private static boolean isLoading = false; + private static boolean isLoaded = false; + + private static CopyOnWriteArrayList listeners = new CopyOnWriteArrayList(); + private static Handler handler = new Handler(Looper.getMainLooper()); + private static final int[][] cols = { {12, 12, 12, 12}, {6, 6, 6, 6}, @@ -82,9 +98,85 @@ public class Emoji { } placeholderPaint = new Paint(); placeholderPaint.setColor(0x00000000); + + loadAllEmojis(); + } + + public static void loadAllEmojis(){ + + if (isLoaded) { + return; + } + if (isLoading) { + return; + } + + isLoading = true; + + new Thread() { + @Override + public void run() { + Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST); + + long start = System.currentTimeMillis(); + Log.d(TAG, "emoji loading start"); + + Iterator> entry = rects.entrySet().iterator(); + while (entry.hasNext()) { + DrawableInfo info = entry.next().getValue(); + if(!loadingEmoji[info.page][info.page2] + && (emojiBmp[info.page][info.page2] == null)) { + loadEmoji(info.page, info.page2); + } + } + isLoaded = true; + isLoading = false; + + notifyEmojiUpdated(true); + Log.d(TAG, "Emoji loaded in " + (System.currentTimeMillis() - start) + " ms"); + } + }.start(); + } + + public static void waitForEmoji() { + if (isLoaded) { + return; + } + + final Object lock = new Object(); + synchronized (lock) { + listeners.add(new SmilesListener() { + @Override + public void onSmilesUpdated(boolean completed) { + synchronized (lock) { + lock.notify(); + } + + } + }); + try { + lock.wait(); + } catch (InterruptedException e) { + Log.e(Emoji.class.getName(), e); + return; + } + } + } + + private static void notifyEmojiUpdated(final boolean completed) { + handler.post(new Runnable() { + @Override + public void run() { + Log.d(TAG, "notify"); + for (SmilesListener listener : listeners) { + listener.onSmilesUpdated(completed); + } + } + }); } private static void loadEmoji(final int page, final int page2) { + loadingEmoji[page][page2] = true; try { float scale; int imageResize = 1; @@ -125,7 +217,7 @@ private static void loadEmoji(final int page, final int page2) { } } } catch (Exception e) { - //FileLog.e("tmessages", e); + Log.e(Emoji.class.getName(), e); } Bitmap bitmap = null; try { @@ -136,20 +228,15 @@ private static void loadEmoji(final int page, final int page2) { bitmap = BitmapFactory.decodeStream(is, null, opts); is.close(); } catch (Throwable e) { - //FileLog.e("tmessages", e); + Log.e(Emoji.class.getName(), e); } final Bitmap finalBitmap = bitmap; - AndroidUtils.runOnUIThread(new Runnable() { - @Override - public void run() { - emojiBmp[page][page2] = finalBitmap; + emojiBmp[page][page2] = finalBitmap; + loadingEmoji[page][page2] = false; - //NotificationCenter.getInstance().postNotificationName(NotificationCenter.emojiDidLoaded); - } - }); } catch (Throwable x) { - //FileLog.e("tmessages", "Error loading emoji", x); + Log.e(Emoji.class.getName(), x); } } @@ -243,25 +330,24 @@ public Rect getDrawRect() { @Override public void draw(Canvas canvas) { - /*if (MessagesController.getInstance().useSystemEmoji) { - //textPaint.setTextSize(getBounds().width()); - canvas.drawText(EmojiData.data[info.page][info.emojiIndex], getBounds().left, getBounds().bottom, textPaint); - return; - }*/ if (emojiBmp[info.page][info.page2] == null) { if (loadingEmoji[info.page][info.page2]) { return; } - loadingEmoji[info.page][info.page2] = true; - Utilities.globalQueue.postRunnable(new Runnable() { - @Override - public void run() { - loadEmoji(info.page, info.page2); - loadingEmoji[info.page][info.page2] = false; - } - }); - canvas.drawRect(getBounds(), placeholderPaint); - return; +// loadingEmoji[info.page][info.page2] = true; +// Utilities.globalQueue.postRunnable(new Runnable() { +// @Override +// public void run() { +// // loadEmoji(info.page, info.page2); +// loadingEmoji[info.page][info.page2] = false; +// } +// }); + + //canvas.drawRect(getBounds(), placeholderPaint); + //return; + + loadEmoji(info.page, info.page2); +// loadingEmoji[info.page][info.page2] = false; } Rect b; @@ -271,9 +357,7 @@ public void run() { b = getBounds(); } - //if (!canvas.quickReject(b.left, b.top, b.right, b.bottom, Canvas.EdgeType.AA)) { canvas.drawBitmap(emojiBmp[info.page][info.page2], info.rect, b, paint); - //} } @Override diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java index 7a15bb7c2b..b460481768 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java @@ -16,35 +16,20 @@ package im.actor.sdk.view.emoji.keyboard.emoji; -import android.animation.ObjectAnimator; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; -import android.support.v4.view.ViewPager; import android.view.KeyEvent; -import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnClickListener; import android.widget.EditText; -import android.widget.FrameLayout; -import android.widget.LinearLayout; -import im.actor.core.entity.Sticker; import im.actor.sdk.ActorSDK; -import im.actor.sdk.R; import im.actor.sdk.util.Screen; import im.actor.sdk.view.MaterialInterpolator; -import im.actor.sdk.view.PagerSlidingTabStrip; import im.actor.sdk.view.emoji.SmileProcessor; import im.actor.sdk.view.emoji.keyboard.BaseKeyboard; -import im.actor.sdk.view.emoji.keyboard.BaseKeyboard2; -import im.actor.sdk.view.emoji.keyboard.emoji.smiles.OnBackspaceClickListener; -import im.actor.sdk.view.emoji.keyboard.emoji.smiles.OnSmileClickListener; -import im.actor.sdk.view.emoji.keyboard.emoji.smiles.RepeatListener; -import im.actor.sdk.view.emoji.keyboard.emoji.smiles.SmilePagerAdapter; -import im.actor.sdk.view.emoji.smiles.SmilesPack; -public class EmojiKeyboard2 extends BaseKeyboard2 { +public class EmojiKeyboard2 extends BaseKeyboard { private static final String TAG = "EmojiKeyboard"; private OnStickerClickListener onStickerClickListener; @@ -59,7 +44,6 @@ public EmojiKeyboard2(Activity activity, EditText messageBody) { @Override protected View createView() { - EmojiView emojiView = new EmojiView(getActivity()); emojiView.setVisibility(View.VISIBLE); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java index a894b5c806..de95c9c2b8 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java @@ -1005,7 +1005,6 @@ protected void onDetachedFromWindow() { } } - private class EmojiGridAdapter extends BaseAdapter { private int emojiPage; From 1b4dcdf5df99d761f2a6341c8e111c66083616f3 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 12 Jan 2017 11:22:58 -0200 Subject: [PATCH 208/253] alteracoes --- .../view/emoji/keyboard/emoji/EmojiView.java | 25 +------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java index de95c9c2b8..70135581dd 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java @@ -61,8 +61,6 @@ public class EmojiView extends FrameLayout { public interface Listener { boolean onBackspace(); void onEmojiSelected(String emoji); - //void onStickersSettingsClick(); - //void onGifTab(boolean opened); void onClearEmojiRecent(); } @@ -497,7 +495,6 @@ protected void onDraw(Canvas canvas) { private static HashMap emojiColor = new HashMap<>(); private ArrayList recentEmoji = new ArrayList<>(); - private Drawable dotDrawable; private int[] icons = { @@ -515,22 +512,9 @@ protected void onDraw(Canvas canvas) { private ArrayList views = new ArrayList<>(); private ArrayList emojiGrids = new ArrayList<>(); private ImageView backspaceButton; -// private StickersGridAdapter stickersGridAdapter; private LinearLayout emojiTab; -// private ScrollSlidingTabStrip stickersTab; -// private RecyclerListView stickersGridView; -// private GridLayoutManager stickersLayoutManager; private TextView stickersEmptyView; -// private RecyclerListView gifsGridView; -// private ExtendedGridLayoutManager flowLayoutManager; -// private GifsAdapter gifsAdapter; -// private RecyclerListView trendingGridView; -// private GridLayoutManager trendingLayoutManager; -// private TrendingGridAdapter trendingGridAdapter; -// private RecyclerListView.OnItemClickListener stickersOnItemClickListener; private PagerSlidingTabStrip2 pagerSlidingTabStrip; - - private boolean trendingLoaded; private int currentPage; @@ -540,11 +524,7 @@ protected void onDraw(Canvas canvas) { private int popupHeight; private int emojiSize; private int location[] = new int[2]; - private int stickersTabOffset; - private int recentTabBum = -2; - private int gifTabNum = -2; - private int trendingTabNum = -2; - private boolean switchToGifTab; + private boolean isLayout; private int currentBackgroundType = -1; @@ -1115,12 +1095,9 @@ public void unregisterDataSetObserver(DataSetObserver observer) { } private class Holder extends RecyclerView.ViewHolder { - public Holder(View itemView) { super(itemView); } } - - } From 2c8a4bd1456e54dd6e8ac8a28ef75b49041f6816 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Fri, 13 Jan 2017 11:18:19 -0200 Subject: [PATCH 209/253] emji fixes --- .../controllers/dialogs/view/DialogView.java | 2 +- .../emoji/keyboard/emoji/EmojiKeyboard.java | 13 --- .../emoji/keyboard/emoji/EmojiKeyboard2.java | 2 +- .../view/emoji/keyboard/emoji/EmojiView.java | 80 +++++++++++++++++-- .../emoji/smiles/SmilePagerAdapter.java | 2 +- .../view/emoji/stickers/StickersAdapter.java | 5 +- .../sdk/view/emoji/stickers/StickersView.java | 8 +- .../main/res/layout/emoji_smiles_pager.xml | 8 +- .../android-sdk/src/main/res/values/ids.xml | 4 + 9 files changed, 89 insertions(+), 35 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java index e4b18558fb..9bed837a43 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java @@ -477,7 +477,7 @@ private CharSequence buildShortName(String name) { } } } - return Emoji.replaceEmoji(name, textPaint.getFontMetricsInt(), Screen.dp(17), false); + return Emoji.replaceEmoji(name, textPaint.getFontMetricsInt(), Screen.dp(20), false); } private AvatarImage getAvatarImage(Avatar avatar) { diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java index ccfb642faf..f65677f0f8 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java @@ -168,19 +168,6 @@ public void onPageScrollStateChanged(int state) { } }); - //emojiPagerIndicator.setLayoutParams(new RelativeLayout.LayoutParams(Screen.dp(58 * mEmojisAdapter.getCount()), Screen.dp(48))); -// emojiPager.postDelayed(new Runnable() { -// @Override -// public void run() { -// emojiPager.setAlpha(0f); -// emojiPagerIndicator.setAlpha(0f); -// animateView(emojiPager); -// animateView(emojiPagerIndicator); -// emojiPager.setAdapter(mEmojisAdapter); -// emojiPagerIndicator.setViewPager(emojiPager); -// } -// }, BINDING_DELAY); - if (SmilesPack.getRecent().size() == 0) { emojiPager.setCurrentItem(1); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java index b460481768..dbf0221cf6 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java @@ -44,7 +44,7 @@ public EmojiKeyboard2(Activity activity, EditText messageBody) { @Override protected View createView() { - EmojiView emojiView = new EmojiView(getActivity()); + EmojiView emojiView = new EmojiView(true, getActivity()); emojiView.setVisibility(View.VISIBLE); emojiView.setListener(new EmojiView.Listener() { diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java index 70135581dd..4fe727f291 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java @@ -1,5 +1,6 @@ package im.actor.sdk.view.emoji.keyboard.emoji; +import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; @@ -40,6 +41,7 @@ import java.util.Comparator; import java.util.HashMap; +import im.actor.core.entity.Sticker; import im.actor.runtime.Log; import im.actor.sdk.R; import im.actor.sdk.util.AndroidUtils; @@ -49,6 +51,7 @@ import im.actor.sdk.view.PagerSlidingTabStrip; import im.actor.sdk.view.PagerSlidingTabStrip2; import im.actor.sdk.view.emoji.EmojiData; +import im.actor.sdk.view.emoji.stickers.StickersView; /** * Created by 98379720172 on 03/01/17. @@ -508,12 +511,16 @@ protected void onDraw(Canvas canvas) { private Listener listener; private ViewPager pager; - private FrameLayout stickersWrap; + + private LinearLayout stickerIndicatorContainer; + private LinearLayout stickerSwitchContainer; + private StickersView stickersView; + private ArrayList views = new ArrayList<>(); private ArrayList emojiGrids = new ArrayList<>(); private ImageView backspaceButton; private LinearLayout emojiTab; - private TextView stickersEmptyView; + private PagerSlidingTabStrip2 pagerSlidingTabStrip; private int currentPage; @@ -538,7 +545,7 @@ protected void onDraw(Canvas canvas) { private int minusDy; - public EmojiView(final Context context) { + public EmojiView(boolean needStickers, final Context context) { super(context); @@ -573,6 +580,52 @@ public void getOutline(View view, Outline outline) { views.add(frameLayout); } + if(needStickers){ + + stickerIndicatorContainer = new LinearLayout(context); + //stickersWrap.setVisibility(View.INVISIBLE); + stickerIndicatorContainer.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, Screen.dp(48))); + stickerIndicatorContainer.setOrientation(LinearLayout.HORIZONTAL); + stickerIndicatorContainer.setId(R.id.sticker_indicator_container); + + ImageView backToSmiles = new ImageView(context); + backToSmiles.setId(R.id.back_to_smiles); + backToSmiles.setPadding(Screen.dp(8),Screen.dp(8),Screen.dp(8),Screen.dp(8)); + backToSmiles.setLayoutParams(new ViewGroup.LayoutParams(Screen.dp(48), Screen.dp(48))); + backToSmiles.setImageResource(R.drawable.ic_smiles_smile); + + backToSmiles.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + pager.setCurrentItem(5); +// +// ObjectAnimator oa = ObjectAnimator.ofFloat(indicatorContainer, "translationX", 0, 0); +// oa.setDuration(0); +// oa.start(); +// if (stickerIndicatorContainer.getVisibility() == View.INVISIBLE) { +// stickerIndicatorContainer.setVisibility(View.VISIBLE); +// } +// ObjectAnimator oas = ObjectAnimator.ofFloat(stickerIndicatorContainer, "translationX", Screen.getWidth(), Screen.getWidth()); +// oas.setDuration(0); +// oas.start(); +// +// emojiPager.setCurrentItem(1, true); + + } + }); + + stickerIndicatorContainer.addView(backToSmiles); + + stickerSwitchContainer = new LinearLayout(getContext()); + stickerSwitchContainer.setId(R.id.sticker_switch_container); + stickerSwitchContainer.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)); + + stickerIndicatorContainer.addView(stickerSwitchContainer); + + // stickersWrap.addView(new StickersView()); + + views.add(stickerIndicatorContainer); + } pager = new ViewPager(context) { @@ -1041,12 +1094,26 @@ public void unregisterDataSetObserver(DataSetObserver observer) { } } + + public void onStickerClicked(Sticker sticker) { + + } + + + public LinearLayout getStickerIndicatorContainer() { + return stickerIndicatorContainer; + } + + public LinearLayout getStickerSwitchContainer() { + return stickerSwitchContainer; + } + private class EmojiPagesAdapter extends PagerAdapter implements PagerSlidingTabStrip2.IconTabProvider { public void destroyItem(ViewGroup viewGroup, int position, Object object) { View view; if (position == 6) { - view = stickersWrap; + view = stickerIndicatorContainer; } else { view = views.get(position); } @@ -1074,7 +1141,10 @@ public void customOnDraw(Canvas canvas, int position) { public Object instantiateItem(ViewGroup viewGroup, int position) { View view; if (position == 6) { - view = stickersWrap; + if (stickersView == null) { + stickersView = new StickersView(getContext(), EmojiView.this); + } + view = stickerIndicatorContainer; } else { view = views.get(position); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/SmilePagerAdapter.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/SmilePagerAdapter.java index ae383901ec..3aa3bbc0f2 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/SmilePagerAdapter.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/SmilePagerAdapter.java @@ -137,7 +137,7 @@ public void onRecentChange() { } else { if (stickersView == null) { - stickersView = new StickersView(container.getContext(), emojiKeyboard); + //stickersView = new StickersView(container.getContext(), emojiKeyboard); } itemView = stickersView; } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/stickers/StickersAdapter.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/stickers/StickersAdapter.java index 3ae96dd41e..6ca2a4881c 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/stickers/StickersAdapter.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/stickers/StickersAdapter.java @@ -17,13 +17,14 @@ import im.actor.sdk.controllers.ActorBinder; import im.actor.sdk.util.Screen; import im.actor.sdk.view.emoji.keyboard.emoji.EmojiKeyboard; +import im.actor.sdk.view.emoji.keyboard.emoji.EmojiView; import static im.actor.sdk.util.ActorSDKMessenger.messenger; public class StickersAdapter extends RecyclerView.Adapter { private ArrayList stickers = new ArrayList<>(); - private EmojiKeyboard keyboard; + private EmojiView keyboard; private PacksAdapter packsAdapter; private RecyclerView recyclerView; private ActorBinder binder; @@ -31,7 +32,7 @@ public class StickersAdapter extends RecyclerView.Adapter - + diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/ids.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/ids.xml index 126145cee3..4b44520661 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/ids.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/ids.xml @@ -9,4 +9,8 @@ + + + + \ No newline at end of file From 128f92d3334d2558b92626c8370fe82cf8ef1ed0 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sun, 15 Jan 2017 13:41:07 -0200 Subject: [PATCH 210/253] stickers fixing --- .../src/main/assets/emoji_a_15.jpg | Bin 346120 -> 0 bytes .../android-sdk/src/main/assets/emoji_a_2.jpg | Bin 527335 -> 0 bytes .../src/main/assets/emoji_c_15.jpg | Bin 555687 -> 0 bytes .../android-sdk/src/main/assets/emoji_c_2.jpg | Bin 973008 -> 0 bytes .../src/main/java/im/actor/sdk/ActorSDK.java | 7 - .../inputbar/InputBarFragment.java | 13 +- .../preprocessor/ChatListProcessor.java | 5 - .../controllers/dialogs/view/DialogView.java | 2 - .../actor/sdk/view/PagerSlidingTabStrip.java | 475 ++------- .../actor/sdk/view/PagerSlidingTabStrip2.java | 336 ------- .../actor/sdk/view/emoji/SmileProcessor.java | 908 ------------------ .../emoji/keyboard/emoji/EmojiKeyboard.java | 183 +--- .../emoji/keyboard/emoji/EmojiKeyboard2.java | 116 --- .../view/emoji/keyboard/emoji/EmojiView.java | 60 +- .../emoji/smiles/SmilePagerAdapter.java | 209 ---- .../sdk/view/emoji/smiles/SmilesPackView.java | 160 --- .../view/emoji/stickers/StickersAdapter.java | 1 - .../sdk/view/emoji/stickers/StickersView.java | 7 +- .../src/main/res/layout/emoji_keyboard.xml | 29 - .../src/main/res/layout/emoji_smiles_page.xml | 27 - .../main/res/layout/emoji_smiles_pager.xml | 69 -- .../android-sdk/src/main/res/values/attrs.xml | 13 - 22 files changed, 171 insertions(+), 2449 deletions(-) delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji_a_15.jpg delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji_a_2.jpg delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji_c_15.jpg delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji_c_2.jpg delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/PagerSlidingTabStrip2.java delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/SmileProcessor.java delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/SmilePagerAdapter.java delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesPackView.java delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/emoji_keyboard.xml delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/emoji_smiles_page.xml delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/emoji_smiles_pager.xml diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji_a_15.jpg b/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji_a_15.jpg deleted file mode 100644 index b9d2d15822e7b409041f4c074b6a61676b7dfe11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346120 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 o=*gCX(l=d zC5?sL=3g0Ie5vK9h{mfr4g_;r6@Hz>4u>_#%&x?lO{Jx1cJ!yIPZiRMCE>*45<@@) zQFv&+o+L(D^IV=l#-sg?%uw~}DJF?dx0hsw0MSMDA^LMr5wiT9;oca<@|Iu~6!>fE zSIfs-bx8#9N*FeZM%%gkLgVT^dCZefYsT4#GffdQDhzkZg3-sk{y%1lt}k~I_S#iI zJC7QO<5*Mw0Ak*nB8pO*w7qEoiy8;;-cycZ$8 z%-H0xCioMLx3`ul7V>{oRLtsr5Tnaa+uZc4g=&J*ax_vF+|RR?{{Yo;9#TEuCu9Er zDW@NJ9h(ArE1Bc+ysh$g1GJI~HzMUEfAO7<{HB{13EZszW&Z#xt}d;H+v(|{SPpBHn3R@P`8yvLrGM7@w4EZgO6oeA zcr2RV>FQ}(NppOqoxc(JD-q-NOQlgJrEb6Ey{5!=^ON8>wccj)BgjpF-IBMriX>YZ z{a%I{81)Q%wZ+BP$N9f(r{G*?3CM4=b~zjYzX$ka7Vs8N2zM&SkbL4m~SI(NitW%rkZ`53}!wKQcmq5owE_* zV&a-lr`fLNxtlM_SkJh+{H2f;DnLKh`Bu7hkcPB3l8tkA`D8D4Zd&dK)7-)ka~z<0 z3aYfTvhiO(>vh(~1!=`1dxuF%{t-pmz1QO3_K5!Q3SEC^{YvcEzca8{e6Qf$w!6Qj z;iVCU6ndg;{{VBlIh=~-3#`6aVnXc zKl|f&_v$q#Ne46AT49jGB`W>x?Bi{v=5Y~KQBYaiPy|q;{co^p)w{F6$uYY6c022r z+(_fDLtlj!v)+!*n*RW|=Li1)AzOdS=|gybAgjOOaDH>{P#pWaUAV~h{{TIL!cUaA z$mPCFA-uPSD3n^<2~WiwjA})EwGQg>(^8`)b+v5lvels1Qi#CwuG!DqzBkA7_xZeb zM+Dc~n->MVkw`Bm^+in1r{Ms24M&aTrv-M&3q}hYIoSqMt;l&{4bcApvRHZl0PxK^ zE(l8NJDTUWyX+;i7l%8_m5)M2rGmlp-QtEJ@rtvAZ* z!=N4mRCC+5N>_r?S#B@41T=Y;gv@pkZW818$0=#igDbVIiSRWa>pj{>$+U`aPmSh4 zY6dIbOF!7WjjR^ed9G0;R_!d250tT}X`6G@`kiWYMP}9#Mr9Wp)Up5wz%3W~KEhv4 zv)pEROG>Dbf-Nk63}7mc>pXzc;L$LntY{{ZwmANfsp=1(QwpK9Hb~yBd(k#A%nwsV%rAmMPwtKD))BZ=ay;k0W4jjp1pXv>T9sBIvM!!rlW z+Co9Jx=~r6BcLP0a35`H(^H_lEdVxno+#H(rNS5zDnh-Ez(yg~msYvyb?YwFBkh zAJv&hUs_lECAW3yT{h|CjiIf^iTJH2o<}}U2ymxxOU%Y*`!9Ugmyfze6jdD+RCp?n zW~*hCz11r2-rcaUF}VfLZF4oW!dP2tkI;R`NCiHL@%*meU=srq`S_LlwCH+4YUsJ- zmYWF^0%_8nf0Iho7XwNf$z^1_VyjUfzr_8zWzMQt3xi2rQkbml_Ee3A_&uI$_G_Tg z1r_46c31KUeravbnUsYeu9{5OIvZLO+`7m^jVnaJvF=|H;P{zV&UMOWBu{}M>Vdze zmbHbWTC%jMxPOznzpGw-yg@VPI#}~wL1?Vnz{^;Fr zl6avQkX^_s!Ol6xW0+=tiDb5+RrKJ3I_!-rS_<_wJxz7Cu&`yTG&36FNz9c;b#&>S zQoL}kYnkFXmC54@m!`>~dhL;GS{ii}J$h)|Hu&zN(Ek8o;u0onyND@251jxH+ z7kZBn7o|sCWp^)67Z*tZqnv75ay{IYt-bqjY=aJAJQKZ~5$rx~GLW*;y99~5?4cm* zIr3LE(&*j~b{_RSnCV?Yi67nW_d}j7Ws5uQ$Abg#pSN25qi%E}t`sV&?r`h^Ny{vf z$YhZ2X7M_{P!#V9=DDsTnOvqVhpA1H!u8uC*0eP1(Dmu4SN0LzGfVhl4&rYq-zs*v)w}Dhf$TxXYC5=D~Mzn={>1e-HvsK zy5uuUXLPg1N5W$v!TZ#mY&Lf}uz*@y-l{KJHQ+%ViA|KuO?u>YSiPQS?bV?*Q9x1k z*B4Wlx83@h!y6wTcSA({h6lTy=>?&MXZH?45d zC$O$gMUdm0<-5h?qMin;h?IihA8Ppity@`NNlHk^HQxmecp49c)F5n^BoZlDYSr^1 zgH}dL@KHcR?(HL&b5=elNJ?IGA!dXoXKi@TZTUnI;xaQ_S@J12Dz~T>IZ0wy(WweX)`psqF<&Bh%YlH|{{?Ee50OK=|B)G8^tn37JM(h^B1cawI180jP8T-)3MRgJpFPqW%I z7{SQ^k(yIwF?YDj*(~oPG0hq3Jc#yC$S=Eh$K zMil5zgAWm?_i(;Q%UI&a9EjkYh2gHL6$;$(?%H-woN-HRrG^3sZSP|QycLdE+lSZsB9O4W>TVd~JL%f33``&z3KW>`@6)zJh{17~!Q31C97EKSIX|z7e=#Hg zuB-ZKtNR`8vN$qK9B>DLDlC?CX>)QMIHbJ}uT&JM z4HWx)^+mYvA}4g?0ng%3lz$$@IvYxjPQY^FQ?EbTp3Lx$DRGm?;v=|*&N4)o1)fP9 z_zII!N$}Qb_m{HB10;5*;08_YKFrj{#TW$X6bh$ujIK8+nV$0-j*k^&^bpy^Y7{R@ zpLz4v;?5Vv7;D^K?qyX>@aI$t1rw=Br8mTQmSdFWV#Q+P-7EEyR<6j>v@FDb@Et_G zy^h*4_vP^?kWRx3q;&$cd=u$&h~n)cn~>Knl6C#+Jyr!L$y2B4ZDa2Do0*LmdQ9Q@ zy`@iWylv0KQC;`b?`rOCUIoF!330d7imKz@7#^CgJB8~FTPuwZ8WHVEEn)m2AbYX& z<&@&ETxIZc8~i+Dd%*o}BTy>Fpa9{2O*N(4JwzpNieaVaBlunSD6-m6YHmp@O=;9L z=HY)&mpMO9=PP!PhREYg_8BV~6@*uWqa<=83b5K(8h(+ij^pa4Lsqe;sK?RGb`@?o zf~}z22|g@A6{tt-HLIs&8&^X@tFKl_QOxXjv{o(2*l;9d(nNf4Fm~3DVh2 zgPlJq>{fBu#wl7>ls%*GLtMMDID6YrY??v*ClD-f*!aRnCB^XG!fT0W7vg6X=qv4} ztgL-eBOOPNJer*BXx8C_LS}8O5r#ph>DrMz--6`0b={SYPIzAa=Gdj z;7?C3n%r&Mly_}&qX$b(DtPvVNj`Uu?3aSRykC+v5% z5M;ibFjk$oj%)kDjO4Z!(p}%=8Hu)LAivAVtUw!jAa$Xyk<|^it6wedhPPBMG;ikq zucri;ShuHI_<~w?3lWLTcW(oZ%UVT$kC@#0_LHc1-({q(yOjGGLDun96HHXhec!=2 zsO_H?{{W-S{{SheZM7#9+ohuS{p{gC{{UKXU-~@X>FIwak=Oct3d7x;C>8$f__6l? z0JBa0p15rh*B?*uQa3rCH_JOq&T<2W;jmd8A;lXzylgCzQtt0$l`hPG3R9=IQRRNQhRo%>GtCGD0AGD1-0AiMU5ctB=sJxd^&a8`gK`#eL+U6n@a!)be`mG z&A3+)PF2g9aJ;t_$qP&BNfd*9 zz0w2e$iC|M5#}|01nrfz3nO)C_+3XK{XC+h{@!uU4V#JWa(5F9qXJeSL}~}M4_(LY z)h6Y6aRY;cM^ECjJLUcDxekr3>GRLtxjE-+>0ujTiRJGXAF zxbU1GN~iX1@Ll*EG|5k4?m?8*vcFkP2wyZIO>r!Bo-SIUSADvuuBYA77I&vr=|iBSVn393s2B>oZ9A+DGfm(+41(K z86^%WI(4s7mS{p^cHfI*r-3rJ(arNqItv2IK3LQC>J3RfHJ{z@p3~E1DNh$Q5^1s0 z6R9#ck}uChme$u1TfM!_kECXH5sk{ys|5?RejQ|-Xmpa|4;s_&s!4I+mYn|pgv*q* zOpHqx@hJ}ZE+Y(nVn+b_YttrUO)c#N*+I8a;b-xVcdu%}a7BJy{709AN#PTBN^q$bW>W`erucPdRNn`i7L8))uaPYLN88@>}12OGWAK0!Tu!3jkrm}jXqJ!~MZleC>J#q@a z_iMWTA9wLUIco*5zn0ZzS=KT(%AO1e1b;5CVUt@!sY;R+SJ1WLq^4(g{`dk(!XmtjY^P+29{!5VwKdY?70qn+YhH_El8x6TXh_SK)3q^A3*z}(m@Rz+ z9h#PV=otFZ&jd?fkAGE@cHfDAMx@IX25R2r(sYP@934yu;#FSf7&O9ioQ6IzNF$WA z1KAt=N_@@#Qlvsd&;ZA&srP82aya!k z4r<|Hdq2gX#97+<0E>ODri1Z#*RR{-sO0JV6Wc#kD? zk$MvlRw$$_;A*JKOJ?&w5Tfi+by(>EDX@%Fe)`W z3yPl*g(j6R0`-&~!J414dU)%tZADaRJwIvyZAf=CrR98EBgXP(!t|>?-N@_U%UWq5 zte)dw>u2dEpyXFR3kh?Y$j6VhbX%FaM6PHVy@2V9o0h`D_jy8U($voFAb?eb;ytY6 z*h_3zAM^Hx(n<*SO(v6i}?Aj(&T zRIQdHwEUa+ehV3M1gnmoTgHh-$Cb$>0k|&V*1C%&#r?LaUI^9$dy|xmnvl~%2pp1Y zyPN>=jDy|XTtt)Prgyc*!_>tH@G>7G?$*a)-9BZSS`8R6apHRw9_?(wS!;{kfTCSf zS`|c{eYE<1gFl3WHJrYZ2rnbwX>D!>?WVM6X0O{oHH_XpRBh!kM9@ofC+t@iyJ&ND zKZ>v%7lB}S_Z_#z+1tk`fm_wMkr#ZdPsGpD#Oo7#d2xF)q$G|*fb0rmV{AYGm)zUw z_l@!%LwS{o@=R+^7Pj{Bp^wx8h1$N~JzQ=6tDfE_##$eziOz|+cIL=+6GdG)&kn!h zJc3*`?29wTt0Z$JLb^YJq44lJ^gXuymvD(&g?K7^n{yNNlT_FGTay!SlgZuAjMsq2 z7UC4D#Nd&%AI-TG)U8(RKLF(UYXg66Zjst_*)7De!RlAeF(WB) zQe5Z@NxqMDq&(c}ow~>O$XiRhgR5cuR6<;Iet&Z0}Ml%$cJ+9(; z;;Qat45t!!1dzY5y0N>G*5wRyL}<#ugZc;uS8RB2s9cUf_Ua3M8v&QiTs6Kj-L7Uu zF36+?@#2pozqVV8x#R;I8-8GqM)Dv5wxs(t0`fvl20>NdOiY@14&Ev|zucbE z;%jUrw2{dyPSf8yAW^*ZR0Q>+`3)+~gt)lmySEK)FW@jr2q2buQW#LlEQBf|ijq%& z8nAPK6*((sI5ZMX08PFN+F=&^zDEj59RP;br0plEEv&BPz1EG0k=n5v$EkHuw&aRt zR*vTO_X&>1#gWCw^3Up|QbY|CLBfd*7kwRs_{K>HY3$WHHKhU`>0GC68*j zs^M1JOMg=CNWLqQNpR$TA?(#`yUoW_P(B*us%G^a(VI|p8V+5FKgu|cUyoh-SCQ5h zBtvk$QK|3pKJ9BP@8h^_T5;sJdw%B?(`v(y5TNxnST3A(h0a3$-p1K?Pje#0827QK zT_x`gX(u3@iX$U~MrAU4!P=kfjfNij*W!Xm5(~l>pT7dT&-nU*XM5CfX~6JSclH7{ zhcgf`KYz6=bz-U(XhO{hMjgH4mK>f-{9}_IN7D5zCnSi{hJ>{`c#sWzyfs<4-#Xh% zvtcwUZKbf5ql)>;`(4Vor;gxy)8D09Zm`a14IRj&&t&+sLL_R% zL`Pgpw-y|N-Wk&{k(vg&fJawPXcS^={!Xi}Hx7<%_NbQ^C7csF9?3=}B0=^~Rvqf>e0l^1ri+FZ$RI_#DvD(ZcsT82D02MmhVM<9Dcn~_;*YjJmT z6|KBxTZ!FciZ$_OV?YPruDF0IQ_;rfxHY(vtjBNrS;x4&l3rh;UFC`fxVe-DNY9Sg zRfoa{?RcMehO^gK&VELX`qtjZYGgSLQgi!}ZZYlW^%~OAc2teT06oK~)nrvUR*K@{ zJv7#FP`rZ`i_6daJ0)a=W+53}M}hNFC`a15M^;8j;UpCA%Q5hf;2zYA?w4&_h~7nU zX74^C?TW?GA+sQHrNd=D3DP6u*)ok08V3vxL%w(&lzhhijLxIY=O)K7x zc?T4PWis|LBvwf!ym;5XRE=O|XIVswk^ca|s%?J*;5Asu-56`FnM14cp&{ZCluJ zS|=IU?;Lb#_Mq+&V`F{E>}{{%S?t~EJZ{X2SHr17t<&w(xAQtUT;}Exb0K3Y6W5Y` zI`C;Y^p|)%gw|KfM~+K}62d|Jg=nk+uR~M!>WU5KZlxSGj?4;ew*>a8^OnV3;;*E# zy9zEMG<8!@J)fj?)|NQ~+fb!7)eDPDN?D-@n}PC+PCJ-O`K^|BRzj@ZLa09wr@v9I zVsqPpP;a1>;26ydaqm-;@Jr4~$(ti>aTvvBE@rrEq*8qYBN;t5PMv7fUn8kjP3t>A z%quO5Gk+EVP<}ptj`#mBZ10KHcAN0g4W?sq}x`d6rfV9e5+BZQd?;>1zcS1 zZE4cdb$0&%g0F-SNIeMg8i=UqvqBRmjdp%(l(CyRck+^60VH^o1#X%q6++JA(~Px4 zP}R2iY8a+_5u~|+z=A3YQyyAD z7!a?Q5fJlE*jilP!mTXUi6bEZg0jX7r`T$GYt3C~LnRG9J9qd`9X!397LnH-Ihyao zBSlp<%J6r`cM^Uw=X5aKbZYfB?MGVs_7Por9@%m(qGW^d5AjrY&~#)i;lsG6#wy9p zly(@%w-}*m1Z(i9iWRFdC&5$>r&fi)W}u3>M&h}TuMF`Z-jT%58dZJ+u{(AXitugqd}rjjFD6c-3(lJR)Z#sN#HwN z`IIO82V9xBRVA*)EA<&TzUV@=-%s-9Fx{G;FBDQ;2D!MJ+R`Emym6456p=;UBDS(S zunxMQG{6F`Z3}u-J+w{)nR57H1^vFmcWNbjX86Do15{!3xZ{{X8mtw439E;@WG@K-*~ z7ZHL>Jaw^=t*wlS0{lCKYxs8&=jE)X-wBlIt|t;tYOtNdRZnn9&i&7w%yxDxt;M{S zE$hQA&5Xlzk)t-5KmWi<-H&i$q$uxiq5Yc)Pr&R?8hX z%-!KiEtX;J@GGunx5{HCwVoi+%9~_HqXtP0!Igu zMwb>+tvvq#ii#~iT!zro8gmNCSwoA$|MFY)^b>~eo%^=0k zke)gAdzOnpYeRSin667@m9ZDL5(|r0R(PgBKy9R{@dLn(D(>1yAEEviR}`kk*8oAl zu6X$_Hs>n%ad1C~#~-OA6g3KZ16q4^**58;j7nN`9EwoT9Y94wUiY7c!k%mnts_;jJt;M~#D*evWSkx#vlf$tqdojZJ zw0%V#CLf+De~1W2cAKIMPe@bT8WdA^zg+6MI9fi9^4_S1r`+ijwi zuCA`2;0-YBR|gBivL_jgvB+P;l(exiu)KQ7aVUsUS>&Jv$mq@Db(*&H=yd&X=IC+6 zGt16{u}O9GaaTZox>Ll6IbR)zJ8f(V#BMC7ON(z^H^v$=8EQYG${2gbv|GK0&9F6& z(Cl&SB7|V8tZsxvhj^OdkJytP>Fv#?RyN6UzDXsvKGHD%0K)BM^zD;nYcnGwRnG6k z-F$|#_EA4<0yu~@=Z3d3 zXq&u$u-6wCFAUKOD{Et0yW54SQA(9nZkxUS16gg`)UCISIisle`C2{*k8YYt3tZ|3 z=5oW8KGZGD;Nv!P&1ZsuHLL`y+4Y_bBWeG3^I*3FrvHQ~sR#v%7~y6~&GXDm$^9Qqv`zlP!>iWwf%Q+a!Xat_cJk zr^jIHtp4YABW{p!D^s%A8C}#P!r!f0YrM=5*fpviiU49f&xzJ)_X_qqQs?R^U6a2J zeI$x{hN%0rro3jZOL0+oh-^6?Cg%%&5#(iNvXT5!T6`oQFD*#7xiLICxF~m)B6esw z@Kw_8)@xgtZKqwcLhT%j>}51M*0sUF5yg4jj4W|!%r6m3EKaWzl#zO?sUU;yBV8>7 zP^R3_MF^-y))&{gF5Km<<#wK1N#mDulFSg1UZ?NXEU~sb#yAQG0v38`nGWF_fS_|o z_NhJx#Q5xXYkkPo4A&iPt)*?CC+!uliTCP0<$o!5h-*Qa3Lf*hTo>rKts9vf)E{vN z5?qQ$f{aHbV{O2X`lIZpzwFfAsN5D-T)0;?WwD#188e!Lm2*NGwpWRzz_AT!XB%2y zLT9=jq{Cu3S^-7h_>C*!;az4oN%c5~G||1KMU~Y?`KU5a2p2P2A{gjiifTPZT7br$ zdq~wCvzQNrJ3q7NQ$ZuSU8GjIsge^BiGXDE2Gs(TH9=jbqo~&6#zOdkHLq%z!%(6l zMv>JJRhWfQ?I)(ClR;FXQ`d;&k!}87+QEHDkx{G&mO>;_8RS_yB9lYmtTpuBElzd^ zjsp%<%~xjfQ!d`!XM+AI;hOSmm_(LwT3su~VNfJhc^<9|XT@rfg*!O$_$S3E zhIs->J+wFSL}fGEiC%Fc%nXqoti@CCpdC7nx|wU?IzgokDV7KAOvn;9xVGha3tarb zyB8>|(N?_YQpHQM<~SFs}DliTWOJ$^(;qF zqx9)lm%0v+DtPuPjoWa0KTa<<6Ui|le8-`lN zFfPdI?8gPonYH5?XkG|&i;<&aY8Zt#_>J1ng^#@&s>FhX)wENUMNp4^@J~q1= zJM2F|l-XQt_}j;|n5!~?RnXO0Pk|c0hEXGR1-G}jY|PXXUe*X3wxSUqt0A^;1*xv8 zOMsA?@%vUHN0GQzv>KG>7n}?oqB4W~wGsnRdM81s&X{U)uG|^=&ON_sTlZpbTR8*N zpWONRb=98S{Y@veYdtp2Fp=7U^_7r{WR}Zw5ppdVn;W#A8JDPO=QS(iI&w&?%@$t1%4yt`c9(j7_29% z-qubFjVQtJQ=Pl*wXQ>*+hZ>6{$>kUQSu48p=EMuxqXxeU5VAitoFkv%~j{f4hqF` zF5U5ghbCJ!M6?2E-Zd=h(e(_fDoYP4XnUwCwXtY>fS^*i+q|VMts}QCfd|aY!+1v#B7m=3___^ z?vdO^?l&T^EWXeWT_NJ2g+&9yWNVHf5S^HX;+MGSr7=lt%)bnv5l_5pEc&&@q}6*> zxe~BGHjO9PRF$RWhB=DJ(d2DNqDrI*%GEdAPQfEzdDVegyLcTl!yB1aPmWpSu>4hV zSD(0X9>FvNz!Bp^=cw|68f(RRjg_{RF{Fa#h1PQXa?6h;jl7BTAwhIe`_^@$nP0=l z&skJ?u6>9fl2Yq&YMb?pU@*so|>a zah@~$69;FDwVkGl#wCd!P%1)-b=QpCTsq=cNv9VY`_`$h($L;mD9g@rEN*3jCIE&Z z$B3xtX{qp95X?BMc=qPKpt(xmuiGzb(?CTPkE-4zlh;r#Eu7Pmhj$-Iz$9{{R;cv$M6o5Tkp$!8rFQ<8P42K#h{cfjy+# zKw=|mn|CA~~3XY|j#SB`y@%H!~a#;lJc zBtEK+k*NlOeS>Q4UuLv%zzgc^SDS4X&7N&e#0+ublx3Nivl^0WN%1qOwmcm5->U%MRE^Ll<5-=nxV7VZ+{$q^54BkeZvUw!KaKQ0EaSE>T5i@jx1A;Z~M>XTTs|_4>L)FMB zkI-ftWedBiKeUR{x`hKIWPrF)s=nSS88CB!XaIxAiYTi-SIeP$PAP<(!}9Sg5=kG8 zO&#e^4yW(e3{7w{yqt0iofz~wX$jKvT75{nk?U*xm?Q?cY$njA(m-~XxO0vcApSP@zvJTVIZ4c00p4fHmO-ZQnUlL3}O3O zk+L=o>eso}Hh1tC zq_=4dsN=(GpYZwVox(=RZ&sWMA6l8T+esDG9@-GseM#frXO8~>x49MzSs-9iy+{F; zwEMMPZa-Ovx9nE;FcEJc{#yHruN+ghoS%}Qn$9GK&a`{0hA4mzr1(_*+PApep^4f_ z@ht7G&pgf41smJ;D2`2qw!>xR$H9FbKtceLc!3HZ^Cwbkx9!xppQ*K_6ba(#ytcKX z@8SF(G05)Y`FKdOS023N?Ey!Q+W4J9zucp@Z;1G~1tQYL^BVphX{p)FRgNc{@*H!; zPnV*FVo5Q1FJEao%ld+MOKlUu&+Av4WC4$nyh3#wYdnpl*zA;1+^UaGQ1F%oSbQd< z-Q%pZH!fp?fuJgD+s#$3@Nii8rzF{I0I|FVNJ0V?NIg_n!^gv3m9p*z;x8ASxvb9N zYtnuh6fef}w-`*cSMb#A_+3GzRQT$B-Lq$mu&RrQdWdBf5%FDey*r%E?q0J?TZ-Cs`+46X0 zyebs~2%MgRPLv?~XKY(rlf@;tiKxv|s`don<6p zJXfg416jg|;{f%;T8P%456AvBde>G_HjNZn+rj$Is*dI*#CDS>!!kMA-gE-L%cgGQ zI4OHwD&TUW1@4z6!d-Bin@g5gy>LA=JwTLo45!TDB``43yGGhPmqC zgnK8z6FHQMdzkm3VYGPkJ{os*x^Zxcyj3R6WXNsJ!^en>JC&!&a4su{#m1A{q|-3? z+4{LY-QGHnC9F`eaZv4NGaUh=KzhLAAPdI@Z)p7kcx}+RLLWqxO#FV*6{JIT-BXlJD1rs3wkf z4MkDVp{L!a<=NQBwn*?J;-$~EwXPCHlG)vE+T*!4K3_%{t@F@<@)zW75-R@ysg;++ zZRn)_AG1?j-9dI+cE~E^<;LZ0&Ar@RXnLzD@N{9(l>0`bkwsYe%MA*R z*Afw5ZTOA1CgibMUP#c`Mm<}mPK;C<1O)hQK6-xM9;2wOHm$$rWFYxkDpip^y5Sg% zOqUokZ0@b&rq5N~B-_{GS1c><)s?JWH|haucFRWF+-hqntZ65)6me`#?ZzOd@dim` zPr{%TO8Is1rk6aURcN2wE?C)XqX2?AS7i7$OONGXwX|CvLt_+@!E*}{zC}|Y4hf?N z{W^y{Ac}!SOMPO;w^Lg{?7P)=;8(K2$gQA?-r8robc{9BLT!{_`=hVnZ-$$-S1UCP z=(7xU3bq})#am5omsd&i6K)dkm*a0xij((ORJRTo0g{x*lZs-iqK&la=S@b|kX*TL z(m4SHR<){{8k45Wms;glexi6ZHW!fc3n)@3<|aGfqiHV2t0AZ2C#Wav)z;r}sA)Nb z)U2i`R_nI67oE4ma!f6h*B7!GhDtcMNK9)hs>&0o>9=Xy`aDjew{~kU9}JEFVW)?( zs?JTk8)itsVr>bn^D<9rf&X(HS0c z`1UC_md0n$WyJCd{_u<)zaHXHW1>>F_OL8*hBZ4QO`@mUtTl|sqcrk=;#JDV?ZMIp zwRW0Cntqq()YXeC(4 z4yW?CqoY=!s}B%$qjPE~s)L9qZhMrKrFizCF)|}6^lF}fZ4?7tYePi>>x-Ofwp(Sc zZtbAQ-&_}p)pkJ>(3FUp>{cUiO7+{M=xH_Lfg^yT749_gM}xUt-DE1NKK}p>5*!y> zTBQ!6rx#u(Ty$AGNitBq#yuuRyMi;d-XOzzsi>hVrsfVTA%>5p2e*P;WCsmdE7{vV zOULs(PQvGnTK@nK!a#-#XeA1Ukug>q0eXBuoz?5FI=eE(Gn(^PHkCEbxT~hMrJ%PX z@J13{z-*dC+qHopjYf6gds0~$)kRZt*{eA|q%5Yb7TKe=keXA}Ftq^x06Y)3SMfma z+1-XN$Jt-tmhuhg9I*H+Wovr?u}Mt=s??L^su=Gyj5A19~DM&lGsa;x|1IhL1OZ| zTEgdZBt)Hx#-^kVdQ>67fIQXI#P;!2k`P>UdVr>nwv zBrp?+;JI(@EH4pZzO|0(%~ec`GF4TRs5D{asAfk*@a7r>^(raFNXW2=T1BA-gwxog zpy}iWrCdBo;&IedOa`=7-7*kM-;A5ZZHu{z-rC)+FLESrv-I~G!CL%mWLnUBI*mwt z4*jXP$lAHo4E$C6-HGrkaY|~VMm$GyZ`g}jY@H?A^xaC2g_P7Eg!vG4n}Sgvh!WWb zO3H9`b`{SGTC7_w;z+HQGaM1Zpdc0KD72=#J=~KxzEi2mZI3_=918npnD@DPB#Jb- zAy#P>S9=5>0A>QFnpwS->=DTKbcR7C@o74mF+5PWKe>^({zWaUv6)FoF1YNWR7ONo zx=7jR3oo*x?HZA_GFUkV(Xj#I4dtf*F%3RR{FqY2I!;fB5hJ z0F8khW3^nh^=~Za?hF^=v#~kEu($>QMKTbQ9s}>Hm_;!XTrm^PL&u|v(*DPO$ zl{?mk>gF~^OWmcez!8tss&6&6$1USQj=hTh(6;rsh%$mam6gCC>vgmVWsg*>F~5jE z!DE;h$z7nAH-VuaTI9#ZBkd1zK=T++)qMJAb!`Y*O|{hpad0f>@T?tzC%_$=MsI5q z=d2dz3!fognX^vV;AlnibGfHLra@9oby4z8;;)%?5KyBq^324yk6+iRJpuw`+%%QM z`JoiZ;rjIO)6KOm!ip@Ht!EUu=8_3{70lG3mut7$Mzq$g(-;d0e;|Ct!-|5`g$)_@ z#_+?Ezlp$T9@U;iZv(K3SM;4z?=jVlJasA$P(`XX5#|s2(B^9`ag)ePbu)O9BVQ#! z;GPD`lu9HmD&lL&b$8X+PQds1gYbJ3kha@e*QMDP7X|X?P z>#RlGKpGGOvi_cU@jZ$N^8qDjYxK~)34?=uiL8!K+^3;HP>3P z&eU^UuXS+Y!^-R=A)FFU;yek{p`kh>Xr%^7n~XfOU~-nRF%w3HXmcreDH@q%!oT-ov@RW>b{s;tOjXl-APZZe)=jKo_ilb@4s`YqeU(`sUO|=R$S34|0*U#p3wJE>1<2 zVE2p<$_YOcIR=KF{{Sr{u$AMxj_Y%}+~}=q=I&5EqVAL&YnfhUGZknuU zP&}yA)6EnVTkW*6+y)OVD6HMDa=89$9QT;!X>DUeBhJcJFr&nlYIN62gGEZyS;8J_ z4h3q*W^S=gY`$VVjm5-)mNO>jhvq8rt2cp9Wj@Vgx9?9n_Ex!%%bJ-y2453J8a~DL zEUna~#PH8-EazDsc$aHT5N;{dwNtLv@Ya^rEfI*xJ{~;M1EzRnvVDJi#IdY+yPvnv?gy&x###1l_`nsw6# z6=)sm@!PGOV^gPXDO~s^S8~$ME8AEibT=rh)5jlGKuFp*d7mE*UhL(?t|!aEdCva; zzQMRi9RTn%3iDdKQ$3_S=N#82h{cgBLN~CY`0Clot%2=r$f>3W-mNZQ9UJ5KD$rBI zT$mEYw6>gwr6yYqbv5^`0~ogMO~6-hJ|kJ8*EEqz)oO?i(nF}=inxXc)c`WoiUVI7 zjZfR6InhGguJjBSH+iu3HvBH}-Y_IkJvX2~6-P?=ja)klEWYC~lGaUJ1`5A%Y~Di^ zmWEqP_s6R+6U>M5dGzaDMZLFVv5@A6@(UNYOj#)LXm1s1IQJppT$_sg{pG~a+gVDm zWAC0;Te&WeN~0dVN$~L3m)%<3THI-91ylx8*hMy~% z&At7uBIYSB?N~+@CXg<|>Z5V|K!AE5W|@xSX`Uj9ntFiHHW z?+ci-%USLDs~J*wcZ#WGHK88OYwm5^G;WRFR|+iS9$G;eg>!hnFSyR&tnyJpErsk$ zF2*&c;a@Fy<>i;l%H~$OO%}=+!`dIs3g$RIUi$u9izDj9%xcvNef>R}v$x!%V*qvq zPWhtIL`}u4?y#8lhj=m;{qlPV>ClfIS6)mdeMU*CTht(wnEH+9clT4<@lkFewU2G& z(-XO*Z;4P3U>$X_^p4oZw9i_&_b|R~E z8}<<<{{VGB`*p3BN7jP{kGkBtZXmV6qmG>Wlk*9U;}-E-e*nHQMQ)33ZDb}zFw&lz z7CZdD6JCd|vzOaIn3I#8k7B*B^?P(RuR7W(*yi#@7qd-ufyi6Cda@*E_oJ_Zm#l5>*-O$3B-s>)sCmf# zvB35*G}i$HPz?U0m`E z-<0s|uNaR7mssM=TY!*>5mq_SAA+)Ys}BnPom1Ug>2Wl`@mag;VH1nA)DxfhWA-6l z;Bh-F4qnpo&=`^K6iEwGstZ(Bl?SJo(yixngP4CRdd}hQYom5P8imWov)KF>EXZDD zEAc<>Sw`jrwQ2ItfIdOW%94Gx{-S;geA<* zie>!o7Ul8hMDsJD73r#$-u$3DMP{ z0)W=Kwb`|a#WLcqwho}U1Xi3<_kwcEo;99^@f?d;2urxfgD1D{){k(r6UIm4881=V zufASTPmti{W3hK!doMk{e$F`NoR5Ox2gad=8BVjd(K((MR<+4`16tR#IiwIq1xQ~D z426{TmobZrc^Z;NdWs4fYFp?A8HBEp8S+bB>30Ip6NY|2g^?q=e}%+71W0^*Jn7R- zSZ)1Tb+~v2J>^sHTY!Outv{+oJAy?jv$$0iW*`CYI@J?Jg8-97YWS8e*8#??G4LX! z(jq+Upl&@kG5ETle!Q;wcTY2(av3i}wzcW7Hi>h}c|2TyyRc*wfef)CULf%6Qly`@ zn$cNV8;!iPh&U?S$y;xF+T`}o{fWQsKcA=|Vc|Tj?5-^VkBQ-djdDyrdqs%R08(+|O?y zk{2;=;8z-5mUv8Q&1S=-AhtXFadhkCcxoAizY2oeGzib3RD!k*= zWPI7DAf-45Et4C295TtWGC&RN_I{0MZKe(yUF=EQuE8BQD;0?55MNuZhE0OV$~_y8 zCI`URL!+ijT#yiI+?Ni26^*~QYdqzQSsO0Co4ELvznVD(8Bf@BjUm~l%uRUl1dHxh z0I|V3WH6FRE-q3;u}jtM+@FO>^F!bX)OjM)imbY_F^xmYhq!knem|Oy^oDo{G2BL` zgrV~u@OtT1)0m&BJG5>l(qR1Ba6QT6jn6~KEm^Tsnf*XiJBCCI1$MD+fc=`#w&Aa7 zEnb%eYxRB}Vfbe8;ejHukl{6p5{)m{r-S4om&6wBq?} z?XoS^)7r?-Y^Q6+yEc+5(TXivgHflIp@ad7s=v66kvWY9tr#k?fxL#xHDz@*L@>;a zAr+`v^*uWD9d$%SLi2@idvleIvB;#FGAo1ORUlCPjpeEvrjYe4U?`7LWGg^U-)FP` z0HLTg!ElAW>BgfMj^zy(AzIqZg8Idhu2ar4(R z8QGVhRwke?k45kr^y_$A3mV3GS|}AP^BG=V?8<6!UQ1<|$0R0Dw_!k<5_o^9W~10xNp&WMj{v5pa_8+*>eySY`S9&ju6)J(*@w(D zr{~^tbY&IkA#L>)ub#a?K*1kQo*Glwv%Obp*Z8Yda(hMH3|A$>TdPij@-3G7-eLU!wJd{m!#_)GHM1(CGJxi_Ii&_<`>cZi1yf5xRW z=G}70E*myuk8#4j#Tmf8rZdMSMdpTRWq77Wj#$ZABXCufhln8c2VS7p0xB^IjDj;> zHPyuH`f~1Nw;syLh09#5So@Q{)#Nk_DWGNCeh?US>*x0CDe7IZ(gw{KCC$LoIx9;F z#S0v0I4fxZ$7B#(#OX109-OLcKzj5eShi4;^eRy~PqxfnhtgSc~Wf?*pAcnfuAr4>Shxb^9$tZdzK;K;+Y@jL+g)5P?~ zxBEL)GPdM$e`;goIV*VbQVXGXJ*>otj;4Nf8#l#8}F$}&S`Gcq+8qrFtf#$igSN66xmp89i?JT49Zl`XWBOO`K zodD9}h`qss7dX%k)M^bCc>y9mpm}m#C9VZyvcIvaUgEOQ${yl1U{+Y<3D9nD)B)D> z(%X5DRHs`X<#R}&>?7&TX7_u5=V_qlP*QsfXASOV#?EIE!*g*IGDuAVtGH50H1G#n z>6}`}5Gp__rWS(m4pj=za*qE1V|ewP9CL`r9!oY#TEd|2wuy}qLr58SHE1Xg+D5Uv zcGV-nl6tY2lU&blV!gedHoA;Dox_ktJW)|`(+_AH`jYtwv zfsr?%qp4C4i1XH`VQld|@kqka<{U>Oj~b@;CdTNR_P82gpgx>|J>}!T3X*QX1F5gc zO|3Z1Qd0xmrm=W@+zB0Vm&(Kd0k)WR_I?d*ZRL+onPYCEaWp(iD#&Iz9rhm^h`6-6 z^f7{8L>MLntgHoaq0tHj*aw#NK4XntH2==5Z5_Oq;sUBhF7 zdizGA2u~2K4aXw4+S%SPXX`+u1|$JpEJ8UZ&BM8^Hy5~EU;9PP!dy)l{nfNg7_$!m zNUa8>#}bD%z|52hk-nP#@>{v7>Pp*)9s}41*{NVqDyO?qs^-^HQGWt~QF2#K!2z~- zV+7N4H>YsodRNEvMqDquyU#4Ii4QM1lzi#A?}IFPad#vDrJ!eZZd9LXt0sn6H;l z4w`CMTOgx?;cZbiH@ZBQ$|D;zbD>fzBK%cm1(=^UAZ^uj+bj+(=MG5RjD7FQA|0;Yqbc!R2&&7KC+ zNF!5}`%6a34R|0aJE_W_8E<5*3{qOiUK`lrRi1=Uqc?*u+BGn2kO!AyL%3H32c!^` z(@Qk3G^}1p7_+hQB$|_}X0$X=WSjwO*HE)U5npd*rdDWMs!11B_R!P*`%tgEir;5G zGC71fe-MWH;vv*WBd9-P5vgoA1z9Mg$n9MEQf+-!U_l0icoCqWrtS(-F;?b7@$40^ zkA|{WE&W49hP-d;nsZzkPDyQxyd~O&hu~4yPr+#E8-kN>VCk8H1LPTh;<*O8+qR%D zUlUDU+QHIhm8G(_=*Oi-h9J}$5!4+?Qquzw&8{-|hQj2>sc{MuX>sO4ij{AFO6d|d zp=K_&mccJtJQ`1kA}sDg-W#l4_30)nOA#pt$E^hi_}&`koJVr0vw_ZRjAm|epX zZq}C9ceA8d_Qph*uu!gg4uB4tsI;^W)aJBRuA-}o+0%IF99U^i&cv|F$Fl4H083lK z>KUb93X*;uY2Y<(T2`J9E?RpL4{NyU=Xr&lqps+YgpvyF=%@C)y}FNoGoy@_=968AgH#jLP7%)2`Y9)}F?#H4a&sYJ7Pf zNuASmhA7(UjWuMFefZ|NtL&2DWVdTeBmv65;*f*WsOUh`vD~t8sktnr-t^msXo|Wx z)KHYDvXThyqiclqAPhZ3_OG71ASI@l6-z5zT0>0=XI|hja$+o}z-7`oAdp>I*u0>x ztN6bG{MyXNbs&+#W@ac|P71Qmb-#tp4+YF=sHXzEvR2vKnPr0R@ont07SXnHdDtkC zkktx;N5nh_yG+9PngMHS=-hMx!EMn{+l(`vo%^Rr{XQ{ z_v;t9Y!@t)wXAd6IDn-|y4&Dh_On)1G{=$y<^BHv$K!L?mYB;W$y=aMmuoJ?FSn?s z(@+n;S5_XCe33QMJ3-|{sW+C#;b_%PDIdx?E=Q5(CCXow^`rq+5K&bZ!9{hpva@Bp zVm4%`E^Zw&^*KcbAc74D>Im`Fr5zPRHwZjI+cNo3q3FZ)9acIb-wTEcmRH={yT%PhP9I8rF;X~g z=UVamc_z7Fix&ARXrYhdAP;Hs15U=ma>*vfchrg!j+Mry=aOi_$^3%B;avt$uAjCC~AGc|wk}pjpxKIRLJXKbU@6utl zeR07?hi!ZOFKBB=ZEBNVqnF>f@2>6Mb@8sPC@DpvprsL>2e|h(HbUCz4D6qRPda-J zsjjww_f@8gKY6h>N9t*!@51M#%qoOAKR@EFBhO)uj^`l#O~i;OJ(bhe zdu_+#aSi0Dw>|3Ac^V%6bW2HY9!sXVpjT%yQAHFIcXS>@T1_}nVl|ywxYnuv0BPJj zRlg3i%iX$(#6lqg({oC+2jAp6>j5UyBd%Q=a;M)EA(&TB7m zk)QEQ#Hx=4Um!KNw6+k&7&tFJ+^sZ-(y+o;#O zOg96>G3K4L-KB!j#l)pKdmV?aUl%pWUw` zxN98F8H5X~wMeFTryiRSMMiL0oQ>djy4^;fa!@%@9!MbxPCFZUxD{;9+T}0I`dG{)U%F1B#1A8z&lwy=Z zM~Ghms~xh)$nl4SD7$^L?q=0WFeH?+$ux#ZSiFpC%zBfpsAvL#Zrae%L6Rcv_HNG& z$}O*M$L>HVU-ox&-TE}#z?R^hj+Iw$hH`8j_6z19yoN~1)}e>9P%F(!qD6Q6n_%A3 z=M@aeb8|ZF*n}`%y%^K%)6jxknt8!jO-@nM6Se&0VkB!Drwb3_g^8z9daw9(MY~uR z(d_drr>6H-h8QIvH#VQKIBmJTgt6`tqgTL&8qFBwZeeT1n0J(}9OompaFP}QNb)t; zLmwf;DVFx(fYhMgN6ziwvUp*T5<&CTji%V=I1-@lJDe8nCZM?|?ye-bo#v3$+|=t_ z#s-Q7D5}bf!QElf1ir$87v^ve?lwlJ{nBy z(;2Fde%7`VQ;Jt=p=J@sZ#mtz1!S?vtD6~L)sAR}=8j5G)p~AL1MM2IvAyY3A1PX0 zhkF*4W5s%!NWIKZ>>2W@8u$cO?D%P{h|r@-q0Uzg=fnm8MT< z`-^dd$Syki2!;a|5=E}+&bGfpwe%wf4*tne$O!PJV5y*m2{ z)f?g?H6Rt&eaWq&g^u6{xcT_d9V4cNUHj+G*C45gx1%hCNh<;f3WuQa@u>6F&6T-t zh^A$C1e?{0Wit4e)DJx4wyS8;N0YXV0zfW+ek3Tsu_@9nHT= zD;W1V0Hdhk+K4WGt2w-}GA2IGHXwz1%xG!Q(|=t;9*wr*`3UbHa#-BylNyzrpOq%#26|*!%-62Ari;jYF|*hioGl?G$M*KNnBqvAx`klS98U4&}OY|p}M)Z zR}iG&l~!@Lc%cV!`D!igpty*};#vM>t< zS7NpMwMNfM+XGh@xN;}>Dc`!h3I?=$63;Q5%Vuw$`zduL-P?c+vKr721p~oHxNAcM z42il}16$auq>;}xaj9H!$0V{WajAJ6g+x(SEKL9ac$2466Sw}(UCQJ52jv)?qz{m^ zfLu$Cwlgir0Yl3l#DN{79xGn7>0MVk;tA^;hN0S|ut^!z(?XzeUr{{!9|FW$8Q2OL z8+w!PAy^O9s>wYqYU5FsRE^#fHa57)(W`MH7x9m zRmO>}#`#BZ_=IrU`h;(&U#prH%(NflOL@oPa?X z4h4J9{Y7^gCYr)!w@E_n^#`cbBzS<$uEFV>SAgwLaO6+$S1@lTMrvbPE7+A8jNVr> zde^y2m%F-gLnMZ@1Hn{yDEAF%pn;J$O8{$o6j>y5&0K0%7M(~%y|~8mjGk8Z$Btwn z#@yUlx?ImZh9xi=6LJR%F(cr=<*bH#oJzj8e20s_Abu3q`trQ4#mK9|+n(Bns;^Hj5dFcB;5bte(U8dz9_7 z)GWJrjsgpSIB}@W*ysKUSIK*`%yM!^9G4GkGGl*(4%aVF)*&Tty3LexAtCa;{(1jz%vkisLU*_|CvnzFG6*{0%|k_xn^C4te9929Zy z7k1ajmgU8Lw{w4`rvM4MuRq@>c0c!Dm;V5!P5zdOBCCrt+@61%$H|V&ax8{I!cwMN zTbqd`jfxPE~{PID79cQ36{vMn_R7~HO8)Su_eO4uWZL_NCgT%v4u~Mk<{2O1cQ-N?XKG> zc@n0Y|Z7>t*$!e?p$j;H*y;KP#AhLJg!7*x7l4N&l^A_fvYamr%8oLLz;aHG$Ce$ zEs@VOLBw)02?o~+NZhB$)5L3p0=gVVOJ2ITvqBbVLf>g+cX=|wX$#y=--alZyC1kz z=`L_+sWeJ!ON{`jO-?b`-rz#knLuN+mOw~?Kv{sLcFH;cDdX2vS3Be&me9Mmg1@oa zUJj=`GvZVqDD7@T6K{8ryU4>Nk%yK5U?`feenv+^egyK+R=9B|dn!(a$By;UK=tW~0Mj%)6T! z_QqyP_$xS(2I_e9=z3|ss#c0-lsT)uN5-=^xEXE{<;G0*?#L>n#%WPnbUI|&#QbTR zgD%?~mYIJEpLESnT9k zZQ+TOvdW^W?NUDvmq0zbhIbe%<_f{~w^CvoK&5j1_3mYl9+MZ7#QFwEObvNf0B%}W zpfo*vH)-guV}F!_ku#=^zBW^}B`$96u3SlTGtVFt4e9#vv=@~I}PPKCwvXhNRl zT&7(3$9k5+-{dXU)k?PQ;d}|`I_edjn1fXfbsDJl_ToCzih$JBAro*uZ$A*qJ^VI_ zcw|kD6pgh=>*GLux{GycCT$6#YFM?3BfOW?j(+yppj=h7A%Gi$7N85az>0Wkxa_U` z#XT}&`_ka9E&NJ5R2&ph!iAr6rznr zx3rEL=ozLVwvIAOMGLc0x{{w?G$DJ98QoE7Rx}kL57KqQXq48}&?7t$<(zX1HcG{9 z9?v8`T0k?0-E7$ti{{Yh049)rl zX4^SAEuX+H=t-6U2ewtxK4rX*xh&Yca#5O)p|83Sy(7GC9T=mpP|9dW-ZU-{2%%o* zySlg_+)X6Jco`VAEB4nw2mlP0tqZHR%Htr{NY<#*POG(56tSm=fYVYnntWL#e5jCV z0F@%VZWs5O6t)i2DlX!?v$Gc_Be*21SlgvKf>yeXaU^<6TxnG@EtcZ# zgfWgF^26M=-Ep2m@<}t<72ZpgLMSS0Kq_>GUPC|wl>Y$u#q%0JP1N=%d100(G03GI zd{u=GrH2A46-1FajxBJbhc)9}O{u;q!+8%Y$qarH)ZEMfX@6_cxlMubIk&qX<;Pzw*kzo z=6$l{yifPH$g^2gFU`V9K+HM@3`7R_Qy38F~xIhG;u~g9mv%Cd^Co% z0#7w2S!8nqPnD`Tf;@D!6@1Wz_d*xV2vS)7LzTzCA+wv&0gG-53w5WN2id6d+Q%WQ zg;aTMW02L&1xgO#@^KN2+*A=jden5Mw^4s-g0-T7`z5t&r9fU@+}=*p+(=}Vyjbdd zakYYt6bjBLn;UerP%R*7X~pTIbR&9|s0=Cys6Gd-h1AgP*Jk16ZEjLoe4X3ecy=`s=`+{d^ws=`Ea0Iqjdgw}xR4vD8QrA2)^ zFl*dBsKP&_ZfhhL{{T13Vufv){z*g({(#xx1{Zr4r}GCGM9 z%KLZEIL(!&N0H(#Y%On#EwuBFjLTny^(6@cpfxHwjXD4sC@+!DHF2p!8tOv(p$VVB zdk4w6w+*`FSgV9dAeG~S(qt;L1f^MJ1k?LWYzF=}z z=hC+WCp4dG3(Lcnx4Jf&GcT_Qph;M@2lQ%BPqR;l>J`mU-NiI-(JgfjYlmG?QBQ9B zYsxwHVeyz4qpT77*Ozw>>D$2`;Gv{?9};>hg2$}~L#`7=&?=w!pQU`(DmdE9pG|K2 zLr9S0-Qo>Ti*Eac+$-RAit03vjGRSN!Y8hbm(#Z^zTIsvaU_x;fXKhY%qFMGi$7n} zri*d#X=$NN z-=_}WSmY+T%;q9T$0SB+)zMy-@i&DS8Z@pbJ;UFqGss^kU^ETI%C}SQE}L&3`HwD3 ztGQj3x8#?%x!xBHR@n!4p8Es5DmSW2D_hs1G3)RXxAtk_sZq^UufN%PKo%OL1=X$1 zt<1K!F+3MAJ4ZA!00LKTL#;R}1fagt{-*1tc7 zg&q+Ku=OEA4%x}^C4U#cSUI9rfGpgmfYrk6Qu0cC3XVpa|>N;&t&;lwsQdVu4f!5MNs7l_H)%Wsjg zie-@s7uY>O5A3x!3VXGjg6?~FR1zqCi_(dXU_*s#%~jsu@OzFWmln+@t!Z!?OF5}V zC=Dq6DY$#J={r{B+qm^ojv0lH-1hTq@GDlkFXFj)Uk<kM(PsdGE^2^~PF zQQ~^|Y0bxQWvqJKD_nB;jh4npZJH}Lkqm1ra4QuDuS&4~T|xf< zl3YSVrE7?<7b__CHfsdUA*Tb9Kz9?g9HWFct$3?>@5#Bx#L9x>jp zhZb*N8!&%~!;?eiYhJp`#Bo!n#ma~GV~(#L?lylF8tj5Axg@q-p#X+&-p936kQZZ$ zd$p>8`j`r?aK#Df)y4Bd5tj(Qu!7F@X8~N50JC&rYfY>BLsdJBZ*grhR6D#_XhL8!U=)P>t~K*(n2a15S+O zcn*}+os6J(4r=pjd7)(v1K5T2X04XXYk4jwNMjXuAOWPk!J?%-Zv&-}F}b*>pKLo> zk-2duHAuZNkkVFwhVm!b(zMkD!=$`hLPICq+2%JbAMq^9YM4!}-Jz+*)L9 zAvV$}ig0BIr9r6a;s~hJR#>_xRA#WgoAh(-uNf}37ICJk)7*#e_?{P)_eFupP{ z1a$XPOY1$nO7?MO3%>(>$xX`e10Ql^g*L)X8GVP_Pkyefu62qW*PeQdXBO}3MkvF> zkzE`wiOZV1Qqk{-ov6RGYvcB57x$eZLFQOJ!t}>RH_law!S*82F=A`Wb)>09bVc}m zhJ(+>|ZvALe*V#*W6`2Ddf+;>-r>8U|%yP-&`}?O1Sq za8fU>ocA)g>17HC=Gcs`MkD-Khn)w(7&TbQ9w7UDr&2cgnG2}Q2iB@!+zTcnB&TaD zl)e^fyRHkWBCne<8)^2}TA?5<)xm1m?LZO5T%O%_ujK79mlItXqPMr(Ja7BgmRF%- zUB3!~JO_@v;(4EUuSlayu%~BYu`|__e~9x%T$h1y+|7)Zmv&Idj-^dhd5s< zIGU@G2aPlp43h z5|1^2y~NC8xk9X`Yby<`54>wpZ*JnFQ?wxV=gRHJ(q=UWw~J1kV#V< zajBqkhoNR7qP6L$S5t>cqmtBGZH#O}SpY6RUcjuBOJ^Dgk~P|*l%S@RBmpeyIMs2_ z4ULq7NFa_hoyn7Gs@2ctG#)2NbfKoH=(RWzTtb899CHVs$2wd`knl zB6U+E%p=Z~Y2^@r|wV zP;QaGXz3R5{-ATKR^?y0UHWfob^Mii{T3e=^Bw}f6rkq(9)3SJs}V0^#(=S_D<3a- z)|%4qse$t=?ekzZqp2Cy5%+?G^)+UbJAigSGsw~_+=Ra&jgfaI(OH-u4u_)Db@SCt z*6hg14e>ZDi(R4b0nhNa;+q!#08N|(Mm<)#cc7{Dw*LU$>bLiaf0a!;TqE-+PEYjJ zhWS=}9o(>7Dw2sa2@#KwZh(zD9`@jTU{NLeL~b4eLG4JMN5=BpdnDNWlwO?5Dy+R# zm)fVMuV9_Bw^MRdR~GMy+FUVQxSL3CGFH~J%q`-YK#w^U3J;w$sh(KE;44I{SVXe5 zgy{}6sVO@Az~@Ho>~$GJay-{7gAifhm%fRmiy&nwQda! z0}Amds}p^U%SU-{{6ZX-TGd#84z!j?qmO69)sEJZui|_LpZRu1!0jc+w5ZZ+Yk{VQ z9yy>}2(wmPH(yHluZ%9KeS z({so;KQV_rJP&geaY++L5dpt=2T{6%%UZdkFKq(z=wuBwD%f$KsLnsgt*16P>(_Kj zM;jPcKlC8LL8(=;{^8rI>&@hKO1 zN`V}w#lZ7b8@AXT`mqc+grqvsEW)zAoBERC98ZMWU~;yz$32iL9s~@sRM&B*pI<#h zdn691#3@aC3vs}r-uq+mUCiyiD?NnD#~HSfWwy7Kilnj4@V!+-HuOI3nq=LwF{#`W z@!7sZp`3A5J2}Vlm|NLxZ=otD$=3L1LHJsqK?yvrRp?k z9Z^MDh*ciadTWHxRHZeg!~w-vj@I_?8;!7v{_+tm+<-U4Dnkyv53|@cjofd`-Jge& z+*nvP7GdV%Q#K)I992l8jSs?#gX5__3`dO{$ZD)SDTXy4o5A9;_RSQKh1{eGY8sx} zsUH=8PL#>ZPlq+r9|vL;X6`=^{?6uEVFTqQB%vRK9~uw4TP?EptjZrSSqiYa`g9_x`OSM@#`D-2@z-{76p|yc zqeWJZpN2$g0uJCh4G2_Qm~kwx6wln@GJ$?--h@17ayl@ox|2?aLKG&1D;d~c!`ffL z2P5Q>tgA4sorHi;AqV4d-+m=Q%PIb9XhNiX!--{hu5#lOkxD#FeJMxbkvy0Y?(rU4 z5TP_7W`r!zh4(@i%?L&KPTKPO(;UeHS`q}2e9LWSuZQlycI)q51Xl#6xU|$KPxoQW zXYFmi8r4b5wV>4*wQxp$iipiAD)_gcvelH1vhppdGf zr28t-f%;CRe5-qXVdhnUqj>opa9cCADDDzc zm?5o6P!lt;d~Xqy@sk?cRlMP|P?IgF5$s~7@P8zZ_ts2Gg zIVOUQt~k>arizdio8di=?g>yoj1C7DR zIW?Vy%)W)RvZ6~a-N8e(D^ERGZZ{?vi-u{vqR>kBJ;PID6{j_C`2PR{!tpF+{yuAX zGO;YM-2m|qQ{~c6P1nw(eku-{!cBDP4OPwN?Ifj!FVfQ5P%YtC=*F5ZdH)}Wk~w<@Y76{z|l7z@o>#SuOp~MPcGz@?%!r(kB6R32H0<7FE#zU zl|d4_ksNUVJ|pg~uQrX%!a&32PwqDiy#=MTb4P{TO*5)T@SZU*DCHIyDCHLB@yL0Y zS85`catE2(ri0t9MeWFf7f3~Pg^_|Tqr-WtqsQ<#o;{3*8Hcov-Uty;vLFoQe>1S^ z%t<7Z=5^(F+k~^cnv;*PcP&I#?O>o=@|=Sgg#+iN^)B2K6`FifH9fvaJ?*J`ZqFpf zrnK!tjc{l{UB|`C&$xZ;Ml@U7Wiw;p2cj}{rsL*(&bRh9jJIfOeWgXawyP+rODR?= z!i=VbA0jnqvufP^J|Zg=iSDo&0|7SzCu_6y~)yO?ZYf+>L6xvz$*S z&arox+1B%YoatE+eU0Y-{7DwEvL7X#WECi@l&a-cyOp$+2DLmEqJ4XF6|3Moc6(`NaR45 z1f;62r}q!}SP)K`x^WSb6^6+hUvk#FBVVaL`|X9aG{DinPDm>m5ME6jwf2K%XTWFpl5-oufpctV3w2=|Mm|I%^p%#w48T zRn#_PNW+5f!{uICBDZE)K?l~a!~i{fdUW?`$Y!Y(P2Agn3CS#b<=UHk<~mMIhK?IM z{9F(77E#BwZY|;sB~V5w>Y%Te#J+tsd$w*Sx*l^lEcWALhNkcsu3x1-)$uMzWs&4r z`$=vt>~3NhqD+y*hAK#9LWM)HdJeT7?P%2sw72<7lR31pUsB?L$j$grd-Sm0YJ3*W z)2>5C@LZ{v$XZ<`zDYq@dL+x?T`NE-_gY6QOQSh1etE$#9PbD)dE+t1tgAZ+AJcv4 zr)k|o;axJSX+Xa{d5!@%_bJNY(%@YtHtJhtxdU&gBVq$n%DU>}>EN6%EzCI-7;IuA zPTspMpV3CS_u*2U3#=%e9@m zy60Sz_+(NDpn@|!)A{;ffz$6gOU(k4X%k-X9p&PziuU<9?jb%_IN`O5h*3prUYppD zJwyW>SEAY8#e_^0110h+I9S_5AqAO&vjIW0pVv(+uqkeojYJ@h@bHT)UF12LHcPVJ za}+>T-=NxBp2AM2ZPC!V#~>G+`pa-+&4rD^XF7-aRd+>cWefS8fCt`ByG@hDR)N4T z(B9o~Ocx*HSo}^VIE9_8F^MOMKsOVF21|)rft{VnrF;iU4-G+dn$KdH(lPg=6jcU* z1wJ2cfkcDNFS$!{3~q8~j@C=tJF)6VG*lZ8fsMY;BdXhhBVI_v6=`eJEX2{uwS7+E zmK@FxG+>r1jE$qkcH|F5q_>dm*u(KKM**ws>8m>vMo{LfZ&^oSl4JIQRgbh+%$;W| zk4cL4e?*2LP=82MQ6lroc+>>Pq!`n=OJ6mA`B7E2MjKmLozkR%@NGNP$Usn3RP?V} z_-Wwa1}o5{h`5v^+%5sddA+={NRim`sT2K^C^smO$3aV=frGBzo2j^Tr?XO7EihFV z`#63r%~qaK#IxLABm6%#ZSvPFf>`Lv=<$+3Wn?4~)9v=^Kp?EF@IE6)3NDTTV+Hpw z##_!eL}lJo_!5A)2i;ZF9nw&8?6-AwZ~tfm8qo*aoj>f;!+8Oiy(&L-~;yRsxmwoo9DC z09B=}YLR{Rv9zCwz00UK7LzMNE}bGZuV_0JkDK;-X|cwV}!8G;V&`Qk%xlf zH;KU>Oey+Cv9>o4f?($6(yidf!g6w?c(=de9l^FDCYtjPkx(H)y`(WqO{$~BxbWAx zML1l+dh$~@}%k3fk0cV=8hY< zCY4La9E$FWc9sf3AT{Ts1eOExV`p2m1Y(h7+75_yRG6<$M*pa;$)>a z4{z$$e)c145p#S)=|u}}*)>cfCb1A}T>F)Q;+$gvXJzuS!&H$@_jLd=s0Xi++pj&p zzM1dTPAhK=4TYbk03TXT_ouWmV|QmTFm1M>dz*OHidMDt5l4kTH|o~I)0^p+^rb#7 z2ka^Z?Wl8lj2+|cOHK<4OUR)|6MfCLS%SIs1W%S~a9(+CP6;7?pp)Wt+1?87+iu`OSKrGK3g3t3Fd zO~Yv;*mn;-OWTi)PRu3dD>-+R zw)tg-GCerO0MyxM6rfioL6TnbJD8q*-;^G|W~i>@Rd)^qrH?YWvzW6X1Z|~!tEM6~ zehWD?t$g)nNfpUSgESOKuc-GAp7&jY$n7>lZr4U ziGDU7XexhE)yJkT-Xshs0-#-tTJSi5_9@=bW#YHtxP`A@mOy^ttp&@7nceHsE$xf# zV?W9h2l(`3t#pp5O?;VLnOyLDHYL9cDIV^lNtQxFe%j8DQP=t6iP5x@@)W3S>Q!X# zEx@?uuOR;bo5Tnn+OgI4+x@R<$@-bPZh-zl_No5f_G6s#j3wo?5Gq*Q6p}e4Y6#^| z2J6$Rnh{+tLR|3XejNLXVf!nhXmsyvb>W+-+!m|u+~jz?^IA@!~sE@kcDhx`W^suf<<>mf2;c zO1QDutiu||v>CYL^`K5$#v`$<&7uT}dQBK4(x;;e`D#VI#-l>0y-DfuYy^>tH;DUJ zX93OUUS-9_dn8t94#?D=o7j>E-bvIw%Gx92EvuCd(Xz7oQXJyiH-XJK`1QBU-7 zZxxgqQEu+01*ModKB-v^ejo=;Qo(Q3a4tMkwjPmuach5vL&zvGV1$904`VB(X>=yAsR>eF^>(s ztWZJ%#)<-g;X(Fm&&1@MR`Kz2Qi**<@zcUZ7{avAcqnRghf0>nl3(fr8(}^YJc&>* zAazu6;#G(QYTMKIFY1;bDz4vc+tJs=6oA&rW0U^?u-(|jM|o?3&a5_QsummGp=8_T zAt&)4KW?(SmerzOxT$S%9KV9n+U_Q3`fmQ<7#@GcG5BOWCO$`%yyKU0Uf;yC$#0E+ z-NwKgx1>n;*LTCX>KwYOi14iy?6bNSGC`%dV!7hwe5WtOd1Tq#bas~3P%}V8ZxX3w zaM2LeEKqrkNsCE)bmpRNHjvwarP`{~+rd;HEo)W{KD%3-#m9+`6lGEsYqp&TAJ42l z@oxUEqP;6?k~hEu2u*BmP&7f2!vpWtSWis`EAC!QQ>@X_k z<*g!w0yv-!eb{?-ic8!97V@g@HoZ(wPuV1rg#M4SR`704X{4BrYddkZvEZ2SJd%e2 zYw7YkTYI!9$u`+hfefs^RQA_acW(U`5y@8Vt)(@dN3_SY|um+ChWE2a%4Fylaejgf-8fZe}pP0pRjJ76Q(=9?r zZyPx2(u&FpDRnjLp$Q}P6Nt8KFyfQVqnpO73Eo69(R`|~z2~nQyHZtld204YcLBRPm z9U_tZeK!a2mmh@tbr#P26Q$=8r|_4G1eJSw%|)7QZ(yThGj+w z&ZqVy0P5V31y)h5E;JddS7X3(7<+YVt=^-q<2)yFJ$jcCfW+6wSsmMPzGJAy>1RCZ zrbQHdPAYpKkz8Bb#~hL)tqYCrn`pHBYJM$KTwlwkt#g|0I27|^YUW6?sKy&R`@tv& z{h80K8Api<`|35=H%sQ4GgG_8S6vG^1hVhVg^iaGxPC(fG394J`!?D-EUfh(?JXFo zh!4VlYQ7rXSkEiiI-^U}2_oX$T9bXK?Osovgf+_aNOEIZX!27kG-8VKqGS&@B^2cYmEi+TV)xRZ{ z;%w}5N;#+8A2Pm=)@ia*yegp*8ojkQuZF1)5Z~)T1gktU z-9~3ZJ|*;|8-X6tO-yjWsI1H{(EL@;%wsL3UZIc^)5(YO>Xo@GIR-0b<0{)bI`jay zPi;DWjWcmT!dGDgydYQ_OS_XJABV_$HJH_@%S3!2D*piWD}7weg@~rqR*;WBB_H9| zo73^&=X(_{^6VPk@}PSkn7qa3uI905{%S~sVJ1a%WnK#K5h#35;wWWNuX}84Y$UE>?n>B!tnOsN=1oj``s$LT}lELO6%HrlQURt?mWdI)# zK?D#%1xW{9hcqpfg^m>jENdhzexbmp^|yKXZc`m^dyl$;+^8a96bM^+6g$K3{619G z1bY>;9DFNF6Wc2)6b>&YVz@6O7H4hJNXK(AC#hn5b#NFOG>n2<90Fx=jJn4vNm|DJ z8GWGiI_62|4M8Bg*Tvw#^Lvk$P_~!r^HC`91;2gHNw1Nac3NpqL66v z4ee3yVsz8wE;Tu*H&eReLnHGg2=}&C<$PxQ2WJXB!@;MurHyEfOyr9Ixw zWtvYFeVIw?p4wk`6S)_0VE~665MSaM8WS2lD?$5AdUP7n?Zk*hRUPvIlLQIeE&-R} z8TZ8G2#^uF-r+hdiCR{kN876aYM?o!BW~XC%Rz3JGp6Z?t2ey$p!W@DZ?6lTLFHbj zvTae?Lf4U5U71I6U0K_ol(C3SGWe?g75h%B!7AOlpNTXJNx)rR{8ut{e-#62k9L)+ zi>5{l@k9BZ+~Xuxk)sUY8WySjdVVYCw<4jJs9tuEX&SSI@Qwyq1wdsoQiT8flXC zjloNABf`oV#Xo*U11R(9=kC-7z*y}olHCF-x%qwEabYiE295G}g@S@l{*NH1PL$M$ zT}h)K&Z5e~VR`;kL-gx?b#>Yd536QvA-9LogtY;eYZ}Wz`CG&tZq^~L=8JL9NpGSo z7U;-LSoNpnBka7!^Ls+o@6xO3ufa zl&#0Tc>_Wj;^%o!`j9>ih&X}D0zO&6*8$cCA$J|=katmvOkegduw2@_}Qyg-F8lPaUqY;9WS`~jd zmpR2}tx{5g-sq?-u#l-Be~369b@9_5E;uK;IJ79|^rcYiOuboXgJ8m{$dRb2X_=Qeq}JVqu6qls+pC7K0A+Dv73vwMMW)2Epp zl+&M8r?5QR94)87ybBThu}+L%%lJkdr5y zfbCVi;*W>(xXr!C%~{&c9^T}x#**2|3hbSBGe&E-%THXeTtMcJ#1bqW zXhAgg_-T#DbZeMsK|gAW$T3iPDanD@`H%2xG8|s|oYjmB#43S_yNLZk!FLc@(Q|v$ z5E)5X3G=Uk8uoiyvca{?NA@aPriWcPe=@P0qnTbeAH4nPfU<>oOHeAYqt%axO=qQh zoG3mD!Z?6+SKcYe20qdlnEJNLC~4J@pB|pgQBlo#ASo{zh6-abioo&=RrRcM7~#ml zCB4gAmEW>uD8wrQH&FDb)9~GN-XsGSnx@>s=IJW6bHAr--U`m+CxyR{FORlEEU>!z z7ifwq=hG#T!hut@t4}R#?04vAA*aIgkW|xHxq_n*lp4HHl-Cf-#f#6{-O6bgB^k#} zyTvzZ9sCAZOGau{l%hESD$jAQLbo=mvXHX?eK?Sc9)gTi^lFbk4SAL2rk7!o)INt5 zKgchvE^rri*>wvFtDyq40E!yds2zND2GTdSR=PaXWtifs7B2qZ70ATUw);rtc-8%} z7NBp@*Iv0aMp$Tk#C%mw(RwW}8vg*pT6+`s1<9w1-F+D=699U6bsC{$rMMO9^IEcC z95|^P%<-Ng8R}1tloQ>48@jU`Sx9S@T?|bz5X0`iFDV$PHZW z@X*y@Jy(7-h==0DqOQ{NwzY|23VFx z5_pE^@f~$d^Lz?adxKmmpgA^mBtnSYe=!I3X_D<`gC$Y8UF-0)rM71&yME@PijiLc z2CVJiT(q|2l^HwJd3_}0)k&g%iaa%|hCK`cZEfP|ur*ko!RH{i^{vaU(nBcn>MAL$ zX6;zy4ml)QzXA_5`Ti*%rBK3zczZ^mzTgn0mnclGO-M8~@+a)o70dOyi@i!D-+8le zuN%9C%}j}~FHaXBFZ1gE0MoX_%nv0TyHNoyyIb4@#((U5gu**wOIl3b0TxXT@!OJ-juep)sR>3HuM&o9oCGlpWxLDhTQgeDz9jTaS}ku5&)5Vm;jp z3jKiBT%~YMM{7e>3(2{ijxNSai>W|rA3_@ZPQ$g|9(2nYl263(Uh1nK#W}3_`w?m< zWw%lAMx=%P167etK)q`FYGkB11r5qG5#KvF>N=8rx^7q1O|*lg%vTMrV*Y$ZrM&kK zExo#wf+jr`LmC0Db&i@Y+FQl}b3g>`kjQRlh52A;EN*HugEsoKj| zf^i~<7mnrI7n6$Q8ZAI?)6nX|;w^2W^KF{{0Oh9+K2w2DtX6j4F$@!zV>&x@FvmLg}|8{{o0FpZY5zHRgT$uZRHO9JX6CP%WX}%PZXnTC@og#HHwnW&2KK)LEZ|Tv`3Womxccohm4>F_suh@>=;do|G zHH)~siz#Zpy0z5nD3XSSHjt;{uZ?w}hVHHn87!30;9PvlwCcq{U0B?N`1{zd;53pW zU$l9TzfH>+drL}s-giXs;H+;3=H`k+8TRezh^!4EgMyR@JR>g`Vr!^c`nCYRfQR#yGuE4@wOM9#P6ab-Al z+pGTZEty}f8np2C)7h-E>`Yf6aMZPuTnR0l;C~7Vg7Jm2hI6>6V*8JUJgcjx$BMuS z91dz{fn=agM>Fmu3umelN{|?NS5WszNrZn=zV!3!F{%723%XpPGFOXd18#~V@i&c5 zr)-u+HtIQ)_oy!G`e8f%neS|4;W0;8g9n?}L9{!cR<$JgfkF0a`DK(R)E+_CxEAP= zH>SAQUBGssF6>PWX{y`NitR#JUgd~KFDt2FX|>HjBimg=jgGDfMZsGRGn7fYZG+z+ z5q}MUGm4T*M_Nf=i^I%n?k_4qRU4J&ZE>C5yvo{uw(wr8jR2t`Ko98|f65>Hx`Pv+2t1)JnPlrJ5$o`TTSMMUZTNE#5T zkJJYuhG`1aYY`fs^a;KJh)pEH!OxsfmIfdQI1PUUb9ohhLS zk9*!MC4QjBFlR@AG^1TCJcTr zHfm669^Yv9$S5+#s%`D>O@~@cb1e2QKJH|)_G5lIas`j4`H)d$+xGR=#mxj!WFU~R zhYZ!T;kjI(#lb!oA|`>=S#9QOj-$lXZT%F~9)zs&nvP3D^Y*ik)^3+`2$%aw$&x?b z;vtoQ{9-Xm`+70b34a*HdzXGn%;hBqdWg$%USBLukqGgTk<`W!91j{-;%~R6x*IXb z2Cnq%BFyV5uy@M(*=LH(&i8lnx2ZJbnr&X5WVci8I+qk0O-?0NUTzJPXk&D>Ha?eb ztS9a4_Lk@Ut_ztB`XB~MH^mvJn$yQo_XynfX%z#F6i6LHR*qxD`6a$`>nV(RZ=t=I z$Yz9*JT(9XBDLDI=}lzI*f1uP_^(jf_gEipB7Ou9V$myHUuQWJS!3@SYs*7zZ6vWe z2X!%kSiKc$5T3e50j<?8)CCi6iQR2 z2UG3Uy@XGd;n_5M);rW2gmX$u1`46~GUFL>&$F{)$Tm%O{*wbxNa(~LdjqXH%Y}Bk zb1ahZj58Ct#jGII)c*ihy-ujyd`G=oI8+5KoM$+zpct!cB%MROKcrLEWAy?R$Ec3m zdHmiQ&Nl^hA*of9>Jnd9nMBpCAgBAYt#7B#={x$B7WL*1_4(-_)ZJ*!uDYS7YLGE%t? zKZwRy#@6bOZks@ihoXlhsZhtlzFt~~Z@6_NI-AW^S;ZUOO#l?O?v7R%@GTs42m{en zPzsK{2DBSnHAvNSa5^@UJNZ?5*5P>~k;7-QIEjpwl2KlQSeR894`|XK7>z>#deg$X5Ujro=Ujgw!(fhg4VAe;AfBL+y?WJ$nws?1BI;1k_Q(%YQSnhyNp!$W zXU>(~*tl8oH&#}0J;=6h9SK%bP)9-zxJ7eaYlt-oo!aY8ZO(HM;NZv`djtU9-WqR6>q;$rSojS=b%Y?+ zihD0*B8t*YKOf*2D_lMn)hNjh@|402trquQze0Cl+sE6j4) z&m^^$!tU6ZQ#TQwk>O29Qe>NRB^*6himr+2Dt;&lMk+^dIqu@Pc3wzes9 zE??4VWObzhXDd(l71gbj9X6Gi^#<%OBxwSgN7jjZ9n4vgxaHGE7T6iALFm#3a%DnK zL$`L|2U=HAcNi)9gW9KhcJ`pcbmEmvM{H||B`dqL%~KV}uAMFu_=V(V*23MZysUtv(=9wz z6w|Mn)Xk#Q&oF=BXV#eA?nDr19%rskrcUrfjC-6nEzLn=fyY^&;fpy~>nq9$UBrUa zQfNH2wOEB_?s1m6cp=Ez$jB#+WrpEDIxwo5eVS8WMPqAz==>yVYUhuQTr&@typl-I zD>N=LN3hW`K!&1^na;9I5Zi(7)q8A>_n zP=BROR_@S;z)8)xg+FeRl7Ye4E31iRu}XmR-%%j{NrW?{WI3elFmG$9k-a+|1OFEzw) zpdDC{I(eN4qObkk?%lP_Z;ixUE!?xIS?+-jij7re1Run7B8efP3B%gX>&0qg#%FE> z1|DYrgzkV)r7RhI68YPTmv{>j6!)lFAj`jHEV1H|-oEFcM2jJ1b zDl3NE-aI;Uhb+%>P~6;4b2HC7nP!!XNh2DPPnkNf0)l}~Yd{nkBW@qu>)bReXLcHE zR1`;3@u(gHuBkT-nX?^D!OL5;`je#59K%xvM~FtL-ApX;hB*d^k=0~I2lWH0Q?g3a z<*L?0zisXn)lT&hlJ1Tk5Pn)0$5(e*SO^A z7S^P(uk4ESW%gIYS*_#KjJrD8bid$L#h&V8ZikIc_=N4meMI*D?gcX5HKdgIl5{FZ z-YO62)+&EV-LT-@UBy_7n|BI_Q@wI?F8uKLxc$rG?~?BIkgdECS9bC!39o=2dUtO0 z#le^f8>PHYVo|$>HkSti?h32Jdv^`$Uqve|+;R!hdi+8~ZNaL1_jT8*X%wdgl_b`w z&6DreBQL`*Y_IW-xx2Vp2UObDtjsCud`EEh?VQJR=Xbe2QrYdQA%;a{U|FO)SWwe^6N9rMH74Na z3IRk5tAzo5(1csZJB^paM6i@wn2-fRNmmL50`BWkPiWOu=F=R;xfNk=xH>UHDi>!V z?&l-R*tLpDsl`L*scG=f^m z0*Wagh!61U1FY@ZY_Q^S|GrePL+wM_W zPHzOD`azwD`v>dPh<4&LRrlVlh>z0*lpk|(EyT?%hOWk^R;*}fpjbKQbgwUVWpBo1 zF7ekw;@POwqbcxV<3prP3uJDWD09HsTcyb38{C+^Ftdh<>G625`>CoqwsTxDS?RVD zUkSl%xb7XC$iTC$JONYJ?AIH#xurJEiS0ZPu5*(;`k0|ok)OuL#QUf`2CXfugm|3Q z?X{3*C(NL$smgL8;@ryn0dTTLzNBNpYqXBF=z8kD_itq4hXm826{t>3Cx38q!m-|& zE#94XuS55(MzS|PnVG&!LQA!d)$1|eUNDHl-bp8r`63#Ax(y=V(=(HZ0VIc%o#wpC zen)tW5u&wmZGA}Pdl306o%?8;Q&!0 z8X5skpz6L`Dw?#d#@Xv9#K6g0s0=C>yr(>Q;xXF9P`6F*H4HUa^usA0`AA=auzHM5|snMRP_5a)Q~mVs~bJmXfSERk}<^hUm*heH?jKhFae37 zH2ZZ5O}@D;C8w(BMzCE%FgA=eKRaPfGNm{#{tl7g2@0)*9Y!o5T4hjxV~r3pWgL@(UOwm;eh* zgLnD;KbKj@SlmQ>H6dzQxLe9RSQRrI-GjJL@>yDgPbt}ae5fQHJ=z=d1A~_dfc_?~ zd(KJOEMo7q$Jx8D;i>g#e#U3l40kTVg)gmc(Nf@+{mAZo9EQwd@$d+&RD8Sy~IpQB0A zD_SQ6ucazzk2_1sGZz-7812$0VM6|}}9#z=HA0y+T&^5pV!AiEcbR?GYTrTYH zS&dlulc#{9Vec+AIiijQ&$3)cB)2y8mfLrz@B#zj+g=S(wz4bRiq?PVVwPC>GsM z%~&r%3mP&H=(n@nbRjfg`k2PNBh`vn-knsbKgdpmA>K>%4Rdn~#f-Kk*bpU`qK|&j z)aYDF44zW^CwTXlvYDro#gCBo0pv6;sg4cLIR^{Ou1^mrRv<0J57s$Q8tq~Hhs#0} z(jTY})$*95Ze@d#+ajtFuHdOXJiSQh#D9!5#MaTt<_bg?FOMR&{{VQOPI&R_Lk->Q z)8U1T#2;}KT}K;qBk-r)xlDMV&VBV6eUrt>f#OyRfx}1&$jAVd!RTqXqSxC}bup2( zo>4^!?{kews!QoKfwa7mF8c-lGZ$W$2^dv~@ZcD3m!orT$X!?=NLDPW~)>0QLdoHO190 z!MW!k;dzzHVW!&T1)c|~j#LJ_SP#^Ev>{lGC)Ga-$y%av3kk9JVw>fKM2b(H8G8Pa zsCO0-N-+UF9PVaCO3(Ef+G}WPlFfA9J47-TYIp;>i>UE!F|YtB?n`yib!wHp$oiPg zXY6If@!MmG$4aFooRRCgo`em(629)bv1DPQfk!SSB&(&aCg%bAiR654-U}P(7W&E% z6MCJJ>`_G>eioi$+vg1_=%9E3TI)}3Y}i|+s)pj_(z>o(_`Bbdzl!FS2zr6+(x#7F zOHJL!CJUu9CYH>LrZC$KF%?Mq%yv9QpaqHPiV`I_R#aMe8PeY`+f!U{F znbDfH6Reob98f2v zZ36WOm8~o0N%1;)jM5c#)ybLFDjQ2tmS{qi#PVFmC>6ApkshWd6>3(08W5-L&5qa> z0pWIh(Cd_3Sy63I%$(h^KP38+s2UbOMlt9QA~1;T|YV9@UlNN-Oj zl=lzjIgTlnT!u1Dt>G+Z@VfgBxJ6Q$;xb+QlewImJIHPGR}*ZO(Zkxpr0hz5j~_iH z(T55gl7y}Xqcmm7`R5Vt4+%5!J@!1$3mYar<|;DXMry(tHy;Z1uZTZxp+OVjc9Dw@ z!Aq7#O3gI>*EHUsI3;=tWfh*VZQ{O!fWMmM$ZVodVh0OvPR@7sZI&q;B?8 zr=Eqm&uuzL3b;|ZK>&so_G>qD_^vOo*u!Or2> zpx@m!;5E4fqSk>{FS-z(J+H?0N8~Io@)==iosCr8MR3fk>QargnhI6DnimRUa+&)r zn6UIRJci7`qJ+gEEkV|l1bZ|t@m05;+i?qiK_om*ceuqYYx~(N)=Hh!uUb-?5Qg+2 z6n66GgWK{IZfR{b&K;s zp%hY<+;b^#ipYvL5&$d%3JUcajQgfHim;DtmBO^aZ2rq-3Kl@D0+~9RRY9Spe16Sv zUNLpsY=a^f6~-qcZ*TK5z{_vH()D@~zMHAj-KUu=U4SYakiD6O&jd0}AdWTM?cg-0 zH~~_KqI8bZ(Na^JwVj~9dit|EQfcUXK{W`K6dv7F+)s%I6YvX36yn{D z=+lm(TjFv10&L{?XK8qSt&N^e1(9#bMt4B_#VGDwf#{*C-E|!5aji{LB6qs29#i(_ zwsKy(9a$&KLn-c-M-23Th(o^J|^emvb$xY1wIi@qQ0EU zKN6i%j83NnC#ecD`Jo8wmUhN$F9G9x$_ue`W1LeQ(G{b^Z~<+#9SV@X zdKYMgar}Qhkw%jpjk>&zO&RUrl28w@lvA#Tl9broML;xMQpGG%G;*m)5Yf?r3<&WA z9dRUzFB%sUcd{L*$MQ6~O7)shYqp+aP;W0pBMe>1SlC#)X8;9BGzrsb zm%vGC{{X=_V%=h3_!{fb^#vE9_^IXY)CW(w5FFPvoPo`152vl0;Fd;*@B>G?Zd3nT@cT^nyxnxO9awG zD(#XsD(ZZQ(~>Z;#iuZ#F~PtQky^BbrS_T-h;aSB<~f^oxW?mNc$Ky>FC1hL0sJyD zw}J7dldZhc`flV@K0_OQj=Pr9_7;NT7G#kd_LR`jii7rzbQF>ZT)OJwn&H@Me8(iR z$K4ke(?9Rbe~VxhKV^I?sCV}U7+m)GfWoR>jlWt@!;-VnaC|?@Tif8SQx9(vQbmRs z-Q;g3E=X$Y%}(hhTmN>%N@b zrgg_j&ea*MKZ0)l*{+MI8>PWlEpOI!e9(oy(#GoUQ5C#xBYEuv(0ffhw1>#n3X+z{ z+~7+=G|gsJhw=+|D=n+9$LT9j?PeZI-Umu;+)l~C587^8Xjtmj zlpo!!0_Rq9TJDSJCOGKAy!zZ;t?EJCwhN+yg^Xok3ozXvoTXt1p<) zg~6c-o7)aB*()mxp&zKPnu6Vq(9{Mpbf&HsQE~S#j{g7*$J*Q&_8D)lBCgO4BXBj> zE;T&;;LcsIzn3O#o{uVTd`@4 zwUX}Sg5H!WS+mDXKoa`h4M7bfd0Huyg!&BOS`GZ1F6uX%SF%SJMtu7YVqQ+g}Rm>dr?# zAm?UO34jhDA>~rc6bh5j54TcNU{zdBH{Gt*VtDQ+8)=VOebX|+=0Pg+xm6S6)$U4ulL>CMpD;!$V#OMUG{RHxm7j6bU7y->8CgU01>5CUhH1r zvK;Rxk--OCW$P@^q>2%gm7@v|=>w?@exX%Kb!=gNlZp@0lw{WIhi~|IHhbJ|NZh_@ z2zz+qnIVa7z!j2(S>$cTlpY;4mpX_}n}4J(4+^}u_tzpb@ekgr1prm5Xlv6jl3U!0t0PF0R3vK-;M-yI2;D}#A86dVcE#sOlC)QsJ3+jX zAwH&tv&1Wz=il0@&vj?Z!OSw4OWXIohZ%D5KuRo2LHV{PO3>*tUrBHSo_&KQe9fi{ zHx|SxmM0UHb3wXgJgmoPewQ%$tSz>8lHN1HcNmr%Xvsy|)F9LqZ+DK7s;S)+;F#y> zH?-2iOfgC~ill;BSX15m${lqkiBsKgrD4YKw^_Um``p{wM$*e`Al~E;%9IwzlB`zNMXM-9U8>9n zL0z?{mYmwI*ePxabDA+c6L)Yp68cf40P68US)mGhig3O`$}a`3CfTNa!Ak&0sqz3+ zvHLtc>7_NKq)8xPsZQ)aXz+Y(lFO0eMdj=uJ=}8vy^=v%r42qGw@&UGWS2H)<(;Nx za|6UU1UUXRkA*Dq!b^DBKmt9=OECmiy-(k- zFxc%Uxx6m8bG5~Z2eX3o%Zr9G-mIZ(#RWXHJbO~(vwf_z<<^-CyY<})e&*hVl!gMV z!*8EauS|`V%_C{Ch0z%%6$H?Ir9yWDwK>iuBhJ9wW492q0r4V}@cM)NBS~`zQLpxg zLf)eexc(!(2jg+qxhvSLtfDhq%y!2b{{ZlG14&hoK>1!6!B-UV;-60OoJ7}Ir}eI# z52T7&Q7SqSN)l`4dV93+gz;LdeV*Pg45wSqEQj8bSD2gIe5Cl%6G?S%D?(#MEX1pA z=m%XeNExiO@H#mi9~P1khYaoBS@O1bS(_(=8t18yc#;h&Jge+Fskq$YJ_b9)v>u<@ zjI!%^t6D2WU6t)85c%7Q9{Nj2=0eZ~DiK{lV!cP^^3-FvOeh(o_tjip`el-nBz_EW z96gJ3ac(DR!X(GRB7D`vMWeZtsAA+)9==-V&64eBFs;VS)<9rr02Z82I%a{h{hj8R zYj(Pt-DI^y^%_9iJ`lT!`1bjG4y4=fmh!ka5Kl0?=3TZ%)Q=Df4}@be**;Z`vB=7? zS4JjLD~f#bp4IUPA;rAd=&TZJ$Y{|iLniux zZq@yx0 zhPiEZxJOcTI<2NS(DOsBgZ}`wD?w7ByT9AMIf>#ee-(^a>$o;OvqCm+^&Bfi;Qk{+ zUugR)se4qnt(-PpMUKwAC_V|9n7{=O1clbMMO$rcE^ek+Euv|rev29c%znT$m%XhO zaiC5|6P{?%QjhVx4hV6oa(1qlt~#q$pq~N%0CQ9mZiUbA9}1z}A9rsyhc(R{FwF|* zIJR3HUf|kFwgmp}a;IM~J)YQ`Xp$dD3*yQeWwuZu< zqDVIrx2pJ+qj=P69rWyuGpmy8XAzo`oBi>dH^?v;yO?cYx3#xlN<@iK3k0B0#)^Iu z_iB%Axpa39j%Vv|0*B&{-XOV%IxtuqPJM|6z^f2^M?$;>X$ctB-cihURnp zL9^LDMA;E@bTT(KVlicP=`X<^+MT(O}gX+GCR40+6nES78L`=-f#5uuak0LSSc%<&l}~vrRO;X;n-XrLk4k1 z&hHxwB%kefWh4cioASp_p4~^5BEyPtuBu4sq@>^NFKuy|J5|c%*!nO1RBPhjdGOVA z&oVf+v}jw+pKW9?He%5E9x5x4A9^_D{iou0c)3>`3>P74l{U(eXCr zra4&J9w1^nRdC2y&0~8ttiqB+#ZTRJA^6LC zcW&{o!bhEToZLmk7kxb;(eZb0a?otne>?zT(&NLibI-@_F(IwKRWe`2Bim;>)8Q*p zcKgLYR;+9#X%39DQ{FIL^#;o8GRZohrCi2Gu&5gdCyyl_`(roD%BFY-sG_%3Z(!6p z0cjxMQ#L@k?Q>hLwFlUY@|epwj!Nq82w{%mJ?ph;vBGrQ{xfyyrU5lutL?fd+boZ3 zTGzJ@!`P2|3D}G`D6(wdCsvxyLH^5Tj?s;#qkFQ^i9eJBs$I)`Y%l4ynuco`9jAaj z+;UBhQP>XLTH)N{Eyfn|G$IS-D%e<=*sB4UecAEwK27pRrJP)gRlHvC@wJ9p|(C?jdaVowDB0PRLFT=QO3;+wgz zrmoZ7SjZ#BHJ!^wRW2ZwMJm+j!Algc+PXwL^SF?r^cv%UqNm);i`{XKMR$g|aVfWN z-Oi$dNYCMF9}jr;>q~2L$>R@hMMb!P#Qh~pb6DN@?-sj0c1;mID^!uXevL=7cj`QL zs!IxqWCtqY?ZSb|UamK1^ z8HLPdt}d;uk`*?fdiPR4ryNQehx~oog(T6$&|Sq@vLfSxlaGL9WlNW`$m6GIkhw!M zMo=eKWo9(}I*u=xNCmDQ%+u0ZxwwMW3u>|6!8^|$3X_nM?UCewl06~uI@jU<02fm3E(>A~qJe7@8zb5r=9*zoh*l@~ zzaYi(3l1rZ#Q}&wpE*3yyGCNA3ke6p3R0VOQZ(r#pBE)9=TWXWsr=?A3!1n76__^D zLo=&KWh;=?LGbO`RH;5650<$bh&8H7W)uN$<@Y?2-vC>Tx~tq$hHW*1uPWRv>$?-crO>=0GXDuLEZ^|8@haVh9o;0m!bmg?8UYhxrNdOm8 zxy+(%M+YEI?UGy}?-+5~u?#+Wt| zWN-3uEv387oti~!Y*yccsM;sFU<$=^Lr~4|sQh0SQC}P-$4JMuS;=tLg5$&DjrkAB zac&uLW0AKxtE`N#ZXsBRNvEBDBxx8jg+xk%O?rFvcM}_L9WzuqCBC0aMG5#0YO;3= zfZTDLs4gwmNpQESrq=1G+hqz2kjOwAT~B}`sOl@HVV$xHgx&t#C9Cwm-lO;xrTyP9 z#oO58lQnZB;4Usu408|6uUde+dhR|RI(b0~=yx9H3?Oe{opos_x+;c*qe6r zt?#cAJc*B?_}}8KJjniCQN(LBk9Xkvuv=ZF-6;Bl%p=3?Qkjh2diRvej>X)RAu+O|+$ytnLrPS=9rdVgi zZ+T>ZWG^I((D~Ob9l582ej-5W*H!y0X76!>rgex%j!IJ?SEKr-@;hy`wn83sQ@oW} zJA$w;D!eezD>Y3$z8cotT()T(_T^RQ+b*w_W~BpXX>)mX4W+D2HO<4UP(p&N?&gZB z2bm{Kt5s(BSJST_<8Z(^UPIOA85>!q$6{a`qqId&ifM?h;+3UM2IE0f*H!zK(1sT{ zo(gS@WXK5^RdB_U=iEv|VPS=mbl+csKUOzCw64DwUw*STm$5u*>H*%h^RzoA)fXN$ z2QcFE<-3!NTvi_1EwbL*{{ZPI8I@8(0A^K*y0JCsN|zX@vM(rW?mpRwMO8QP>>sMP)A1b8oyK|5NLBtOZy|YVkwrB{D z(u?sS2Cb(p99-tUHqfw)R3P9man7MoM_sPV>?CX1Ldp?}Y4+>s>zQ)9m}I+!v6#6R zd7Z+UNHi)0WP-J?iTxTEKu%kZ(?!Gbw$@nAKQ;ZNc9Eo)Xq&!bQdxQ8S$NkM zd36dcucuA8v~YBdYu<6MkXBUYu4<)EAARtvm2a!HHuH9N)6$UEjWs%I0&Tc19Z`hi7PG5`3-tpU~ zw78BN30UQE;S6xdi{R=M3bXi-bwve}qYtPCpe+^>ANdevOsB(T%PiGwas?70uErR<0@^Dkoc)1_3K)( zAk-sFKWn*_E$^P*8%2_gsdX~NAXXh2qx@iX_E%k^;dmL8OO5PDJo&e}1{d8^NQA@^ zeYK2fB!uRNaw|i2OP=E;lH=00o!y8ri5f7q>r!1*ecJ8`Cx8a=pWTq<))&2tytH=s zSCBA9cNsj2%%CFNJQhSF}z2Jq0vfyS9q>Q(6B2m2DNSurO59zMM(8?>)Ms0|rO^ zswMMX#*9DC6&k+Vq}31~mjzjJ$~wHz9fQP|uso)bEQ(zF06sr{-ut-3Y#=*OIQ=_Ss>54<3zSc1B_{O5Z7BhX^E3vu z*O>h5fYe~O`&Xvztm6%)r;N!{*4cclk6A8g#8YrpQb)3&YGjvF7(fPaYSn6U9I0ga1$>YCVkYGV6AT-r$ce$}1dA<-~2^E7?mVqI$eQmc#f z{mVvYirU&X~^;?g@< z-y0pNmfir{SV{)%ipQW<)JZq366qrfDUfV!k|65iR1weqp`yauZMnu5nn4tnidZ~y z8Y@VSJhtxXwcgwQ1;)K4ZalCsg!8q49$5|zv)%1cH)c{aKBR`kC zYSmG%zexP93tMcS4QmD5lL^Jb#2l3>1q%`>O}d41bjY00@5PdzZEE==bB0Y%oQHF9 z_%^$?zZ1;Xu_UqF?FZB{HqfP4z^Nj>?MD6DAo9*3N^Z|1qt-H6mE$}olRc%^AhrG@ zc9dke^vH@L!nF-b0q;7VLtHW9tB$4}HBmgPu)Vs>W8{ILXlg2yV#*qw7`IJI>ga^;Xk5i|? z4GOvKd)-wt&A8qZEr^m^$$nnq$~JiK)2m0dYDe^kyIq2JvDIo#{gg9BrcY;oVxnEg z=22$mOB-kPEiGhc5(ZFA}S}z|IkJi?J{x0HCv)RjU7KgsA;M&v<p+DF<6_oFUF$T1mAJn_51cO0wffEipJ z{X7M9>%(ZL+uBjo;G*p@91{nbvbe+JA+u+Np`HH#X@v+Rog~H@MH6=0Z%MBp29wK@ zBbS`vq6P=Qwnn828B)K?rw*FtkSwvPLVp>@@$T+k+}u9fOYN*Ai{l%lDna%TSasHK zd$oMg7PByFs5dG@e1Dt|ifeZRJ;*cII}AQJTdj`abtLxd=+4a*Kt=$71s=UMl-k@e z4rtWXce7bh?vkaXP-o3~?f(E|uso_5Zu5MGW`(NI<5A3WA1{cxYJJt!ycY~}i$j{% z4hlB+x;>6DH(QHysWe?2&#`<{0~BqGxSsiDnJtVmx5F8F_{s;xN_Y;sOYVnIF|O3( z%Yu7l+&bO~8A>*}=Ayfw%I>h8r?<1emG80_!b>|_i6{a@Dyk7_;E|6X9aGp_{LbT0 zd@*LA?*ceA=%B6uamO-;yHVO4FyV4@9Oc9iyR36r&u~wr2k!@`O|`6#PiIflt^9_9 zt1)8aK?dKAkaR{Q8ZCUrj-IU1Wq$j8T0pCtMGxHGH^+HgxNHtm zdvPt*w6e!w>{X^AJ`)*QP^qZ~y6a616L8x-(7F0**3zevraa$+UGctUHyuVd3|UR9 z8g3~k;oJw9@IR+dNbtZ($R;3((!4RblAj&5?fr%l-V}}`Ia$C-E=Z|UO1{#4n)5y5 zb$rCs_y+~(5!**;4p|DG)LERt+SyGE4N1WssCEN&N%PfJwacCf%Yt^w=v_zDE&6sY zypI{TOjoNZS?zAr8;fQDpbjVq8fGiPWT3&#$f)t|0!fS{WUD`Q_#$90lJ?3yxch=o zsQivRzQQ%>TOQ_TZkKt&qTlw>84|EjhcU@7^?tKShuc0eg}S&*o!&sdq470@6%v!| zH1gF3@p~gifZYE87X;XRVnNje$Jv@;^9+7JJ&${9ysXG0W)V9Bu^|GhxP|=Q9ZsmM zBNNMjP)+DAdv ziFWYw*gwOn2iQ#`s%RIdMe3^yW(Gza>T(F$+pv>K9c0g2D-X-C{{V%CkJ+F3nxi|{ zan}f)?@`%K$z-k2v>97z>EJfFuiiInhiH&wK~F>LyL0Db+L7JX;2CT~3)vu6L0?u# zSUS_%dO4I!u<#cSlzI zNInzRny$UM`BnzDq>QV?cc>O|{KS~~2X%78jv+C*Z(?ojF;U(@5?o$dSjTH@j6%dD zK*QINwE+kkst=y4BEFt8M~XDMzQU|#u?4khsSTp9T$Ts7v5OD#)_#S9ywlv<#$}RO zTj4Kpase$t(NGYhT6m*rCQ6#PU=Jl%1;d;v%MKq8y)-v}_h{G4{{ZlsiUPafmRu*6 z=6L2h_SV5;^s+GeR|Z55Li?-X;&nRfXpZ2u&aGRLt{2aXP;ER&legH5xMt+#qa)S8 z-LjA>8BWp}Pnc~#bt76B2j>AqwU9lorv^Bv-Y>whIS4L}XCj!bmd!n)%04M+;Xr(v zpAWZDw;RbLBcjfrCmL{4Ep$j-t@YSQL;o7}}YI|R26Nlsj+7UI(l0^$h^D?4}u_xJ~ z=7CON1keRuIc4NGnftln>V>Ee+2g79Y%PoeytC9-43_ckVW`X8wP7=t7?+u%jU*E; z*H;J2z=Ab#V}9#$OF%VQo4Yp51xXY~m>gvMk27s$hl|#|iU}?!k_y!P8@)9n&uX1_ z)f+MIJkg$EzbF9B(P*u2OJXL2bGTz7Ey8v%aSEZ#VWSuVO`4A9Xx#XZs+w5s@A+! z7RR_nWgMa7#X+P~mj%bkc?5ZOw)Em?mINxnjY%Z?y`Ea*TSUh9yNklwH%MqqP8r>d z>{xt%7{lMmi4n!JS>cIfoyvk+Yq8pkPjz)j-%I?}*?4ZZxZnw(9pj3Q{n`lN9a_V1PxZr-20wQW2aj!kYI_^Eqd{{Uq( zydlk}7gOx2AGYQff5Yx_nR_@ge0{H8+S!5&d#KixR){abww@rG*Uw!$TT4N2f!ujj zOpfwio2GaVgI=Ca>>*BLdy@EkQOj|@OL=E%jxrzgDZRpCFjEoK_n5sxBPZiPY`` zl8DLk44tgP!!ZVY;#iFpIqVV~KYlAH(%U@h$@-~l+ zxQc>!CqA6Rpr}0t?cN{`np;>%1-OLao`Q!mxprb=n1nGP5t58aRFzl4qvAWC-%h$$ z>NsM$0~$Nmc0DthSY=!-tnF<83nQYF9AZPYy+~K{Rl^zz2D`w?n!bxAd37<87LG->vvnx#8*W*BUlpkF_h@a~qpJuB z(*s?RQ^T5LBE5>+C2}D*5~`_kRY7`yXbpOvoqB0;2guUy0XHOU7%o2b78lAYg zbgl&Eh1Wlxy}X+8^C2O!otQz1Z|Y)*6X|p$pH)YTR=z%3q`JK_648?My_eIhwrG7x zdHYvgY_d4(>r9`faE2n;H@Gy4GyzMKj{H$3lo$R->#?>CHQ~-J~ zRs1VoaMC4awvd{hKBEf`ML9TUGsHeW*M@OzIQU6ZMnXk=M~0}Ge|Kj6K6ZAmIovk; zh^7Qr42VRWJGl6)k3Y1;0N0puguZZjU{b;J2l-1 znD{A$d8wbO?p+=`irQdo^77eV+>iF0IEg~dZp5i2fTF6?;oGDYZv4_)v;EJ5kF1zX z#D#GaI?Dv$RjuYy2yyPH)JMQNn)!-3Uu_qy1E%v&%1&LNr#B#v0i2pVo;M|H^Kyd0 z65(Nbw~2|#0IBhzJvCbf<8!vP(Yi4`tBx2}o#AFTk4auKV?B{No#p`3+7IzVclSRp zbp|$Ulm{hx;y98^m6}ezXJLJ!npD1}e6YEe(DY%ah=$YSf~k+v`;FY~`PXS}a&xME zf~6%phs1N-cRMO&N2s?X$!~U``f@M3*hiSu&A#S2Vj4JbT3e00+R>Eo@I+ruQ)1%p z1_|;TX}&>fTf^oIZR!5M4}Pa8>crb-Y_Xm0<&o!@!*P*{58)RxpM=_MQUVjxZtzFA zj=IWk?t2cZRfeFg1(?+c4a^#&p^dbc_mL3F-9bVK{aVHwcwLAho$6Q2IABzFE#(|v zjd0woS&8Ckt}UgGD-yuGrPQv_zBKF9_zhp}FQjHBV^hQLQRHi%Ab&0?O_e6!=@lX5 zL6&KxFNuy~cZF-6*4qK<7iCEPkGosA#tNG0z{p5TpQjAXwVxx%*-tXWFJMCww@uF* z8c_X?b(ZygxqK~f71DkMTI@%}=JNqrt9^!rkT>|s59`;P2Wd4|Pp<-{t>J`&vJ_S# zfQ24Eqfs$v4%3j<`u*n^?h9Kv~!X2W6->dDiEitw;=5YZ+ zcqPTdAgPCDR?2STV`03BB@>re{YBmuO}m2u;ZZ}cNRh>@s8m(vuRWw93w^O(2;qr- zBM^-O&{Xdtw5FpQgPMFo;BqxNVVcm{Y!S1T{!E{(X$3t=ePTkB&`>Qaxbz;~G;TQ6 zN*i?IK+Oa>%Z7eY#38eLqT)scSJ7|l$#28ak3rMK^wJH$QyH<`x=lKB{9Vai-~L%) zKW{Hy!Z7j564k;GRZOf6cP~N!)SG8&#X{UHpKRdQ@j;(UJR=95k1=(cfu@GoLYC@| z(fo22EmE|v!lO%`)sl}AHvQInLgNtwS7lS_`%%D%{{YaWP%3JdGSq?hn*G{~`&GXq z?^dk!W<XxZp4f7Xie3S;$So*jZemv|uFNG^@BZY59*|hr`5ah^%eotpUTeSl;h@ zov3Mh*mZv>Qun>2;B#5rLNW3ec%4xC()41dX%#(s>PvRG8fpQrdZ~A+Z=4HU;Y0kR zC0u@b4KXw9R^;Ib0ohzH@_RURW&6j|JOr$%S9*vQ4y_m;P}H*H@_ zEo#Q*HZ`bciGC&V{5~H2LY4B46$uwRWH&juwbY{5j=#9#`F8br4dv~R%cz3J;@)-} z=oFp9pdy_*bnw(S+`JkVpK@};We_;HOiO7>6Nki~f-SSm!Fr-Re0Nzjjaf+fSxY|Q zU9IXWprQQL(~W!1K-E|X+5pr>3J;v{UOjQcau*z$2rd0UuNF8sW{y<{aomUDZ}Cq} zSw>w?5``dba8&lqzFsUoPTG<^vu$-fDRBhmWkdcvY$>G_kgcWDNu zA&g1l(>M5|uiH&Z*tU~t84mN4if;DgNx{Aj3#*T|^CitcBR#)oEr`oO5 z{kl%3*G+LsF~3frFji_SoMqwzb#DyJd`yU}f0JA-Y0M^z8h9>ys5s;bUOaW6ap&lv z{!y-Um^cN&3ppT8YnYx~e9lsrNJEVr% zN4%bA+ikb^f`_8h+5p!Kjnk^QE|w5zb4EC?r_Sf(VKS~dJ9VHcCz%wGMS2C_`t=w0 z2zVN&g{#j5()xekxt#5);Z16a0*?#1)!6f zvjJ_*y-h1kJ>k-u8i_SkU+Ut@5p#sRU&s5%h#p{o-}k!i*#7|3cT6T&N0L z8=AZl+S^Scy|S{#H-JhZVOlVwbo+FNMje`y4djt|N-plScD!Gk-r?{qTMKo8;F?k< zlCngy6S=y0x3ftQv?pZTr+x*=dnA%eBS|9{k2mtia)~ zJ0ILkjn%Aj-`OJkt-~nZl|kTiAtkgSW`r+r$k9rYFXBcFE8$RUt`Sj0raw!892JPb z_X)3Y(9IJGb|^AzJDGP1?QlAR4^3dMwt~kIOc$@(7%rG3jE@k+R~D5gbxuH0CF{i-DlB%{!+EkANGt0 z>yy|m#oIfmU?Uw*v{zIYw^f%uO47zkGM%Xb-mEp$uY|R zrX{Xtn@;AK{{X@zzy{6%~DJrwHrhiSmcBEui^tQFjAfY~$V%?w0N#z_-pVCOy zSJaZ|d?)#j)UWoV`Y-PZ+05~2cJ~q$sr0BD&a|eoHy5>@qp@i0B%=dQHPOMRzkUL- zTwF^lv{EkV9J5fRC`mfLX5ir*wRS|)+@Rb-&a-?Yht`1kc7K)PcpFZ z#4}acSMBP2hPS{kJSK|x_S?1?E(?N=#=<0fwm>ef%G9y(+O_Mpzj^UGMy1l!Pjzt| zF}uFRjTD!5pj8SgO;3;-Q$Z;Ycxb7~RZjl^_xxNLc<&rwv2|JJQBD5<(m&DjMLs`> z`2zVmMFwgVZ8M!t9ub#ntn5iOCZzb2rd5J3;@ryW&Ny+g`g+@yc^*zmT&7A~jq}~QEKL3hA4O0+0Mjc2eR%7MOoRYW zC1tptPTwWNv6&<_mMw`hbg2wBHEI1VdHY&mzbrXAt7)=a7n*Q;YwZY&j7M=U0EI=C zIA)$TuSQL;UWf11P4soSG{EMV-I(8*ajglWE$&m@TVZg|CfK9(>l6v$RE3V__MKi@ zvCVjUvi=L316XEzMkh{w)Pnk-y=W)nSS9Hlt)H(b=|d!xA8$$@)2DqM9fH$I-_ zN4-p5?)NzTfin9aXNTq8q_e|jVJ~Q(3nWq$eb(|YMhrTG)5BXwusC9?ZEl|fwa4d7 zo>#@QvtTj!{uO&39!p80^u8pX7;lJ>r>S2C(j;M^(xup5!pUDH!*%Lv-^#e( zD!Itur{lR8vDUVeiE|M#W%bkHsM-T=N^TnuPPNxw!%;+=3!7-!Csn1z_0!n4=6H`5 zxX;>h87-J(v8qL+itMVO5?6B9Y1_EdU36`&c%~uTCS*n+X&bW?RYR2IBguFDjKOwW zym2A%+*JdDef4T;zj!2DKAe=_Pk?TPdsB8RiD0&dXqcp^8I{L~H9GT0Fge5=m!LU; z&Mi2CrR<`ECevJGuLN>>AjVkItxx0{i6e|u3~m)w)4A{lwiZ-s$GLD^WN(VaWM?gI ztGGv6gG1w|*%NVfF;f`?buXujnqK#zAv{v=cu%&<{Rx$w{Q)cs;l*s zcCuV5T*_gH_{armt^9?+ctuL{cUG7uw`sB%E;C_0_A1G;&33+o^GKio3GoE`J(TOL zHu)5{FAb61JvfRe?6@&Fz0IpmA09}cNn?F)a+fJAA~U?eQDZ)1!Mcz^^3;1bNdt@H zb8DxLHL8BkV~+Y646o_vbwhH?k8wy&V~*n1_mj3V=1)^`Ce@akN$XDyY&Q9)b4IW! z%`*g=nh3-!?WO)A$CIr2Nd!=cCRkk54_L46>U=zXy)`!EyfeX?nH@C>#>ba?(&-)@p(EshDM>a{)Di+3mH6rH(*9tK zl3Q#E#U#7?*!E#1wC3s|LAluM(QfTwnSDs5jlUy%$f;j#DXi|_1lNu_fzuoGySyvi$8?Su{5ZMo z4jia^m2c0>nTr`M-IRjM6PMo<@LNpYjEs~m6tNa(LMvJ~PiD5Qw~UgqR4kVKB`bM?(0u2Vs73{&N3Q% z2<~+jqiHl+_AIxNF4DV>Shpaf_iVlH`s8&dihH|Uy zCPpzGWVe}u$q$uDrADG%L8xjTV6=Xp-XCosjQFB?%aJ@nF76*ZyEf~Nwo@3LH$0$& z(EA9~TWHLuQ?LVq)OwG1`BrqI^SpVv4$joCI<;PCq%c>Q>pSr_LeyQ`g=O@c!l%Kh zQCe$-PTQu2Idx3kY@xwff2LeMGmqImX6`8$C7MZ&DEe$sV1mkSO;&;A~H1=~prxa2e?v-|m?DJ$_ zyHpl8u-z86<;9F(;rPFbxtdFpZWzXgy|@B-cBO}N_$|$s%5sWXWiK-KP}*FvjKLH# zOGJdHS1g0UkK)&$?Ea*-iG`8FMzj(M&0@C=mg(*;l3E-vXr_MLQtvl!h+C|-ACTNz z!F7&OY@WasNu+4YBNE}7oj}{uPF?Tw-bWE+U@^w03`Ye1-LqRk)#}LYVZIP~s4m`P z=D5tY%uPdPhDSl=deH1P@BOM-q|@eWTZq68 zbj#a{;<}0}PS{)7Tv*L5?DuRV3U-)hEJ$Wh32n$I7gZNl@<#9+bm^|3d$3wfYu3oa*QP z3(qaL8p!5Kbhy5aX&HZyY82H9w?|lu_qO0MT!>a-VUt&7b+5xDY(MXHRWw1G@ z-?;o4FKn?FGPW-9S~h5YBq6Es75uHK< zZjR)VToF=womnx>Bf?c2_R_?EQKh}>s{_a~_$-QKF?S7Za-BCXgDLS=2ca5n;@y)s zOT|J=6TT;EX~i~i{{T>ScXr|)QGkN|%7l5<5%&-AWECIhYKC2f?KOq;?^jXp3?s(e zdlzgS?(M!YOqi}K9Cruv2q6Z);~m;;?H5lzDF?+m?b6(00VmvoxsQ4|FCe#;!qpQM zjF!Hoy|4kKuS30n9zNl#D@~p_&0XVnYOlH7p7BPFE%=}qrFf)SQMSn$42(RO8iT81 zDkxQBT|-r2I8SzPIlNSOzCcV;?DS-2V2Hq;y-(sE>WyUXtR#f^JVWa5TB~ce%-Z>R zqh35Xt(C9KVlGlx-mY2Ys(?*GBN}cV!R4rP%1gXoa+w$u@Z`C<22X<6xyW9vp}d3_ z-uqdqI`rN4c?}_gSK%HZDnl5>=8C;{2cBH=oRDHzSVLb$387~H0E8pJdxo`peTPA{ zIK1Y5#hBbL`p%#fV9W198nIQ1SB>&3>;_UijhP;*bY&!f%TP$^_Gm(5;yJz}F_5@v zZW9%5OHU-1EDxrhE));OcQ?SJuBm0)OQgdhy%xvS@yBKZ#;KYp2Q)L!x%tfn#A0{b zaoc9y9BtA|nFoyX`$_z(<*Rt&Y-3AuSX*H&M2u;N^*nA~SMT_ku$Xd(0 zS5|h-)nJp+4xsrGeIkF&)C09!lTy*{Q^x5n7aQOGJ8@}-M6 zA_a}Q{@ao6)TpglACv%?lJ)P*rEhk7!=LURMl*7v&ktxxu*RXPuS#!_^xX96;XpbK zNKncQ!(`>gWT3r_RiSE?_NnMc=+ie4i5OaVsWx{e8AHbfVfcqXx43}?rci|-5fPAX zQ|v0*^XvVrwD_6uUX06&dzOa++)=DN!r(``T%Op#_?Wsc>*=bKYC-UW@lm9LCgXxp z_p7=VSqyl<;%oPOFRe+QQ0 zK3j_PCpNN4aFKk#@j)rr#D9{!5I+cmr^ z9C65uYEi4akx};Qk+#@kR<3_jY9O{I)wvS8;qBiKft99N=PT3q*DtrBsQ6cCG(H~9 zI4#&Suf0W=)R%5JXm4;`X@}r;6p?If<7EVTjyEs|#1iD`LI!eBrrxffoQ_EksjU7U zPCIX5jd-?6be{#j#ZV)RlTf}rPONR309BV0K1^Oqk7^3+$9J!IW;-Kq3R|>K>B%g2 zA-*D~Xei1-9z8~+sOgTsRL;h;MQONoS_kNTpzhIJ5CA-J?pYVr1-u}%Hr7$I63w+4 zYRAQm4^nheiAC;qWqChTH}h{uW3g8##a)B++6nSLS`t-u{?z2H`3vUkB{ug=?DgnF zZZ%-b;6XlG5U!7CJBx_U@!MC1?NaSgMA3(#4Nr(4eRa~gK$!AnKy@4TiVw1y7ZpeECvj)UD6w@7D;fXkIV5 zOp;31F6}kbiW`aKGf7YA`3(Rfi;^g8a`q2N88Y#feXf2P6W#qSbqWQQm5Q*V4ul;D zOisYUW$tb^g1bYv=%$p+*Bz4I^&x020JlI$zkAKd)PJm&IZydbFV z{{V?DfAc3w87>^vaXu$VN=@#}^PFxr6~<38+Fm2GTTJ9CNFVaIocVCnhn~T{l&WKy#=B=&l z*=RM&;7y4(eprY)d5{$&=MI>^wOm{- zV}xWZBD}F>SY}Y*MLUI|_6qAit|s8-=_HpO3q$H zi9ROk#L~2;kux zyl6tJ+@B2=6OdnGp}vPD6`ZCx@9pd9N~5TCuiK#tFG3Wr8{+x?OOhDe6_l6vy9|aX z=r*Fz7iMCrstFxQ(1iEnJ+AJD9N@f%i%AWV&B-H+<>M2p?pYW{Ns&oK_kN!Z2ufac z+D>=E0?D4oY_)O}Ufa6QZXEvrt7#)7EBl(B?Fd1-5WbBFR(rGm08aQj%pN@91-eGk4b23mK{Gg^+T9mXWp=PzK&>s<>vy(7NF9Kq-gor%h~_sJIb7}S z-V$_$A+%Vhwrged$K!a4F5_C);~GpYEEs^Cyq~S5t$Ur>L(Zz5^85mE?n{uu$9)b- zETu7}^}T&5MF9-8`+ARVr8U5cg;y+Pj?!~c8d7as9>>K7JAmVaakF}nnIx4#C`)+t z*P8FvmqzK*HMJZ#;I&roVTr8{7zAg1bp*utREl_y4QDzN7gV*??kaRX9w~Xvxt*5? zjttGlId7%hW41{~(irswSIgV2&!!-jH@Ll|0u&AMc;t)#;iw#ycp|=Wy3G$r+y_*-v{rELu(v9%jyTqkar=99 zkyv_SwD+(5-B3?Fk(acOF)Cz)y}`g>ggc3jOO7*@ia!^$l~>EbNz{#^QYT^lV5Ys* zg~0MEu=ewt-|)UqYn!v`(6IFsc$BCnpQFRiUc9{Yg@5>earoaU!N-xYyo5+&SuSmi ziMlPzyRTovO$}{QWRNf_>EG|Dc&`NfbBo*wAPi%nSHE-jALZ}Gnc)IXCSN)R;34-KJ%r< zTU=Jx)7H^M&ax1CH0Icy~KJ7(;)N;>kH|A$a8}o72KG2w4-#5gr z?We=#Zle;(9SXVXweUSWJ-U8k!+|S8?vQDYLeSR?LFLU?484qY83}Eooo-@7`?=G> zl=x~A^LzVI1f_w&;ABEzcE`9DSiD`{4wtZJaASMw;jd7<}AclDvc)E&1l31 zAo!H~4!qNM+GT~+Zd?!ExBWqO!06paCJmx-D6HD??gi2sELP{EuU@@9qgnY4!FG@| z_Na23=R2kVXY*%O&6VUFO3K}*w~Zr}SND=j&_us!^V6_e+&s{nJ2x8=7#+Ev1b03Ff2@y>*|G%1H?>7_7{;7m{3w1CES{ z=iH_8e8%G)b!$FyIn(Auaz@jTeMp4?R(__tMF+D{E$kweCx#lmxC&$y-Nl964`ZAw z85JY(Q<4|%o@2L}{KI8%md%e>g%z#PioA*_Sg0(c{5qerLw5{%B_Y`S6o<;=Akf-I zbE;bXn$amL@AezH7@lFmZLzsg6W?QzV3IeWW>x4IevNSAfJn(ia=a&hBFPvruwi)) zB_w9BxsiPtV^%dDqBN^UU+9uG9Kzm8b7sRAQ6F&2JoY;kE<>N*SY2hw^%6T&*$u2= zX|Ovn-p9n6P-*5c4hl5V6UM1c%&}Je(&ckp1!{3IF{aZe8o zMtfv3xAH5iX>H=Mc&@46g*hechA-}$w+2d3e;VoGU-s43muMB#7AJNmNTTC5a@+mjtyGVGsrJ3N#$H^Rd9OK z%}%Z6V5LnIn^5Y6cq-pn0)nKTfO!7^^BY*-#qC=W<@SAwABf%ZTsAiH&OAlIT#O$t zIGWCOWnR5k;S@biuP%1jZd}K?^f8)_{?(Z`62v5HX-NeS@Wo7HGd!-&87(a>uVT0P zX<&*3f_{cl3qM7vke;>j@EtWKZL;0ebBHh02|rE>3^z9n8W?lJmFJ(gwS2VW_xzhF zE9FJioWdqDUcIEp)N~YDfTE5^iSwtoQMU_`Wf%}Qs5NC=tM(~YR?oSV^&O`SO)H4t za{6|tTa0D(muY*7ZY?LbjsF0H1bO0;AjDp^LYD%x)NRf{@YBUxZ7p>TQX^F=-F*au zP-sVi(7Fv47GeM-kUT4*h%P5J^Fre7!{cVjJB&{%8sNsqcspJZ! z7b)+R_15^YiRr1R^$(7;R$iKGagjo~^$c-}L@Ifq3Hh!=A%VNF$z(31GRU&W2KvMu z4N!nbPQE>LuC%bSjxuOOycRypHzQF@dqkZ-(CL)C*H(7^@W@otT}( z^z+mUOKy&=YpB&;?gBaO88{)YZ-lq)T$~>6!rL^`-pV3D1fG*KZC_HIE8$+1pgwxD zwwtFTNiGepI&-3}u#P7=+VpDB?Hc^L{{RhCmpaVFEO_|w_tDL4@rl`D=_);HqGG0- zhm!ef$8_B~?g4^~W=D#vhiewh4l)P2VOO=jR{sDkJ*%%D&Sk^RY}b>nVJ^%!mn|6y zEKg9bo2gCyn$UYSU%SL)7)hc}hnqCNy74RYJ;l6+eXPcEH&q+TCvd0Q@$SsAPYa6`0*zB)x3dYIy@q zKk5l-s+DAj@gUE{Gck27ZtzN-Pe53P=~`+Opb46J;Hs`po2btRY9Dgb#(8#Ik6ahD zlCZh`><#!^PF!0yL5^!%weK?88V?gVx9&_^PUv7~w`r~mMJOK>1Xicrs(0=315Co- zLF#Ka$EdqW91efQF8OyTmp^_c^u$*2d@x2lY3(%g)y1u_h<28Ab1Z7opPx`q~*b4M>#K|AgfF@fn_Zdg zwf8>7XzQr+y`q|hQ_*VRXqK7VYl}R^^^L^eGc~00 zK-UD5xWvUODo>3x^I8DI1cyAkJXC&^kiM#xGyjfP%Y4 z^4{8ehuI2mZyIZ>i)qH*gl91jsp5KTfP%ZEslE@vulaTC_Lg%bF9d$089WH#5?xV!+_s3a>kzxOriC4hk-7dEk)8G;I`v#T*qspz14_ zT4+TS#ymJw8in4RYdYB3GJhp1*hDJ#EQBYp3Y~XBrBi<}&01@UjM5X!eVv`n<-%Lr zMrE2qL`CsBawwelX=tfPl2*pj=NbTtvfZ=H*kElkDzeRWCi8n|=#}&WpM;4wA5(Da z&~((t?Q^tNin1;8)<@_L#RycZd4fLT2-E@K<2l}Q%Iz>#Gc1{GiE$jaaxhY2 ziKIK;j(-eiNdlQJlU&iS{hhfd{^_{K{{TIr{{Tl$blu3L>KxX8+24|X?w5>z^V%=; zbabD{u4^3EO^?$rHONe0u+8z?xx$w*L6S)yXz^{RgwsiTOMJqMpn|x$r_-lC;v8!8 zk!5DbK0d_6Cl=QxSwDRsi72}l^EbCi4hJRFuGdh##~iNIjai$+h)E zdop@)JdZ^}|e;{p6Zd~U+$6cTwi8~}Kq;s^duN65|jO7HFveqe|1dtJ+5 z=dHmlp^G8NJ|9jySyaU!dvS6KODCqZ^o@GzBA7AB6=S;r-^^_OzCR5utlzg4^_r9R z(tf(_4O%`*HQBO%1CbS3b*`&FSZ-CAKo`m#$Nt zy5xDgyw+y_0OoRcY#L{c2?m30DoXeODbkweqIf0fXc)Oo@Gf_I#-qNp#pN2nWTI$f zl2}7WM_s3JR%TJ}16*^Q2312NV~?7i#37Q#UE{8ey~qKm865~@bZ^4w!=owC$pghg zCWX0m?Y{os+1hhl?c5dl(^YSQ+cgE-yJdXaMrp)bFThsB3WgcMwVA;By(1FB$9pP z>OcTwn$T`(|sEQyWbp zRsyDsQHyjnE8(FD#gqDg?`ILm#`%mzfs22o>g}f2r$9jPtq!_?m0iT|w>syRX2UHk zFyo6WwY9uq0~9q~$HdU}*ASOl5WeU_>9opZtjRWab6XSR=*aQbpW>0EmIIhhwr8|Z zIFD-IbI3E-Q8ZUsE2-jPMvhtJbtB#xh}U$EOPy!ZnvcClopm<8XhJ*S9o^6H*rbBo z8=GbztSuo$UmExZt$J&eO4j6MFV!z5bfRKyk&lb-YX1Pe8UsM!xLkRq*DvS!K2+vR zk^?0{jE8a)+d$Rv(_xO)Qsp7jFt&lX^RMti`gKNL)>#!~W$_6RxhVi!7D>i?i8WNp9|?9in2jQ{oLY0=Pgqu6+xu=7cQJh4#7-q=zBM{{RDQ zF_4=!kVq7t3VD5+6_4(6{I|=K;IGgwd|pQ58<2wf+|pigC#?Qp2xods)0Jt!!AG%j7;K6wm}IFvOcPaLfiib#x6m);Es*FdU{ ziSS*o=UKE8*kUJWNC(!DN+l1SPNcHVM|O9r*>`((8fw%><;UtoqZ!sg2O7Kg!(+Eea2YX1P!%$73aM^lz+Zr|!UNEq7o15dpSxSlo(D386F~5Jf>1 z_Kiq_X3D_!`?O!o@e3mNlFLBooYjl+YSj`O&h(1IgVbiJ_YT*8* z`F=hT9nGv)OrQYj?G;F`Rs=Zx6wrkybM;Ng-W8@XRJcFu&q^8($)O2*%e%45`8qTg zcONfk<7}4jZUM(ihh{9qd#gpv^(oP4DF7Unw*)vfV5G2Tsn z0S@wvZ#j-PY>cmUZnb$@7iU#IWz^AyJ)~1p?4`9Qz%-uKOT1X_QMXi{DEYH5ZxkMU zb!@Uqd;0;-$B!J!f6%T!(9ng|kK%p7u$?D^jbsd{cPl-G!+$DisbUfe9FvjASZWm3 zW&63Aw_ALNAHJS6=%C}L=}#f>Y8}4S3@1}64|;Ut5_L+nG1z`5HoKiRyPuUZQ$ zihsP-iiT8nR{@^HdSAtHw^;uGUZxM4f=GAmrtO}huIf})nim#f^0|C<(#eaSSZ)dU zeIjap;h_niY29A&+ghUTn4nq$?4bUJ>!B4woU6GU_bf~~OWBbKp^tF@{*Iauhpl-Q zX4cv5;JJ9xK|(=0fc69Bp>s&Y^F(}iyq(D7xM(oAe8INHT9<2kV+FjSOsrk#WsTdb z8u;s=k&+8R%{Y5w{{U&8bkW@Z02pjO3Pmn5*H$)^exDDc8HpNA-?h;*g)NJ@B<`Sfc%%HyMH%ml6EeBbJOjk_*n zURt6lV>j^oNg>*%g}qqebf><$HM^NWjiZ1|8{TuvZ#hfyxw3N(MI#4nlte==;TVdb z#uP8WHuTbHoT`-m`FpYd0J{9Y{W5R#v>Z?k6A!lsy&T_<=Cg7410!K=i7OH;movLd zJE?HJ9d<6!_`3a?0HQ03khsJ5x(+eNGV=Ed{ckx8&_=lSxw!qpT+Qi5?I3fz#1;X6 zPPs+EDuuh>A948A%5lu+F}>ti>$DFl%PhW;k|qSHjowP_G$7~+Mb%1J(|f8`n}`)Y z{dI5(qT$7gm0x5rnMrVeY%2g*bNq;o{+qAL%aYH#H>BE%LXcLAq+nfnu0%0 zx%-S=zT~F*I`P7wu=hLoE-c3g$YSgyyqajQ>^F>%&}N|SKApL6xH(PNTD3 zP`YIcG$DM@h4*ox9!JMrsY3a#A$3~huI+8Et)YFfUMi)+)5TS{57(qRFyaZ|n|w`i z1dLmf=F-!PG$DM@g=u(S)8B0ExNW~NSTrj%r1f8n&?2h-B1xdvC6Td;l_Jv4 zONkp31zzM`$a{I)eBWqu7u-71C1r@xQ5UB;Xnzt(QBly>O~orD8iIQI#%oCoa*ZaQ z{@&D<`d#4hXSw{Xe*(>CV-%jeQUJ=wz^eoArkx=|4kIMy%l5aiJeQKs#%&R8vylc$ zK^sRAboiYkkWou7n9~iqVSa#dR&wmOOt%*fZ6iIu63bw$rED@Nf#%t#D|sBn_pmqAm^cw)~F5_akj2__(H1aj`dw z15vq1A(RnPG?}A$jJcyE?X;1JTGy1~?~f$m*{(5fV}Q4|miK&gYe*oCimy{UG%5=E zo*NFLTSYsh0JX|(+n{7bhcuqUl2P!Bf0N`G`|Pco$%KyS68`{j_)3FAP<(dQwDa)O z*Ai)~D@XENv#^pziL{dyXv9Eg>-hK=q(Q z;i~(4pA}qa!JT=lJB^-72C=2jc2r9K)UCu^%g|ux#tGI)heAkS3LiZqd!e_l^95CG z$HysY@VHi>rWYRU?-04iUF0vWX8GWaaSgnTg#{j-laOlCAK9nBTN_y7X=WO$pJK>O zd2sej;&eHlQBOZU?!y`b{K5XivbiC`wbO;Z~>LUX<2~;+niUV7%h~ z)5cr}m{*T1el+)}+?H3jR~cov$o!O<2!fFE0CufpB$56u&+=*cwE^yoyTwYW5Zm82 z9Wm<+JiVXCED%?Bb2nK|HE1lZp!qle`N$(!)tJ_bYO18rYd>)ONEuaa_E1@;s4C(O z4{oV-U$)CC#S_4kXc22y3lP=))$fHI9HO#`l{j4^y(`e zL2&1eUeK*JdzxS}7+aecuvbPxu`8+tjP0OdPYt^477{W*?MjaK)UZtfjj++*hc6Fk zrzJ=`g>PjCD!fZDJsQ@l;7KN@Q1^y`HXK6RY>#`bnqQhI`fW7tPaXdNr`gvE4x5Bau?7PelqTQ~EVwz3;8E4UMhUBZgduH4X@$HApmQ z%}evH)Zwu>)@vA`w%JCF?q*M3U_WLv*RGYcZf~8{aHu?+fcB^tau}VT9IKD|R3B;i zM0^jL+UI4p`HLeP+TX;0dWIQkR*tK zD}Fn8E{&+go3!+#iIdd48#f14_8$#o1(c8)KMqRTDVrs9*V?O358yLptEUoXlKD7xqT6m7nD%G2Pf3_ktJkOBs4tbyTWejO2njKY70sH0 z%1g+SD;UN`)oDAxzBK}#voWUcvr7*&RVQzWw*}0sl5yk|9qp8Nm%k@>2d49>`DfY} z;{cj;{aSW6VNh`jw{na+P{~*W9e_QkDr;$CxM&%FdX2QG>(^7-YAUf4Lg?OD?AoMl zFf%X@a5j%5^ZWJMdlNNXPi1Wt7062X1EpiZB-4t?u!2?ap*{{Z#H>_B<~r)psVe*@ z!N-Bu7gdPu?g(bMKLfJ$5(6|DBw6HA>ZD)F-9YQ*tL?7o&_g5IDn|vG-XiK;M#6N5 zardI^=WH(V82EBO4EB;xdaFiIN$47ZN>|95>6<@POk511y*C~ig#G^jrCQkBVUfm0 zis^9kcPLA&V3lomBGx-tlb{3emm0CyE=d!A`A@k}dWqd52MWN?e;zLviVg_5?hySfj2EH7gZh>BtFq9D8Am`fw*#eWV) z?L!OU98!7^D*h&hQp@W){{V|asIuS4>JZ&6CWD!;K1y!gZEW{Q*<^O8<1X-wwC9f> zbr!srZmpxWTl`h@H~7-RDJ7D&(?cN@3p7qmH+dB#9WC3$abYubJKhS5Yqnh7{{ZDj zSax7Xct3d^suwL}Eqg!Q5w~vj!}Rxy9lwWJC&@nGL!NYjmkO_34YJr6_~Buh?i!tqba2PBu?T%h z{{Z&t!6?Z#Momv^%85O|%Ks+Xj$~x^j5WaDaC&zDWeQd4V%W(853=a%yp#BieH{y2j z+PV=`Ih)4CkH2^zo8~S2VwA4NBf^ZmcCbAN(1m0^pRMfdIG@i#s<*Sy8L9Cq_?@T7 zx0%((Y6L-YN-%Ulo07-(EwYZo? zd6jwij}5@_oJFQS%HBBA*;EGF0W1YKY9g^n{{X3*3ufUtcU`K`-Nwk?-`@2D^yosU zdJw*y2ux1bc7r3#qH0wju>Z;0U=b55OPMXowsG$0CRr`Ob zEw3Et?b}B;Eki$UKO9tlZ?Rk#xD#ZoZ#c9TP}#&C?%|Kp3nuD%E(jkG9cksQFR8YR zdp5E5^Et)cwWn&Iw%$!GM6t9``_MOWKA)`PisvW7Z&LmXU|Q}xjoajPV z%#oypV~|RN!N4NFaiP$KuR;;uYP(;O=GmyD*wNynkPDf>>c+M7)82f~mYR}K+&Gms z(#*+M92nfne)o5+vYKGBU+-3i6nbKcu$x3r1&3kI^!fH=_`{$-k6c2 zO>_P#r(RlJS=~!%brZpJ0~qFpKvk8L(5VMcC~LEiajf?v$c%0d#$1K_BS^9w z#-8mWNgBad8U@fQia)r%@BaYqQz8EV7ykfvO#I|unRh{7Ke*2Cf9_Ku{{R>N0C!yZ z*ncox&{r(opzdT6OC84@yMV*6NM=zQ)zq?p&Q)8WsiEoTrHiP~;tQHewm#l@EU%=Ah!D=Ei6JXp(Uu)g?3(C8JMUEA zPXmjtFNGtoA+niTE2xo*N`&o_DP6opJ|WY@d(MO*uG{@Xb6y9=E_n7aA)eAnO!luh z+|VWzw zO#t;gzX_n#PQ*`0jzwwxXA4_2ZW)&2>^LCnD;t~1eJB@m0aMn14{6oX#;Is{enLUk zXjJ<*5`R$FXob378Gk^1ctWTEb#K4RT_JL-g6EE8U`LQ_l~b#FZBs$#t`@F?RmYC8 zp8ED1H~=!v!B)Nl+E2I+r%lTsV@r-fNwc+m#I22Gg+KR|?JWn!DXYdK1W0kg+8ew?Rp3Xmn zO2L?rKg0ok;i=4c{0zZVOKjkOT6#GBIO3zS7+xjIeM<+j{u`VCh@)Qrl_WusW9DLS$OqzA>-ZM#CIyK-L44uETde<5RF5Hx(YUe%t%=R{#w$EKWk2H z_YMx}N#+@MD88fH7+5ag05RTS$n*C902JK3vFG`$u5{t@^Q?Hu;tytSHWM7FyY~Uv z0~Mu8*TchB@rD-wgO$Lj$M{M>I;IeM0 zHrIE%KxA4gtH;T7K?h4+U9W(q9`va0-R@T0}y%Xs#-&2bvautyYY zP>A7{u4FYd@adrn$h$!`v)d$%Yq~QMnCOidr2$Tq1$?!_Dkzl4X>fNg9Mo152%L5+ zneMY!ckxS4{V~+4P}Zsk=019AD2s8aDt-3gCjybNl>DI#b58DIu-6tC>1BI=;_{1o zXAzkli6M8D{E4}M+~cnh=H&9ouRtW9 zf51{|NplV5wavAhjD1B}Zp@IRft6WlxOlfgu2K4lt_z{orY5wuj|UUkU%3i>N4{aX ztS2K8i}xqf_*FqW&iZY62eZ#ghgCdD7wmzr{S#KvDk3zM53z^x>C&ML)%fgh4#L@R z>~4Nrbek)agiq_pp^Q_Ru^c5s^uA$o7wUs>z9dn&mMm0L&ZnlX#1H0^RT{kS2_^h^>wBAXdoc?YymCflV%$jx`k~x`DV~w%xTpV~|pc--Ku1A0o@`HDYR3qbjI0!`Klh;I4AGygeL=nvR_WzgN*WC&fM|t zPjM34*vsh1vdOWw3OsD4yQ;l9>dt6{jia(mS>8!)D3&uvwNBmlcd^_P0dat_y*Fs$ zK{RpJSsmpYS)IIpR+9`3iMm>x+;?WFdK`GP4WbDQN03(-|VX_duNamiT5j^y&hr~%uq_8msfT*cZAM9V z3hC6`eTjq2_@4^G@q4N87V*1Fa}(X%2?U;uF)?BW^UznO(brjxk9D}ZyN~7^Kw#yW zS`FWA5n4&oW-h1JfiZaauk!YG);8kkte&ja;HU;F)tllVbls_&#k*qMTJk&(0H3LA zJsZ09HZvQYrSU&V?Z;61)W&Cx*g=S%?;8ih1f%9|S(JKepNU5Lec*M}ebx(Tpe>6R zJoBy#MYZnoTwJuu-~&Me4ka(_Z6brXFiRK!&u4I2o@6Ke-DhQxy3m8c%~1VUZr0v0 z;84A%-V)7kvZm@t?d~QoBajtcs!eD-^{i{i0M%dwI^94jNk*{t4i~2f*X;LpD4!mu0Wyf((4}+=f1}Dt;5^yG%)N(TORh zZBv7!Hk4d^g9Uqn$TmLl(XJ2!AdQOwUoN0%jzIBHn7OquyGyB67pD|-Q`?+YYcI(n z#$m3-o!CZ1otvr&2tk^ z{B5IP*73%K7@0_+>b@h#Q@?wdaB8h@r)^l^;NBdPK6{C0m8F%7$lXgFRn0r4cBdMZ zZpH?R43i(}#M8Xoc>C`E0QpL7Hr&D=uGJq?&-xgX1MAGRVU0QIaUj7I}EriKMa_^H4 z_ijr{^D%h|_L6FK=vEGe^)b*iWkr{gcL$K_hb9z#nSuB)gxkgau9N+}u3qP4P}#LT zDC7ietEuq)uR3ZBo24hEe@`WK9f5QK;=0a0#J_7_m+b!laePMch7|t*7WskGd*~Hs zwLh~-t5T8T7Z#TMV;K+t0RoZ-?H;FC=^f%;^|f1(Y|4I6rk3K%@fsbVw^9K3MRb61 zQ(o7!5`^&hg1GTMMdE_u;z=$iF6v7&u{HQhSEq)O;Zm8f(#WwMB1t~fGt62$OWaMw zO;k&yV9Vyag?~uXw!)-^N9ytfago8*LcEpV70d44ARBClayL*#X;0Ouw&tx^z3sp5 z3H-nxf@9$LrH#fWJoau$F?hF7$!#i;bt#}Uj8N4LdN?0;tFJdYJEs8ZN$?4~O}eA0 zG0@MgYt6NV_op5|A04H%E4D4jH*NOqHEOqsXC(cacE;XjopL+Gb4k9QH+Wdwxbsog z_*o@!3{mf32|fS-JXwk80P`nSWmbZ6LOi22VmIUQ&a1%!8B4g7X;qICnCvlEVNk! zGh5HOKB;I;<&O2Eo4bWMW zwH!|>91`;z)9V7)+^9eO$~6)GbKb7wAEYVye#C3Unkev>cJ|7DicjfB>J(~22&rNm zuHDjjbUqrsy?YFe>JJM?eky}%+wa+C=`G)+%lO(ZA8854(cV+{S3bHF3`+4Jz*fuyLG>+&orTX z>6zp{fq%{t740WIHtuAAwkRZw8A}DeG&Eoim%BexVdahQ`U|_%mNG<&wKN4)YIQ?-Z0TpKzqSQepzJ%ecD6z|>GLu_NaQQUY_a0F{BIcI zlEnxYnHiFMx!R2*JHY2|>Ub#Wr{$D5#Nm-~P%L0{LiLZu&0rPwl#Kd?gk1O6Jp(q; zH1=_q_6D_uYpHE*Tn93#OX%93O2=m{@H|tC*;sMwVPkmq_RwF=@?z>cn;6mSZe08* zU8LSy$5yafx=AQ}jVm{OxwZ(rC-q&Dr#zzz9yatCTpN3m?+SUUtCgYs9W@_vwh>E4 zFQ2!=oqpezY$n6ULFrBy5q&35nPc7z097 zpB}oBp{=6o;%iu}6%mzWFCN&})n|GN7Xy2EbQREq#^czoN5pZdm$J2rSuZ_HOoLrA zh#47b*71+UzA6TJM@4EaPPzh3aiZqC?lhK?K_oJ+Ks*#uL060#k4{f(D|OsFb;P6x zk;q--uVlNrZS%@%$NU3A7lZ$?mw?Bfw(i zZ?^45bE()z@jc4o_Ropq@YWIhtP2Ia3+dY+9?ui+{(UuQ!sD&VUhg|t(F-tBnM;O; zEYh#US8YM+3YF>)+BMl6L+YEgV0-``AuK!3*lbrau#+`}Rf9LTd{c_jK%$;M9-x31ymPaQI1ZEH}3o%))eBrK8aE$ejo3pI6QSxPLHQdBq(B|l`6i~d%vHrBT% z9tpRTM4plh*e>}Ux2qlQJ{&E?miY*6R@GnCFw{2GL-3GP1FI(JI(QvfRWj=FN4=28 z;wA0F+h#M|meL!W$CWHF!d13a0YzDn7?R{vfWT_TiKj>gXakvWgvfUqRL5FmZMef+ zMHIO^$ldM?Lui_IPsRINR-P2mq^8ZxV~RKBJ-_UXTyG^O7q-k~bJ1I$k+yiGMBYeG zQOgAzQ+DDsX($&loQe+Zr*F8TWG|0%6CsU?IM7&G!vuy&9m(A7wM`X5^!C@?u7(nl z>&Tm#Q27Wr<~zD^LB<+a!llG%3Aj>{GBBfuR_oLfH4^-Oi@TNYr)1Z65oy8BOpZ0& z3;TSn-x9UTWAT$iDUKO3(6qMGLHOfCA~LjcMOqIg8n)Z+-F0lkT1iZMR&UgsOm=tj zxvbR@reBATyA?6W?JTXJWzO=OZb6s1Mv5$bf~r{A*|`sJ>u(im%|JId#B|Q(a{E{u z?0SwGTkTPHTQ*%z#<8@9GpON->{2*R-}ZBtVs0-jvF6HLZ4&LB9?Do-ZuMy+dH|(< zAjhV#(3`l$9U&x&@OQC#KDbM&7~DH4_a%>e_$p&|ZKTzuGO0emv zTNV9ebOp3F&D{=G4^YyT4MQ8aS)wYLAsLc{9QbSdRIZO1=fn-rE|A76Jk;CKugHuL5lPi zFpUQ46LGZH)YUz`tgy^<9Z^3QYB+~~FJhlO@yi%5!bbUYLLJ&*ns}xeb1AJ09kkil! zZl*D@&1EY@CvI)4=M913*0aT|avTWk?%;)fq9?VxGsj#O(|MUs2Q_ z8Xc-Dq*}rl=Te!eTgK!rSsO)g7`lKRUd{?eCgafan`zX>_{iAZ&XZiLG`Bk%Rjhp} zvPx}VVC!8cpwTEJ_|-4>l5Cw3#m0bOC>l9&sto2Rn>Z|zkXA;&ny1W}RD=3Obu=vM zEaQ3CgO=kl$uFdC?%}pCUjZWlU(j{bCO>?6h5d$8ErrKJdwmW+2lG+BCTU@OP2Tb% zySp*dauuTiQfQ~)p{|4_f7FgY6Me+Ew<$}AZ*x+`1+Dg46$mfYt;31R&~@CVmFq)8 zp$fe=gez_I?~lo3yA71b;_nVWC3Saq9i`}~G00LX8jhpcQQ@HprQ4ieF2?aIYaUf{ zFEaM+ATtR)Vj$i7rIK0=><6BNF0Mp3NouFV;-K=cO$bVS216Om`IbUlh8By&=k)P6 ztnLYru?({(;Vc<p@;B1*jFc~PE5RJ@B8i=fC^YD+S`WKSZW24J z;ZsVkv|zpV&O;wP!Z`64EBuE|S$}z}rAv3E_wzdc0P!qC^|qvLzuo@;C|qh7$MKA< z{vz`)0>&(?j@g~$L}Jw3LMb(32CGt(TCU~`T2#`y5VqRc++AKpX9Dk@cUYoYfmUNd z)b#Pth1H$GUtuy2kG}N&VE|_Iq*+#n`btR9g~JqWB#RpUCm~k7I-Z*0G!7N?}`h zD@&WBK^?H#Y6)f?Pfsm5e|ghxmigV6VCU>zw6-sHISkV;x%`EAXB?A_K{B32l>P2n zWC$7+U^d$B0P8>$zfO(m_!jdzrLnf_%c$bU{7Sc$Rz$+=iSqsF1k%dDD=}pRkO?GI z_@BR8pa5CtIGonlau?7-@I!GdP|9m0XzZ%Qdq6#P)Rp4i2cCH0L06H2DEE_12vhv1 zK{Ph=!A-VoY#N<9L_QDj_18-2P*%6MmX03Qc_46V8a66wKEgG{#i`kyi!m(BNoGAs zC(l9=7X`GoxXgx$ z?Yjq=6!SXN+B94MUqUjXq1+^VAKI&V(~3LISz#LyEDm?1m0}s$z9ZDIsqwF#rya5g z@n`_5ICp#3oi1@94RIS!QdhdTlhrUcqh}`WpeZ|zJdc*V=hYXkbb>F*pKm4aUWD1> z5IW$rex^e@bHlw7T-n=AZt>2$<6=oxVnt8p>tBoCtg~fsAcD6)AqfO%Zas)=j9tkm zKZeq21c_;HaH%QtQiJhR*-pB$yo?K7Lk&)9^Ns%D?z#~;>giU8u%m1nc3R&JaTJ$0 z=yJ}C?Qo^{t-yc79exoQUw>U+z9v38I2!Xv+i&BBW)^4+1I5iAVmap)x8nAY8q6e0+1DIBqC605X1ZXa=vcFHIP~@HU?d`!tNnYP;)ttm= zXk7K6K0C+Xq}^4_APiJHeZmTwzv+TO_W|(pa$Ad>P2s(@x&7~|+o~ClRrrAL*KI?C z0C1sMt<*EDOC6{bHK_`w z?4-7hsr31B*}kg7mSlyCC3395^BF;$9qwZ99XN`6aMh zancuiW!>PJH-0Fj9zN6~O*E@Hrv;AgTlkDtZH=_Joqc&w1`8o2J_FEgA7-7c3aWvj z_TUqnQ1^20jqXATiX=u`t>!3(*w=FoioQxUBHZ|jp!G8YEu&>?L^<5G3(PM^__h5S zkp^DXmfekHZ}c@WyT5%kgYaC|J!G(wJYv8kG6z#4svX{$sG}>UZdx7gDq}{vOoLn)fStls5@+a|}=W&qzBDPDULx}@wic}E!5-oD16KhFVEiGGQG^|?ZWON+}PSK)AMy>xyi(qYSfeSgqr*Py0G0HRz_(|GFe|u#nYB{YU*il z@pH{cc79GzY1!^8mBIQ~31FFK$YW^r6%`hdb)nUhURrC#WlKYw zP83I%J>N_2+QBW%5}b-au}VPkC^iWPxQ@Ei+sqpom0~XJ47V+d4J|dV*pOMAq`528 zaN}w!goZ!aMerZtI?i2O8D3mg%G%sS%_H01n;nGicM#%O%>Fk&Xp&2kP}Z}!J8BfJ z$7K~!<_?$%@-SO_-P|ra$+(9fv%%WO0I+t3`efZnBvcKx8NMb}-BNw0O*)1C#Pb0W zca)iu;^I_}IVE?F5LOgsBp@cFC_Wv1nsGFV@YX4a{q);cDpPr9>XuP3{;|iL&OZYF zUmqO_B(6?R%rY619lxl{V{D5I5%_!w;m~*r^{2PTu7orp?FmcVFS1o{*&ygbY2(xl81;>ZjPJ}MY-eYjMi-=h4X(K9v zp!MNFuo@_s~Q!^La1H)+5m?FVQ89-hw~2uwcK+@u(sEV3FTGe;wzVk?49uWj*y zor@!VM%{zkRbWqjG51`S&ejM8whT&sZu;O>LMTGAp!^HEl|DL#cJ~HU`IVD*ran;7 z<>FDt_ld!&U*mSa=jtCt{FSJ>k3B&oJG01fd0t@Gc-w`!v`c8=^^@?K6tQi!@uuO| zS2i)YM?;-fS9h7Nn@~O-H1?%;ZRL_K{#wi_y(1)7sOkX!01m5f&1EX{XJHoY1$z3h zx|ZjcV_r%Euu7wEPX`)?tx}@{b;MxDWCmu&;`07Q3y)}}^y7@s)ta4H)}HMMP?`|E zyfUJzIx;Jb$XE~JIK)$&UGf*BPr`f`1 zbsSERo;O|9#c+JJrxCHnKgrwei`D@3CW52etlUpMqJ?9E-OsJUbMR=dvi+2fPfu9>U#K7+BIkDZ%Q`QvFTAWw&VocmptoIIkUt zF>JYiuOUs~6j@$=s9|Q09=RBB>-KH(#--tl#{_t&>Be z$Gtgmw;1@6ySuU4q!=k$=KbUfyNbmaQTj2xZI>Nm z1LMb^4 z%9|VoWg*+C3QZ5URE7yTA97J}Q`~Q#@M}o!P46kjqqK!#SIk9pJth1kZeg&WHPbJ) zlk%T(=AgOHargw8K1{H3oM4t~dv&*AkcK+HqT}~+GVD?b@eK6yrj_#2(0EU|b5KFu z$>uz6UeI#PY2-ND%h}RDl8!t0E+?1+5MmJxLHJ49H7eE@nVL&TqD#o44D9w}5f1>h zist5PX%VETM<6v%kP2z{>r~ZAa7LvmmE;_CE*uecat#TXOo|$#*y~=JSOrzg_`$>z z?NRY^t~&s@RJ6N4H3QqdZe!@KK_pQ;ejO+Rm=i?b!t8rjBW3u*w)r5vX7JqCQL+7N zT`LrVAtw;;dQ)YttiQZ;p50zMWw?%uD+XcV;y?pc`-4f1!?A9?B<40~2*J97i{}X< z@{8tiPf>%fycHDGZM2SqX~A21nkO>)O7WrgQ4;np^41P;1wjY>%$r}WXY_123a8^$Z$+#adTg)VF4fKqwCDonOZwt*7CvrPQGRE?vpR^5D zL2E6%LcBQDSiS6Xsa*IZ4}3CMY<%%?91@6ZZDx}0;sj#R#U$NCNm|iGOKtM5rtA?( zA$7!=yTUs_;-PNxwTx^n?r%7od9%^t*6$Y}OP39`r`=Eq z9t}`USKY3pmaZ&EEQZ>4k)URv*aOi?AGD;@b`{9qmG7sT8 z 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¨$Sbi-Nz0Av)`IJlB?DXH3wovqIZ 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

  • DUhF#-$t!(1AM)f;0+|`(ntaQ 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 diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji_c_2.jpg b/actor-sdk/sdk-core-android/android-sdk/src/main/assets/emoji_c_2.jpg deleted file mode 100644 index 0ecf07fa70d9593d0bcfccf38075ba18c5d31281..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973008 zcmdS91ymi`)-_r<1PKz{oj`DR_u%gC?k<4@2=1032~Kc#2`<6iJ-8&e{s%hUoxb%zu)yE1hkXD=#Kp+U0{{ac zL5Fz&;9(Vl#@yN2o{OH|)``x**v`;|&dAP&-rc~So{^4$9^m13w>L1dGI1s{G%>TV zi@JtHS4=i?kqOthd8v`!wj&IazZwoasf&LCpqWaMaJ?`&abOY}ISfuWs?GcO4U z=^wXXWB=E*|6{Cv8z>|5--p`RJO}X=(Z0D$KXJ`Fq6y?qBob8;~MqXJKK?#VO1n%)lfjD#9+r$jB(lB*ZGnz{w%Rz|O|W$tubz`scYKc1A8X zCbrIho@@N~xnlqE+{aX~u?JmQ#Kh6U)x=oL(awhG>6W=H{xcTg|2W^TbB+Hq7LosW zE|q{w3qV6c zLP9}8LqS2qL4$tbVWFX6;SruagMao60U6=xg^Ymo9QipC0vg(j7iegBxVX4@gnzxj zU|?Vn5fHJEk+E>lQP6Sz`r?20!$TW@0t;0J13-YG0N^NK5GY^|oxlMIA0z}A*x%I; z13*E;fuIvF)PJYj>oSCd?r&?ITki@3d~|rJ^8vO zV(eTsLC)H-{x;jhg@R2@RE(0nbHkM5M}jz2PPGIGE;u*<2?+rO4Fv%K4u<%M0|k

    m!{i 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�PMJoUIb8jjGf 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

    G8J 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�v}~Af+Kf{F5AdbFgK@hFPZ~k|9M-j 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

    1=Cdb4w|f;}XAKAB@MY@NvP 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

    bZ?hN0pBgXJC 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 nL%s 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�s2g3a{}|oCjMjkun#fM8=!Z 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

    2n7_=0}0%+vz`=Hm+CDm_-6-ks3cw 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

    &U}~8W5{{>@aPRy(#2VVp zXyt>o*^Xn2TTrUByD}KUUmOCJZ$*g@GqtojNk-f4ATYZej(2s+`|Dv8!1%s&dtZ)K ztoU}`1&*M%UVwR`>;_XU+Ixio1*K>c7gGDS51Z~HlFlt9m9(M}W=_B#T5K%cco84c z0Q^?(V7atgt>zi&2a{n6Mx#ATYcQFQmKm$e6n|L>k|nl^U*s)fCl6{dgX8~W%Jk-PVHx=Wr~Xzk5KyM88vJHxK& z6a89~{qK+UUaqFR#8Y@}ixPV@8%hZ}MB9>IKy>%usd=yD+n=8DP405+@%)WU$Y!^A z`SXm!hK|GS8xf;==JB}5SrMr_TQ*)z1+UY1_p$?$-}aiJYs}3Atr_pd8U`DwFAFv` zsZ}twa+}hxvc+a8Hh||*OnkdRB;kuH$u%C5ghfSlTUNFXSP9TEwqZ+%ttT_Leeo2MjqtIU_D)f04DvuC|;@?EV$FrHxT*XdpK;>r9cww2pPBcq^0&s)iR&M z0lTocKxg?_8p}(OB&W6gfUXPm%qaPWi@NB=K1=XCv5L>1x}J5l%?F;D<7f2 zx(CsL87Sy)LX_+&>wHfV*@?|bk8(T69_b)+z%S}3Q^iRsd65*mb zCDg=02%^j-2xy={jom;n3XBDvSIljB1_G@FH(p+;!vDL$R%E1ss)zqBbbM#c@%Uw2B57Up5k8)Et^HBXJ25XrK+IZ> zjxOV!v))7Jh{#o0L|Z89AGXeFJwHa6z#@d1A9RA*Y`ME+hTjOJ8EO<^B0L(@eK`l2 ztb|aNKP3uos6%Obsr$qqM)gPh+o!g=mp0m{Zmd|j)$CHrXLvbeGo?nPp%uM~=WB`pN?O3U`1@mKkvLSJ2TaSsI%i0$6+HAhe zAMd>U?V6c+-$QRb;V=eNG&>!YVKXp+ov!x|gezUuIv%p}2v9*E=?{oWZLd2F|7+WNHKBiyBnH^iNyPeI==$`QN z9@l0$CD>h@Vi%S`)+^VigQ8CYtsd6m#i2EPB_a(&Vlo#-^IlfyDi?Tnj;?q0DBheO zH#?qJufq(qI&>K^yE!{>k7r^Yl;J(wb;a<8nW^qvVPN~g(;j=98%NBTvxEc+=gGy# z(WNV^_&~dnYmN8ars6d}I)?TC0Wi$o_OOAP0+H9Hr_N~4R5evDbgzY{DtPXnTO6nR zz=ZavPATE_q3@_!)Z(0c{flm;5_Yf?O4x={s>KI*_t5gU7)6pI`YAU~?<-vb$5Iz> z$7$0On^hsv(Vywh@7=nO`LRs!5t7(-IA@}Yx@uKTq@onveX)u?zJ*0JvEJ*g$D0l} zN){hhyP?aLF~S(dG*d0uX9u->%$4fiYSSL=!k)VHY3=)gTOYxjJo5!Z_s&H#p%xlR zf)_|Y>R!d<;`1Droc}#(GEy$`tZ?&Dm6MU8_E*|a$gIR=d{m1#>hMiB&HB#3W!;#^ z-^BwBi?OR`i_;F)KXTPiCX;OD@wzUN?mjbO6m;~A zUg?3Pn>QzJk%N)a?%+eomt#^}OapYbQ$fccBJr-*%geO<+c@fIOBc+;n+{_4?UL<1 zJXa#*Au4N}Z^n6=>JK&VTy+1E9Ps_kfU-eOWmS<5#N+Owqfq1R=x<*LUL;YXd+-y} z;qHkJ6=o6P=67+zqgwhgi5JltbcRAD^>swfeop}QCXKiHG^ zM$(Q|qff|i^%~UpX*#geRmH3O<$N2Rl$-10XhI}DXhF+nSf5571B2B%>aJ5B0amCh z_I5&i#Ss1quax>Ask=8LzkU8(5gKPw#W{tyEs2)EZ@^rW)VRx0?&w0r=n|h20hHt0 z-Ow(th#9rJeTj}==#&fTc^)fxDM zBX7=ilntQd;CHpfiZ96)kF{a!usT3OHMRfirP772U&~rs{M=PTwFC3{f!Pf9QFwF zES!C%C2ryv+`b+LujsHANV^hfa!R3{gHpPSN6DNY5yL7jAv{M5>H5ia|ItDkyV!d^ zhyfR|fs&JF;b}I$g#*{wVEx#1JKyB2VsIYd`EE5>0KH{xikB zIGHVg|2vK$uVX>hI_yvBVwovdi($*?dG08>ktI+;EbT&(nXQpHNmC6xZR=>|(s zbRZ@?&LLZ8f%IiBe0n{Z`bf2438P!34|=L|C9&afASyr+M3-W&!SQ#6awJrS5#(I) zWFxskBM+1c&sxR|kCWrii?5@;V^$%2RjLjpj`N;bw(f=m9=!e6ZBlGsj8$AqlJXP| zs|_1HGMQcf0~j}7R;n!=h$WYOf9mzW2=ha89KC+f8))m}ZIt7dKH;gMlMl(@;glvt zH7zna)hAGcjjp0tpps@4K$jKA?XRq8~XFCzht^QlKf zww@UCAM1OE6~jt1>=ldJi)SF1C4%+c>M4N2N*u196~vQ!&rMdh)!Qq{U4e(}o?6KB z1puEtG3ElKM1m-V)2>K6oIT8{5H!kf2XI5b?z&dooz5e>Kgp*?dQEH#9W}w=pf-ja z`L7Qul1D`i2fpUL;DHG}!h?Ep6)5i^ z9)_)7s5{&JMUW=Dfh6#*qqpa{gEs@Y3dI6O^iwjPVP2j)-aW>?7pvXsmTzQ!HB)zHODg@6km z|D2BLe2o!vSp1#Y4tNRVZqte3sRFl;VU6E9H?<+n5;7E;(!H<@tr3Q^f?AJY^zi+- zZUWn>BAI~9K?0U=6lIwIY=V_>sV)rk&I2g$7h|j6l zE}Jt$s>~fs#n&vtqr6aFcBFBJl?K1ozurlz7&OM%ai>VFv7#3l)17M(s0obYibm$E z`tf5VXW{ysI8&|6*4QABWaEhS{GI2(T@NHlXH!(fduQgD85BquXJE(5o1%c5)#k7D z1yxS1+_i2v)^N}pWF~Q=-O=6c;2ijE5=*gg0WQM6e_H2oG z?AYa1W$LWQqkr`{WGn{_=Ql^tkllXEi-c3l0kQXb7&vVcc+LW3ZyXUxwPGI6XoLA@ z-IR`=puSu1FscjX<}q_f*} zIRbaM4xO(U$a7jIM{^J3bM9dXq4-J9G$G+<0ls1mfx+pkmp?RPJ{gb6VKoc*>-6-J zI0mYKzzU1=>`$HHJ2U&sY0vkCy@E!+nvlvoY|A8_-`mn3hZc*>zUafnS86`=cU_ar zratsUYc|bxTfVOgQmPBsHBFmp->-W@v!d`gA8-#u4pK-YT-IBD+AoksJMkIG%VjnG zT@&;waX&ujxx&k{^|<=mgwzg7UD?dmdH%z?_i{FRSLcp|R~zK_{Zt~oVefytUjQVXfwmI;0}OeL*FFhg*sT1Zla6)xvsNYq& zUuMA-jzqU-iaPW6$i;X~zQPug03d}dK`V9Z&JoY+pl+4!Z||)Q!;)lJM!Hu*tCtn; zS&haV_HX2mR3rzn20!qxTZP*UOW-Hw8Y$f?IT8FJ_r*6_Ir=UUNGxI($nXzvoQZUO z9eWy?X_D|feI;(vAR@icg^XjRp1L8+GBe}c2XAUg=U@3j|D^%;|MK}l(XS+jwU*ch zJaI4W)ypUp{=t)1Y((Mi%;>&789Bd+ozDpzadQ-PbYI^7U=94NqVt8N*oVa2Intv; z`4S<%r!uv1n*$!7-WqXFCaFN*>$g>9>tX60hu@^DDe8NNQ%OK%yh2bcn;sDMlUhdqG!##tv;;d2cI{y3~DDtGMe?rP({Z| zWr?%py5P@P$MZesdIi)mnb!Q-Z5wCOKO(<7VmfZjzc zQsABn>mOhdME#V`m0E^8#!XxTmyEp_pbg6ZH5r;f%D2gk7Fn#w1i}xWL*O_ae)4Mw z)<3-}@ssyyC_QJOIPcH%@_&g*EkOnN#XzzXD@MoG$!hyx7qUOx7xRX`vTLlfb zfq`WDxwn^1StrIS(D|dfu)@e-s>Rzfv1Nxq0my+Yo&Ih8HC107T>-nDo=R*i*Mm;? zb#<#Wm)~s|0Ftru`EYZrCnX>`j+A~4N2XE@2H$dZ5J`$)EbwNTWz?kF%%;D_6whfd z38Bo7TEML5=`a?%hKtSM`N=VW6vIiGMqAA)D!a3ay^fDZ+m}>s>x*{yX2~s~7HjM^ z$jeQJL2fXwrJf`~IkqB1m zb7!u1zehw%&J)nVH~tY5G{3K2hQG8?4B#vyg=HvGWc#Y(X7X|eRCOZ3v#$C`_k)cA zoZP}}&z;SJPjXx2@na-s#kr;zY5&QfeiSZn=Do5@3rp7BRku1;O~gXl{=Dz8Ac)z;F}+z8kQ zJ+^CvF}7B%ZQn7~nAX}<#DG8Eqj>K)Id`R^eEkgUjGDhS%3YWP|3I)T5hNx|b#{rH zK&tq>8o2b3JSTef{MLK12s>J!M-y#x}G&lJmy44K!uEoCj z#VLTZ;;E(|KhV%$g?Ys3WzrU#98f^6TbtHz*mFq9MD!fon%`K55x?{=$Zs_lETL7R zqTf*RTK+RI1sr8zR)QDk&yEU)@tMc zbGQVvXo+-=!WgNcFR4OjIbE|!4dYk}zOx?*_XT7Ai2-$v-_Hqlyv5&bKzf~N%yj7_ zlw>IYCAu-mXQfs%XsyCbM?wkMSRd&L@gnICniF8wpyV& zfmrm_@jUeS_{L`4W2ol4H_`67uVPIc)6Lt?|@{w{oWV$|~m>ow8#CGWJ{dAJ=NEX5l&)1B9bcSWOy*Kr1gr>iR?GUUGO#1cEz@)tI|M$U8{ycXq{|id$t{Pv zKUL<6ejGHhx@m-IK+H;vrWL)|BvSq2fffB3yKsG;p0l|tkt5dS6vx+zp1Vl zIDG8}xAW28=3QQ09JF%puy@wE-k0*C``H81Y^no3f@WcATMD7qjU&Q-cGHy{sL=sib1iaJgRBI-F0&=8WTW#;7CkAVV`~gaSM6ovifuPiZzaEueiggthclco8A$l&*{QPsV#7s;+a8YQy zj*;zUl|eHGdiYh*7o5h*byct5Ycu)m&LdW!rH&F`&}M%oH{ou?apQ`d1-VwDt>j-y z)_AJXy0GmroXQ*glv>UcireGWjzKFk%7Qt{-37mJPX)>;68cElw5p10E!+FjF5w08 z3JOg}_LLuHC~{UN7@%^GSeICwMk<|zV4Z4pP*TN*!VipL4Vc*;vo&23JJGLqsEaeM zK|RLHrK^6KA4uTw$$h<}71Gw0HN5ro_e`(o;#R0po|>f=w}2sXeViEbC9-jEb}-D|#R%r4;KvC)UE^CQX+o$c-(hoKiMUkm z5psU+#4_;osT?(G#&)Rj@Rj%|kab7cKP~e%i=C3r@-4}WbYj&SI)f&vM{738)@E+9 z^F|i+%nhM4#JynccpCnoE7dvy6lz(Hg&FRj{esj>?unv-0q+!hvx<+<>{0%PJJYdA zW(DDZw%{>gnN=(Ki)QGhFtdgXpuh2}H+KeCNafZ(QbH`#+aJt6v2lZw^O*^K+Ii|p zqGnD&f)2my$W6M$D>WXLJ#NzCAR?0|InYO^d>1eL>eJ0u0HU_6fwb(@i||1upH~sj zm^wl7<=j{%Pv=Vi&&jQ~i{4o7dtoG`uuGfDm zuNdw%XCiJ`=sJLm#{&=E8i9UobrP-2w%sJ}yDjeWITqOG^7Dr}w--WHciK2FJoe|l zfsF^W(cjOvr2;|M0b@1lX_+cqw`NbqH%iwJQDA;y9f>>)(L}oDgn|5Mwn1)%u@q+* zeM&D6xgDJo`bt2kkxST zf2I&ikR{#Slu5?oGV&;0q*`{fohzBd3xtH4#E>Lv|G?v!z-)A3hKLUA!(SM5UsS!% z>S(Etj%kkh@IBfy&5)1lG1TL7cU@W4vBypyj`+==Wg(#Rd~zaAdrRj2+Lm|!q)yrV zvU8I{4f5eEfyQcVwaOvZoxFQNRO7dA`U+P)!v{(VfREte1>9KCRjH&F-Eq-_&FQ+d z5c{)0zu0ZhTmibmY!rGPw{H9x>w?^MY>deIi_k07|Ikl3nF@0864wK*7h~1$)mYYU zL--Q*JWbpwSBp!@qlURg+Hk)}-eYl@s*n6uXMTF_%IukpUz*nQ7o(yFX;U2B|8af2(u$PWb?H0V~V&^?k*{w6m+Jid+c+-_N}E zEQf@HCB)MvgAU|}Bf&eJ(26=`ORtT26*C&g@%TDB;{9%W&vzpn@=CX6?u=gv6h5Ih zV=?YQ6RN!WxNq>(f&drpS9U7Tj@Pk~_C4}8oazkcGMA??y9e{ksYX=J7q+sD`tmfyQo(Me-+u02Qk$U z@<*I8eq-5w_s%B~=>C8llSpw5h?=_!8^*X4*l+Yi&mk|1&1%-AcTa0Oa^Plq{56b$ ze2MakG#;x``AATM0jUp>sb_&F6kGN$?!(M2m*Z8JPB+I(i>2$pVu!W6M503b*2u4| z-0!s$6~>Y!vnjJGI@YdAv{Jl>tu$NgphG>8m^B5SA4P@t7O1Z)5(4*o9@B6C0Z@OO zus#*{pmgd1a}9<#v}`}hr@Y+Ph$BnCEb`t_(s!_`rkkdMcOx-3e3CeT6GQm@x6ZI zZ2)(darilIV)y%X$cun|q7&9X`GvO_cjDzn@ddV@@^N3L2jy8u|k|3fc=>O%&I6;2YiWMMFMMTgaTH(aaM?px*|0-l;KU zc}#v;D|3iLMow*w`JoKu0;Br;se77hms-LItKs3%l-V0=y#Zn%?-Fgx`u>yqN0jb_ zi$!b4BPKa2wgd4TgfWkcpU?a8r*3Na<}-s;+b%`M?)>gN=#GlKjXq~v-Ccox%t*%y zRh?r{^kRR80xsslrQk&B^hV5?a?8IcX~{@xK+pV(jq-03)t+|12FhPM^5fwlHv63% zrX75y58uhiEXDm^1mAg4ljgg>{nj#hVK;h%(JRWOqrQFT2<^Z_dP=G=p4V5)^q)Q( zIuGcF=k#1m2eJaN$Rpn^vcGVgWGcHvKEHXXaRKtnF_LqK^u4$5!lIM4v{j#!Qag4E z;=c3kQENP}63NO6&kn-_5TsBBD^Gr+*EUoB`|*W?hv9|Q+D6!l9QkdGcs*L^@<+g9 z9)A1;AA4(D-XSSdfIA%kLOrPMiNYe2yv6;#!P_BeD3C|)u(;wu2L95UT<;3HUGGVnxm{6n?_+RIC+$hNUaU8g%PwKk24kaXv<1&pWgE;fZN z`^#>NWH@j#cs=VnK%!k=_0NEO4f`Tq!}lZ9dQ2x6*#akUYPR=&xnEC1{}X+nbc?ua z;+MLOuYz)TjFZb920jb7eI$WjIEO43ER3@_0JF;rk0)>nYNVy72|Ds`d^L{Te<#79 zvB9JNSqncKb)cf`XKT$Bnf?6pl!&Sr=m_o6=rD5SBm)=eUWsEZyWmxkjYJCkDD}|` zdX=BGyxeZor`@s;(%nhHrjch5^$##EIwG3u5u)@;p1-Rk&0dG)Q^LnE8xKkrx4jka ze##z*RJmy9gfTv`%Y$8Jh2UV{^~Ku)Ll4|glc!{KeAYTQp zpe{S?c9L@$>7Ij>u4wU`e?d6IriS}X#AZvEjB-YI_2-ufo{)&tG&T(-!8bsGi9$~B zI4ot=a6K*7bwzA1RvAx?v{^yHf2@9uNNf@1?yAF_dp)nZf}yqaK!xjyC{tj2E<<#hbD`j^Ow$GukGIJ>>Vcf=?q zr)BJ2RN&D^->{jm?)f)&vuQiT$ZLx%(p+(oW>6DGyxsFO{SR=J9oe#^EjtKi+sFSi+fWn%LJ{T60#Yhq9G))G0kexsN3p?|0dwhQ+yHUrIOy__bJn6A4 z=xmbLF{?HxoG0{ywN(7K7kamA5~ZOa)w2IqZIX#d7T<^`)P&1w({+Jz|MS^xxo=dc|L57)@u-_ZwX{^h)1%hptV=rt8+sxn5}%y2PNE?z7Je zSmTM`CiCzk_k4$n{XMCa+}8P(YO~i7+YN8k__*XTuKU8ic8PCdecL%%UV&BG(8vCd z<*h!yJ9BQOq3uGhah#&oM$Vrt4dto{c)-swzka{|9kD8;A}NwrbNmF>E4##_J!!bS zv21(V&;asX4|8F6v6QfY6JB(25uk@7F2ks6vzN^fCa)OOa+AW|(nTBjv2*dOf$K3~ zgzWP($;MC0l-H>|B;OOiwl+4(a2*~t z4O5SFY~z|mpsA~E&K%R8(^-$khbhvOxL1cZ)Y?dXRW2F;hmt2heb{_JxZ~n&$0*{x z6p4w1NpZ$BJ8zk0oC|zK{PF+e+wCO}!H!Q5uBRF7InSq2k5kPs^O5M%7752{C}u{B z{Mr2I*{_NQ&HHl06c4qR2qdpNrO{P~+@L`pX*n+k;mJkroQ8O#9M*j|OtI%HeGS~>$%t{_IId(BkU#ltyw`j+iqJZpeYsV5SxMi*OAcmPvZyManFmSyRAKHg zoMm!|$9<+p|5VV@Wa3g#I({mo^My1MzViY@m~&m!MSU2II?_(v|Be(sl{l3tsk$wp zJKOG?4a{L6u&j%?sl;lihHe)7(xMHyK}!<|7bWn5Vs zjyG}1K2oq|=uzz~%fe;AnK06$EgXtsfMU^=70a@*1lRa7NAked221z5v>-1i#W$Sfj0^gr#A+7`*s^alX?(vk6S48 z?%zVevf(H1b!y$tZ;&<7g*aua2U+vBUpBpi(S-umEcC4EKBl9wO}sVwtgV#cw5y7&AM9dumAI7pH8my1!@bftr`2Cko1j3Z#m=4I zA*cVouwOxWM=LB2+e$o&_UbV^Ha{r3ivp$-?Z$Krs3eObBV46E0fQWM$IU}c| zwJp&a+_peE#j3_$7a?eaxbN24na7NQ;AJ+@(izx4lK3Mml(qWyAwFLye<) zq0T1M;M1BhAEr4iv~ve9hJGF6Q}qjGEw^ZQP4UvRP4!O+N zOJ0(3*Hab0nA`iV;s|E88@I<- zT}8h^FG0x&Ks9^N@wFe|iS7=cZwuWxkLL!pb~mNJ6S?P>IvZlvL~l<`iaT?9mmw0D z?xf2>O|naiV@ha%;kMd7$YI~WTB;!JggxZekdcqIMG$~Y+HW3M~`Ftn5}%tpHvi4QfaMSp!LLNBYApx?stY}N>Adz|Y`KJGOZPQY1kR$4 z&jQ@B5s7|JMwX}|8A;qy6Kn7>S=Qv;*^kZW&_WkxvKt&mH-wmr$nup>lyjs1OVOi> zF#m5^6w92smZKW&s%cxY-J4W0hQiR5?{ocs6t0$Lj>Vfa2QcjU?Pv_As=r&;%~$TG z4Y17gY2ec2DJ9L})yu3@sP!;x*u&P=o%=#)HFN!y<;VAX@VinMdovuC& zbg=E*z?F1|qqExBdEs>j;{UaG3lDA_Yv{#u7vr81qc0)MKwDjNIQW{AE5x9#aH zM87@#meHaebR%^a*{`s(*0l-lb}477#ul2l$N0owlL?Bg)R8iD1|>St7HHmG`hn@0 z--AA`Ebkf5S4^9N9b0|&humamNP4~B)*GV96X+%9oDNsAk!WJfM3P0#@QQ}1kZk$f z-+Lu~`TAx401={B;)EKbqynE^{&T3>^u0N>)&gKr#y`+mo15CQX7z0}>+bYTRz_g7 z?`Ij3@ffm1aB(+5e-a+ahZrvp*(h{r^@&b4A{!$$(mq}*-JUy$h0vEk*dwYvZZ;RS@et_#X}M$0`eDK; z%e>K&KAgf_$=S(xPndBc`4NphoNV&+9>bc(i<(27jyA`ov*FyUyx+-MH3>#a59rKI z`UF2U_)q9ij7FWg+Zi(NEE*eop0Kj{*Ku;7e{O zOsL1{$3?2p57A45zGoQzotS6VY6LVFFz}Q4d$`T@4?=jTO12ZcA~^{%25ZlMW-ye1qlJ^1UGbdvUwE6nkbtYFs`0q%1tIf z`Z3!se7t)|;yCj*&yZjVmt_sU7mcD%U-uO>=Y;9Wyjsio;|$-oZ5!M#g8riaw6Y))6*-NVd!jg-oz_=nn~#r zhhXAhZ`b0Kg&;(*%YvIT6=I~upas*YT6?O8dQG75S~v1|==XT8iWrVI9}vRE)k4sk zoh=nb>ZT6Aw34P4z3$fE%ILX-xKo@-gjo@K8g;dChj#-`_34a~qyqh{Qf3<$AOVs@ z@6mw`;@=9mgLsBwR_|ixP#l*Gw0|4@Sis0Y(1t@h*eXya9Fbky^sN-8U|g1Xp(?$7 zQ33F}_T6o?E+O>rEvtUeWi=F!1f~FvE|uI|P9gdGt~lFQ@)*Tefyma78xw$_J2nle z-I|j^QRP~>hAk#(V&Y+T6nBrz??T0xVigjE*%_Yn zp_Dmf3+Q4$n*);Du6m#dyOqWig;zqA+h8F!U^7a}iu(he=h3HeXLwj|gW+>oUAyW6 zV2-yr4z09z{FLqAE4kRO;{Bdk1QuMz$xrZ$C!G8=4D3i0pIXFoQbF#(4nfHf3NhuoCUL z8Ys$*0yUW7CV+^#bb0xFMVo85WhvLvRq{&|qJ54#19q*q77@JPlUMPLUK*w!MhKpy zt(8RcTCyE51nh0fxDo5mS@K`VUe0VuXG7WT&(i~;@acG0wUq0wZZmt8L3p7|F#dSr zFgp+6Hj_%Y1lN~t7+P4y<~-4j|2gKr{L&e0EKA5gUVr< zyqu*o!>_q0G!YHpI z^ofZhnAu*Pd=ed4=x94Rv92{g=hMPTelKGWNthgJW*iF^98e2OB? zYsUnBd@NIBwrX^(x_=qmCiiQ2zcYV!it>7^`^B=-Rqye$@tb55TFiE^Zflo}HXLgs zjw6zpzNX|(;#{GZuwo4lzQefkioJ-^{`6!1l=SaHY-%B+(JAJhd|qKXumLq&R;&-> zZCal%Xi6gh(S?)N!afo|7cv*Rv+_1A*HI5SD;onOBrShO;(j>*U*ddcAhPAdcNrep zGESU~<**+8zaI^WPW9BEL+<+?v~?*ku&Rb>v&!YUbOzL31>YC@$e@@-q;Sk8;*Y@) zh7KZTiLb&pLej~SI5YQN@OaI|#c@V=GW zPmf0?6k8v)3uI~-B1OQ{B!2uZ zMW+FA3S)Hz84F=x^=bdQ)>y_z+Tq!e{9eS=#7yi3r?n~V(itX`lc&W<%-ZF7+&rrY zR4+%$z+opvM=FmxnX$?Y4jDTda5grCHz0rGHtvI7Cug4?@`T zCKkWBn)Cz^y~M@0d5i-QG=E|M`1R}#S*m2dCBk=~v}WG92^<3l!D^en%18V(_^#_! zT=XUT!CME3%H-lwQByH#?RA5U>DoBSo>Y^6w|a}n`FQ~tD4=v6^yFp1^qtoCE`DG# zviqSo6AP_#n>UrMk4fggCII&}hojJ@BiCgvJ5&eDr`hYD&+<2iu8Zsc0>Fl^t%9go zVYEy<%`(D{X@`4mDw_#!2w!@?$Qp3n?&el@%4g^18V!5&9P8yrq&3LoL?g`Bna%#= z4{r?XPyoy7A(WyOE!BISXSPyHfmZ5E-$dW!->^h5LzH+J$*d+*Cay*ORi6BEPaO1< zTv2=o$m1or9Y9ashUa=~;*B#8+ta5CY=bZ+ukl!rkD{A9jHYbcLaa=UsrgOuMJw4P zU%qWrz=|<@{Rw}xo6WOJ`J=Y^KQ6U5S{GlJyS}1;E__)zGxWo?h$$JqD{}1hc7(+r z^-t9Ej#t@7wCx|SWs9!lj?)P%{8G7>2s=P$Ivw0PotgAL(aNm}6XRNujabts6C;#k z+@H(0sau~28=QTpLi-^)$*cM1(=(f9<8-U-1nC~~ zT+>*tKp6Y?c>B$su~GI+8ZmY>A=B2O<(2m+^fO}cAA*XLG6uaEp)q#l^yZ?1?U%= z=2;fpgW4*ivz?df{(RS9}7+(l+H7p*JCuF=<87&!37( zWfpTM>moFql=URMhkvcP)RD-$Us>-mQcAVfX&M=tG^t)vVroU-w>9Q}xtU#@Q!%ni%&9b#ny04)^~fQDJ`n8^Y~* z6?XX8rvY{+2N3y#UJ_fh5|Ay&L5f$JAr7?Vzi^h>p>{ps4c*j9hrg5{RWb+8+!J;E z?geVhJe>uTqN9g#hgfyp>3;w}`-h`=KWLN&ARg9gT7xTQO{0>Zn%wzel_0ALTFbtJ z=-AqBOCb)@8S;UuxhI&38qiUKN*O3EBfv>PH;*2iNBiCrck+2SNYOPlM!w+VDP0-9 zTO?p$S6vFXeu@g|WN9=@9b@2l*KOqGg}&g6^0Cp3Hk?9TzwLZZKXZ{(t)rJ%+^7-k zLE5U?IMn(VfN9#K^}~3BUnXOr8e5^(OZ4oa<)ln9Y3*3dV>?{uh_n@Nb$5{cDfJ*LEGJ&EBLpCR|lF+OKOj@ zUspB{m6S9OJ+zVX1=#;RIPz`{H9X0H5oF4U7CA@?M*i)JoEVy3!3Xho_ISi5i*X7sZ5G%$RY1iQuW~3=TgnCBaabZuf;~=#Ub0!mMRtMoM4hN8dwRb8MQ?Q<2Q^D zB_je(zAQy=SSI*!28V43u+8SWZ#lxVOoO&c3QIBJajx}sB8ch|&jFE;c}p2C6xv89 zxKYDEApAxHU{5_(v+qU?Li3vmtA2^fFev!K-cP}q9M@z2^;@cY2z{p`-s zY=qzqSaZMltP)#5r=2{L`jyq$20yB`y2rk_?(Jjws|#Z3pdyu%0b-6ND3}iz5q164 zaZ6f0|B#mAyAHnW`Nq$%t*kqQF~0Ly(jxjFlNQgodReQ%RquhhDfUPoie)L>KcIhz zt*zz9R4)ZSQkXJ-OIS6m6F0q@@eBiO)pBIp}Eh@B`WdOPTYV-nhR2Q-au;&Swu# z`ms$2bH?XH=e)tar;;HjF)};XJxUoSGS|7S#lh{^3zlDZ{qT1vv!*-{7o*)Pp=o4( zIaj*67Fh#;&YeHrr{@P0w&01#^D6v{Fzy90mUU<6$0<5&^!UuQVZfj-(OxTK^%*Xn zd)l*E*HH=N0^Ms|K`X|kUnW~S0|PZ5(5WVnj~1~h#wkl@0BEpBDz!Vl&)N3x6h-2! zj9eoC!tk!{s279>Bc)H5gICRQ62D!bt6jjl5CIe4f&tG@i6<920Du}iR;>`q{E$RK z&;b{qtpa#FRDqKZ05;lexxp9iTZ#qopAyH=EH1E?O6T^4SiKYOeU#k(%V~h<390kK z*T40g(Vkf1s`&_(w+UPG=3O>uv5c?s7l3~1hzhIVu7&4=*=}DBtY7$!Ul>yO;qema zUz$#?6l!@Z0)pHu{}BPSSU>uc=M5$lOcL_*tMWeTV}Tv(!`yNh{fb9!roDA)Hh#fG zpG3S))^uIN5R4-{zE?wsOz`h?v5Pc5Z^O02R7aEfl3yzo*P(*!hW7%YRBHDNF8=60 zsRnK7lN(yZs&(9vS85{29s5kY`_ry0uY4-swwUs8@2$wX>uDf+)wqMSWL4euzBG;5 ziP)Kor079aZNgwzQszjMeQwgK_I>W52_Bn8*J7jVkF7#K{6yHUqUhQlmpMRXpGxO4^dV?!(cEIgemCX{O{9JXL}q~qWaNt-f#16;<50s!aV{qGQXy!3xS zKGgdeYgN(KIvaM)Z#Uo*4^rGvt1BK?V$+gg539TAN=J=wgp^`oV~ zBB!0897)9fLulle6NH}u_pAAjF7IolSB9Ego`0iL#B^-UtxiDIPKHzh&`Z|3z*@=G zqPSOE;}A<6Q|?(ezjv>ax|IS<&~duACS||jj*+b_r?UF;ntn@IogAZE?7i+bt8+p~ z=;q6tKf9TA*B03`j|j3l=i~SjW;|qzeEtx--u>Hjh<4&O9a8utxdz%T9}339J;AG$ zrVm!Gn3fT%CJ5j)Y{ccmvdZu5PAsYTZAB0*im1hOEDy4Ozk0iSm)h2CPhd7nXJh@J z?B}85BDe76M=r%|Omamuu(58$C{Qgq&dIT7W+mZVtUKb(du^(kH)~bpC=RA-)~=2$ zJE$*}jC$?3Y9dy=N0?0*4Y?qNDXvB4u5VYTd4UJViuqf0Kcb0U9odas=_YN?jAK^D ztgmgSwsD0Hu_j8K0ZOAJcdPEdARA1a$^NbGWA>zajQI!GT^w&SGg__63=OWo{muT< JXYgOM{|j3t`xO8H diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java index 7acc58bbc3..da74c82bbb 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java @@ -46,7 +46,6 @@ import im.actor.sdk.push.ActorPushRegister; import im.actor.sdk.services.KeepAliveService; import im.actor.sdk.util.Devices; -import im.actor.sdk.view.emoji.SmileProcessor; import im.actor.runtime.android.AndroidContext; @@ -245,7 +244,6 @@ public void createActor(final Application application) { .build(); Fresco.initialize(application, config); - SmileProcessor emojiProcessor = new SmileProcessor(application); ActorSystem.system().addDispatcher("voice_capture_dispatcher", 1); // @@ -357,11 +355,6 @@ public void createActor(final Application application) { LOAD_LOCK.notifyAll(); } - // - // Loading Emoji - // - - emojiProcessor.loadEmoji(); }); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java index c0c2103e12..6bf5297635 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java @@ -41,16 +41,14 @@ import im.actor.sdk.util.KeyboardHelper; import im.actor.sdk.util.Screen; import im.actor.sdk.view.TintImageView; -import im.actor.sdk.view.emoji.SmileProcessor; import im.actor.sdk.view.emoji.keyboard.KeyboardStatusListener; +import im.actor.sdk.view.emoji.keyboard.emoji.Emoji; import im.actor.sdk.view.emoji.keyboard.emoji.EmojiKeyboard; -import im.actor.sdk.view.emoji.keyboard.emoji.EmojiKeyboard2; import im.actor.sdk.view.markdown.AndroidMarkdown; import static im.actor.sdk.util.ActorSDKMessenger.messenger; import static im.actor.sdk.util.ViewUtils.zoomInView; import static im.actor.sdk.util.ViewUtils.zoomOutView; -import static im.actor.sdk.view.emoji.SmileProcessor.emoji; public class InputBarFragment extends BaseFragment implements MessagesDefaultFragment.NewMessageListener { @@ -92,7 +90,7 @@ public class InputBarFragment extends BaseFragment implements MessagesDefaultFra protected KeyboardHelper keyboardUtils; // Emoji keyboard - protected EmojiKeyboard2 emojiKeyboard; + protected EmojiKeyboard emojiKeyboard; protected ImageView emojiButton; private Message lastMessage; @@ -272,8 +270,8 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { } @NonNull - protected EmojiKeyboard2 getEmojiKeyboard() { - return new EmojiKeyboard2(getActivity(), messageEditText); + protected EmojiKeyboard getEmojiKeyboard() { + return new EmojiKeyboard(getActivity(), messageEditText); } public void requestFocus() { @@ -293,8 +291,7 @@ public void setText(String text) { public void setText(String text, boolean selectAll) { isTypingDisabled = true; Spannable spantext = AndroidMarkdown.processOnlyLinks(text); - spantext = emoji().processEmojiCompatMutable(spantext, SmileProcessor.CONFIGURATION_BUBBLES); - messageEditText.setText(spantext); + messageEditText.setText(Emoji.replaceEmoji(spantext, messageEditText.getPaint().getFontMetricsInt(), Screen.sp(20), false)); if (selectAll) { messageEditText.setSelection(messageEditText.getText().length()); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java index 3495e9a52b..fcefaae465 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/preprocessor/ChatListProcessor.java @@ -2,7 +2,6 @@ import android.content.Context; import android.graphics.Color; -import android.graphics.Paint; import android.text.Spannable; import android.text.SpannableString; import android.text.SpannableStringBuilder; @@ -37,14 +36,10 @@ import im.actor.sdk.R; import im.actor.sdk.controllers.conversation.view.MentionSpan; import im.actor.sdk.controllers.conversation.view.ReactionSpan; -import im.actor.sdk.util.Screen; import im.actor.sdk.view.BaseUrlSpan; -import im.actor.sdk.view.emoji.SmileProcessor; -import im.actor.sdk.view.emoji.keyboard.emoji.Emoji; import im.actor.sdk.view.markdown.AndroidMarkdown; import im.actor.runtime.generic.mvvm.ListProcessor; -import static im.actor.sdk.view.emoji.SmileProcessor.emoji; import static im.actor.sdk.util.ActorSDKMessenger.groups; import static im.actor.sdk.util.ActorSDKMessenger.messenger; import static im.actor.sdk.util.ActorSDKMessenger.myUid; diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java index 9bed837a43..465eb285ef 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java @@ -45,11 +45,9 @@ import im.actor.sdk.util.Screen; import im.actor.sdk.view.ListItemBackgroundView; import im.actor.sdk.view.TintDrawable; -import im.actor.sdk.view.emoji.SmileProcessor; import im.actor.sdk.view.emoji.keyboard.emoji.Emoji; import static im.actor.sdk.util.ActorSDKMessenger.messenger; -import static im.actor.sdk.view.emoji.SmileProcessor.emoji; public class DialogView extends ListItemBackgroundView { diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/PagerSlidingTabStrip.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/PagerSlidingTabStrip.java index 6cda9a121d..f56e53cc8f 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/PagerSlidingTabStrip.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/PagerSlidingTabStrip.java @@ -1,52 +1,35 @@ package im.actor.sdk.view; -import android.annotation.SuppressLint; +/** + * Created by 98379720172 on 08/01/17. + */ + + import android.content.Context; -import android.content.res.TypedArray; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; -import android.graphics.Typeface; import android.os.Build; -import android.os.Parcel; -import android.os.Parcelable; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; -import android.util.AttributeSet; -import android.util.DisplayMetrics; -import android.util.TypedValue; -import android.view.Gravity; import android.view.View; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.widget.FrameLayout; -import android.widget.ImageButton; +import android.widget.HorizontalScrollView; +import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.TextView; - -import java.util.Locale; -import im.actor.sdk.R; +import im.actor.sdk.util.LayoutHelper; import im.actor.sdk.util.Screen; -public class PagerSlidingTabStrip extends FrameLayout { - - +public class PagerSlidingTabStrip extends HorizontalScrollView { public interface IconTabProvider { - public int getPageIconResId(int position, Context context); - } - public interface TabProvider { - public View getTab(int position, Context context); + int getPageIconResId(int position); + void customOnDraw(Canvas canvas, int position); } - // @formatter:off - private static final int[] ATTRS = new int[]{ - android.R.attr.textSize, - android.R.attr.textColor - }; - // @formatter:on - private LinearLayout.LayoutParams expandedTabLayoutParams; + private LinearLayout.LayoutParams defaultTabLayoutParams; private final PageListener pageListener = new PageListener(); public OnPageChangeListener delegatePageListener; @@ -60,120 +43,45 @@ public interface TabProvider { private float currentPositionOffset = 0f; private Paint rectPaint; - private Paint dividerPaint; - - private int indicatorColor = 0xFFFFFFFF; - private int underlineColor = 0x1A000000; - private int dividerColor = 0x1A000000; - - private boolean textAllCaps = true; - - private int scrollOffset = 52; - private int indicatorHeight = 8; - private int underlineHeight = 2; - private int dividerPadding = 12; - private int tabPadding = Screen.dp(5); - private int dividerWidth = 1; - - private int tabTextSize = 12; - private int tabTextColor = 0xFFFFFFFF; - private Typeface tabTypeface = null; - private int tabTypefaceStyle = Typeface.BOLD; - private int tabsContainerPaddingLeft = Screen.dp(11); - private int tabsContainerPaddingTop = 0; - private int tabsContainerPaddingRight = 0; - private int tabsContainerPaddingBottom = 0; - private int lastScrollX = 0; + private int indicatorColor = 0xff666666; + private int underlineColor = 0x1a000000; - private int indicatorPadding = 0; + private boolean shouldExpand = false; - private int tabBackgroundResId = R.drawable.background_tab; + private int scrollOffset = Screen.dp(52); + private int indicatorHeight = Screen.dp(8); + private int underlineHeight = Screen.dp(2); + private int dividerPadding = Screen.dp(12); + private int tabPadding = Screen.dp(24); - private Locale locale; + private int lastScrollX = 0; public PagerSlidingTabStrip(Context context) { - this(context, null); - } - - public PagerSlidingTabStrip(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PagerSlidingTabStrip(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); + super(context); + setFillViewport(true); setWillNotDraw(false); tabsContainer = new LinearLayout(context); tabsContainer.setOrientation(LinearLayout.HORIZONTAL); - tabsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); - tabsContainer.setPadding(tabsContainerPaddingLeft, tabsContainerPaddingTop, tabsContainerPaddingRight, tabsContainerPaddingBottom); + tabsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); addView(tabsContainer); - DisplayMetrics dm = getResources().getDisplayMetrics(); - - scrollOffset = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, scrollOffset, dm); - indicatorHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, indicatorHeight, dm); - underlineHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, underlineHeight, dm); - dividerPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dividerPadding, dm); - tabPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, tabPadding, dm); - dividerWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dividerWidth, dm); - tabTextSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, tabTextSize, dm); - - // get system attrs (android:textSize and android:textColor) - - TypedArray a = context.obtainStyledAttributes(attrs, ATTRS); - - tabTextSize = a.getDimensionPixelSize(0, tabTextSize); - tabTextColor = a.getColor(1, tabTextColor); - - a.recycle(); - - // get custom attrs - - a = context.obtainStyledAttributes(attrs, R.styleable.PagerSlidingTabStrip); - - indicatorColor = a.getColor(R.styleable.PagerSlidingTabStrip_pstsIndicatorColor, indicatorColor); - underlineColor = a.getColor(R.styleable.PagerSlidingTabStrip_pstsUnderlineColor, underlineColor); - dividerColor = a.getColor(R.styleable.PagerSlidingTabStrip_pstsDividerColor, dividerColor); - indicatorHeight = a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_pstsIndicatorHeight, indicatorHeight); - underlineHeight = a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_pstsUnderlineHeight, underlineHeight); - dividerPadding = a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_pstsDividerPadding, dividerPadding); - tabPadding = a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_pstsTabPaddingLeftRight, tabPadding); - tabBackgroundResId = a.getResourceId(R.styleable.PagerSlidingTabStrip_pstsTabBackground, tabBackgroundResId); - scrollOffset = a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_pstsScrollOffset, scrollOffset); - textAllCaps = a.getBoolean(R.styleable.PagerSlidingTabStrip_pstsTextAllCaps, textAllCaps); - - a.recycle(); - rectPaint = new Paint(); rectPaint.setAntiAlias(true); rectPaint.setStyle(Style.FILL); - dividerPaint = new Paint(); - dividerPaint.setAntiAlias(true); - dividerPaint.setStrokeWidth(dividerWidth); - - expandedTabLayoutParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1.0f); - - if (locale == null) { - locale = getResources().getConfiguration().locale; - } + defaultTabLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutHelper.MATCH_PARENT); } public void setViewPager(ViewPager pager) { this.pager = pager; - if (pager.getAdapter() == null) { throw new IllegalStateException("ViewPager does not have adapter instance."); } - pager.setOnPageChangeListener(pageListener); - notifyDataSetChanged(); - - redrawTabs(pager.getCurrentItem()); } public void setOnPageChangeListener(OnPageChangeListener listener) { @@ -181,102 +89,86 @@ public void setOnPageChangeListener(OnPageChangeListener listener) { } public void notifyDataSetChanged() { - tabsContainer.removeAllViews(); - tabCount = pager.getAdapter().getCount(); - for (int i = 0; i < tabCount; i++) { - if (pager.getAdapter() instanceof IconTabProvider) { - if (((IconTabProvider) pager.getAdapter()).getPageIconResId(i, getContext()) != -1) { - addIconTab(i, ((IconTabProvider) pager.getAdapter()).getPageIconResId(i, getContext())); - } else { - addTextTab(i, pager.getAdapter().getPageTitle(i).toString()); - } - } else if(pager.getAdapter() instanceof TabProvider){ - addTab(i, ((TabProvider)pager.getAdapter()).getTab(i, getContext())); - } else { - addTextTab(i, pager.getAdapter().getPageTitle(i).toString()); + addIconTab(i, ((IconTabProvider) pager.getAdapter()).getPageIconResId(i)); } - } - updateTabStyles(); - getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { - - @SuppressWarnings("deprecation") - @SuppressLint("NewApi") @Override public void onGlobalLayout() { - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { + if (Build.VERSION.SDK_INT < 16) { getViewTreeObserver().removeGlobalOnLayoutListener(this); } else { getViewTreeObserver().removeOnGlobalLayoutListener(this); } - currentPosition = pager.getCurrentItem(); + scrollToChild(currentPosition, 0); } }); - - } - - private void addTextTab(final int position, String title) { - - TextView tab = new TextView(getContext()); - tab.setText(title); - tab.setGravity(Gravity.CENTER); - tab.setSingleLine(); - - addTab(position, tab); } private void addIconTab(final int position, int resId) { - - ImageButton tab = new ImageButton(getContext()); - tab.setImageResource(resId); - - addTab(position, tab); - - } - - private void addTab(final int position, final View tab) { + ImageView tab = new ImageView(getContext()) { + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (pager.getAdapter() instanceof IconTabProvider) { + ((IconTabProvider) pager.getAdapter()).customOnDraw(canvas, position); + } + } + }; tab.setFocusable(true); + tab.setImageResource(resId); + tab.setScaleType(ImageView.ScaleType.CENTER); tab.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { pager.setCurrentItem(position); } }); - if(tabPadding>0) - tab.setPadding(tabPadding, 0, tabPadding, 0); - tabsContainer.addView(tab, position, expandedTabLayoutParams); + tabsContainer.addView(tab); + tab.setSelected(position == currentPosition); } private void updateTabStyles() { - for (int i = 0; i < tabCount; i++) { - View v = tabsContainer.getChildAt(i); - - v.setBackgroundResource(tabBackgroundResId); - - if (v instanceof TextView) { - - TextView tab = (TextView) v; - tab.setTextSize(TypedValue.COMPLEX_UNIT_PX, tabTextSize); - tab.setTypeface(tabTypeface, tabTypefaceStyle); - tab.setTextColor(tabTextColor); - - // setAllCaps() is only available from API 14, so the upper case is made manually if we are on a - // pre-ICS-build - tab.setAllCaps(true); - + v.setLayoutParams(defaultTabLayoutParams); + if (shouldExpand) { + v.setPadding(0, 0, 0, 0); + v.setLayoutParams(new LinearLayout.LayoutParams(-1, -1, 1.0F)); + } else { + v.setPadding(tabPadding, 0, tabPadding, 0); } } + } + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + if (!shouldExpand || MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED) { + return; + } + int myWidth = getMeasuredWidth(); + tabsContainer.measure(MeasureSpec.EXACTLY | myWidth, heightMeasureSpec); + } + + private void scrollToChild(int position, int offset) { + if (tabCount == 0) { + return; + } + int newScrollX = tabsContainer.getChildAt(position).getLeft() + offset; + if (position > 0 || offset > 0) { + newScrollX -= scrollOffset; + } + if (newScrollX != lastScrollX) { + lastScrollX = newScrollX; + scrollTo(newScrollX, 0); + } } @Override @@ -289,98 +181,39 @@ protected void onDraw(Canvas canvas) { final int height = getHeight(); - // draw indicator line - - rectPaint.setColor(indicatorColor); + // draw underline + rectPaint.setColor(underlineColor); + canvas.drawRect(0, height - underlineHeight, tabsContainer.getWidth(), height, rectPaint); // default: line below current tab View currentTab = tabsContainer.getChildAt(currentPosition); - float lineLeft = currentTab.getLeft() + indicatorPadding; - float lineRight = currentTab.getRight() - indicatorPadding; - int currentTabColor; - int nextTabColor; + float lineLeft = currentTab.getLeft(); + float lineRight = currentTab.getRight(); // if there is an offset, start interpolating left and right coordinates between current and next tab if (currentPositionOffset > 0f && currentPosition < tabCount - 1) { View nextTab = tabsContainer.getChildAt(currentPosition + 1); - final float nextTabLeft = nextTab.getLeft() + indicatorPadding; - final float nextTabRight = nextTab.getRight() - indicatorPadding; + final float nextTabLeft = nextTab.getLeft(); + final float nextTabRight = nextTab.getRight(); lineLeft = (currentPositionOffset * nextTabLeft + (1f - currentPositionOffset) * lineLeft); lineRight = (currentPositionOffset * nextTabRight + (1f - currentPositionOffset) * lineRight); - - currentTabColor = blendColors(tabTextColor, 0x30000000, currentPositionOffset, false); - - nextTabColor = blendColors(tabTextColor, 0x30000000, currentPositionOffset, true); - - if (currentTab instanceof TextView) { - ((TextView) currentTab).setTextColor(currentTabColor); - } else if (currentTab instanceof ImageButton) { - ((ImageButton) currentTab).setAlpha(Color.alpha(currentTabColor)); - } - - if (nextTab instanceof TextView) { - ((TextView) nextTab).setTextColor(nextTabColor); - } else if (nextTab instanceof ImageButton) { - ((ImageButton) nextTab).setAlpha(Color.alpha(nextTabColor)); - } - } else { - for (int i = 0; i < tabCount; i++) { - if (tabsContainer.getChildAt(i) instanceof TextView) { - if (i == currentPosition) { - ((TextView) tabsContainer.getChildAt(i)).setTextColor(blendColors(tabTextColor, 0x30000000, currentPositionOffset, false)); - } else { - ((TextView) tabsContainer.getChildAt(i)).setTextColor(blendColors(tabTextColor, 0x30000000, currentPositionOffset, true)); - } - } else if (tabsContainer.getChildAt(i) instanceof ImageButton) { - if (i == currentPosition) { - ((ImageButton) tabsContainer.getChildAt(i)).setAlpha(Color.alpha(blendColors(tabTextColor, 0x30000000, currentPositionOffset, false))); - } else { - ((ImageButton) tabsContainer.getChildAt(i)).setAlpha(Color.alpha(blendColors(tabTextColor, 0x30000000, currentPositionOffset, true))); - } - } - } } - - // canvas.drawRect(lineLeft, 0, lineRight, indicatorHeight, rectPaint); + // draw indicator line + rectPaint.setColor(indicatorColor); canvas.drawRect(lineLeft, height - indicatorHeight, lineRight, height, rectPaint); - - // draw underline - - rectPaint.setColor(underlineColor); - canvas.drawRect(0, height - underlineHeight, tabsContainer.getWidth(), height, rectPaint); - - // draw divider - - dividerPaint.setColor(dividerColor); - for (int i = 0; i < tabCount - 1; i++) { - View tab = tabsContainer.getChildAt(i); - canvas.drawLine(tab.getRight(), dividerPadding, tab.getRight(), height - dividerPadding, dividerPaint); - } - - } - - private static int blendColors(int color1, int color2, float ratio, boolean inverse) { - final float inverseRation = 1f - ratio; - float a = (Color.alpha(color1)) - (Color.alpha(color2) * (inverse ? inverseRation : ratio)); - float r = (Color.red(color1)) - (Color.red(color2) * (inverse ? inverseRation : ratio)); - float g = (Color.green(color1)) - (Color.green(color2) * (inverse ? inverseRation : ratio)); - float b = (Color.blue(color1)) - (Color.blue(color2) * (inverse ? inverseRation : ratio)); - return Color.argb((int) a, (int) r, (int) g, (int) b); } private class PageListener implements OnPageChangeListener { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - currentPosition = position; currentPositionOffset = positionOffset; - + scrollToChild(position, (int) (positionOffset * tabsContainer.getChildAt(position).getWidth())); invalidate(); - if (delegatePageListener != null) { delegatePageListener.onPageScrolled(position, positionOffset, positionOffsetPixels); } @@ -388,7 +221,9 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse @Override public void onPageScrollStateChanged(int state) { - + if (state == ViewPager.SCROLL_STATE_IDLE) { + scrollToChild(pager.getCurrentItem(), 0); + } if (delegatePageListener != null) { delegatePageListener.onPageScrollStateChanged(state); } @@ -396,26 +231,22 @@ public void onPageScrollStateChanged(int state) { @Override public void onPageSelected(int position) { - redrawTabs(position); if (delegatePageListener != null) { delegatePageListener.onPageSelected(position); } + for (int a = 0; a < tabsContainer.getChildCount(); a++) { + tabsContainer.getChildAt(a).setSelected(a == position); + } } - } - public void redrawTabs(int currentPosition) { - try { - for (int i = 0; i < tabsContainer.getChildCount(); ++i) { - View tmp = tabsContainer.getChildAt(i); - if (i == currentPosition) { - tmp.setSelected(true); - } else { - tmp.setSelected(false); + public void onSizeChanged(int paramInt1, int paramInt2, int paramInt3, int paramInt4) { + if (!shouldExpand) { + post(new Runnable() { + public void run() { + PagerSlidingTabStrip.this.notifyDataSetChanged(); } - } - } catch (Exception e) { - //no-op + }); } } @@ -456,20 +287,6 @@ public int getUnderlineColor() { return underlineColor; } - public void setDividerColor(int dividerColor) { - this.dividerColor = dividerColor; - invalidate(); - } - - public void setDividerColorResource(int resId) { - this.dividerColor = getResources().getColor(resId); - invalidate(); - } - - public int getDividerColor() { - return dividerColor; - } - public void setUnderlineHeight(int underlineHeightPx) { this.underlineHeight = underlineHeightPx; invalidate(); @@ -497,49 +314,15 @@ public int getScrollOffset() { return scrollOffset; } - public boolean isTextAllCaps() { - return textAllCaps; - } - - public void setAllCaps(boolean textAllCaps) { - this.textAllCaps = textAllCaps; - } - - public void setTextSize(int textSizePx) { - this.tabTextSize = textSizePx; + public void setShouldExpand(boolean shouldExpand) { + this.shouldExpand = shouldExpand; + tabsContainer.setLayoutParams(new FrameLayout.LayoutParams(-1, -1)); updateTabStyles(); + requestLayout(); } - public int getTextSize() { - return tabTextSize; - } - - public void setTextColor(int textColor) { - this.tabTextColor = textColor; - updateTabStyles(); - } - - public void setTextColorResource(int resId) { - this.tabTextColor = getResources().getColor(resId); - updateTabStyles(); - } - - public int getTextColor() { - return tabTextColor; - } - - public void setTypeface(Typeface typeface, int style) { - this.tabTypeface = typeface; - this.tabTypefaceStyle = style; - updateTabStyles(); - } - - public void setTabBackground(int resId) { - this.tabBackgroundResId = resId; - } - - public int getTabBackground() { - return tabBackgroundResId; + public boolean getShouldExpand() { + return shouldExpand; } public void setTabPaddingLeftRight(int paddingPx) { @@ -550,64 +333,4 @@ public void setTabPaddingLeftRight(int paddingPx) { public int getTabPaddingLeftRight() { return tabPadding; } - - public void setTabLayoutParams(LinearLayout.LayoutParams tabLayoutParams) { - this.expandedTabLayoutParams = tabLayoutParams; - } - - public int getIndicatorPadding() { - return indicatorPadding; - } - - public void setIndicatorPadding(int indicatorPadding) { - this.indicatorPadding = indicatorPadding; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - SavedState savedState = (SavedState) state; - super.onRestoreInstanceState(savedState.getSuperState()); - currentPosition = savedState.currentPosition; - requestLayout(); - } - - @Override - public Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - SavedState savedState = new SavedState(superState); - savedState.currentPosition = currentPosition; - return savedState; - } - - static class SavedState extends BaseSavedState { - int currentPosition; - - public SavedState(Parcelable superState) { - super(superState); - } - - private SavedState(Parcel in) { - super(in); - currentPosition = in.readInt(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(currentPosition); - } - - public static final Creator CREATOR = new Creator() { - @Override - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - @Override - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } - -} +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/PagerSlidingTabStrip2.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/PagerSlidingTabStrip2.java deleted file mode 100644 index b8ff9c7365..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/PagerSlidingTabStrip2.java +++ /dev/null @@ -1,336 +0,0 @@ -package im.actor.sdk.view; - -/** - * Created by 98379720172 on 08/01/17. - */ - - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Paint.Style; -import android.os.Build; -import android.support.v4.view.ViewPager; -import android.support.v4.view.ViewPager.OnPageChangeListener; -import android.view.View; -import android.view.ViewTreeObserver.OnGlobalLayoutListener; -import android.widget.FrameLayout; -import android.widget.HorizontalScrollView; -import android.widget.ImageView; -import android.widget.LinearLayout; - -import im.actor.sdk.util.LayoutHelper; -import im.actor.sdk.util.Screen; - -public class PagerSlidingTabStrip2 extends HorizontalScrollView { - - public interface IconTabProvider { - int getPageIconResId(int position); - void customOnDraw(Canvas canvas, int position); - } - - private LinearLayout.LayoutParams defaultTabLayoutParams; - - private final PageListener pageListener = new PageListener(); - public OnPageChangeListener delegatePageListener; - - private LinearLayout tabsContainer; - private ViewPager pager; - - private int tabCount; - - private int currentPosition = 0; - private float currentPositionOffset = 0f; - - private Paint rectPaint; - - private int indicatorColor = 0xff666666; - private int underlineColor = 0x1a000000; - - private boolean shouldExpand = false; - - private int scrollOffset = Screen.dp(52); - private int indicatorHeight = Screen.dp(8); - private int underlineHeight = Screen.dp(2); - private int dividerPadding = Screen.dp(12); - private int tabPadding = Screen.dp(24); - - private int lastScrollX = 0; - - public PagerSlidingTabStrip2(Context context) { - super(context); - - setFillViewport(true); - setWillNotDraw(false); - - tabsContainer = new LinearLayout(context); - tabsContainer.setOrientation(LinearLayout.HORIZONTAL); - tabsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); - addView(tabsContainer); - - rectPaint = new Paint(); - rectPaint.setAntiAlias(true); - rectPaint.setStyle(Style.FILL); - - defaultTabLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutHelper.MATCH_PARENT); - } - - public void setViewPager(ViewPager pager) { - this.pager = pager; - if (pager.getAdapter() == null) { - throw new IllegalStateException("ViewPager does not have adapter instance."); - } - pager.setOnPageChangeListener(pageListener); - notifyDataSetChanged(); - } - - public void setOnPageChangeListener(OnPageChangeListener listener) { - this.delegatePageListener = listener; - } - - public void notifyDataSetChanged() { - tabsContainer.removeAllViews(); - tabCount = pager.getAdapter().getCount(); - for (int i = 0; i < tabCount; i++) { - if (pager.getAdapter() instanceof IconTabProvider) { - addIconTab(i, ((IconTabProvider) pager.getAdapter()).getPageIconResId(i)); - } - } - updateTabStyles(); - getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - if (Build.VERSION.SDK_INT < 16) { - getViewTreeObserver().removeGlobalOnLayoutListener(this); - } else { - getViewTreeObserver().removeOnGlobalLayoutListener(this); - } - currentPosition = pager.getCurrentItem(); - scrollToChild(currentPosition, 0); - } - }); - } - - private void addIconTab(final int position, int resId) { - ImageView tab = new ImageView(getContext()) { - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - if (pager.getAdapter() instanceof IconTabProvider) { - ((IconTabProvider) pager.getAdapter()).customOnDraw(canvas, position); - } - } - }; - tab.setFocusable(true); - tab.setImageResource(resId); - tab.setScaleType(ImageView.ScaleType.CENTER); - tab.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - pager.setCurrentItem(position); - } - }); - tabsContainer.addView(tab); - tab.setSelected(position == currentPosition); - } - - private void updateTabStyles() { - for (int i = 0; i < tabCount; i++) { - View v = tabsContainer.getChildAt(i); - v.setLayoutParams(defaultTabLayoutParams); - if (shouldExpand) { - v.setPadding(0, 0, 0, 0); - v.setLayoutParams(new LinearLayout.LayoutParams(-1, -1, 1.0F)); - } else { - v.setPadding(tabPadding, 0, tabPadding, 0); - } - } - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - if (!shouldExpand || MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED) { - return; - } - int myWidth = getMeasuredWidth(); - tabsContainer.measure(MeasureSpec.EXACTLY | myWidth, heightMeasureSpec); - } - - private void scrollToChild(int position, int offset) { - if (tabCount == 0) { - return; - } - int newScrollX = tabsContainer.getChildAt(position).getLeft() + offset; - if (position > 0 || offset > 0) { - newScrollX -= scrollOffset; - } - if (newScrollX != lastScrollX) { - lastScrollX = newScrollX; - scrollTo(newScrollX, 0); - } - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - if (isInEditMode() || tabCount == 0) { - return; - } - - final int height = getHeight(); - - // draw underline - rectPaint.setColor(underlineColor); - canvas.drawRect(0, height - underlineHeight, tabsContainer.getWidth(), height, rectPaint); - - // default: line below current tab - View currentTab = tabsContainer.getChildAt(currentPosition); - float lineLeft = currentTab.getLeft(); - float lineRight = currentTab.getRight(); - - // if there is an offset, start interpolating left and right coordinates between current and next tab - if (currentPositionOffset > 0f && currentPosition < tabCount - 1) { - - View nextTab = tabsContainer.getChildAt(currentPosition + 1); - final float nextTabLeft = nextTab.getLeft(); - final float nextTabRight = nextTab.getRight(); - - lineLeft = (currentPositionOffset * nextTabLeft + (1f - currentPositionOffset) * lineLeft); - lineRight = (currentPositionOffset * nextTabRight + (1f - currentPositionOffset) * lineRight); - } - - // draw indicator line - rectPaint.setColor(indicatorColor); - canvas.drawRect(lineLeft, height - indicatorHeight, lineRight, height, rectPaint); - } - - private class PageListener implements OnPageChangeListener { - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - currentPosition = position; - currentPositionOffset = positionOffset; - scrollToChild(position, (int) (positionOffset * tabsContainer.getChildAt(position).getWidth())); - invalidate(); - if (delegatePageListener != null) { - delegatePageListener.onPageScrolled(position, positionOffset, positionOffsetPixels); - } - } - - @Override - public void onPageScrollStateChanged(int state) { - if (state == ViewPager.SCROLL_STATE_IDLE) { - scrollToChild(pager.getCurrentItem(), 0); - } - if (delegatePageListener != null) { - delegatePageListener.onPageScrollStateChanged(state); - } - } - - @Override - public void onPageSelected(int position) { - if (delegatePageListener != null) { - delegatePageListener.onPageSelected(position); - } - for (int a = 0; a < tabsContainer.getChildCount(); a++) { - tabsContainer.getChildAt(a).setSelected(a == position); - } - } - } - - public void onSizeChanged(int paramInt1, int paramInt2, int paramInt3, int paramInt4) { - if (!shouldExpand) { - post(new Runnable() { - public void run() { - PagerSlidingTabStrip2.this.notifyDataSetChanged(); - } - }); - } - } - - public void setIndicatorColor(int indicatorColor) { - this.indicatorColor = indicatorColor; - invalidate(); - } - - public void setIndicatorColorResource(int resId) { - this.indicatorColor = getResources().getColor(resId); - invalidate(); - } - - public int getIndicatorColor() { - return this.indicatorColor; - } - - public void setIndicatorHeight(int indicatorLineHeightPx) { - this.indicatorHeight = indicatorLineHeightPx; - invalidate(); - } - - public int getIndicatorHeight() { - return indicatorHeight; - } - - public void setUnderlineColor(int underlineColor) { - this.underlineColor = underlineColor; - invalidate(); - } - - public void setUnderlineColorResource(int resId) { - this.underlineColor = getResources().getColor(resId); - invalidate(); - } - - public int getUnderlineColor() { - return underlineColor; - } - - public void setUnderlineHeight(int underlineHeightPx) { - this.underlineHeight = underlineHeightPx; - invalidate(); - } - - public int getUnderlineHeight() { - return underlineHeight; - } - - public void setDividerPadding(int dividerPaddingPx) { - this.dividerPadding = dividerPaddingPx; - invalidate(); - } - - public int getDividerPadding() { - return dividerPadding; - } - - public void setScrollOffset(int scrollOffsetPx) { - this.scrollOffset = scrollOffsetPx; - invalidate(); - } - - public int getScrollOffset() { - return scrollOffset; - } - - public void setShouldExpand(boolean shouldExpand) { - this.shouldExpand = shouldExpand; - tabsContainer.setLayoutParams(new FrameLayout.LayoutParams(-1, -1)); - updateTabStyles(); - requestLayout(); - } - - public boolean getShouldExpand() { - return shouldExpand; - } - - public void setTabPaddingLeftRight(int paddingPx) { - this.tabPadding = paddingPx; - updateTabStyles(); - } - - public int getTabPaddingLeftRight() { - return tabPadding; - } -} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/SmileProcessor.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/SmileProcessor.java deleted file mode 100644 index 46dc2380b0..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/SmileProcessor.java +++ /dev/null @@ -1,908 +0,0 @@ -/* - * Copyright (C) 2015 Actor LLC. - */ - -package im.actor.sdk.view.emoji; - -import android.app.Application; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Rect; -import android.os.Build; -import android.os.Handler; -import android.os.Looper; -import android.os.Process; -import android.text.Spannable; -import android.text.TextPaint; -import android.text.style.ReplacementSpan; -import android.util.TypedValue; - -import java.io.File; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.concurrent.CopyOnWriteArrayList; - -import im.actor.core.utils.IOUtils; -import im.actor.sdk.util.images.common.ImageMetadata; -import im.actor.sdk.util.images.ops.ImageLoading; -import im.actor.sdk.util.images.sources.FileSource; -import im.actor.sdk.view.emoji.smiles.SmilesPack; -import im.actor.sdk.view.emoji.smiles.SmilesRecentListener; -import im.actor.sdk.view.emoji.smiles.SmilesRecentsController; -import im.actor.sdk.view.emoji.smiles.SmileysPack; -import im.actor.sdk.view.emoji.keyboard.emoji.smiles.SmilesListener; -import im.actor.runtime.Log; - - -public class SmileProcessor { - - private static final String TAG = "Emoji"; - - private static final int COUNT_IN_ROW = 32; - private static final int COUNT_IN_COL = 26; - private static final int SECTION_SIDE = 8; - private static final int SECTION_ROW_COUNT = COUNT_IN_ROW / SECTION_SIDE; - private static final int SECTION_COL_COUNT = (int) Math.ceil((float) COUNT_IN_COL / SECTION_SIDE); - - public static final int CONFIGURATION_DIALOGS = 0; - public static final int CONFIGURATION_BUBBLES = 1; - - private static final long[] EMOJI_MAP = {2302179L, 3154147L, 3219683L, 3285219L, 3350755L, 3416291L, 3481827L, 3547363L, 3612899L, 3678435L, 3743971L, 169L, 174L, 8252L, 8265L, 8482L, 8505L, 8596L, 8597L, 8598L, 8599L, 8600L, 8601L, 8617L, 8618L, 8986L, 8987L, 9193L, 9194L, 9195L, 9196L, 9200L, 9203L, 9410L, 9642L, 9643L, 9654L, 9664L, 9723L, 9724L, 9725L, 9726L, 9728L, 9729L, 9742L, 9745L, 9748L, 9749L, 9757L, 9786L, 9800L, 9801L, 9802L, 9803L, 9804L, 9805L, 9806L, 9807L, 9808L, 9809L, 9810L, 9811L, 9824L, 9827L, 9829L, 9830L, 9832L, 9851L, 9855L, 9875L, 9888L, 9889L, 9898L, 9899L, 9917L, 9918L, 9924L, 9925L, 9934L, 9940L, 9962L, 9970L, 9971L, 9973L, 9978L, 9981L, 9986L, 9989L, 9992L, 9993L, 9994L, 9995L, 9996L, 9999L, 10002L, 10004L, 10006L, 10024L, 10035L, 10036L, 10052L, 10055L, 10060L, 10062L, 10067L, 10068L, 10069L, 10071L, 10084L, 10133L, 10134L, 10135L, 10145L, 10160L, 10175L, 10548L, 10549L, 11013L, 11014L, 11015L, 11035L, 11036L, 11088L, 11093L, 12336L, 12349L, 12951L, 12953L, 3627867140L, 3627867343L, 3627867504L, 3627867505L, 3627867518L, 3627867519L, 3627867534L, 3627867537L, 3627867538L, 3627867539L, 3627867540L, 3627867541L, 3627867542L, 3627867543L, 3627867544L, 3627867545L, 3627867546L, -2865171270784459277L, -2865171266489491990L, -2865171262194524680L, -2865171257899557385L, -2865171253604590105L, -2865171245014655495L, -2865171240719688203L, -2865171236424720905L, -2865171206359949830L, -2865171193475047944L, 3627867649L, 3627867650L, 3627867674L, 3627867695L, 3627867699L, 3627867701L, 3627867702L, 3627867703L, 3627867704L, 3627867705L, 3627867706L, 3627867728L, 3627867904L, 3627867905L, 3627867906L, 3627867907L, 3627867908L, 3627867909L, 3627867910L, 3627867911L, 3627867912L, 3627867913L, 3627867914L, 3627867915L, 3627867916L, 3627867917L, 3627867918L, 3627867919L, 3627867920L, 3627867921L, 3627867922L, 3627867923L, 3627867924L, 3627867925L, 3627867926L, 3627867927L, 3627867928L, 3627867929L, 3627867930L, 3627867931L, 3627867932L, 3627867933L, 3627867934L, 3627867935L, 3627867936L, 3627867952L, 3627867953L, 3627867954L, 3627867955L, 3627867956L, 3627867957L, 3627867959L, 3627867960L, 3627867961L, 3627867962L, 3627867963L, 3627867964L, 3627867965L, 3627867966L, 3627867967L, 3627867968L, 3627867969L, 3627867970L, 3627867971L, 3627867972L, 3627867973L, 3627867974L, 3627867975L, 3627867976L, 3627867977L, 3627867978L, 3627867979L, 3627867980L, 3627867981L, 3627867982L, 3627867983L, 3627867984L, 3627867985L, 3627867986L, 3627867987L, 3627867988L, 3627867989L, 3627867990L, 3627867991L, 3627867992L, 3627867993L, 3627867994L, 3627867995L, 3627867996L, 3627867997L, 3627867998L, 3627867999L, 3627868000L, 3627868001L, 3627868002L, 3627868003L, 3627868004L, 3627868005L, 3627868006L, 3627868007L, 3627868008L, 3627868009L, 3627868010L, 3627868011L, 3627868012L, 3627868013L, 3627868014L, 3627868015L, 3627868016L, 3627868017L, 3627868018L, 3627868019L, 3627868020L, 3627868021L, 3627868022L, 3627868023L, 3627868024L, 3627868025L, 3627868026L, 3627868027L, 3627868028L, 3627868032L, 3627868033L, 3627868034L, 3627868035L, 3627868036L, 3627868037L, 3627868038L, 3627868039L, 3627868040L, 3627868041L, 3627868042L, 3627868043L, 3627868044L, 3627868045L, 3627868046L, 3627868047L, 3627868048L, 3627868049L, 3627868050L, 3627868051L, 3627868064L, 3627868065L, 3627868066L, 3627868067L, 3627868068L, 3627868069L, 3627868070L, 3627868071L, 3627868072L, 3627868073L, 3627868074L, 3627868075L, 3627868076L, 3627868077L, 3627868078L, 3627868079L, 3627868080L, 3627868081L, 3627868082L, 3627868083L, 3627868084L, 3627868085L, 3627868086L, 3627868087L, 3627868088L, 3627868089L, 3627868090L, 3627868091L, 3627868092L, 3627868093L, 3627868094L, 3627868095L, 3627868096L, 3627868097L, 3627868098L, 3627868099L, 3627868100L, 3627868102L, 3627868103L, 3627868104L, 3627868105L, 3627868106L, 3627868128L, 3627868129L, 3627868130L, 3627868131L, 3627868132L, 3627868133L, 3627868134L, 3627868135L, 3627868136L, 3627868137L, 3627868138L, 3627868139L, 3627868140L, 3627868141L, 3627868142L, 3627868143L, 3627868144L, 3627932672L, 3627932673L, 3627932674L, 3627932675L, 3627932676L, 3627932677L, 3627932678L, 3627932679L, 3627932680L, 3627932681L, 3627932682L, 3627932683L, 3627932684L, 3627932685L, 3627932686L, 3627932687L, 3627932688L, 3627932689L, 3627932690L, 3627932691L, 3627932692L, 3627932693L, 3627932694L, 3627932695L, 3627932696L, 3627932697L, 3627932698L, 3627932699L, 3627932700L, 3627932701L, 3627932702L, 3627932703L, 3627932704L, 3627932705L, 3627932706L, 3627932707L, 3627932708L, 3627932709L, 3627932710L, 3627932711L, 3627932712L, 3627932713L, 3627932714L, 3627932715L, 3627932716L, 3627932717L, 3627932718L, 3627932719L, 3627932720L, 3627932721L, 3627932722L, 3627932723L, 3627932724L, 3627932725L, 3627932726L, 3627932727L, 3627932728L, 3627932729L, 3627932730L, 3627932731L, 3627932732L, 3627932733L, 3627932734L, 3627932736L, 3627932738L, 3627932739L, 3627932740L, 3627932741L, 3627932742L, 3627932743L, 3627932744L, 3627932745L, 3627932746L, 3627932747L, 3627932748L, 3627932749L, 3627932750L, 3627932751L, 3627932752L, 3627932753L, 3627932754L, 3627932755L, 3627932756L, 3627932757L, 3627932758L, 3627932759L, 3627932760L, 3627932761L, 3627932762L, 3627932763L, 3627932764L, 3627932765L, 3627932766L, 3627932767L, 3627932768L, 3627932769L, 3627932770L, 3627932771L, 3627932772L, 3627932773L, 3627932774L, 3627932775L, 3627932776L, 3627932777L, 3627932778L, 3627932779L, 3627932780L, 3627932781L, 3627932782L, 3627932783L, 3627932784L, 3627932785L, 3627932786L, 3627932787L, 3627932788L, 3627932789L, 3627932790L, 3627932791L, 3627932792L, 3627932793L, 3627932794L, 3627932795L, 3627932796L, 3627932797L, 3627932798L, 3627932799L, 3627932800L, 3627932801L, 3627932802L, 3627932803L, 3627932804L, 3627932805L, 3627932806L, 3627932807L, 3627932808L, 3627932809L, 3627932810L, 3627932811L, 3627932812L, 3627932813L, 3627932814L, 3627932815L, 3627932816L, 3627932817L, 3627932818L, 3627932819L, 3627932820L, 3627932821L, 3627932822L, 3627932823L, 3627932824L, 3627932825L, 3627932826L, 3627932827L, 3627932828L, 3627932829L, 3627932830L, 3627932831L, 3627932832L, 3627932833L, 3627932834L, 3627932835L, 3627932836L, 3627932837L, 3627932838L, 3627932839L, 3627932840L, 3627932841L, 3627932842L, 3627932843L, 3627932844L, 3627932845L, 3627932846L, 3627932847L, 3627932848L, 3627932849L, 3627932850L, 3627932851L, 3627932852L, 3627932853L, 3627932854L, 3627932855L, 3627932856L, 3627932857L, 3627932858L, 3627932859L, 3627932860L, 3627932861L, 3627932862L, 3627932863L, 3627932864L, 3627932865L, 3627932866L, 3627932867L, 3627932868L, 3627932869L, 3627932870L, 3627932871L, 3627932872L, 3627932873L, 3627932874L, 3627932875L, 3627932876L, 3627932877L, 3627932878L, 3627932879L, 3627932880L, 3627932881L, 3627932882L, 3627932883L, 3627932884L, 3627932885L, 3627932886L, 3627932887L, 3627932888L, 3627932889L, 3627932890L, 3627932891L, 3627932892L, 3627932893L, 3627932894L, 3627932895L, 3627932896L, 3627932897L, 3627932898L, 3627932899L, 3627932900L, 3627932901L, 3627932902L, 3627932903L, 3627932904L, 3627932905L, 3627932906L, 3627932907L, 3627932908L, 3627932909L, 3627932910L, 3627932911L, 3627932912L, 3627932913L, 3627932914L, 3627932915L, 3627932916L, 3627932917L, 3627932918L, 3627932919L, 3627932921L, 3627932922L, 3627932923L, 3627932924L, 3627932928L, 3627932929L, 3627932930L, 3627932931L, 3627932932L, 3627932933L, 3627932934L, 3627932935L, 3627932936L, 3627932937L, 3627932938L, 3627932939L, 3627932940L, 3627932941L, 3627932942L, 3627932943L, 3627932944L, 3627932945L, 3627932946L, 3627932947L, 3627932948L, 3627932949L, 3627932950L, 3627932951L, 3627932952L, 3627932953L, 3627932954L, 3627932955L, 3627932956L, 3627932957L, 3627932958L, 3627932959L, 3627932960L, 3627932961L, 3627932962L, 3627932963L, 3627932964L, 3627932965L, 3627932966L, 3627932967L, 3627932968L, 3627932969L, 3627932970L, 3627932971L, 3627932972L, 3627932973L, 3627932974L, 3627932975L, 3627932976L, 3627932977L, 3627932978L, 3627932979L, 3627932980L, 3627932981L, 3627932982L, 3627932983L, 3627932984L, 3627932985L, 3627932986L, 3627932987L, 3627932988L, 3627932989L, 3627933008L, 3627933009L, 3627933010L, 3627933011L, 3627933012L, 3627933013L, 3627933014L, 3627933015L, 3627933016L, 3627933017L, 3627933018L, 3627933019L, 3627933179L, 3627933180L, 3627933181L, 3627933182L, 3627933183L, 3627933184L, 3627933185L, 3627933186L, 3627933187L, 3627933188L, 3627933189L, 3627933190L, 3627933191L, 3627933192L, 3627933193L, 3627933194L, 3627933195L, 3627933196L, 3627933197L, 3627933198L, 3627933199L, 3627933200L, 3627933201L, 3627933202L, 3627933203L, 3627933204L, 3627933205L, 3627933206L, 3627933207L, 3627933208L, 3627933209L, 3627933210L, 3627933211L, 3627933212L, 3627933213L, 3627933214L, 3627933215L, 3627933216L, 3627933217L, 3627933218L, 3627933219L, 3627933220L, 3627933221L, 3627933222L, 3627933223L, 3627933224L, 3627933225L, 3627933226L, 3627933227L, 3627933228L, 3627933229L, 3627933230L, 3627933231L, 3627933232L, 3627933233L, 3627933234L, 3627933235L, 3627933236L, 3627933237L, 3627933238L, 3627933239L, 3627933240L, 3627933241L, 3627933242L, 3627933243L, 3627933244L, 3627933245L, 3627933246L, 3627933247L, 3627933248L, 3627933253L, 3627933254L, 3627933255L, 3627933256L, 3627933257L, 3627933258L, 3627933259L, 3627933260L, 3627933261L, 3627933262L, 3627933263L, 3627933312L, 3627933313L, 3627933314L, 3627933315L, 3627933316L, 3627933317L, 3627933318L, 3627933319L, 3627933320L, 3627933321L, 3627933322L, 3627933323L, 3627933324L, 3627933325L, 3627933326L, 3627933327L, 3627933328L, 3627933329L, 3627933330L, 3627933331L, 3627933332L, 3627933333L, 3627933334L, 3627933335L, 3627933336L, 3627933337L, 3627933338L, 3627933339L, 3627933340L, 3627933341L, 3627933342L, 3627933343L, 3627933344L, 3627933345L, 3627933346L, 3627933347L, 3627933348L, 3627933349L, 3627933350L, 3627933351L, 3627933352L, 3627933353L, 3627933354L, 3627933355L, 3627933356L, 3627933357L, 3627933358L, 3627933359L, 3627933360L, 3627933361L, 3627933362L, 3627933363L, 3627933364L, 3627933365L, 3627933366L, 3627933367L, 3627933368L, 3627933369L, 3627933370L, 3627933371L, 3627933372L, 3627933373L, 3627933374L, 3627933375L, 3627933376L, 3627933377L, 3627933378L, 3627933379L, 3627933380L, 3627933381L}; - private static final long[] EMOJI_SORTED; - private static final long minEmoji1; - private static final long maxEmoji1; - private static final long minEmoji2; - private static final long maxEmoji2; - private static final HashSet EMOJI_SET = new HashSet<>(EMOJI_MAP.length); - - static { - for (int i = 0; i < EMOJI_MAP.length; i++) { - EMOJI_SET.add(EMOJI_MAP[i]); - } - EMOJI_SORTED = new long[EMOJI_MAP.length]; - long min1 = 0xFFFF, max1 = 0; - long min2 = 0xFFFFFFFF, max2 = 0; - for (int i = 0; i < EMOJI_MAP.length; i++) { - EMOJI_SORTED[i] = EMOJI_MAP[i]; - if ((EMOJI_SORTED[i] & 0xffff) == EMOJI_SORTED[i]) { - if (EMOJI_SORTED[i] < min1) { - min1 = EMOJI_SORTED[i]; - } - if (EMOJI_SORTED[i] > max1) { - max1 = EMOJI_SORTED[i]; - } - } else if ((EMOJI_SORTED[i] & 0xffffffff) == EMOJI_SORTED[i]) { - if (EMOJI_SORTED[i] < min2) { - min2 = EMOJI_SORTED[i]; - } - if (EMOJI_SORTED[i] > max2) { - max2 = EMOJI_SORTED[i]; - } - } - } - - minEmoji1 = min1; - maxEmoji1 = max1; - - minEmoji2 = min2; - maxEmoji2 = max2; - Arrays.sort(EMOJI_SORTED); - } - - private static final int LAYOUT_1X = 1; - private static final int LAYOUT_15X_1 = 2; - private static final int LAYOUT_15X_2 = 3; - private static final int LAYOUT_2X_1 = 4; - private static final int LAYOUT_2X_2 = 5; - private static SmileProcessor instance; - private static SmileProcessor processor; - - // protected Bitmap emojiImages; - protected HashMap emojiMap; - - private static final Spannable.Factory spannableFactory = Spannable.Factory.getInstance(); - - private Application application; - private float density; - - private HashMap indexes; - private HashMap originalMetrics; - - private int layoutType = LAYOUT_1X; - - private boolean isLoading = false; - private boolean isLoaded = false; - - private Handler handler = new Handler(Looper.getMainLooper()); - private CopyOnWriteArrayList listeners = new CopyOnWriteArrayList(); - - private int emojiSideSize; - - private int rectSize = 0; - private SmilesRecentListener smilesRecentListener; - private SmilesRecentsController recentController; - - public static final SmileProcessor emoji() { - return processor; - } - - public SmileProcessor(Application application) { - long start = System.currentTimeMillis(); - this.application = application; - processor = this; - density = application.getResources().getDisplayMetrics().density; - - emojiSideSize = (int) (density * 20); - - Log.d(TAG, "Emoji phase 0 in " + (System.currentTimeMillis() - start) + " ms"); - - if (density >= 2 || density == 1) { - if (density >= 2) { - // XHDPI and more - if (SmileysPack.PACK_2) { - layoutType = LAYOUT_2X_1; - } else if (SmileysPack.PACK_15) { - layoutType = LAYOUT_15X_1; - } else if (SmileysPack.PACK_1) { - layoutType = LAYOUT_1X; - } else { - throw new RuntimeException("Unable to find smileys pack"); - } - } else { - // MDPI - if (SmileysPack.PACK_1) { - layoutType = LAYOUT_1X; - } else if (SmileysPack.PACK_15) { - layoutType = LAYOUT_15X_1; - } else if (SmileysPack.PACK_2) { - layoutType = LAYOUT_2X_2; - } else { - throw new RuntimeException("Unable to find smileys pack"); - } - } - } else { - if (density > 1) { // 1.3333 and 1.5 - // HDPI & TVDPI - if (SmileysPack.PACK_15) { - layoutType = LAYOUT_15X_1; - } else if (SmileysPack.PACK_2) { - layoutType = LAYOUT_2X_1; - } else if (SmileysPack.PACK_1) { - layoutType = LAYOUT_1X; - } else { - throw new RuntimeException("Unable to find smileys pack"); - } - } else { // 0.75 - // LDPI - if (SmileysPack.PACK_15) { - layoutType = LAYOUT_15X_2; - } else if (SmileysPack.PACK_1) { - layoutType = LAYOUT_1X; - } else if (SmileysPack.PACK_2) { - layoutType = LAYOUT_2X_2; - } else { - throw new RuntimeException("Unable to find smileys pack"); - } - } - } - - Log.d(TAG, "Emoji phase 1 in " + (System.currentTimeMillis() - start) + " ms"); - start = System.currentTimeMillis(); - - switch (layoutType) { - default: - case LAYOUT_1X: - rectSize = 28; - break; - case LAYOUT_15X_1: - rectSize = 36; - break; - case LAYOUT_15X_2: - rectSize = 18; - break; - case LAYOUT_2X_1: - rectSize = 56; - break; - case LAYOUT_2X_2: - rectSize = 28; - break; - } - - indexes = new HashMap(); - emojiMap = new HashMap(); - originalMetrics = new HashMap(); - - TextPaint bodyPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG); - // bodyPaint.setTypeface(FontController.loadTypeface(application, "normal")); - bodyPaint.setTextSize(getSp(16)); - bodyPaint.setColor(0xff000000); - originalMetrics.put(CONFIGURATION_BUBBLES, bodyPaint.getFontMetricsInt()); - - bodyPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG); - // bodyPaint.setTypeface(FontController.loadTypeface(application, "light")); - bodyPaint.setColor(0xff808080); - bodyPaint.setTextSize(getSp(15.5f)); - originalMetrics.put(CONFIGURATION_DIALOGS, bodyPaint.getFontMetricsInt()); - - Log.d(TAG, "Emoji phase 2 in " + (System.currentTimeMillis() - start) + " ms"); - start = System.currentTimeMillis(); - - for (int i = 0; i < EMOJI_MAP.length; i++) { - indexes.put(EMOJI_MAP[i], i); - } - - Log.d(TAG, "Emoji phase 3 in " + (System.currentTimeMillis() - start) + " ms"); - } - - protected int getSp(float sp) { - return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, application.getResources().getDisplayMetrics()); - } - - public boolean isLoaded() { - return isLoaded; - } - - public void registerListener(SmilesListener listener) { - if (!listeners.contains(listener)) { - listeners.add(listener); - } - } - - public void unregisterListener(SmilesListener listener) { - listeners.remove(listener); - } - - public void loadEmoji() { - if (isLoaded) { - return; - } - if (isLoading) { - return; - } - isLoading = true; - new Thread() { - @Override - public void run() { - Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST); - long start = System.currentTimeMillis(); - Log.d(TAG, "emoji loading start"); - try { - - boolean useScale = false; - String fileName = null; - String fileNameAlpha = null; - - - switch (layoutType) { - default: - case LAYOUT_1X: - fileName = "emoji_c_1.jpg"; - fileNameAlpha = "emoji_a_1.jpg"; - useScale = false; - break; - case LAYOUT_15X_1: - fileName = "emoji_c_15.jpg"; - fileNameAlpha = "emoji_a_15.jpg"; - useScale = false; - break; - case LAYOUT_15X_2: - fileName = "emoji_c_15.jpg"; - fileNameAlpha = "emoji_a_15.jpg"; - useScale = true; - break; - case LAYOUT_2X_1: - fileName = "emoji_c_2.jpg"; - fileNameAlpha = "emoji_a_2.jpg"; - useScale = false; - break; - case LAYOUT_2X_2: - fileName = "emoji_c_2.jpg"; - fileNameAlpha = "emoji_a_2.jpg"; - useScale = true; - break; - } - - File sourceFile = application.getFileStreamPath(fileName); - if (!sourceFile.exists()) { - InputStream colorsIs = SmileProcessor.this.application.getAssets().open(fileName); - IOUtils.copy(colorsIs, sourceFile); - colorsIs.close(); - } - - File sourceAlphaFile = application.getFileStreamPath(fileNameAlpha); - if (!sourceAlphaFile.exists()) { - InputStream colorsIs = SmileProcessor.this.application.getAssets().open(fileNameAlpha); - IOUtils.copy(colorsIs, sourceAlphaFile); - colorsIs.close(); - } - - ImageMetadata metadata = new FileSource(sourceFile.getAbsolutePath()).getImageMetadata(); - int w = useScale ? metadata.getW() / 2 : metadata.getW(); - int h = useScale ? metadata.getH() / 2 : metadata.getH(); - - Bitmap colorsBitmap; - Bitmap alphaBitmap; - - if (useScale) { - colorsBitmap = ImageLoading.loadBitmap(sourceFile.getAbsolutePath(), 2); - alphaBitmap = ImageLoading.loadBitmap(sourceAlphaFile.getAbsolutePath(), 2); - } else { - colorsBitmap = ImageLoading.loadBitmap(sourceFile.getAbsolutePath(), 1); - alphaBitmap = ImageLoading.loadBitmap(sourceAlphaFile.getAbsolutePath(), 1); - } - - // Bitmap colorsBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); - // BitmapDecoderEx.decodeReuseBitmapScaled(sourceFile.getAbsolutePath(), colorsBitmap); - // colorsBitmap.setHasAlpha(true); - - // BitmapDecoderEx.decodeReuseBitmapBlend(sourceAlphaFile.getAbsolutePath(), colorsBitmap, useScale); - - Log.d(TAG, "emoji pre-loaded in " + (System.currentTimeMillis() - start) + " ms"); - - int[] resultColors = new int[rectSize * SECTION_SIDE * rectSize * SECTION_SIDE]; - int[] tmpColors = new int[rectSize * SECTION_SIDE * rectSize * SECTION_SIDE]; - - int[] order = new int[]{8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3, 12, 13, 14, 15}; - int stride = rectSize * SECTION_SIDE; - for (int ordinal : order) { - int col = ordinal % SECTION_COL_COUNT; - int row = ordinal / SECTION_COL_COUNT; - - int leftOffset = col * stride; - int topOffset = row * stride; - int width = stride; - int height = stride; - if (row == SECTION_ROW_COUNT - 1) { - height = colorsBitmap.getHeight() - topOffset; - } - - colorsBitmap.getPixels(tmpColors, 0, stride, leftOffset, topOffset, width, height); - for (int ind = 0; ind < resultColors.length; ind++) { - resultColors[ind] = 0xFFFFFF & tmpColors[ind]; - } - alphaBitmap.getPixels(tmpColors, 0, stride, leftOffset, topOffset, width, height); - for (int ind = 0; ind < resultColors.length; ind++) { - resultColors[ind] = resultColors[ind] | ((tmpColors[ind] & 0xFF) << 24); - } - - Bitmap section = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - /*Canvas canvas = new Canvas(section); - canvas.drawBitmap(colorsBitmap, new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height), - new Rect(0, 0, width, height), new Paint());*/ - section.setPixels(resultColors, 0, stride, 0, 0, width, height); - emojiMap.put(ordinal, section); - - Log.d(TAG, "emoji region loaded in " + (System.currentTimeMillis() - start) + " ms"); - } - - recentController = SmilesRecentsController.getInstance(application); - - isLoaded = true; - notifyEmojiUpdated(true); - Log.d(TAG, "emoji loaded in " + (System.currentTimeMillis() - start) + " ms"); - } catch (Throwable t) { - t.printStackTrace(); - Log.d(TAG, "emoji loading error"); - isLoaded = false; - isLoading = false; - } - } - }.start(); - } - - private void notifyEmojiUpdated(final boolean completed) { - handler.post(new Runnable() { - @Override - public void run() { - Log.d(TAG, "notify"); - for (SmilesListener listener : listeners) { - listener.onSmilesUpdated(completed); - } - } - }); - } - - public void waitForEmoji() { - if (isLoaded) { - return; - } - - final Object lock = new Object(); - synchronized (lock) { - listeners.add(new SmilesListener() { - @Override - public void onSmilesUpdated(boolean completed) { - synchronized (lock) { - lock.notify(); - } - - } - }); - try { - lock.wait(); - } catch (InterruptedException e) { - e.printStackTrace(); - return; - } - } - } - - private long getId(String val) { - long id = 0; - if (val.length() == 1) { - id = val.charAt(0); - } else { - id = ((long) val.charAt(0) << 16) + (long) val.charAt(1); - } - - return id; - } - - - public Bitmap getBitmap(String emojiString) { - return getSection(emojiString.charAt(0)); - } - - public void upRecent(long smileId) { - SmilesPack.upRecent(smileId); - if (smilesRecentListener != null) { - smilesRecentListener.onSmilesUpdated(); - } - - } - - public void setRecentUpdateListener(SmilesRecentListener smilesRecentListener) { - this.smilesRecentListener = smilesRecentListener; - } - - public SmilesRecentsController getRecentController() { - return recentController; - } - - private class SpanDescription { - - private SpanDescription(long id, int start, int end) { - this.id = id; - this.start = start; - this.end = end; - } - - public long id; - public int start, end; - } - - public String cutEmoji(String s) { - StringBuilder stringBuilder = new StringBuilder(); - - long prev = 0; - long prevLong = 0; - int prevLongCount = 0; - int lastTextPos = 0; - - ArrayList list = new ArrayList(); - - for (int i = 0; i < s.length(); i++) { - long current = s.charAt(i); - - if (prevLongCount == 3) { - long prevId = ((prevLong & 0xFFFFFFFF) << 16) + current; - if (EMOJI_SET.contains(prevId)) { - if (lastTextPos < i - 3) { - stringBuilder.append(s.substring(lastTextPos, i - 3)); - lastTextPos = i - 3; - } - stringBuilder.append(":smile:"); - lastTextPos += 4; - - list.add(new SpanDescription(prevId, i - 3, i + 1)); - - prev = 0; - prevLong = 0; - prevLongCount = 0; - continue; - } - } - - if (prev != 0) { - long prevId = ((prev & 0xFFFF) << 16) + current; - - if (EMOJI_SET.contains(prevId)) { - - if (lastTextPos < i - 1) { - stringBuilder.append(s.substring(lastTextPos, i - 1)); - lastTextPos = i - 1; - } - stringBuilder.append(":smile:"); - lastTextPos += 2; - - list.add(new SpanDescription(prevId, i - 1, i + 1)); - - prev = 0; - prevLong = 0; - prevLongCount = 0; - continue; - } - } - - if (EMOJI_SET.contains(current)) { - - if (lastTextPos < i) { - stringBuilder.append(s.substring(lastTextPos, i)); - lastTextPos = i; - } - stringBuilder.append(":smile:"); - lastTextPos += 1; - - list.add(new SpanDescription(current, i, i + 1)); - - prev = 0; - prevLong = 0; - prevLongCount = 0; - } else { - prev = current; - prevLong = ((prevLong & 0xFFFFFFFF) << 16) + current; - if (prevLongCount < 3) { - prevLongCount++; - } - } - } - - if (lastTextPos < s.length()) { - stringBuilder.append(s.substring(lastTextPos, s.length())); - } - - return stringBuilder.toString(); - } - - public String fixStringCompat(String src) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - return src; - } else { - return cutEmoji(src); - } - } - - public Spannable processEmojiCutMutable(String s, int mode) { - StringBuilder stringBuilder = new StringBuilder(); - - long prev = 0; - long prevLong = 0; - int prevLongCount = 0; - int lastTextPos = 0; - - ArrayList list = new ArrayList(); - - for (int i = 0; i < s.length(); i++) { - long current = s.charAt(i); - - if (prevLongCount == 3) { - long prevId = ((prevLong & 0xFFFFFFFF) << 16) + current; - if (EMOJI_SET.contains(prevId)) { - if (lastTextPos < i - 3) { - stringBuilder.append(s.substring(lastTextPos, i - 3)); - lastTextPos = i - 3; - } - stringBuilder.append("++++"); - lastTextPos += 4; - - list.add(new SpanDescription(prevId, i - 3, i + 1)); - - prev = 0; - prevLong = 0; - prevLongCount = 0; - continue; - } - } - - if (prev != 0) { - long prevId = ((prev & 0xFFFF) << 16) + current; - - if (EMOJI_SET.contains(prevId)) { - - if (lastTextPos < i - 1) { - stringBuilder.append(s.substring(lastTextPos, i - 1)); - lastTextPos = i - 1; - } - stringBuilder.append("++"); - lastTextPos += 2; - - list.add(new SpanDescription(prevId, i - 1, i + 1)); - - prev = 0; - prevLong = 0; - prevLongCount = 0; - continue; - } - } - - if (EMOJI_SET.contains(current)) { - - if (lastTextPos < i) { - stringBuilder.append(s.substring(lastTextPos, i)); - lastTextPos = i; - } - stringBuilder.append("+"); - lastTextPos += 1; - - list.add(new SpanDescription(current, i, i + 1)); - /*stringBuilder.setSpan(new ImageSpan(res, isAlignBottom ? ImageSpan.ALIGN_BOTTOM : ImageSpan.ALIGN_BASELINE), - i, i + 1, - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);*/ - - prev = 0; - prevLong = 0; - prevLongCount = 0; - } else { - prev = current; - prevLong = ((prevLong & 0xFFFFFFFF) << 16) + current; - if (prevLongCount < 3) { - prevLongCount++; - } - } - } - - if (lastTextPos < s.length()) { - stringBuilder.append(s.substring(lastTextPos, s.length())); - } - - Spannable spannable = spannableFactory.newSpannable(stringBuilder.toString()); - for (SpanDescription description : list) { - spannable.setSpan(new EmojiSpan(this, indexes.get(description.id), emojiSideSize, originalMetrics.get(mode)), description.start, description.end, - Spannable.SPAN_INCLUSIVE_EXCLUSIVE); - } - return spannable; - } - - public Spannable processEmojiMutable(CharSequence s, int mode) { - - long prev = 0; - long prevLong = 0; - int prevLongCount = 0; - - ArrayList list = new ArrayList(); - - for (int i = 0; i < s.length(); i++) { - long current = s.charAt(i); - - if (prevLongCount == 3) { - long prevId = ((prevLong & 0xFFFFFFFF) << 16) + current; - if (Arrays.binarySearch(EMOJI_SORTED, prevId) >= 0) { - list.add(new SpanDescription(prevId, i - 3, i + 1)); - prev = 0; - prevLong = 0; - prevLongCount = 0; - continue; - } - } - - if (prev != 0) { - long prevId = ((prev & 0xFFFF) << 16) + current; - if (Arrays.binarySearch(EMOJI_SORTED, prevId) >= 0) { - list.add(new SpanDescription(prevId, i - 1, i + 1)); - prev = 0; - prevLong = 0; - prevLongCount = 0; - continue; - } - } - - if (Arrays.binarySearch(EMOJI_SORTED, current) >= 0) { - list.add(new SpanDescription(current, i, i + 1)); - prev = 0; - prevLong = 0; - prevLongCount = 0; - } else { - prev = current; - prevLong = ((prevLong & 0xFFFFFFFF) << 16) + current; - if (prevLongCount < 3) { - prevLongCount++; - } - } - } - - Spannable spannable = spannableFactory.newSpannable(s); - for (SpanDescription description : list) { - spannable.setSpan(new EmojiSpan(this, indexes.get(description.id), - emojiSideSize, originalMetrics.get(mode)), description.start, description.end, - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - } - return spannable; - } - - public Spannable processEmojiCompatMutable(CharSequence s, int mode) { - return processEmojiMutable(s, mode); - } - - public static long[] findFirstUniqEmoji(String s, int count) { - long prev = 0; - long prevLong = 0; - int prevLongCount = 0; - - long[] res = new long[count]; - int index = 0; - HashSet founded = new HashSet(); - - for (int i = 0; i < s.length(); i++) { - long current = s.charAt(i); - - if (prevLongCount == 3) { - long prevId = ((prevLong & 0xFFFFFFFF) << 16) + current; - if (EMOJI_SET.contains(prevId) && !founded.contains(prevId)) { - founded.add(prevId); - res[index++] = prevId; - if (index >= count) - break; - } - } - - if (prev != 0) { - long prevId = ((prev & 0xFFFF) << 16) + current; - - if (EMOJI_SET.contains(prevId) && !founded.contains(prevId)) { - founded.add(prevId); - res[index++] = prevId; - if (index >= count) - break; - } - } - - if (EMOJI_SET.contains(current) && !founded.contains(current)) { - founded.add(current); - res[index++] = current; - if (index >= count) - break; - } else { - prev = current; - prevLong = ((prevLong & 0xFFFFFFFF) << 16) + current; - if (prevLongCount < 3) { - prevLongCount++; - } - } - } - - if (index == count) { - return res; - } else { - long[] res2 = new long[index]; - for (int i = 0; i < index; i++) { - res2[i] = res[i]; - } - return res2; - } - } - - public static boolean containsEmoji(CharSequence s) { - if (s == null) { - return false; - } - long prev = 0; - long prevLong = 0; - int prevLongCount = 0; - - for (int i = 0; i < s.length(); i++) { - long current = s.charAt(i); - -// if (prevLongCount == 3) { -// long prevId = ((prevLong & 0xFFFFFFFF) << 16) + current; -// if (Arrays.binarySearch(EMOJI_SORTED, prevId) > 0) { -// return true; -// } -// } - - if (prev != 0) { - long prevId = ((prev & 0xFFFF) << 16) + current; - - if ((current >= minEmoji2) && (current <= maxEmoji2) && Arrays.binarySearch(EMOJI_SORTED, prevId) > 0) { - return true; - } - } - - if ((current >= minEmoji1) && (current <= maxEmoji1) && Arrays.binarySearch(EMOJI_SORTED, current) > 0) { - return true; - } else { - prev = current; - prevLong = ((prevLong & 0xFFFFFFFF) << 16) + current; - if (prevLongCount < 3) { - prevLongCount++; - } - } - } - - return false; - } - - public int getRectSize() { - return rectSize; - } - - public int getSectionIndex(long emoji) { - int globalIndex = indexes.get(emoji); - int x = globalIndex / COUNT_IN_ROW; - int y = globalIndex % COUNT_IN_ROW; - - return (y / SECTION_SIDE) + (x / SECTION_SIDE) * SECTION_ROW_COUNT; - } - - public int getSectionX(long emoji) { - int globalIndex = indexes.get(emoji); - return (globalIndex % COUNT_IN_ROW) % SECTION_SIDE; - } - - public int getSectionY(long emoji) { - int globalIndex = indexes.get(emoji); - return (globalIndex / COUNT_IN_ROW) % SECTION_SIDE; - } - - public Bitmap getSection(int index) { - return emojiMap.get(index); - } - - private static Paint bitmapPaint = new Paint(); - - static { - bitmapPaint.setAntiAlias(true); - bitmapPaint.setFlags(Paint.FILTER_BITMAP_FLAG); - } - - private static Rect bitmapRect = new Rect(); - private static Rect srcRect = new Rect(); - - private class EmojiSpan extends ReplacementSpan { - - private SmileProcessor processor; - private int offset; - private int size; - private int padding; - private int section; - private int sectionX; - private int sectionY; - private Paint.FontMetricsInt originalMetrics; - - public EmojiSpan(SmileProcessor processor, int index, int size, Paint.FontMetricsInt original) { - this.processor = processor; - this.size = size; - this.originalMetrics = original; - - int x = index / COUNT_IN_ROW; - int y = index % COUNT_IN_ROW; - - section = (y / SECTION_SIDE) + (x / SECTION_SIDE) * SECTION_ROW_COUNT; - sectionX = y % SECTION_SIDE; - sectionY = x % SECTION_SIDE; - } - - @Override - public int getSize(Paint paint, CharSequence charSequence, int start, int end, Paint.FontMetricsInt fm) { - padding = (int) paint.measureText(" ") / 3; - - if (fm != null) { - fm.ascent = originalMetrics.ascent; - fm.descent = originalMetrics.descent; - - fm.top = originalMetrics.top; - fm.bottom = originalMetrics.bottom; - } - return size + padding * 2; - } - - @Override - public void draw(Canvas canvas, CharSequence text, int start, int end, - float x, int top, int y, int bottom, Paint paint) { - Bitmap srcEmoji = processor.emojiMap.get(section); - if (srcEmoji != null) { - if (paint.getFontMetrics() != null) { - offset = (int) (paint.getFontMetrics().descent); - } - x += padding; - bitmapRect.set((int) x, y - size + offset, (int) (x + size), y + offset); - srcRect.set(sectionX * rectSize, sectionY * rectSize, (sectionX + 1) * rectSize, (sectionY + 1) * rectSize); - canvas.drawBitmap(srcEmoji, srcRect, bitmapRect, bitmapPaint); - } - } - } -} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java index f65677f0f8..7be4a7e988 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java @@ -16,168 +16,85 @@ package im.actor.sdk.view.emoji.keyboard.emoji; -import android.animation.ObjectAnimator; import android.app.Activity; -import android.support.v4.view.ViewPager; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.view.KeyEvent; -import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnClickListener; import android.widget.EditText; -import android.widget.FrameLayout; -import android.widget.LinearLayout; -import im.actor.core.entity.Peer; -import im.actor.core.entity.Sticker; -import im.actor.sdk.R; -import im.actor.sdk.view.emoji.SmileProcessor; -import im.actor.sdk.view.emoji.keyboard.BaseKeyboard; -import im.actor.sdk.view.emoji.keyboard.emoji.smiles.OnBackspaceClickListener; -import im.actor.sdk.view.emoji.keyboard.emoji.smiles.OnSmileClickListener; -import im.actor.sdk.view.emoji.keyboard.emoji.smiles.RepeatListener; -import im.actor.sdk.view.emoji.keyboard.emoji.smiles.SmilePagerAdapter; +import im.actor.sdk.ActorSDK; import im.actor.sdk.util.Screen; import im.actor.sdk.view.MaterialInterpolator; -import im.actor.sdk.view.PagerSlidingTabStrip; -import im.actor.sdk.view.emoji.smiles.SmilesPack; - -import static im.actor.sdk.util.ActorSDKMessenger.messenger; +import im.actor.sdk.view.emoji.keyboard.BaseKeyboard; -public class EmojiKeyboard extends BaseKeyboard implements OnSmileClickListener, - OnBackspaceClickListener { +public class EmojiKeyboard extends BaseKeyboard { private static final String TAG = "EmojiKeyboard"; - - private static final long BINDING_DELAY = 150; private OnStickerClickListener onStickerClickListener; - private View stickerIndicatorContainer; - private View stickerSwitchContainer; - private SmilePagerAdapter mEmojisAdapter; + private static final long BINDING_DELAY = 150; public EmojiKeyboard(Activity activity, EditText messageBody) { super(activity, messageBody); } - @Override - public void onEmojiClicked(String smile) { - if (messageBody == null) { - return; - } - int selectionEnd = messageBody.getSelectionEnd(); - if (selectionEnd < 0) { - selectionEnd = messageBody.getText().length(); - } - CharSequence appendString = SmileProcessor.emoji().processEmojiMutable(smile, - SmileProcessor.CONFIGURATION_BUBBLES); - - messageBody.getText().insert(selectionEnd, appendString); - } - - @Override - public void onBackspaceClick(View v) { - if (messageBody == null) { - return; - } - KeyEvent event = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_DEL, 0, 0, 0, 0, KeyEvent.KEYCODE_ENDCALL); - messageBody.dispatchKeyEvent(event); - } @Override protected View createView() { - final View emojiPagerView = LayoutInflater.from(activity).inflate(R.layout.emoji_smiles_pager, null); - final ViewPager emojiPager = (ViewPager) emojiPagerView.findViewById(R.id.emoji_pager); + EmojiView emojiView = new EmojiView(true, getActivity()); + emojiView.setVisibility(View.VISIBLE); - final PagerSlidingTabStrip emojiPagerIndicator = (PagerSlidingTabStrip) emojiPagerView.findViewById(R.id.emoji_pager_indicator); - View backspace = emojiPagerView.findViewById(R.id.backspace); - final View backToSmiles = emojiPagerView.findViewById(R.id.back_to_smiles); - final View indicatorContainer = emojiPagerView.findViewById(R.id.indicator_container); - stickerIndicatorContainer = emojiPagerView.findViewById(R.id.sticker_indicator_container); - stickerSwitchContainer = emojiPagerView.findViewById(R.id.sticker_switch_container); - - emojiPagerIndicator.setTabBackground(R.drawable.clickable_background); - emojiPagerIndicator.setIndicatorColorResource(R.color.primary); - emojiPagerIndicator.setIndicatorHeight(Screen.dp(2)); - emojiPagerIndicator.setDividerColor(0x00000000); - emojiPagerIndicator.setUnderlineHeight(0); - emojiPagerIndicator.setTabLayoutParams(new LinearLayout.LayoutParams(Screen.dp(48), Screen.dp(48))); - - backspace.setOnTouchListener(new RepeatListener(500, 100, new OnClickListener() { - @Override - public void onClick(View v) { - onBackspaceClick(v); + emojiView.setListener(new EmojiView.Listener() { + public boolean onBackspace() { + if (messageBody == null) { + return true; + } + KeyEvent event = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_DEL, 0, 0, 0, 0, KeyEvent.KEYCODE_ENDCALL); + messageBody.dispatchKeyEvent(event); + return true; } - })); - - mEmojisAdapter = new SmilePagerAdapter(this); - mEmojisAdapter.setTabs(emojiPagerIndicator); - emojiPager.setAdapter(mEmojisAdapter); - emojiPagerIndicator.setViewPager(emojiPager); - backToSmiles.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - emojiPager.setCurrentItem(3, false); - - ObjectAnimator oa = ObjectAnimator.ofFloat(indicatorContainer, "translationX", 0, 0); - oa.setDuration(0); - oa.start(); - if (stickerIndicatorContainer.getVisibility() == View.INVISIBLE) { - stickerIndicatorContainer.setVisibility(View.VISIBLE); + public void onEmojiSelected(String symbol) { + if (messageBody == null) { + return; + } + int selectionEnd = messageBody.getSelectionEnd(); + if (selectionEnd < 0) { + selectionEnd = messageBody.getText().length(); } - ObjectAnimator oas = ObjectAnimator.ofFloat(stickerIndicatorContainer, "translationX", Screen.getWidth(), Screen.getWidth()); - oas.setDuration(0); - oas.start(); - - emojiPager.setCurrentItem(1, true); + CharSequence localCharSequence = Emoji.replaceEmoji(symbol, messageBody.getPaint().getFontMetricsInt(), Screen.dp(20), false); + messageBody.getText().insert(selectionEnd, localCharSequence); } - }); - final FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) stickerIndicatorContainer.getLayoutParams(); - - emojiPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - if (position == 4) { - - ObjectAnimator oa = ObjectAnimator.ofFloat(indicatorContainer, "translationX", indicatorContainer.getX(), -positionOffsetPixels); - oa.setDuration(0); - oa.start(); - if (stickerIndicatorContainer.getVisibility() == View.INVISIBLE) { - stickerIndicatorContainer.setVisibility(View.VISIBLE); - } - ObjectAnimator oas = ObjectAnimator.ofFloat(stickerIndicatorContainer, "translationX", stickerIndicatorContainer.getX() + Screen.getWidth(), -positionOffsetPixels + Screen.getWidth()); - oas.setDuration(0); - oas.start(); - + public void onClearEmojiRecent() { + if (getActivity() == null) { + return; } - } - - @Override - public void onPageSelected(int position) { - - } - - @Override - public void onPageScrollStateChanged(int state) { - + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle(ActorSDK.sharedActor().getAppName()); + builder.setMessage("Remover emojis recentes"); + builder.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + emojiView.clearRecentEmoji(); + } + }); + builder.setNegativeButton("Cancelar", null); + builder.create().show(); } }); - - if (SmilesPack.getRecent().size() == 0) { - emojiPager.setCurrentItem(1); - } - - return emojiPagerView; + return emojiView; } @Override protected void onDismiss() { - SmileProcessor.emoji().getRecentController().saveRecents(); + } void animateView(View view) { @@ -188,13 +105,6 @@ void animateView(View view) { .start(); } - - public void onStickerClicked(Sticker sticker) { - if (onStickerClickListener != null) { - onStickerClickListener.onStickerClicked(sticker); - } - } - public OnStickerClickListener getOnStickerClickListener() { return onStickerClickListener; } @@ -202,15 +112,4 @@ public OnStickerClickListener getOnStickerClickListener() { public void setOnStickerClickListener(OnStickerClickListener onStickerClickListener) { this.onStickerClickListener = onStickerClickListener; } - - public LinearLayout getStickerIndicatorContainer() { - return (LinearLayout) stickerSwitchContainer; - } - - public void release() { - if (mEmojisAdapter != null) { - mEmojisAdapter.release(); - } - } - } \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java deleted file mode 100644 index dbf0221cf6..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard2.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2014 Ankush Sachdeva - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.actor.sdk.view.emoji.keyboard.emoji; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.view.KeyEvent; -import android.view.View; -import android.widget.EditText; - -import im.actor.sdk.ActorSDK; -import im.actor.sdk.util.Screen; -import im.actor.sdk.view.MaterialInterpolator; -import im.actor.sdk.view.emoji.SmileProcessor; -import im.actor.sdk.view.emoji.keyboard.BaseKeyboard; - -public class EmojiKeyboard2 extends BaseKeyboard { - - private static final String TAG = "EmojiKeyboard"; - private OnStickerClickListener onStickerClickListener; - - private static final long BINDING_DELAY = 150; - - public EmojiKeyboard2(Activity activity, EditText messageBody) { - super(activity, messageBody); - } - - - @Override - protected View createView() { - - EmojiView emojiView = new EmojiView(true, getActivity()); - emojiView.setVisibility(View.VISIBLE); - - emojiView.setListener(new EmojiView.Listener() { - public boolean onBackspace() { - if (messageBody == null) { - return true; - } - KeyEvent event = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_DEL, 0, 0, 0, 0, KeyEvent.KEYCODE_ENDCALL); - messageBody.dispatchKeyEvent(event); - return true; - } - - public void onEmojiSelected(String symbol) { - if (messageBody == null) { - return; - } - int selectionEnd = messageBody.getSelectionEnd(); - if (selectionEnd < 0) { - selectionEnd = messageBody.getText().length(); - } - - CharSequence localCharSequence = Emoji.replaceEmoji(symbol, messageBody.getPaint().getFontMetricsInt(), Screen.dp(20), false); - - messageBody.getText().insert(selectionEnd, localCharSequence); - } - - - @Override - public void onClearEmojiRecent() { - if (getActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setTitle(ActorSDK.sharedActor().getAppName()); - builder.setMessage("Remover emojis recentes"); - builder.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - emojiView.clearRecentEmoji(); - } - }); - builder.setNegativeButton("Cancelar", null); - builder.create().show(); - } - }); - return emojiView; - } - - @Override - protected void onDismiss() { - SmileProcessor.emoji().getRecentController().saveRecents(); - } - - void animateView(View view) { - view.animate() - .setInterpolator(MaterialInterpolator.getInstance()) - .alpha(150) - .setDuration(300) - .start(); - } - - public OnStickerClickListener getOnStickerClickListener() { - return onStickerClickListener; - } - - public void setOnStickerClickListener(OnStickerClickListener onStickerClickListener) { - this.onStickerClickListener = onStickerClickListener; - } -} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java index 4fe727f291..326d4f2080 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java @@ -1,11 +1,8 @@ package im.actor.sdk.view.emoji.keyboard.emoji; -import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.app.Activity; -import android.app.AlertDialog; import android.content.Context; -import android.content.DialogInterface; import android.content.SharedPreferences; import android.database.DataSetObserver; import android.graphics.Canvas; @@ -17,7 +14,6 @@ import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.widget.RecyclerView; -import android.util.TypedValue; import android.view.Gravity; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; @@ -49,7 +45,6 @@ import im.actor.sdk.util.Screen; import im.actor.sdk.util.Utilities; import im.actor.sdk.view.PagerSlidingTabStrip; -import im.actor.sdk.view.PagerSlidingTabStrip2; import im.actor.sdk.view.emoji.EmojiData; import im.actor.sdk.view.emoji.stickers.StickersView; @@ -512,6 +507,8 @@ protected void onDraw(Canvas canvas) { private Listener listener; private ViewPager pager; + + private LinearLayout stickersWrap; private LinearLayout stickerIndicatorContainer; private LinearLayout stickerSwitchContainer; private StickersView stickersView; @@ -521,7 +518,7 @@ protected void onDraw(Canvas canvas) { private ImageView backspaceButton; private LinearLayout emojiTab; - private PagerSlidingTabStrip2 pagerSlidingTabStrip; + private PagerSlidingTabStrip pagerSlidingTabStrip; private int currentPage; @@ -583,7 +580,6 @@ public void getOutline(View view, Outline outline) { if(needStickers){ stickerIndicatorContainer = new LinearLayout(context); - //stickersWrap.setVisibility(View.INVISIBLE); stickerIndicatorContainer.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, Screen.dp(48))); stickerIndicatorContainer.setOrientation(LinearLayout.HORIZONTAL); stickerIndicatorContainer.setId(R.id.sticker_indicator_container); @@ -597,34 +593,33 @@ public void getOutline(View view, Outline outline) { backToSmiles.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - pager.setCurrentItem(5); -// -// ObjectAnimator oa = ObjectAnimator.ofFloat(indicatorContainer, "translationX", 0, 0); -// oa.setDuration(0); -// oa.start(); -// if (stickerIndicatorContainer.getVisibility() == View.INVISIBLE) { -// stickerIndicatorContainer.setVisibility(View.VISIBLE); -// } -// ObjectAnimator oas = ObjectAnimator.ofFloat(stickerIndicatorContainer, "translationX", Screen.getWidth(), Screen.getWidth()); -// oas.setDuration(0); -// oas.start(); -// -// emojiPager.setCurrentItem(1, true); - + pager.setCurrentItem(0); } }); stickerIndicatorContainer.addView(backToSmiles); - stickerSwitchContainer = new LinearLayout(getContext()); stickerSwitchContainer.setId(R.id.sticker_switch_container); stickerSwitchContainer.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)); stickerIndicatorContainer.addView(stickerSwitchContainer); - // stickersWrap.addView(new StickersView()); + stickersWrap = new LinearLayout(getContext()); + stickersWrap.setOrientation(LinearLayout.VERTICAL); + stickersWrap.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + + stickersWrap.addView(stickerIndicatorContainer); - views.add(stickerIndicatorContainer); + StickersView stickersView = new StickersView(getContext(), this); + +// ViewGroup.MarginLayoutParams marginLayoutParams = +// new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); +// +// marginLayoutParams.setMargins(0, Screen.dp(48), 0, 0); + + stickersWrap.addView(stickersView); + + views.add(stickersWrap); } @@ -651,7 +646,7 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { emojiTab.setOrientation(LinearLayout.HORIZONTAL); addView(emojiTab, LayoutHelper.createFrame(LayoutParams.MATCH_PARENT, 48)); - pagerSlidingTabStrip = new PagerSlidingTabStrip2(context); + pagerSlidingTabStrip = new PagerSlidingTabStrip(context); pagerSlidingTabStrip.setViewPager(pager); pagerSlidingTabStrip.setShouldExpand(true); pagerSlidingTabStrip.setIndicatorHeight(Screen.dp(2)); @@ -1094,26 +1089,20 @@ public void unregisterDataSetObserver(DataSetObserver observer) { } } - public void onStickerClicked(Sticker sticker) { } - - public LinearLayout getStickerIndicatorContainer() { - return stickerIndicatorContainer; - } - public LinearLayout getStickerSwitchContainer() { return stickerSwitchContainer; } - private class EmojiPagesAdapter extends PagerAdapter implements PagerSlidingTabStrip2.IconTabProvider { + private class EmojiPagesAdapter extends PagerAdapter implements PagerSlidingTabStrip.IconTabProvider { public void destroyItem(ViewGroup viewGroup, int position, Object object) { View view; if (position == 6) { - view = stickerIndicatorContainer; + view = stickersWrap; } else { view = views.get(position); } @@ -1141,10 +1130,7 @@ public void customOnDraw(Canvas canvas, int position) { public Object instantiateItem(ViewGroup viewGroup, int position) { View view; if (position == 6) { - if (stickersView == null) { - stickersView = new StickersView(getContext(), EmojiView.this); - } - view = stickerIndicatorContainer; + view = stickersWrap; } else { view = views.get(position); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/SmilePagerAdapter.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/SmilePagerAdapter.java deleted file mode 100644 index 3aa3bbc0f2..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/SmilePagerAdapter.java +++ /dev/null @@ -1,209 +0,0 @@ -package im.actor.sdk.view.emoji.keyboard.emoji.smiles; - -import android.content.Context; -import android.support.v4.view.PagerAdapter; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.ImageButton; - -import java.util.ArrayList; -import java.util.Arrays; - -import im.actor.runtime.mvvm.MVVMCollection; -import im.actor.sdk.R; -import im.actor.sdk.controllers.activity.BaseActivity; -import im.actor.sdk.view.emoji.SmileProcessor; -import im.actor.sdk.view.emoji.smiles.SmilesPack; -import im.actor.sdk.view.emoji.smiles.SmilesPackView; -import im.actor.sdk.view.emoji.keyboard.emoji.EmojiKeyboard; -import im.actor.sdk.util.Screen; -import im.actor.sdk.view.PagerSlidingTabStrip; -import im.actor.sdk.view.emoji.stickers.StickersView; - -import static im.actor.sdk.util.ActorSDKMessenger.messenger; - -/** -* Created by Jesus Christ. Amen. -*/ -public class SmilePagerAdapter extends PagerAdapter implements PagerSlidingTabStrip.TabProvider { - - private EmojiKeyboard emojiKeyboard; - private int count; - private PagerSlidingTabStrip tabs; - private StickersView stickersView; - - public SmilePagerAdapter(EmojiKeyboard emojiKeyboard) { - this.emojiKeyboard = emojiKeyboard; -// count = messenger().getOwnStickerPacks().getValuesMap().values().size(); -// if (emojiKeyboard.getActivity() instanceof BaseActivity) { -// messenger().getOwnStickerPacks().addCallback(new MVVMCollection.OnChangedListener() { -// @Override -// public void onChanged() { -// count = messenger().getOwnStickerPacks().getValuesMap().values().size(); -// if (tabs != null) { -// tabs.notifyDataSetChanged(); -// } -// notifyDataSetChanged(); -// } -// }); -// } - - } - - - @Override - public int getCount() { - return 6;//count > 0 ? 6 : 5; - } - - @Override - public Object instantiateItem(ViewGroup container, int position) { - View itemView; - if (position <= 4) { - - itemView = LayoutInflater.from(container.getContext()).inflate(R.layout.emoji_smiles_page, null); - ViewGroup emojicontainer = (ViewGroup) itemView.findViewById(R.id.emojiPackContainer); - View noEmojiTV = itemView.findViewById(R.id.text); - - ArrayList emojiPack = new ArrayList(); - switch (position) { - case 0: - emojiPack = SmilesPack.getRecent(); - break; - case 1: - emojiPack = new ArrayList(Arrays.asList(SmilesPack.STANDART)); - break; - case 2: - emojiPack = new ArrayList(Arrays.asList(SmilesPack.NATURE)); - break; - case 3: - emojiPack = new ArrayList(Arrays.asList(SmilesPack.TRANSPORT)); - break; - case 4: - emojiPack = new ArrayList(Arrays.asList(SmilesPack.UNSORTED)); - break; - - } - - int emojisMaxRowCount = 8; - int emojiSize = Screen.dp(45); - int emojiPadding = emojiSize / 5; - if (Screen.getWidth() / emojiSize < emojisMaxRowCount) { - emojisMaxRowCount = Screen.getWidth() / emojiSize; - } - final SmilesPackView smilesPackView = new SmilesPackView(container.getContext(), SmileProcessor.emoji(), emojiPack, emojisMaxRowCount, emojiSize, emojiPadding); - FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - params.gravity = Gravity.CENTER; - emojicontainer.addView(smilesPackView, params); - if (!SmileProcessor.emoji().isLoaded()) { - SmileProcessor.emoji().registerListener(new SmilesListener() { - @Override - public void onSmilesUpdated(boolean completed) { - smilesPackView.update(); - SmileProcessor.emoji().unregisterListener(this); - } - }); - } - if (emojiPack.size() == 0) { - noEmojiTV.setVisibility(View.VISIBLE); - } else { - noEmojiTV.setVisibility(View.GONE); - } - // is this necessary? - /*if(position==0){ - getSmileProcessor().setRecentUpdateListener(new SmilesRecentListener() { - @Override - public void onSmilesUpdated() { - smilesPackView.update(); - } - }); - }*/ - smilesPackView.setOnSmileClickListener(new OnSmileClickListener() { - @Override - public void onEmojiClicked(String smile) { - emojiKeyboard.onEmojiClicked(smile); - } - }); - SmilesPack.setOnRecentChangeListener(new OnRecentChangeListener() { - - @Override - public void onRecentChange() { - smilesPackView.update(); - } - }); - - } else { - if (stickersView == null) { - //stickersView = new StickersView(container.getContext(), emojiKeyboard); - } - itemView = stickersView; - } - container.addView(itemView, 0); - return itemView; - } - - @Override - public void destroyItem(ViewGroup container, int position, Object view) { - container.removeView((View) view); - } - - @Override - public boolean isViewFromObject(View view, Object key) { - return key == view; - } - - @Override - public View getTab(int position, Context context) { - - ImageButton tabView = new ImageButton(context); - //if(position==0){ - int icon; - switch (position) { - case 0: - icon = R.drawable.ic_smiles_recent; - break; - case 1: - icon = R.drawable.ic_smiles_smile; - break; - case 2: - icon = R.drawable.ic_smiles_bell;//R.drawable.ic_smiles_flower; - break; - /*case 3: - icon = R.drawable.ic_smiles_bell; - break;*/ - case 3://4: - icon = R.drawable.ic_smiles_car; - break; - case 4://5: - icon = R.drawable.ic_smiles_grid; - break; - case 5: - icon = R.drawable.ic_smiles_sticker; - break; - default: - icon = R.drawable.ic_smiles_smile; - } - tabView.setImageResource(icon); - /*//} else{ - *//*tabView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - tabView.setAdjustViewBounds(true); - //tabView.setCropToPadding(false); - StickerPack pack = Stickers.getPacks()[position - 1]; - tabView.setImageURI(Uri.parse(Stickers.getFile(pack.getId(), pack.getLogoStickerId())));*//* - //}*/ - return tabView; - } - - public void setTabs(PagerSlidingTabStrip tabs) { - this.tabs = tabs; - } - - public void release() { - if (stickersView != null) { - stickersView.relesase(); - } - } -} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesPackView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesPackView.java deleted file mode 100644 index 024181baa8..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesPackView.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2015 Actor LLC. - */ - -package im.actor.sdk.view.emoji.smiles; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Rect; -import android.view.MotionEvent; -import android.view.SoundEffectConstants; -import android.view.View; -import android.view.ViewConfiguration; - -import java.util.ArrayList; - -import im.actor.sdk.view.emoji.SmileProcessor; -import im.actor.sdk.view.emoji.keyboard.emoji.smiles.OnSmileClickListener; - -public class SmilesPackView extends View { - - private int smileysInRow; - private int rowCount; - private int countInRow; - private SmileProcessor processor; - private ArrayList smileyIds; - private int[] smileysSections; - private int[] smileysX; - private int[] smileysY; - private int smileySrcSize; - private int smileySize; - private int smileyPadding; - private Rect rect = new Rect(); - private Rect sectionRect = new Rect(); - private Paint paint = new Paint(); - private OnSmileClickListener onSmileClickListener; - private float touchX, touchY; - - public SmilesPackView(Context context, SmileProcessor processor, - ArrayList smileyIds, int smileysInRow, int smileySize, int smileyPadding) { - super(context); - - - this.smileysInRow = smileysInRow; - this.rowCount = (int) Math.ceil((float) smileyIds.size() / smileysInRow); - this.processor = processor; - this.smileyIds = new ArrayList(smileyIds); - this.countInRow = smileysInRow; - this.smileySize = smileySize; - this.smileyPadding = smileyPadding; - this.smileySrcSize = processor.getRectSize(); - - init(); - - } - - private void init() { - - smileysSections = new int[smileyIds.size()]; - smileysX = new int[smileyIds.size()]; - smileysY = new int[smileyIds.size()]; - for (int i = 0; i < smileyIds.size(); i++) { - smileysSections[i] = processor.getSectionIndex(smileyIds.get(i)); - smileysX[i] = processor.getSectionX(smileyIds.get(i)); - smileysY[i] = processor.getSectionY(smileyIds.get(i)); - } - - this.paint.setAntiAlias(true); - this.paint.setFlags(Paint.FILTER_BITMAP_FLAG); - } - - - public void update() { - this.rowCount = (int) Math.ceil((float) smileyIds.size() / smileysInRow); - super.invalidate(); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - setMeasuredDimension(smileySize * countInRow, smileySize * rowCount); - } - - public OnSmileClickListener getOnSmileClickListener() { - return onSmileClickListener; - } - - public void setOnSmileClickListener(OnSmileClickListener onSmileClickListener) { - this.onSmileClickListener = onSmileClickListener; - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - touchX = event.getX(); - touchY = event.getY(); - return true; - case MotionEvent.ACTION_UP: - float slop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); - if (Math.abs(event.getX() - touchX) < slop && Math.abs(event.getY() - touchY) < slop) { - int offsetLeft = (getWidth() - countInRow * smileySize) / 2; - if (touchX > offsetLeft || touchX < offsetLeft + smileySize * countInRow) { - int row = (int) (touchY / smileySize); - int col = (int) ((touchX - offsetLeft) / smileySize); - int index = row * countInRow + col; - if (index >= 0 && index < smileyIds.size()) { - if (onSmileClickListener != null) { - playSoundEffect(SoundEffectConstants.CLICK); - - long smileId = smileyIds.get(index); - String smile = null; - char a = (char) (smileId & 0xFFFFFFFF); - char b = (char) ((smileId >> 16) & 0xFFFFFFFF); - char c = (char) ((smileId >> 32) & 0xFFFFFFFF); - char d = (char) ((smileId >> 48) & 0xFFFFFFFF); - if (c != 0 && d != 0) { - smile = "" + d + c + b + a; - } else if (b != 0) { - smile = b + "" + a; - } else { - smile = "" + a; - } - SmileProcessor.emoji().upRecent(smileId); - onSmileClickListener.onEmojiClicked(smile); - } - } - } - } - return true; - } - return false; - } - - @Override - protected void onDraw(Canvas canvas) { - if (processor.isLoaded()) { - int offsetLeft = (getWidth() - countInRow * smileySize) / 2; - for (int i = 0; i < smileyIds.size(); i++) { - int row = i / countInRow; - int col = i % countInRow; - rect.set(col * smileySize + smileyPadding + offsetLeft, row * smileySize + smileyPadding, (col + 1) * smileySize - smileyPadding + offsetLeft, - (row + 1) * smileySize - smileyPadding); - if (!canvas.quickReject(rect.left, rect.top, rect.right, rect.bottom, Canvas.EdgeType.AA)) { - Bitmap img = processor.getSection(smileysSections[i]); - if (img != null) { - sectionRect.set(smileysX[i] * smileySrcSize + 1, smileysY[i] * smileySrcSize + 1, - (smileysX[i] + 1) * smileySrcSize - 1, (smileysY[i] + 1) * smileySrcSize - 1); - canvas.drawBitmap(img, sectionRect, rect, paint); - } - } - } - } - } - - public void setPack(Long[] updated) { - - } -} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/stickers/StickersAdapter.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/stickers/StickersAdapter.java index 6ca2a4881c..9fed7423fe 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/stickers/StickersAdapter.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/stickers/StickersAdapter.java @@ -16,7 +16,6 @@ import im.actor.runtime.mvvm.ValueChangedListener; import im.actor.sdk.controllers.ActorBinder; import im.actor.sdk.util.Screen; -import im.actor.sdk.view.emoji.keyboard.emoji.EmojiKeyboard; import im.actor.sdk.view.emoji.keyboard.emoji.EmojiView; import static im.actor.sdk.util.ActorSDKMessenger.messenger; diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/stickers/StickersView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/stickers/StickersView.java index edb6bfd9bc..1aa2edaa14 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/stickers/StickersView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/stickers/StickersView.java @@ -8,7 +8,6 @@ import android.widget.LinearLayout; import im.actor.sdk.util.Screen; -import im.actor.sdk.view.emoji.keyboard.emoji.EmojiKeyboard; import im.actor.sdk.view.emoji.keyboard.emoji.EmojiView; import static im.actor.sdk.util.ActorSDKMessenger.messenger; @@ -53,11 +52,11 @@ private void buildAdapter(Context context) { packSwitch.setLayoutManager(linearLayoutManager); packSwitch.setItemAnimator(null); packSwitch.setHasFixedSize(true); - PacksAdapter packsAdapter = new PacksAdapter(context, stickersAdapter, keyboard.getStickerIndicatorContainer()); + PacksAdapter packsAdapter = new PacksAdapter(context, stickersAdapter, keyboard.getStickerSwitchContainer()); packSwitch.setAdapter(packsAdapter); stickersAdapter.setPacksAdapter(packsAdapter); - keyboard.getStickerIndicatorContainer().removeAllViews(); - keyboard.getStickerIndicatorContainer().addView(packSwitch, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); + keyboard.getStickerSwitchContainer().removeAllViews(); + keyboard.getStickerSwitchContainer().addView(packSwitch, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); } public void relesase() { diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/emoji_keyboard.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/emoji_keyboard.xml deleted file mode 100644 index f71a28b317..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/emoji_keyboard.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/emoji_smiles_page.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/emoji_smiles_page.xml deleted file mode 100644 index d04b53f87d..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/emoji_smiles_page.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/emoji_smiles_pager.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/emoji_smiles_pager.xml deleted file mode 100644 index 0245ba4d79..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/layout/emoji_smiles_pager.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/attrs.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/attrs.xml index 48243a099f..4d52b52608 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/attrs.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values/attrs.xml @@ -4,19 +4,6 @@ --> - - - - - - - - - - - - - From d9b59a1031e632cc20ab7a6fa18ec0a89f7f9540 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sun, 15 Jan 2017 13:53:24 -0200 Subject: [PATCH 211/253] alteracoes --- .../sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java | 10 ++++++++-- .../actor/sdk/view/emoji/keyboard/emoji/EmojiView.java | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java index 7be4a7e988..2b0e9e74b4 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java @@ -23,6 +23,7 @@ import android.view.View; import android.widget.EditText; +import im.actor.core.entity.Sticker; import im.actor.sdk.ActorSDK; import im.actor.sdk.util.Screen; import im.actor.sdk.view.MaterialInterpolator; @@ -64,9 +65,7 @@ public void onEmojiSelected(String symbol) { if (selectionEnd < 0) { selectionEnd = messageBody.getText().length(); } - CharSequence localCharSequence = Emoji.replaceEmoji(symbol, messageBody.getPaint().getFontMetricsInt(), Screen.dp(20), false); - messageBody.getText().insert(selectionEnd, localCharSequence); } @@ -88,6 +87,13 @@ public void onClick(DialogInterface dialogInterface, int i) { builder.setNegativeButton("Cancelar", null); builder.create().show(); } + + @Override + public void onStickerSelected(Sticker sticker) { + if(getOnStickerClickListener() != null){ + getOnStickerClickListener().onStickerClicked(sticker); + } + } }); return emojiView; } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java index 326d4f2080..c3ed5740bd 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiView.java @@ -60,6 +60,7 @@ public interface Listener { boolean onBackspace(); void onEmojiSelected(String emoji); void onClearEmojiRecent(); + void onStickerSelected(Sticker sticker); } private static final Field superListenerField; @@ -1090,7 +1091,7 @@ public void unregisterDataSetObserver(DataSetObserver observer) { } public void onStickerClicked(Sticker sticker) { - + this.listener.onStickerSelected(sticker); } public LinearLayout getStickerSwitchContainer() { From e06ce87d18340f081722b2a9a7623785c4ab8036 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sun, 15 Jan 2017 16:06:22 -0200 Subject: [PATCH 212/253] alteracoes --- .../sdk/view/emoji/keyboard/emoji/Emoji.java | 1 - .../smiles/OnBackspaceClickListener.java | 10 - .../emoji/smiles/OnRecentChangeListener.java | 8 - .../emoji/smiles/OnSmileClickListener.java | 8 - .../keyboard/emoji/smiles/RepeatListener.java | 62 - .../sdk/view/emoji/smiles/SmilesPack.java | 1117 ----------------- .../emoji/smiles/SmilesRecentListener.java | 12 - .../emoji/smiles/SmilesRecentsController.java | 107 -- .../sdk/view/emoji/smiles/SmileysPack.java | 14 - 9 files changed, 1339 deletions(-) delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/OnBackspaceClickListener.java delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/OnRecentChangeListener.java delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/OnSmileClickListener.java delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/RepeatListener.java delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesPack.java delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesRecentListener.java delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesRecentsController.java delete mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmileysPack.java diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java index 21ae720cb7..9fdcac8206 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java @@ -151,7 +151,6 @@ public void onSmilesUpdated(boolean completed) { synchronized (lock) { lock.notify(); } - } }); try { diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/OnBackspaceClickListener.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/OnBackspaceClickListener.java deleted file mode 100644 index 2c871dab3f..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/OnBackspaceClickListener.java +++ /dev/null @@ -1,10 +0,0 @@ -package im.actor.sdk.view.emoji.keyboard.emoji.smiles; - -import android.view.View; - -/** - * Created by Jesus Christ. Amen. - */ -public interface OnBackspaceClickListener { - void onBackspaceClick(View v); -} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/OnRecentChangeListener.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/OnRecentChangeListener.java deleted file mode 100644 index 3a232f47c6..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/OnRecentChangeListener.java +++ /dev/null @@ -1,8 +0,0 @@ -package im.actor.sdk.view.emoji.keyboard.emoji.smiles; - -/** - * Created by Jesus Christ. Amen. - */ -public interface OnRecentChangeListener { - void onRecentChange(); -} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/OnSmileClickListener.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/OnSmileClickListener.java deleted file mode 100644 index be92adf76a..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/OnSmileClickListener.java +++ /dev/null @@ -1,8 +0,0 @@ -package im.actor.sdk.view.emoji.keyboard.emoji.smiles; - -/** -* Created by Jesus Christ. Amen. -*/ -public interface OnSmileClickListener { - public void onEmojiClicked(String smile); -} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/RepeatListener.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/RepeatListener.java deleted file mode 100644 index 67a5161226..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/smiles/RepeatListener.java +++ /dev/null @@ -1,62 +0,0 @@ -package im.actor.sdk.view.emoji.keyboard.emoji.smiles; - -import android.os.Handler; -import android.os.SystemClock; -import android.view.MotionEvent; -import android.view.View; - -/** -* Created by Jesus Christ. Amen. -*/ -public class RepeatListener implements View.OnTouchListener { - - private Handler handler = new Handler(); - - private int initialInterval; - private final int normalInterval; - private final View.OnClickListener clickListener; - - private Runnable handlerRunnable = new Runnable() { - @Override - public void run() { - if (downView == null) { - return; - } - handler.removeCallbacksAndMessages(downView); - handler.postAtTime(this, downView, SystemClock.uptimeMillis() + normalInterval); - clickListener.onClick(downView); - } - }; - - private View downView; - - - public RepeatListener(int initialInterval, int normalInterval, View.OnClickListener clickListener) { - if (clickListener == null) - throw new IllegalArgumentException("null runnable"); - if (initialInterval < 0 || normalInterval < 0) - throw new IllegalArgumentException("negative interval"); - - this.initialInterval = initialInterval; - this.normalInterval = normalInterval; - this.clickListener = clickListener; - } - - public boolean onTouch(View view, MotionEvent motionEvent) { - switch (motionEvent.getAction()) { - case MotionEvent.ACTION_DOWN: - downView = view; - handler.removeCallbacks(handlerRunnable); - handler.postAtTime(handlerRunnable, downView, SystemClock.uptimeMillis() + initialInterval); - clickListener.onClick(view); - return true; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_OUTSIDE: - handler.removeCallbacksAndMessages(downView); - downView = null; - return true; - } - return false; - } -} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesPack.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesPack.java deleted file mode 100644 index 1b9371007f..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesPack.java +++ /dev/null @@ -1,1117 +0,0 @@ -/* - * Copyright (C) 2015 Actor LLC. - */ - -package im.actor.sdk.view.emoji.smiles; - -import java.util.ArrayList; - -import im.actor.sdk.view.emoji.keyboard.emoji.smiles.OnRecentChangeListener; - -public class SmilesPack { - public static final Long[] STANDART = new Long[] - { - 0xD83DDE0AL, - 0xD83DDE03L, - 0xD83DDE09L, - 0xD83DDE06L, - 0xD83DDE1CL, - 0xD83DDE0BL, - 0xD83DDE0DL, - 0xD83DDE0EL, - 0xD83DDE12L, - 0xD83DDE0FL, - 0xD83DDE14L, - 0xD83DDE22L, - 0xD83DDE2DL, - 0xD83DDE29L, - 0xD83DDE28L, - 0xD83DDE10L, - 0xD83DDE0CL, - 0xD83DDE04L, - 0xD83DDE07L, - 0xD83DDE30L, - 0xD83DDE32L, - 0xD83DDE33L, - 0xD83DDE37L, - 0xD83DDE02L, - 0x2764L, - 0xD83DDE1AL, - 0xD83DDE15L, - 0xD83DDE2FL, - 0xD83DDE26L, - 0xD83DDE35L, - 0xD83DDE20L, - 0xD83DDE21L, - 0xD83DDE1DL, - 0xD83DDE34L, - 0xD83DDE18L, - 0xD83DDE1FL, - 0xD83DDE2CL, - 0xD83DDE36L, - 0xD83DDE2AL, - 0xD83DDE2BL, - 0x263AL, - 0xD83DDE00L, - 0xD83DDE25L, - 0xD83DDE1BL, - 0xD83DDE16L, - 0xD83DDE24L, - 0xD83DDE23L, - 0xD83DDE27L, - 0xD83DDE11L, - 0xD83DDE05L, - 0xD83DDE2EL, - 0xD83DDE1EL, - 0xD83DDE19L, - 0xD83DDE13L, - 0xD83DDE01L, - 0xD83DDE31L, - 0xD83DDE08L, - 0xD83DDC7FL, - 0xD83DDC7DL, - 0xD83DDC4DL, - 0xD83DDC4EL, - 0x261DL, - 0x270CL, - 0xD83DDC4CL, - 0xD83DDC4FL, - 0xD83DDC4AL, - 0x270BL, - 0xD83DDE4FL, - 0xD83DDC43L, - 0xD83DDC46L, - 0xD83DDC47L, - 0xD83DDC48L, - 0xD83DDCAAL, - 0xD83DDC42L, - }; - - public static final Long[] TRANSPORT = new Long[] - { - 0xD83DDCA1L, - 0xD83DDCA3L, - 0xD83DDCA5L, - 0xD83DDCA7L, - 0xD83DDCA8L, - 0xD83DDCACL, - 0xD83DDCB0L, - 0xD83DDCB3L, - 0xD83DDCB4L, - 0xD83DDCB5L, - 0xD83DDCB6L, - 0xD83DDCB7L, - 0xD83DDCB8L, - 0xD83DDCBAL, - 0xD83DDCBBL, - 0xD83DDCBCL, - 0xD83DDCBDL, - 0xD83DDCBEL, - 0xD83DDCBFL, - 0xD83DDCC0L, - 0xD83DDCC4L, - 0xD83DDCC5L, - 0xD83DDCC7L, - 0xD83DDCC8L, - 0xD83DDCC9L, - 0xD83DDCCAL, - 0xD83DDCCBL, - 0xD83DDCCCL, - 0xD83DDCCDL, - 0xD83DDCCEL, - 0xD83DDCD0L, - 0xD83DDCD1L, - 0xD83DDCD2L, - 0xD83DDCD3L, - 0xD83DDCD4L, - 0xD83DDCD5L, - 0xD83DDCD6L, - 0xD83DDCD7L, - 0xD83DDCD8L, - 0xD83DDCD9L, - 0xD83DDCDAL, - 0xD83DDCDCL, - 0xD83DDCDDL, - 0xD83DDCDFL, - 0xD83DDCE0L, - 0xD83DDCE1L, - 0xD83DDCE2L, - 0xD83DDCE6L, - 0xD83DDCEDL, - 0xD83DDCEEL, - 0xD83DDCEFL, - 0xD83DDCF0L, - 0xD83DDCF1L, - 0xD83DDCF7L, - 0xD83DDCF9L, - 0xD83DDCFAL, - 0xD83DDCFBL, - 0xD83DDCFCL, - 0xD83DDD06L, - 0xD83DDD0EL, - 0xD83DDD11L, - 0xD83DDD14L, - 0xD83DDD16L, - 0xD83DDD25L, - 0xD83DDD26L, - 0xD83DDD27L, - 0xD83DDD28L, - 0xD83DDD29L, - 0xD83DDD2AL, - 0xD83DDD2BL, - 0xD83DDD2CL, - 0xD83DDD2DL, - 0xD83DDD2EL, - 0xD83DDD31L, - 0xD83DDDFFL, - 0xD83DDE80L, - 0xD83DDE81L, - 0xD83DDE82L, - 0xD83DDE83L, - 0xD83DDE84L, - 0xD83DDE85L, - 0xD83DDE86L, - 0xD83DDE87L, - 0xD83DDE88L, - 0xD83DDE8AL, - 0xD83DDE8CL, - 0xD83DDE8DL, - 0xD83DDE8EL, - 0xD83DDE8FL, - 0xD83DDE90L, - 0xD83DDE91L, - 0xD83DDE92L, - 0xD83DDE93L, - 0xD83DDE94L, - 0xD83DDE95L, - 0xD83DDE96L, - 0xD83DDE97L, - 0xD83DDE98L, - 0xD83DDE99L, - 0xD83DDE9AL, - 0xD83DDE9BL, - 0xD83DDE9CL, - 0xD83DDE9DL, - 0xD83DDE9EL, - 0xD83DDE9FL, - 0xD83DDEA0L, - 0xD83DDEA1L, - 0xD83DDEA3L, - 0xD83DDEA4L, - 0xD83DDEA7L, - 0xD83DDEA8L, - 0xD83DDEAAL, - 0xD83DDEACL, - 0xD83DDEB4L, - 0xD83DDEB5L, - 0xD83DDEB6L, - 0xD83DDEBDL, - 0xD83DDEBFL, - 0xD83DDEC0L, - 0xD83CDDE8D83CDDF3L, - 0xD83CDDE9D83CDDEAL, - 0xD83CDDEAD83CDDF8L, - 0xD83CDDEBD83CDDF7L, - 0xD83CDDECD83CDDE7L, - 0xD83CDDEED83CDDF9L, - 0xD83CDDEFD83CDDF5L, - 0xD83CDDF0D83CDDF7L, - 0xD83CDDF7D83CDDFAL, - 0xD83CDDFAD83CDDF8L - }; - - public static final Long[] NATURE = new Long[] - { - 0xD83DDC28L, - 0xD83DDC0EL, - 0xD83DDC0FL, - 0xD83DDC1CL, - 0xD83DDC2BL, - 0xD83DDC2EL, - 0xD83DDC03L, - 0xD83DDC3BL, - 0xD83DDC3CL, - 0xD83DDC05L, - 0xD83DDC13L, - 0xD83DDC18L, - 0xD83DDC36L, - 0xD83DDC31L, - 0xD83DDC37L, - 0xD83DDC11L, - 0x26C4L, - 0x2600L, - 0xD83CDF3AL, - 0xD83CDF3BL, - 0xD83CDF3CL, - 0xD83CDF3DL, - 0xD83CDF4BL, - 0xD83CDF4DL, - 0xD83CDF4EL, - 0xD83CDF4FL, - 0xD83CDF6DL, - 0xD83CDF37L, - 0xD83CDF38L, - 0xD83CDF46L, - 0xD83CDF49L, - 0xD83CDF50L, - 0xD83CDF51L, - 0xD83CDF53L, - 0xD83CDF54L, - 0xD83CDF55L, - 0xD83CDF56L, - 0xD83CDF57L, - 0xD83CDF69L, - 0xD83CDF83L, - 0xD83DDE3AL, - 0xD83DDE38L, - 0xD83DDE39L, - 0xD83DDE3CL, - 0xD83DDE3DL, - 0xD83DDE3EL, - 0xD83DDE3FL, - 0xD83DDE3BL, - 0xD83DDE40L, - 0xD83CDF0DL, - 0xD83CDF1BL, - 0xD83CDF1DL, - 0xD83CDF1EL, - 0xD83CDF30L, - 0xD83CDF31L, - 0xD83CDF32L, - 0xD83CDF33L, - 0xD83CDF34L, - 0xD83CDF35L, - 0xD83CDF3EL, - 0xD83CDF3FL, - 0xD83CDF40L, - 0xD83CDF41L, - 0xD83CDF42L, - 0xD83CDF43L, - 0xD83CDF44L, - 0xD83CDF47L, - 0xD83CDF48L, - 0xD83DDC00L, - 0xD83DDC01L, - 0xD83DDC02L, - 0xD83DDC04L, - 0xD83DDC06L, - 0xD83DDC07L, - 0xD83DDC08L, - 0xD83DDC09L, - 0xD83DDC0AL, - 0xD83DDC0BL, - 0xD83DDC0CL, - 0xD83DDC0DL, - 0xD83DDC10L, - 0xD83DDC12L, - 0xD83DDC14L, - 0xD83DDC15L, - 0xD83DDC16L, - 0xD83DDC17L, - 0xD83DDC19L, - 0xD83DDC1AL, - 0xD83DDC1BL, - 0xD83DDC1DL, - 0xD83DDC1EL, - 0xD83DDC1FL, - 0xD83DDC20L, - 0xD83DDC21L, - 0xD83DDC22L, - 0xD83DDC23L, - 0xD83DDC24L, - 0xD83DDC25L, - 0xD83DDC26L, - 0xD83DDC27L, - 0xD83DDC29L, - 0xD83DDC2AL, - 0xD83DDC2CL, - 0xD83DDC2DL, - 0xD83DDC2FL, - 0xD83DDC30L, - 0xD83DDC32L, - 0xD83DDC33L, - 0xD83DDC34L, - 0xD83DDC35L, - 0xD83DDC38L, - 0xD83DDC39L, - 0xD83DDC3AL, - 0xD83DDC3DL, - 0xD83DDC3EL, - 0xD83DDE48L, - 0xD83DDE49L, - 0xD83DDE4AL, - 0xD83CDF4AL, - 0x26C5L, - 0xD83CDF4CL, - 0xD83CDF39L, - 0xD83CDF45L, - 0xD83CDF52L, - 0xD83CDF84L, - }; - - public static final Long[] UNSORTED = new Long[] - { - 0xD83CDF5AL, - 0xD83CDF5BL, - 0xD83CDF5CL, - 0xD83CDF5DL, - 0xD83CDF5EL, - 0xD83CDF5FL, - 0xD83CDF60L, - 0xD83CDF61L, - 0xD83CDF62L, - 0xD83CDF63L, - 0xD83CDF64L, - 0xD83CDF65L, - 0xD83CDF66L, - 0xD83CDF67L, - 0xD83CDF68L, - 0xD83CDF6AL, - 0xD83CDF6BL, - 0xD83CDF6CL, - 0xD83CDF6EL, - 0xD83CDF6FL, - 0xD83CDF70L, - 0xD83CDF71L, - 0xD83CDF72L, - 0xD83CDF73L, - 0xD83CDF74L, - 0xD83CDF75L, - 0xD83CDF76L, - 0xD83CDF79L, - 0xD83CDF7CL, - 0xD83DDC8BL, - 0xD83DDCA9L, - 0x2744L, - 0xD83CDF77L, - 0xD83CDF78L, - 0xD83CDF85L, - 0xD83DDCA6L, - 0xD83DDC7AL, - 0xD83DDD1EL, - 0xD83DDC79L, - 0x26BDL, - 0xD83CDF1FL, - 0xD83CDF7AL, - 0xD83CDF7BL, - 0xD83CDF81L, - 0xD83CDF82L, - 0xD83CDFC1L, - 0xD83CDFC6L, - 0xD83DDC94L, - 0xD83DDCADL, - 0x23F3L, - 0x26BEL, - 0xD83CDFAAL, - 0xD83CDFB1L, - 0xD83CDFB2L, - 0xD83CDFB7L, - 0xD83CDFB8L, - 0xD83CDFBEL, - 0xD83CDFC0L, - 0xD83CDFE6L, - 0x23F0L, - 0x2601L, - 0x260EL, - 0x2615L, - 0x267BL, - 0x26A0L, - 0x26A1L, - 0x26D4L, - 0x26EAL, - 0x26F3L, - 0x26F5L, - 0x26FDL, - 0x2702L, - 0x2708L, - 0x2709L, - 0x270AL, - 0x270FL, - 0x2712L, - 0x2728L, - 0xD83CDC04L, - 0xD83CDCCFL, - 0xD83CDD98L, - 0xD83CDF02L, - 0xD83CDF80L, - 0xD83CDF88L, - 0xD83CDF89L, - 0xD83CDF8AL, - 0xD83CDF8BL, - 0xD83CDF8CL, - 0xD83CDF8DL, - 0xD83CDF8EL, - 0xD83CDF8FL, - 0xD83CDF90L, - 0xD83CDF92L, - 0xD83CDF93L, - 0xD83CDFA3L, - 0xD83CDFA4L, - 0xD83CDFA7L, - 0xD83CDFA8L, - 0xD83CDFA9L, - 0xD83CDFABL, - 0xD83CDFACL, - 0xD83CDFADL, - 0xD83CDFAFL, - 0xD83CDFB0L, - 0xD83CDFB3L, - 0xD83CDFB4L, - 0xD83CDFB9L, - 0xD83CDFBAL, - 0xD83CDFBBL, - 0xD83CDFBDL, - 0xD83CDFBFL, - 0xD83CDFC2L, - 0xD83CDFC3L, - 0xD83CDFC4L, - 0xD83CDFC7L, - 0xD83CDFC8L, - 0xD83CDFC9L, - 0xD83CDFCAL, - 0xD83DDC40L, - 0xD83DDC44L, - 0xD83DDC45L, - 0xD83DDC4BL, - 0xD83DDC50L, - 0xD83DDC51L, - 0xD83DDC52L, - 0xD83DDC53L, - 0xD83DDC54L, - 0xD83DDC55L, - 0xD83DDC56L, - 0xD83DDC57L, - 0xD83DDC58L, - 0xD83DDC59L, - 0xD83DDC5AL, - 0xD83DDC5BL, - 0xD83DDC5CL, - 0xD83DDC5DL, - 0xD83DDC5EL, - 0xD83DDC5FL, - 0xD83DDC60L, - 0xD83DDC61L, - 0xD83DDC62L, - 0xD83DDC63L, - 0xD83DDC66L, - 0xD83DDC67L, - 0xD83DDC68L, - 0xD83DDC69L, - 0xD83DDC6AL, - 0xD83DDC6BL, - 0xD83DDC6CL, - 0xD83DDC6DL, - 0xD83DDC6EL, - 0xD83DDC6FL, - 0xD83DDC70L, - 0xD83DDC71L, - 0xD83DDC72L, - 0xD83DDC73L, - 0xD83DDC74L, - 0xD83DDC75L, - 0xD83DDC76L, - 0xD83DDC77L, - 0xD83DDC78L, - 0xD83DDC7BL, - 0xD83DDC7CL, - 0xD83DDC7EL, - 0xD83DDC80L, - 0xD83DDC81L, - 0xD83DDC82L, - 0xD83DDC83L, - 0xD83DDC84L, - 0xD83DDC85L, - 0xD83DDC86L, - 0xD83DDC87L, - 0xD83DDC88L, - 0xD83DDC89L, - 0xD83DDC8AL, - 0xD83DDC8CL, - 0xD83DDC8DL, - 0xD83DDC8EL, - 0xD83DDC8FL, - 0xD83DDC90L, - 0xD83DDC91L, - 0xD83DDC92L, - 0xD83DDC93L, - 0xD83DDC95L, - 0xD83DDC96L, - 0xD83DDC97L, - 0xD83DDC98L, - 0xD83DDC99L, - 0xD83DDC9AL, - 0xD83DDC9BL, - 0xD83DDC9CL, - 0xD83DDC9DL, - 0xD83DDC9EL, - 0xD83DDC9FL, - 0xD83DDE45L, - 0xD83DDE46L, - 0xD83DDE47L, - 0xD83DDE4BL, - 0xD83DDE4CL, - 0xD83DDE4EL, - - }; - - public static final Long[] ALL_SMILEYS = new Long[]{0xD83DDE0AL, - 0xD83DDE03L, - 0xD83DDE09L, - 0xD83DDE06L, - 0xD83DDE1CL, - 0xD83DDE0BL, - 0xD83DDE0DL, - 0xD83DDE0EL, - 0xD83DDE12L, - 0xD83DDE0FL, - 0xD83DDE14L, - 0xD83DDE22L, - 0xD83DDE2DL, - 0xD83DDE29L, - 0xD83DDE28L, - 0xD83DDE10L, - 0xD83DDE0CL, - 0xD83DDE04L, - 0xD83DDE07L, - 0xD83DDE30L, - 0xD83DDE32L, - 0xD83DDE33L, - 0xD83DDE37L, - 0xD83DDE02L, - 0x2764L, - 0xD83DDE1AL, - 0xD83DDE15L, - 0xD83DDE2FL, - 0xD83DDE26L, - 0xD83DDE35L, - 0xD83DDE20L, - 0xD83DDE21L, - 0xD83DDE1DL, - 0xD83DDE34L, - 0xD83DDE18L, - 0xD83DDE1FL, - 0xD83DDE2CL, - 0xD83DDE36L, - 0xD83DDE2AL, - 0xD83DDE2BL, - 0x263AL, - 0xD83DDE00L, - 0xD83DDE25L, - 0xD83DDE1BL, - 0xD83DDE16L, - 0xD83DDE24L, - 0xD83DDE23L, - 0xD83DDE27L, - 0xD83DDE11L, - 0xD83DDE05L, - 0xD83DDE2EL, - 0xD83DDE1EL, - 0xD83DDE19L, - 0xD83DDE13L, - 0xD83DDE01L, - 0xD83DDE31L, - 0xD83DDE08L, - 0xD83DDC7FL, - 0xD83DDC7DL, - 0xD83DDC4DL, - 0xD83DDC4EL, - 0x261DL, - 0x270CL, - 0xD83DDC4CL, - 0xD83DDC4FL, - 0xD83DDC4AL, - 0x270BL, - 0xD83DDE4FL, - 0xD83DDC43L, - 0xD83DDC46L, - 0xD83DDC47L, - 0xD83DDC48L, - 0xD83DDCAAL, - 0xD83DDC42L, - 0xD83DDC8BL, - 0xD83DDCA9L, - 0x2744L, - 0xD83CDF4AL, - 0xD83CDF77L, - 0xD83CDF78L, - 0xD83CDF85L, - 0xD83DDCA6L, - 0xD83DDC7AL, - 0xD83DDC28L, - 0xD83DDD1EL, - 0xD83DDC79L, - 0x26BDL, - 0x26C5L, - 0xD83CDF1FL, - 0xD83CDF4CL, - 0xD83CDF7AL, - 0xD83CDF7BL, - 0xD83CDF39L, - 0xD83CDF45L, - 0xD83CDF52L, - 0xD83CDF81L, - 0xD83CDF82L, - 0xD83CDF84L, - 0xD83CDFC1L, - 0xD83CDFC6L, - 0xD83DDC0EL, - 0xD83DDC0FL, - 0xD83DDC1CL, - 0xD83DDC2BL, - 0xD83DDC2EL, - 0xD83DDC03L, - 0xD83DDC3BL, - 0xD83DDC3CL, - 0xD83DDC05L, - 0xD83DDC13L, - 0xD83DDC18L, - 0xD83DDC94L, - 0xD83DDCADL, - 0xD83DDC36L, - 0xD83DDC31L, - 0xD83DDC37L, - 0xD83DDC11L, - 0x23F3L, - 0x26BEL, - 0x26C4L, - 0x2600L, - 0xD83CDF3AL, - 0xD83CDF3BL, - 0xD83CDF3CL, - 0xD83CDF3DL, - 0xD83CDF4BL, - 0xD83CDF4DL, - 0xD83CDF4EL, - 0xD83CDF4FL, - 0xD83CDF6DL, - 0xD83CDF37L, - 0xD83CDF38L, - 0xD83CDF46L, - 0xD83CDF49L, - 0xD83CDF50L, - 0xD83CDF51L, - 0xD83CDF53L, - 0xD83CDF54L, - 0xD83CDF55L, - 0xD83CDF56L, - 0xD83CDF57L, - 0xD83CDF69L, - 0xD83CDF83L, - 0xD83CDFAAL, - 0xD83CDFB1L, - 0xD83CDFB2L, - 0xD83CDFB7L, - 0xD83CDFB8L, - 0xD83CDFBEL, - 0xD83CDFC0L, - 0xD83CDFE6L, - 0xD83DDE38L, - 0xD83DDE39L, - 0xD83DDE3CL, - 0xD83DDE3DL, - 0xD83DDE3EL, - 0xD83DDE3FL, - 0xD83DDE3BL, - 0xD83DDE40L, - 0x23F0L, - 0x2601L, - 0x260EL, - 0x2615L, - 0x267BL, - 0x26A0L, - 0x26A1L, - 0x26D4L, - 0x26EAL, - 0x26F3L, - 0x26F5L, - 0x26FDL, - 0x2702L, - 0x2708L, - 0x2709L, - 0x270AL, - 0x270FL, - 0x2712L, - 0x2728L, - 0xD83CDC04L, - 0xD83CDCCFL, - 0xD83CDD98L, - 0xD83CDF02L, - 0xD83CDF0DL, - 0xD83CDF1BL, - 0xD83CDF1DL, - 0xD83CDF1EL, - 0xD83CDF30L, - 0xD83CDF31L, - 0xD83CDF32L, - 0xD83CDF33L, - 0xD83CDF34L, - 0xD83CDF35L, - 0xD83CDF3EL, - 0xD83CDF3FL, - 0xD83CDF40L, - 0xD83CDF41L, - 0xD83CDF42L, - 0xD83CDF43L, - 0xD83CDF44L, - 0xD83CDF47L, - 0xD83CDF48L, - 0xD83CDF5AL, - 0xD83CDF5BL, - 0xD83CDF5CL, - 0xD83CDF5DL, - 0xD83CDF5EL, - 0xD83CDF5FL, - 0xD83CDF60L, - 0xD83CDF61L, - 0xD83CDF62L, - 0xD83CDF63L, - 0xD83CDF64L, - 0xD83CDF65L, - 0xD83CDF66L, - 0xD83CDF67L, - 0xD83CDF68L, - 0xD83CDF6AL, - 0xD83CDF6BL, - 0xD83CDF6CL, - 0xD83CDF6EL, - 0xD83CDF6FL, - 0xD83CDF70L, - 0xD83CDF71L, - 0xD83CDF72L, - 0xD83CDF73L, - 0xD83CDF74L, - 0xD83CDF75L, - 0xD83CDF76L, - 0xD83CDF79L, - 0xD83CDF7CL, - 0xD83CDF80L, - 0xD83CDF88L, - 0xD83CDF89L, - 0xD83CDF8AL, - 0xD83CDF8BL, - 0xD83CDF8CL, - 0xD83CDF8DL, - 0xD83CDF8EL, - 0xD83CDF8FL, - 0xD83CDF90L, - 0xD83CDF92L, - 0xD83CDF93L, - 0xD83CDFA3L, - 0xD83CDFA4L, - 0xD83CDFA7L, - 0xD83CDFA8L, - 0xD83CDFA9L, - 0xD83CDFABL, - 0xD83CDFACL, - 0xD83CDFADL, - 0xD83CDFAFL, - 0xD83CDFB0L, - 0xD83CDFB3L, - 0xD83CDFB4L, - 0xD83CDFB9L, - 0xD83CDFBAL, - 0xD83CDFBBL, - 0xD83CDFBDL, - 0xD83CDFBFL, - 0xD83CDFC2L, - 0xD83CDFC3L, - 0xD83CDFC4L, - 0xD83CDFC7L, - 0xD83CDFC8L, - 0xD83CDFC9L, - 0xD83CDFCAL, - 0xD83DDC00L, - 0xD83DDC01L, - 0xD83DDC02L, - 0xD83DDC04L, - 0xD83DDC06L, - 0xD83DDC07L, - 0xD83DDC08L, - 0xD83DDC09L, - 0xD83DDC0AL, - 0xD83DDC0BL, - 0xD83DDC0CL, - 0xD83DDC0DL, - 0xD83DDC10L, - 0xD83DDC12L, - 0xD83DDC14L, - 0xD83DDC15L, - 0xD83DDC16L, - 0xD83DDC17L, - 0xD83DDC19L, - 0xD83DDC1AL, - 0xD83DDC1BL, - 0xD83DDC1DL, - 0xD83DDC1EL, - 0xD83DDC1FL, - 0xD83DDC20L, - 0xD83DDC21L, - 0xD83DDC22L, - 0xD83DDC23L, - 0xD83DDC24L, - 0xD83DDC25L, - 0xD83DDC26L, - 0xD83DDC27L, - 0xD83DDC29L, - 0xD83DDC2AL, - 0xD83DDC2CL, - 0xD83DDC2DL, - 0xD83DDC2FL, - 0xD83DDC30L, - 0xD83DDC32L, - 0xD83DDC33L, - 0xD83DDC34L, - 0xD83DDC35L, - 0xD83DDC38L, - 0xD83DDC39L, - 0xD83DDC3AL, - 0xD83DDC3DL, - 0xD83DDC3EL, - 0xD83DDC40L, - 0xD83DDC44L, - 0xD83DDC45L, - 0xD83DDC4BL, - 0xD83DDC50L, - 0xD83DDC51L, - 0xD83DDC52L, - 0xD83DDC53L, - 0xD83DDC54L, - 0xD83DDC55L, - 0xD83DDC56L, - 0xD83DDC57L, - 0xD83DDC58L, - 0xD83DDC59L, - 0xD83DDC5AL, - 0xD83DDC5BL, - 0xD83DDC5CL, - 0xD83DDC5DL, - 0xD83DDC5EL, - 0xD83DDC5FL, - 0xD83DDC60L, - 0xD83DDC61L, - 0xD83DDC62L, - 0xD83DDC63L, - 0xD83DDC66L, - 0xD83DDC67L, - 0xD83DDC68L, - 0xD83DDC69L, - 0xD83DDC6AL, - 0xD83DDC6BL, - 0xD83DDC6CL, - 0xD83DDC6DL, - 0xD83DDC6EL, - 0xD83DDC6FL, - 0xD83DDC70L, - 0xD83DDC71L, - 0xD83DDC72L, - 0xD83DDC73L, - 0xD83DDC74L, - 0xD83DDC75L, - 0xD83DDC76L, - 0xD83DDC77L, - 0xD83DDC78L, - 0xD83DDC7BL, - 0xD83DDC7CL, - 0xD83DDC7EL, - 0xD83DDC80L, - 0xD83DDC81L, - 0xD83DDC82L, - 0xD83DDC83L, - 0xD83DDC84L, - 0xD83DDC85L, - 0xD83DDC86L, - 0xD83DDC87L, - 0xD83DDC88L, - 0xD83DDC89L, - 0xD83DDC8AL, - 0xD83DDC8CL, - 0xD83DDC8DL, - 0xD83DDC8EL, - 0xD83DDC8FL, - 0xD83DDC90L, - 0xD83DDC91L, - 0xD83DDC92L, - 0xD83DDC93L, - 0xD83DDC95L, - 0xD83DDC96L, - 0xD83DDC97L, - 0xD83DDC98L, - 0xD83DDC99L, - 0xD83DDC9AL, - 0xD83DDC9BL, - 0xD83DDC9CL, - 0xD83DDC9DL, - 0xD83DDC9EL, - 0xD83DDC9FL, - 0xD83DDCA1L, - 0xD83DDCA3L, - 0xD83DDCA5L, - 0xD83DDCA7L, - 0xD83DDCA8L, - 0xD83DDCACL, - 0xD83DDCB0L, - 0xD83DDCB3L, - 0xD83DDCB4L, - 0xD83DDCB5L, - 0xD83DDCB6L, - 0xD83DDCB7L, - 0xD83DDCB8L, - 0xD83DDCBAL, - 0xD83DDCBBL, - 0xD83DDCBCL, - 0xD83DDCBDL, - 0xD83DDCBEL, - 0xD83DDCBFL, - 0xD83DDCC0L, - 0xD83DDCC4L, - 0xD83DDCC5L, - 0xD83DDCC7L, - 0xD83DDCC8L, - 0xD83DDCC9L, - 0xD83DDCCAL, - 0xD83DDCCBL, - 0xD83DDCCCL, - 0xD83DDCCDL, - 0xD83DDCCEL, - 0xD83DDCD0L, - 0xD83DDCD1L, - 0xD83DDCD2L, - 0xD83DDCD3L, - 0xD83DDCD4L, - 0xD83DDCD5L, - 0xD83DDCD6L, - 0xD83DDCD7L, - 0xD83DDCD8L, - 0xD83DDCD9L, - 0xD83DDCDAL, - 0xD83DDCDCL, - 0xD83DDCDDL, - 0xD83DDCDFL, - 0xD83DDCE0L, - 0xD83DDCE1L, - 0xD83DDCE2L, - 0xD83DDCE6L, - 0xD83DDCEDL, - 0xD83DDCEEL, - 0xD83DDCEFL, - 0xD83DDCF0L, - 0xD83DDCF1L, - 0xD83DDCF7L, - 0xD83DDCF9L, - 0xD83DDCFAL, - 0xD83DDCFBL, - 0xD83DDCFCL, - 0xD83DDD06L, - 0xD83DDD0EL, - 0xD83DDD11L, - 0xD83DDD14L, - 0xD83DDD16L, - 0xD83DDD25L, - 0xD83DDD26L, - 0xD83DDD27L, - 0xD83DDD28L, - 0xD83DDD29L, - 0xD83DDD2AL, - 0xD83DDD2BL, - 0xD83DDD2CL, - 0xD83DDD2DL, - 0xD83DDD2EL, - 0xD83DDD31L, - 0xD83DDDFFL, - 0xD83DDE3AL, - 0xD83DDE45L, - 0xD83DDE46L, - 0xD83DDE47L, - 0xD83DDE48L, - 0xD83DDE49L, - 0xD83DDE4AL, - 0xD83DDE4BL, - 0xD83DDE4CL, - 0xD83DDE4EL, - 0xD83DDE80L, - 0xD83DDE81L, - 0xD83DDE82L, - 0xD83DDE83L, - 0xD83DDE84L, - 0xD83DDE85L, - 0xD83DDE86L, - 0xD83DDE87L, - 0xD83DDE88L, - 0xD83DDE8AL, - 0xD83DDE8CL, - 0xD83DDE8DL, - 0xD83DDE8EL, - 0xD83DDE8FL, - 0xD83DDE90L, - 0xD83DDE91L, - 0xD83DDE92L, - 0xD83DDE93L, - 0xD83DDE94L, - 0xD83DDE95L, - 0xD83DDE96L, - 0xD83DDE97L, - 0xD83DDE98L, - 0xD83DDE99L, - 0xD83DDE9AL, - 0xD83DDE9BL, - 0xD83DDE9CL, - 0xD83DDE9DL, - 0xD83DDE9EL, - 0xD83DDE9FL, - 0xD83DDEA0L, - 0xD83DDEA1L, - 0xD83DDEA3L, - 0xD83DDEA4L, - 0xD83DDEA7L, - 0xD83DDEA8L, - 0xD83DDEAAL, - 0xD83DDEACL, - 0xD83DDEB4L, - 0xD83DDEB5L, - 0xD83DDEB6L, - 0xD83DDEBDL, - 0xD83DDEBFL, - 0xD83DDEC0L, - 0xD83CDDE8D83CDDF3L, - 0xD83CDDE9D83CDDEAL, - 0xD83CDDEAD83CDDF8L, - 0xD83CDDEBD83CDDF7L, - 0xD83CDDECD83CDDE7L, - 0xD83CDDEED83CDDF9L, - 0xD83CDDEFD83CDDF5L, - 0xD83CDDF0D83CDDF7L, - 0xD83CDDF7D83CDDFAL, - 0xD83CDDFAD83CDDF8L,}; - - public static final Long[] RECENT_DEFAULT = new Long[]{ - - // todo default recent? - 0xD83DDE37L, - 0xD83DDE21L, - 0xD83DDE33L, - 0xD83DDE0DL, - 0xD83DDE0AL, - - - }; - private static ArrayList recent = new ArrayList(); - - - private static OnRecentChangeListener onRecentChangeListener; - - public static void setOnRecentChangeListener(OnRecentChangeListener onRecentChangeListener) { - SmilesPack.onRecentChangeListener = onRecentChangeListener; - } - - public static ArrayList getRecent() {/* - if (recent.isEmpty()) { - recent.addAll(Arrays.asList(RECENT_DEFAULT)); - } - return recent;*/ - return SmilesRecentsController.getInstance(); - } - - public static void upRecent(Long smileId) { - SmilesRecentsController.getInstance().push(smileId); - } -} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesRecentListener.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesRecentListener.java deleted file mode 100644 index 79d32297b9..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesRecentListener.java +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (C) 2015 Actor LLC. - */ - -package im.actor.sdk.view.emoji.smiles; - -/** - * Created by Jesus Christ. Amen. - */ -public interface SmilesRecentListener { - void onSmilesUpdated(); -} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesRecentsController.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesRecentsController.java deleted file mode 100644 index cfac7e83f1..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmilesRecentsController.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2015 Actor LLC. - */ - -package im.actor.sdk.view.emoji.smiles; - -import android.content.Context; -import android.content.SharedPreferences; - -import java.util.ArrayList; -import java.util.StringTokenizer; - -import im.actor.runtime.android.AndroidContext; - -/** - * Created by Jesus Christ. Amen. - */ -public class SmilesRecentsController extends ArrayList { - - private static final String PREFERENCE_NAME = "smiles"; - private static final String PREF_RECENTS = "recent_smiles"; - - private static final Object LOCK = new Object(); - private static SmilesRecentsController sInstance; - - private Context mContext; - - private SmilesRecentsController(Context context) { - mContext = context.getApplicationContext(); - loadRecents(); - } - - public static SmilesRecentsController getInstance() { - return getInstance(AndroidContext.getContext()); - } - - public static SmilesRecentsController getInstance(Context context) { - if (sInstance == null) { - synchronized (LOCK) { - if (sInstance == null) { - sInstance = new SmilesRecentsController(context); - } - } - } - return sInstance; - } - - - public void push(Long object) { - if (contains(object)) { - super.remove(object); - } - add(0, object); - while(size()>32){ - remove(32); - } - } - - @Override - public boolean add(Long object) { - boolean ret = super.add(object); - return ret; - } - - @Override - public void add(int index, Long object) { - super.add(index, object); - } - - @Override - public boolean remove(Object object) { - boolean ret = super.remove(object); - return ret; - } - - private SharedPreferences getPreferences() { - return mContext.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); - } - - private void loadRecents() { - SharedPreferences prefs = getPreferences(); - String str = prefs.getString(PREF_RECENTS, ""); - StringTokenizer tokenizer = new StringTokenizer(str, "~"); - while (tokenizer.hasMoreTokens()) { - try { - add(Long.valueOf(tokenizer.nextToken())); - } catch (NumberFormatException e) { - // ignored - } - } - } - - public void saveRecents() { - StringBuilder str = new StringBuilder(); - int c = size(); - for (int i = 0; i < c; i++) { - Long e = get(i); - str.append(e); - if (i < (c - 1)) { - str.append('~'); - } - } - SharedPreferences prefs = getPreferences(); - prefs.edit().putString(PREF_RECENTS, str.toString()).apply(); - } - -} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmileysPack.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmileysPack.java deleted file mode 100644 index 4064d9effa..0000000000 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/smiles/SmileysPack.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (C) 2015 Actor LLC. - */ - -package im.actor.sdk.view.emoji.smiles; - -/** - * Created by ex3ndr on 19.10.14. - */ -public class SmileysPack { - public static final boolean PACK_2 = true; - public static final boolean PACK_15 = true; - public static final boolean PACK_1 = false; -} From ff3317f5d10a0bf1a29db6eb2e48ee699081e920 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Mon, 16 Jan 2017 09:47:29 -0200 Subject: [PATCH 213/253] fix emoji --- .../conversation/attach/AttachFragment.java | 2 ++ .../conversation/inputbar/InputBarFragment.java | 2 +- .../conversation/messages/content/TextHolder.java | 10 ++++++++-- .../im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java | 1 + 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java index be7c298660..ead36dde80 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java @@ -383,6 +383,8 @@ public void show() { onShown(); messenger().getGalleryScannerActor().send(new GalleryScannerActor.Show()); showView(root); + + // TranslateAnimation animation = new TranslateAnimation(0, 0, root.getHeight(), 0); // animation.setInterpolator(MaterialInterpolator.getInstance()); // animation.setDuration(200); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java index 6bf5297635..1a94ac1dd5 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java @@ -291,7 +291,7 @@ public void setText(String text) { public void setText(String text, boolean selectAll) { isTypingDisabled = true; Spannable spantext = AndroidMarkdown.processOnlyLinks(text); - messageEditText.setText(Emoji.replaceEmoji(spantext, messageEditText.getPaint().getFontMetricsInt(), Screen.sp(20), false)); + messageEditText.setText(Emoji.replaceEmoji(spantext, messageEditText.getPaint().getFontMetricsInt(), Screen.dp(20), false)); if (selectAll) { messageEditText.setSelection(messageEditText.getText().length()); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java index ae44291eef..ca5b3bed03 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java @@ -31,6 +31,8 @@ public class TextHolder extends MessageHolder { protected FrameLayout messageBubble; protected TextView text; + protected TextPaint emojiTextPaint; + protected TextView time; protected TintImageView status; @@ -49,6 +51,9 @@ public TextHolder(MessagesAdapter adapter, final View itemView, Peer peer) { text.setTextColor(ActorSDK.sharedActor().style.getConvTextColor()); text.setTypeface(Fonts.regular()); + emojiTextPaint = new TextPaint(); + emojiTextPaint.setTextSize(Screen.sp(30)); + time = (TextView) itemView.findViewById(R.id.tv_time); ActorSDK.sharedActor().style.getConvTimeColor(); time.setTypeface(Fonts.regular()); @@ -69,10 +74,11 @@ protected void bindData(final Message message, long readDate, long receiveDate, PreprocessedTextData textData = (PreprocessedTextData) preprocessedData; Spannable reactions = preprocessedData.getReactionsSpannable(); CharSequence text; + if (textData.getSpannableString() != null) { - text = Emoji.replaceEmoji(textData.getSpannableString(), this.text.getPaint().getFontMetricsInt(), Screen.sp(40), false); + text = Emoji.replaceEmoji(textData.getSpannableString(), emojiTextPaint.getFontMetricsInt(), Screen.dp(40), false); } else { - text = Emoji.replaceEmoji(new SpannableStringBuilder(textData.getText()), this.text.getPaint().getFontMetricsInt(), Screen.sp(40), false); + text = Emoji.replaceEmoji(new SpannableStringBuilder(textData.getText()), emojiTextPaint.getFontMetricsInt(), Screen.dp(40), false); } bindRawText(text, readDate, receiveDate, reactions, message, false); } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java index 9fdcac8206..dc7d67b8a3 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/Emoji.java @@ -517,6 +517,7 @@ public static CharSequence replaceEmoji(CharSequence cs, Paint.FontMetricsInt fo } drawable = Emoji.getEmojiDrawable(emojiCode.subSequence(0, emojiCode.length())); if (drawable != null) { + span = new EmojiSpan(drawable, DynamicDrawableSpan.ALIGN_BOTTOM, size, fontMetrics); s.setSpan(span, startIndex, startIndex + startLength, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); emojiCount++; From 3aae09c1d0e59c6483ea5eca7f73fd2a43802c96 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Mon, 16 Jan 2017 12:53:54 -0200 Subject: [PATCH 214/253] alteracoes --- .../sdk/controllers/conversation/view/BubbleContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/view/BubbleContainer.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/view/BubbleContainer.java index e9e86025ec..9c12b79c14 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/view/BubbleContainer.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/view/BubbleContainer.java @@ -241,7 +241,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int topOffset = 0; View messageView = findMessageView(); - int padding = Screen.dp(8); + int padding = Screen.dp(6); if (showAvatar) { padding += Screen.dp(48); } From 2320fe6b44fb8c3c71818b776f82cddcd7aa18de Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Mon, 16 Jan 2017 14:32:52 -0200 Subject: [PATCH 215/253] alteracoes --- .../controllers/conversation/messages/content/TextHolder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java index ca5b3bed03..5df51d1024 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/messages/content/TextHolder.java @@ -52,7 +52,7 @@ public TextHolder(MessagesAdapter adapter, final View itemView, Peer peer) { text.setTypeface(Fonts.regular()); emojiTextPaint = new TextPaint(); - emojiTextPaint.setTextSize(Screen.sp(30)); + emojiTextPaint.setTextSize(Screen.sp(25)); time = (TextView) itemView.findViewById(R.id.tv_time); ActorSDK.sharedActor().style.getConvTimeColor(); From 4c7d3118390ff51612c7e4a606cb7737211181e2 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 17 Jan 2017 12:22:37 -0200 Subject: [PATCH 216/253] alteracoes --- .../conversation/attach/AttachFragment.java | 128 ++++++++---------- 1 file changed, 58 insertions(+), 70 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java index ead36dde80..54c4aa6b68 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java @@ -65,7 +65,7 @@ public class AttachFragment extends AbsAttachFragment implements MediaPickerCall private boolean isLoaded = false; private RecyclerView fastShare; - private LinearLayout bottomBackground; + private FrameLayout bottomBackground; private boolean isFastShareFullScreen; //private GridLayoutManager layoutManager; private LinearLayoutManager layoutManager; @@ -110,10 +110,10 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup fcontainer @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - if (h != oldh && shareButtons != null) { - shareButtons.getLayoutParams().height = root.getHeight() - Screen.dp(135); - shareButtons.requestLayout(); - } +// if (h != oldh && shareButtons != null) { + // shareButtons.getLayoutParams().height = root.getHeight() - Screen.dp(135); +// shareButtons.requestLayout(); +// } } }; root.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, @@ -253,6 +253,8 @@ private void prepareView() { // return position == 0 ? spanCount : 1; // } // }); + + StateListDrawable background = ShareMenuButtonFactory.get(style.getMainColor(), getActivity()); final View.OnClickListener finalDefaultSendOcl = defaultSendOcl; @@ -289,41 +291,30 @@ private void prepareView() { }); shareButtons.getLayoutParams().height = root.getHeight() - Screen.dp(135); - shareButtons.requestLayout(); - bottomBackground = new LinearLayout(getContext()); - bottomBackground.setOrientation(LinearLayout.VERTICAL); - - FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Screen.dp(275), Gravity.BOTTOM); + bottomBackground = new FrameLayout(getContext()); bottomBackground.setBackgroundColor(ActorSDK.sharedActor().style.getMainBackgroundColor()); - FrameLayout.LayoutParams params3 = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - bottomBackground.addView(fastShare, params3); + FrameLayout.LayoutParams paramsFastShare = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Screen.dp(90)); + bottomBackground.addView(fastShare, paramsFastShare); - FrameLayout.LayoutParams params4 = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - //params4.setMargins(0, 0, 0, Screen.dp(115)); - bottomBackground.addView(shareButtons, params4); + FrameLayout.LayoutParams paramsShareButtons = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Screen.dp(180)); + paramsShareButtons.setMargins(0, Screen.dp(90), 0, 0); + bottomBackground.addView(shareButtons, paramsShareButtons); - root.addView(bottomBackground, params); + FrameLayout.LayoutParams paramsBackground = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Screen.dp(270), Gravity.BOTTOM | Gravity.RIGHT); + root.addView(bottomBackground, paramsBackground); + //shareButtons.requestLayout(); + //bottomBackground.requestLayout(); // FrameLayout.LayoutParams params2 = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.RIGHT); // params2.setMargins(0, 0, Screen.dp(20), Screen.dp(20)); // root.addView(hideClone, params2); } -// @NonNull -// private GridLayoutManager getGridLayoutManager() { -// spanCount = Screen.getWidth() / Screen.dp(88); -// fastShareWidth = Screen.getWidth() / spanCount; -// return new GridLayoutManager(getActivity(), spanCount); -// } - private LinearLayoutManager getLinearLayoutManager(){ spanCount = Screen.getWidth() / Screen.dp(88); fastShareWidth = Screen.getWidth() / spanCount; - - LinearLayoutManager llm = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false); - - return llm; + return new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false); } private View instantiateShareMenuItem(ShareMenuField f) { @@ -384,13 +375,12 @@ public void show() { messenger().getGalleryScannerActor().send(new GalleryScannerActor.Show()); showView(root); - // TranslateAnimation animation = new TranslateAnimation(0, 0, root.getHeight(), 0); // animation.setInterpolator(MaterialInterpolator.getInstance()); // animation.setDuration(200); - //root.startAnimation(animation); +// fastShare.startAnimation(animation); // bottomBackground.startAnimation(animation); - /* + shareButtons.post(new Runnable() { @Override public void run() { @@ -406,7 +396,7 @@ public void run() { } } }); - */ + } } @@ -420,46 +410,44 @@ public void hide() { fastShare.scrollToPosition(0); hideView(root); +// if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP && !isFastShareFullScreen) { +// View internal = shareButtons; +// int cx = internal.getWidth() - Screen.dp(56 + 56); +// int cy = internal.getHeight() - Screen.dp(56 / 2); +// float finalRadius = (float) Math.hypot(cx, cy); +// Animator anim = ViewAnimationUtils.createCircularReveal(internal, cx, cy, finalRadius, 0); +// anim.addListener(new Animator.AnimatorListener() { +// @Override +// public void onAnimationStart(Animator animator) { +// internal.setAlpha(1); +// } +// +// @Override +// public void onAnimationEnd(Animator animator) { +// internal.setAlpha(0); +// } +// +// @Override +// public void onAnimationCancel(Animator animator) { +// +// } +// +// @Override +// public void onAnimationRepeat(Animator animator) { +// +// } +// }); +// +// anim.setDuration(200); +// anim.start(); +// } else { +// TranslateAnimation animation = new TranslateAnimation(0, 0, 0, root.getHeight()); +// animation.setInterpolator(MaterialInterpolator.getInstance()); +// animation.setDuration(250); +// fastShare.startAnimation(animation); +// bottomBackground.startAnimation(animation); +// } - /** - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP && !isFastShareFullScreen) { - View internal = shareButtons; - int cx = internal.getWidth() - Screen.dp(56 + 56); - int cy = internal.getHeight() - Screen.dp(56 / 2); - float finalRadius = (float) Math.hypot(cx, cy); - Animator anim = ViewAnimationUtils.createCircularReveal(internal, cx, cy, finalRadius, 0); - anim.addListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animator) { - internal.setAlpha(1); - } - - @Override - public void onAnimationEnd(Animator animator) { - internal.setAlpha(0); - } - - @Override - public void onAnimationCancel(Animator animator) { - - } - - @Override - public void onAnimationRepeat(Animator animator) { - - } - }); - - anim.setDuration(200); - anim.start(); - } else { - TranslateAnimation animation = new TranslateAnimation(0, 0, 0, root.getHeight()); - animation.setInterpolator(MaterialInterpolator.getInstance()); - animation.setDuration(250); - fastShare.startAnimation(animation); - bottomBackground.startAnimation(animation); - } - **/ } } From d6355582564715993153a0ae5eb1a06670e8dd0b Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 17 Jan 2017 15:45:33 -0200 Subject: [PATCH 217/253] alteracoes --- .../conversation/ChatFragment.java | 3 + .../attach/AbsAttachFragment.java | 6 ++ .../conversation/attach/AttachFragment.java | 13 +++++ .../inputbar/InputBarFragment.java | 21 ++++++- .../tools/AttachOpenCloseCallback.java | 11 ++++ .../sdk/view/emoji/keyboard/BaseKeyboard.java | 57 +++++++++---------- .../emoji/keyboard/emoji/EmojiKeyboard.java | 8 +-- 7 files changed, 79 insertions(+), 40 deletions(-) create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/tools/AttachOpenCloseCallback.java diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/ChatFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/ChatFragment.java index dd8ac7f636..efd440d648 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/ChatFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/ChatFragment.java @@ -128,6 +128,9 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, if (fragment == null) { fragment = new AttachFragment(peer); } + + fragment.setAttachListener(inputBarFragment); + getFragmentManager().beginTransaction() .add(R.id.overlay, fragment) .commit(); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AbsAttachFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AbsAttachFragment.java index 8cbf2ca5bb..efde812cc9 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AbsAttachFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AbsAttachFragment.java @@ -4,10 +4,12 @@ import im.actor.core.entity.Peer; import im.actor.sdk.controllers.BaseFragment; +import im.actor.sdk.controllers.tools.AttachOpenCloseCallback; public abstract class AbsAttachFragment extends BaseFragment { private Peer peer; + protected AttachOpenCloseCallback attachListener; public AbsAttachFragment(Peer peer) { Bundle bundle = new Bundle(); @@ -23,6 +25,10 @@ public Peer getPeer() { return peer; } + public void setAttachListener(AttachOpenCloseCallback attachListener) { + this.attachListener = attachListener; + } + @Override public void onCreate(Bundle saveInstance) { super.onCreate(saveInstance); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java index 54c4aa6b68..59d6b41879 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/attach/AttachFragment.java @@ -40,6 +40,7 @@ import im.actor.runtime.collections.ManagedList; import im.actor.sdk.ActorSDK; import im.actor.sdk.R; +import im.actor.sdk.controllers.tools.AttachOpenCloseCallback; import im.actor.sdk.controllers.tools.MediaPickerCallback; import im.actor.sdk.controllers.tools.MediaPickerFragment; import im.actor.sdk.util.SDKFeatures; @@ -74,6 +75,8 @@ public class AttachFragment extends AbsAttachFragment implements MediaPickerCall private int fastShareWidth; private int spanCount; + + public AttachFragment(Peer peer) { super(peer); } @@ -96,6 +99,8 @@ protected LinearLayoutManager getLayoutManager() { return layoutManager; } + + @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup fcontainer, @Nullable Bundle savedInstanceState) { @@ -357,6 +362,11 @@ private View instantiateShareMenuItem(ShareMenuField f) { @Override public void show() { + + if(attachListener != null){ + attachListener.onAttachOpen(); + } + prepareView(); if (root.getVisibility() == View.INVISIBLE) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { @@ -403,6 +413,9 @@ public void run() { @Override public void hide() { + if(attachListener != null){ + attachListener.onAttachHide(); + } if (root != null && root.getVisibility() == View.VISIBLE) { onHidden(); fastAttachAdapter.clearSelected(); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java index 1a94ac1dd5..6cac32ef06 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/inputbar/InputBarFragment.java @@ -37,6 +37,7 @@ import im.actor.sdk.controllers.BaseFragment; import im.actor.sdk.controllers.conversation.messages.MessagesDefaultFragment; import im.actor.sdk.controllers.conversation.messages.MessagesFragment; +import im.actor.sdk.controllers.tools.AttachOpenCloseCallback; import im.actor.sdk.core.audio.VoiceCaptureActor; import im.actor.sdk.util.KeyboardHelper; import im.actor.sdk.util.Screen; @@ -50,7 +51,8 @@ import static im.actor.sdk.util.ViewUtils.zoomInView; import static im.actor.sdk.util.ViewUtils.zoomOutView; -public class InputBarFragment extends BaseFragment implements MessagesDefaultFragment.NewMessageListener { +public class InputBarFragment extends BaseFragment implements MessagesDefaultFragment.NewMessageListener, + AttachOpenCloseCallback { private static final int SLIDE_LIMIT = Screen.dp(180); private static final int PERMISSION_REQUEST_RECORD_AUDIO = 1; @@ -173,7 +175,6 @@ public void afterTextChanged(Editable editable) { } }); - // // Send Button // @@ -197,7 +198,9 @@ public void afterTextChanged(Editable editable) { // Emoji keyboard // emojiButton = (ImageView) res.findViewById(R.id.ib_emoji); - emojiButton.setOnClickListener(v -> emojiKeyboard.toggle()); + emojiButton.setOnClickListener(v -> { + emojiKeyboard.toggle(); + }); emojiKeyboard = getEmojiKeyboard(); emojiKeyboard.setOnStickerClickListener(sticker -> { Fragment parent = getParentFragment(); @@ -643,4 +646,16 @@ public void onNewMessage(Message m) { ((MessagesFragment.NewMessageListener) emojiKeyboard).onNewMessage(m); } } + + @Override + public void onAttachOpen() { + if(emojiKeyboard.isShowing()) { + emojiKeyboard.dismiss(true); + } + } + + @Override + public void onAttachHide() { + + } } \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/tools/AttachOpenCloseCallback.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/tools/AttachOpenCloseCallback.java new file mode 100644 index 0000000000..4b0713e07c --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/tools/AttachOpenCloseCallback.java @@ -0,0 +1,11 @@ +package im.actor.sdk.controllers.tools; + +/** + * Created by 98379720172 on 17/01/17. + */ + +public interface AttachOpenCloseCallback { + + void onAttachOpen(); + void onAttachHide(); +} diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/BaseKeyboard.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/BaseKeyboard.java index 1466964b30..600b4996ab 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/BaseKeyboard.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/BaseKeyboard.java @@ -22,11 +22,12 @@ import im.actor.sdk.R; import im.actor.runtime.Log; import im.actor.sdk.controllers.conversation.KeyboardLayout; +import im.actor.sdk.controllers.tools.AttachOpenCloseCallback; import im.actor.sdk.util.KeyboardHelper; import im.actor.sdk.util.Screen; public class BaseKeyboard implements - ViewTreeObserver.OnGlobalLayoutListener { + ViewTreeObserver.OnGlobalLayoutListener{ private static final String TAG = "BaseKeyboard"; @@ -144,8 +145,6 @@ private void update() { PixelFormat.TRANSLUCENT); params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; windowManager.updateViewLayout(emojiKeyboardView, params); - } else { - } } @@ -215,7 +214,6 @@ public boolean isShowing() { public void destroy() { dismiss(true); - if (keyboardStatusListener != null) { keyboardStatusListener.onDismiss(); } @@ -294,16 +292,12 @@ public void onGlobalLayout() { // FIXME verify root view applied new padding after keyboard state change // workaround for [some of android versions] bug, when keyboard closing not causing relayout, or causing it with delay if (changed && root != null) { - root.postDelayed(() -> { if (!root.isSync()) { root.requestLayout(); } }, 30); } - - - } public Activity getActivity() { @@ -341,29 +335,30 @@ public boolean onBackPressed() { } public static int getViewInset(View view, int statusBarHeight) { - if (view == null || view.getRootView() == null) { - return 0; - } - - view = view.getRootView(); - - if (Build.VERSION.SDK_INT < 21 || view.getHeight() == Screen.getHeight() || view.getHeight() == Screen.getHeight() - statusBarHeight) { - return 0; - } - - try { - Field mAttachInfoField = View.class.getDeclaredField("mAttachInfo"); - mAttachInfoField.setAccessible(true); - Object mAttachInfo = mAttachInfoField.get(view); - if (mAttachInfo != null) { - Field mStableInsetsField = mAttachInfo.getClass().getDeclaredField("mStableInsets"); - mStableInsetsField.setAccessible(true); - Rect insets = (Rect) mStableInsetsField.get(mAttachInfo); - return insets.bottom; - } - } catch (Exception e) { - e.printStackTrace(); - } +// if (view == null || view.getRootView() == null) { +// return 0; +// } +// +// view = view.getRootView(); +// +// if (Build.VERSION.SDK_INT < 21 || view.getHeight() == Screen.getHeight() || view.getHeight() == Screen.getHeight() - statusBarHeight) { +// return 0; +// } +// +// try { +// Field mAttachInfoField = View.class.getDeclaredField("mAttachInfo"); +// mAttachInfoField.setAccessible(true); +// Object mAttachInfo = mAttachInfoField.get(view); +// if (mAttachInfo != null) { +// Field mStableInsetsField = mAttachInfo.getClass().getDeclaredField("mStableInsets"); +// mStableInsetsField.setAccessible(true); +// Rect insets = (Rect) mStableInsetsField.get(mAttachInfo); +// return insets.bottom; +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } return 0; } + } diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java index 2b0e9e74b4..74340e8576 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java @@ -18,7 +18,6 @@ import android.app.Activity; import android.app.AlertDialog; -import android.content.DialogInterface; import android.view.KeyEvent; import android.view.View; import android.widget.EditText; @@ -78,11 +77,8 @@ public void onClearEmojiRecent() { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(ActorSDK.sharedActor().getAppName()); builder.setMessage("Remover emojis recentes"); - builder.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { + builder.setPositiveButton("Confirmar", (dialogInterface, i)-> { emojiView.clearRecentEmoji(); - } }); builder.setNegativeButton("Cancelar", null); builder.create().show(); @@ -100,7 +96,7 @@ public void onStickerSelected(Sticker sticker) { @Override protected void onDismiss() { - + messageBody.requestFocus(); } void animateView(View view) { From af5e4065bfff2c512e62b72a274a06fdd9b44eb0 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Fri, 20 Jan 2017 15:27:18 -0200 Subject: [PATCH 218/253] alteracoes --- .../android-sdk/src/main/res/values-pt-rBR/ui_text.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml index df21f7db20..b600ea1aaf 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml @@ -434,7 +434,7 @@ Adicionar contato - Insira o número do telefone + telefone, email ou usuário CANCELAR CONTINUE From 95d15221f62397b09063362216c7f8bb8d5ff442 Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 22 Jan 2017 09:05:54 -0200 Subject: [PATCH 219/253] alteracoes --- .../src/main/java/im/actor/Application.java | 2 ++ .../src/main/java/im/actor/sdk/ActorSDK.java | 10 ++++++++++ .../sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index 28ad4fa09c..4af541b384 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -89,6 +89,8 @@ public void onConfigureActorSDK() { ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); ActorSDK.sharedActor().setAuthType(AuthActivity.AUTH_TYPE_PHONE); + ActorSDK.sharedActor().setStickersEnabled(false); + // ActorSDK.sharedActor().setTwitter(""); // ActorSDK.sharedActor().setHomePage("http://www.foo.com"); // ActorSDK.sharedActor().setInviteUrl("http://www.foo.com"); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java index da74c82bbb..d2fd02c886 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java @@ -196,6 +196,8 @@ public class ActorSDK { private boolean onClientPrivacyEnabled = false; + private boolean stickersEnabled = true; + private String inviteDataUrl = "https://api.actor.im/v1/groups/invites/"; protected ActorSDK() { @@ -701,6 +703,14 @@ public boolean isCallsEnabled() { return callsEnabled; } + public boolean isStickersEnabled() { + return stickersEnabled; + } + + public void setStickersEnabled(boolean stickersEnabled) { + this.stickersEnabled = stickersEnabled; + } + /** * Getting Application Delegate. * diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java index 74340e8576..3e6b6dab1f 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/view/emoji/keyboard/emoji/EmojiKeyboard.java @@ -43,7 +43,7 @@ public EmojiKeyboard(Activity activity, EditText messageBody) { @Override protected View createView() { - EmojiView emojiView = new EmojiView(true, getActivity()); + EmojiView emojiView = new EmojiView(ActorSDK.sharedActor().isStickersEnabled(), getActivity()); emojiView.setVisibility(View.VISIBLE); emojiView.setListener(new EmojiView.Listener() { From 4e27da7bef445dc303b044feaa6a027aa0b45f31 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sun, 22 Jan 2017 10:18:27 -0200 Subject: [PATCH 220/253] emoji improvments --- actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../Sources/ActorCore/ActorCoreExt.swift | 25 ++++++++++-- .../AADialogsListContentController.swift | 4 -- .../Dialogs List/Cells/AADialogCell.swift | 2 +- .../Sources/SwiftExtensions/Strings.swift | 38 ++++++++++++++++++ 6 files changed, 61 insertions(+), 10 deletions(-) diff --git a/actor-sdk/sdk-core-ios/.DS_Store b/actor-sdk/sdk-core-ios/.DS_Store index 344bdc6d583203f9dbfbeb1141fd55695dceb2c7..3b066cfb1dfdf20209bd02d39b6d04977f78981e 100644 GIT binary patch delta 19 acmZoEXeromN|VV%a`FUCoy|WqdH4WO6bC^7 delta 19 bcmZoEXeromN|Q-%(&P!6I-7rJ^6&uwRE!6- diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index 9b84b676bd..4fbbdf2a43 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.30" + s.version = "3.0.457.31" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift index cb7df2d627..6d458511ff 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/ActorCoreExt.swift @@ -289,10 +289,27 @@ open class TextParser { let doc = markdownParser?.processDocument(with: text) if (doc?.isTrivial())! { - let nAttrText = NSMutableAttributedString(string: text) - let range = NSRange(location: 0, length: nAttrText.length) - nAttrText.yy_setColor(textColor, range: range) - nAttrText.yy_setFont(UIFont.textFontOfSize(fontSize), range: range) + + let nAttrText = NSMutableAttributedString(string: "") + + for ch in text.characters { + let str = String(ch) + + if(str.containsEmoji){ + let emoji = NSMutableAttributedString(string: str) + let range = NSRange(location: 0, length: emoji.length) + emoji.yy_setColor(textColor, range: range) + emoji.yy_setFont(UIFont.textFontOfSize(30), range: range) + nAttrText.append(emoji) + }else{ + let noEmoji = NSMutableAttributedString(string: str) + let range = NSRange(location: 0, length: noEmoji.length) + noEmoji.yy_setColor(textColor, range: range) + noEmoji.yy_setFont(UIFont.textFontOfSize(fontSize), range: range) + nAttrText.append(noEmoji) + } + } + return ParsedText(attributedText: nAttrText, isTrivial: true, code: []) } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/AADialogsListContentController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/AADialogsListContentController.swift index 0bec46cbc7..f6da1e3821 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/AADialogsListContentController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/AADialogsListContentController.swift @@ -56,10 +56,6 @@ open class AADialogsListContentController: AAContentTableController, UISearchBar } r.selectAction = { (dialog: ACDialog) -> Bool in - print(dialog.isBot) - print(dialog.isChannel) - print(dialog.peer.peerType) - if let d = self.delegate { return d.recentsDidTap(self, dialog: dialog) } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift index 768cdf2f51..36b344cb0b 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Content/Dialogs List/Cells/AADialogCell.swift @@ -411,7 +411,7 @@ final class AADialogCell: AATableViewCell, AABindedCell { if !statusView.isHidden { padding += 22 } - let messageViewFrame = CGRect(x: padding, y: 44, width: render.messageWidth, height: 18) + let messageViewFrame = CGRect(x: padding, y: 44, width: render.messageWidth, height: 22) UIView.performWithoutAnimation { self.messageView.frame = messageViewFrame } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Strings.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Strings.swift index f01e01e2d0..4a6d3fece4 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Strings.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Strings.swift @@ -137,6 +137,44 @@ public extension String { } public var asNS: NSString { return (self as NSString) } + + var containsEmoji: Bool { + for scalar in unicodeScalars { + print(scalar.value) + switch scalar.value { + case + 0x1F600...0x1F64F, // Emoticons + 0x1F300...0x1F5FF, // Misc Symbols and Pictographs + 0x1F680...0x1F6FF, // Transport and Map + 0x2600...0x26FF, // Misc symbols + 0x2700...0x27BF, // Dingbats + 0xFE00...0xFE0F, // Variation Selectors + 0x1F910...0x1F933, // New Emoticons + 0x1F1E6...0x1F1FF, // Flags + 0x1F980...0x1F984, + 0x1F191...0x1F19A, + 0x1F201...0x1F202, + 0x1F232...0x1F23A, + 0x1F250...0x1F251, + 0x23E9...0x23F3, + 0x23F8...0x23FA, + 0x1F170...0x1F171, + 0x1F17E, + 0xA9, + 0xAE, + 0x2122, + 0x2328, + 0x3030, + 0x1F0CF, + 0x1F18E, + 0x1F9C0: + return true + default: + continue + } + } + return false + } } public extension NSAttributedString { From 6f4262c0f39be210c19a7545a28619d9b4b6c920 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sun, 22 Jan 2017 20:40:51 -0200 Subject: [PATCH 221/253] fix the window when the user leve the group or channel --- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../Resources/Base.lproj/Localizable.strings | 2 ++ .../Group/AAGroupViewController.swift | 17 +++++++++++----- .../Managed Runtime/AAViewController.swift | 4 +++- .../Sources/SwiftExtensions/Views.swift | 20 +++++++++++++++++++ 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index 4fbbdf2a43..f6293d2c79 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.31" + s.version = "3.0.457.32" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings index 2626a6fa2d..a9ac6e8885 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings +++ b/actor-sdk/sdk-core-ios/ActorSDK/Resources/Base.lproj/Localizable.strings @@ -734,6 +734,8 @@ "ActionDeleteAndExitAction" = "Exit"; +"ActionDeleteAndExitNotAllowed" = "You are not allowed to leave this group"; + "ActionClearHistory" = "Clear History"; diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewController.swift index a16d839c24..68c0118194 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Group/AAGroupViewController.swift @@ -322,16 +322,23 @@ open class AAGroupViewController: AAContentTableController { let title: String let action: String if self.group.groupType == ACGroupType.channel() { - title = AALocalized("ActionLeaveChannelMessage") - action = AALocalized("ActionLeaveChannelAction") + title = AALocalized("ActionLeaveChannelAction") + action = AALocalized("ActionLeaveChannel") } else { title = AALocalized("ActionDeleteAndExitMessage") - action = AALocalized("ActionDeleteAndExitMessageAction") + action = AALocalized("ActionDeleteAndExitAction") } self.confirmDestructive(title, action: action, yes: { () -> () in - self.executePromise(Actor.leaveAndDeleteGroup(withGid: jint(self.gid))) + self.executePromise(Actor.leaveAndDeleteGroup(withGid: jint(self.gid)), successBlock: { (t) in + DispatchQueue.main.async { + self.navigationController?.popToRootViewController(animated: true) + } + }, failureBlock: { (e) in + DispatchQueue.main.async { + self.alertUser(AALocalized("ActionDeleteAndExitNotAllowed")) + } + }) }) - return true } }) diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AAViewController.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AAViewController.swift index a593669a83..11e9175869 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AAViewController.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/Controllers/Managed Runtime/AAViewController.swift @@ -93,8 +93,10 @@ open class AAViewController: UIViewController, UINavigationControllerDelegate, U open func showPlaceholder() { if placeholder.superview == nil { - placeholder.frame = view.bounds + //placeholder.frame = view.frame view.addSubview(placeholder) + view.addConstraintsWithFormat("H:|[v0]|", views: placeholder) + view.addConstraintsWithFormat("V:|[v0]|", views: placeholder) } } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Views.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Views.swift index 04779a14ee..a3e5574622 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Views.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Views.swift @@ -111,6 +111,26 @@ public extension UIView { self.frame = CGRect(x: rect.origin.x + (rect.width - self.bounds.width) / 2, y: rect.origin.y, width: self.bounds.width, height: self.bounds.height) } + + public func addConstraintsWithFormat(_ format: String, views: UIView...) { + var viewsDictionary = [String: UIView]() + for (index, view) in views.enumerated() { + let key = "v\(index)" + view.translatesAutoresizingMaskIntoConstraints = false + viewsDictionary[key] = view + } + addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary)) + } + + public func addConstraintsWithFormat(_ format: String, formatOptions: NSLayoutFormatOptions, views: UIView...) { + var viewsDictionary = [String: UIView]() + for (index, view) in views.enumerated() { + let key = "v\(index)" + view.translatesAutoresizingMaskIntoConstraints = false + viewsDictionary[key] = view + } + addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: formatOptions, metrics: nil, views: viewsDictionary)) + } } // Text measuring From a10bd2538dfcc64d151feddbe35306bfd534138c Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 24 Jan 2017 09:46:20 -0200 Subject: [PATCH 222/253] alteracoes --- .../models/im/actor/api/scheme.mps | 50 ++++++++++++++++--- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps index 417db3f790..8b90c3a517 100644 --- a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps +++ b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps @@ -18638,18 +18638,54 @@ - - + + + + + + + + + + + + + + + + + + - - - + + + + + - - + + + + + + + + + + + + + + + + + + + + From d918bf4e781f994d6fb219444a42ebdfe32a5fe5 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Fri, 27 Jan 2017 10:59:01 -0200 Subject: [PATCH 223/253] alteracoes --- .../android-sdk/src/main/res/values-pt-rBR/ui_text.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml index b600ea1aaf..cc07536e31 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/res/values-pt-rBR/ui_text.xml @@ -274,7 +274,7 @@ Entrar Silenciar - Descilenciar + Ativar Notificações COMEÇAR Não há descrição para este bot ainda @@ -288,7 +288,7 @@ Gostar Editar a última mensagem Somente sua última mensagem pode ser editada - A mensagem é muito velha + A mensagem é muito antiga Galeria From 2deb73d4750db406d6195dd00e57a852627ac658 Mon Sep 17 00:00:00 2001 From: diego Date: Fri, 27 Jan 2017 19:27:01 -0200 Subject: [PATCH 224/253] alteracoes --- .../android-app/src/main/java/im/actor/Application.java | 4 ++-- actor-server/conf/server.conf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index 4af541b384..ece8727718 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -85,8 +85,8 @@ public void onConfigureActorSDK() { "canalxloto" }); -// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.8:9070"}); - ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); + ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.3:9070"}); +// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); ActorSDK.sharedActor().setAuthType(AuthActivity.AUTH_TYPE_PHONE); ActorSDK.sharedActor().setStickersEnabled(false); diff --git a/actor-server/conf/server.conf b/actor-server/conf/server.conf index 7f3d99de5b..f77371a157 100644 --- a/actor-server/conf/server.conf +++ b/actor-server/conf/server.conf @@ -277,9 +277,9 @@ services { certs = [{ key: 868547 bundleId: "br.com.diegosilva.xlotomessenger" - path: "/home/diego/Dropbox/actor/apple/production/xloto_apns.p12" + path: "/home/diego/Dropbox/actor/apple/development/aps_development.p12" password: "xlotoapns123" - sandbox: false + sandbox: true voip: false }] } From 727f54eda805eedd3578ea17003c109d4f2c3a01 Mon Sep 17 00:00:00 2001 From: diego Date: Sat, 28 Jan 2017 08:43:20 -0200 Subject: [PATCH 225/253] adicao do ativador de sms no sdk --- actor-sdk/sdk-api/api-language/.mps/misc.xml | 7 ++- .../src/main/java/im/actor/Application.java | 2 + .../android-sdk/src/main/AndroidManifest.xml | 10 +++ .../src/main/java/im/actor/sdk/ActorSDK.java | 15 +++++ .../sdk/activation/SMSActivationReceiver.java | 61 +++++++++++++++++++ .../sdk/controllers/auth/AuthActivity.java | 13 ++++ .../auth/ValidateCodeFragment.java | 6 ++ 7 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/activation/SMSActivationReceiver.java diff --git a/actor-sdk/sdk-api/api-language/.mps/misc.xml b/actor-sdk/sdk-api/api-language/.mps/misc.xml index 1162f43828..8e3bf350fc 100644 --- a/actor-sdk/sdk-api/api-language/.mps/misc.xml +++ b/actor-sdk/sdk-api/api-language/.mps/misc.xml @@ -1,5 +1,6 @@ - - - + + + \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index 4af541b384..5b21c94781 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -76,6 +76,8 @@ public void onConfigureActorSDK() { ActorSDK.sharedActor().setCallsEnabled(true); + ActorSDK.sharedActor().setAppName("XLoto Mensageiro"); + ActorSDK.sharedActor().setTosUrl("http://actor.im"); ActorSDK.sharedActor().setPrivacyText("bla bla bla"); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml b/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml index 3a09fac396..1baa6bc303 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/AndroidManifest.xml @@ -23,6 +23,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java index d2fd02c886..977939a00b 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/ActorSDK.java @@ -112,6 +112,13 @@ public class ActorSDK { * Push Registration Id */ private long pushId = 0; + + /** + * Defines where is the sms code activation + * on the message + */ + private int smsCodePosition = 7; + /** * Actor Push Endpoint */ @@ -897,6 +904,14 @@ public void startAuthActivity(Context context, Bundle extras) { } } + public int getSmsCodePosition() { + return smsCodePosition; + } + + public void setSmsCodePosition(int smsCodePosition) { + this.smsCodePosition = smsCodePosition; + } + /** * Method is used internally for starting default activity or activity added in delegate * diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/activation/SMSActivationReceiver.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/activation/SMSActivationReceiver.java new file mode 100644 index 0000000000..f8ecd45110 --- /dev/null +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/activation/SMSActivationReceiver.java @@ -0,0 +1,61 @@ +package im.actor.sdk.activation; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Build; +import android.os.Bundle; +import android.telephony.SmsMessage; +import android.util.Log; + +import im.actor.sdk.ActorSDK; +import im.actor.sdk.controllers.auth.SMSActivationObservable; + +/** + * Created by diego on 28/01/17. + */ + +public class SMSActivationReceiver extends BroadcastReceiver { + + private SharedPreferences preferences; + + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { + Bundle bundle = intent.getExtras(); + SmsMessage[] msgs = null; + + if (bundle != null) { + try { + Object[] pdus = (Object[]) bundle.get("pdus"); + msgs = new SmsMessage[pdus.length]; + + for (int i = 0; i < msgs.length; i++) { + String format = bundle.getString("format"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format); + }else{ + msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); + } + + String msgFrom = msgs[i].getOriginatingAddress(); + String msgStr = msgs[i].getMessageBody(); + + String arrAppName[] = msgStr.split(":"); + String arr[] = msgStr.split("\\s+"); + + if(arrAppName[0].equalsIgnoreCase(ActorSDK.sharedActor().getAppName())){ + Integer codigoAtivacao = Integer.parseInt(arr[ActorSDK.sharedActor().getSmsCodePosition()]); + SMSActivationObservable.getInstance().updateValue(codigoAtivacao.toString()); + } + } + } catch (Exception e) { + Log.d("Erro ao receber SMS", e.getMessage()); + } + } + } + } + + +} \ No newline at end of file diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java index 1af9db63d1..05886884ef 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/AuthActivity.java @@ -1,11 +1,15 @@ package im.actor.sdk.controllers.auth; +import android.Manifest; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; +import android.content.pm.PackageManager; import android.os.Bundle; +import android.support.v13.app.ActivityCompat; import android.support.v4.app.Fragment; +import android.support.v4.content.ContextCompat; import android.view.MenuItem; import java.util.Observable; @@ -36,6 +40,8 @@ public class AuthActivity extends BaseFragmentActivity implements Observer{ + private static final int PERMISSIONS_REQUEST_READ_SMS = 1; + public static final String AUTH_TYPE_KEY = "auth_type"; public static final String SIGN_TYPE_KEY = "sign_type"; public static final int AUTH_TYPE_PHONE = 1; @@ -151,6 +157,13 @@ private void updateState(AuthState state, boolean force) { break; case CODE_VALIDATION_PHONE: case CODE_VALIDATION_EMAIL: + + if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.READ_SMS}, + PERMISSIONS_REQUEST_READ_SMS); + } + Fragment signInFragment = new ValidateCodeFragment(); Bundle args = new Bundle(); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/ValidateCodeFragment.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/ValidateCodeFragment.java index 3891c773c6..519b99f2d0 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/ValidateCodeFragment.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/auth/ValidateCodeFragment.java @@ -1,9 +1,13 @@ package im.actor.sdk.controllers.auth; +import android.Manifest; import android.app.AlertDialog; import android.content.DialogInterface; +import android.content.pm.PackageManager; import android.graphics.drawable.StateListDrawable; import android.os.Bundle; +import android.support.v13.app.ActivityCompat; +import android.support.v4.content.ContextCompat; import android.text.Editable; import android.text.Html; import android.text.TextWatcher; @@ -29,6 +33,8 @@ public class ValidateCodeFragment extends BaseAuthFragment { + + public static final String AUTH_TYPE_EMAIL = "auth_type_email"; public static final String AUTH_TYPE_PHONE = "auth_type_phone"; public static final String AUTH_TYPE_SIGN = "auth_type_is_sign"; From e8cf593c38640d0a4daabe48c908313cb01cdaf2 Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 29 Jan 2017 21:58:47 -0200 Subject: [PATCH 226/253] lateracoes --- actor-server/conf/server.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actor-server/conf/server.conf b/actor-server/conf/server.conf index 7f3d99de5b..f77371a157 100644 --- a/actor-server/conf/server.conf +++ b/actor-server/conf/server.conf @@ -277,9 +277,9 @@ services { certs = [{ key: 868547 bundleId: "br.com.diegosilva.xlotomessenger" - path: "/home/diego/Dropbox/actor/apple/production/xloto_apns.p12" + path: "/home/diego/Dropbox/actor/apple/development/aps_development.p12" password: "xlotoapns123" - sandbox: false + sandbox: true voip: false }] } From a84955d6b3aa4e7ca90c7825c84dcbbe31123657 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Mon, 30 Jan 2017 13:51:45 -0200 Subject: [PATCH 227/253] =?UTF-8?q?correcao=20no=20tamanho=20da=20imagem?= =?UTF-8?q?=20do=20profile=20na=20exibi=C3=A7=C3=A3o=20na=20conversa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdk/controllers/conversation/view/BubbleContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/view/BubbleContainer.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/view/BubbleContainer.java index 9c12b79c14..d9be1b2f58 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/view/BubbleContainer.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/conversation/view/BubbleContainer.java @@ -105,7 +105,7 @@ private void init() { // AVATAR avatarView = new AvatarViewWithOnline(getContext()); avatarView.init(Screen.dp(42), 18); - addView(avatarView, new MarginLayoutParams(Screen.dp(42), Screen.dp(42))); + addView(avatarView, new MarginLayoutParams(Screen.dp(40), Screen.dp(40))); } public OnAvatarClickListener getOnClickListener() { From 838dabe8003763f32128175c7cf82845d88dde97 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 31 Jan 2017 13:07:32 -0200 Subject: [PATCH 228/253] grupos predefinidos api-schema --- actor-sdk/sdk-api/api-language/.mps/misc.xml | 4 +- .../models/im/actor/api/scheme.mps | 96 ++++++++++++++----- 2 files changed, 71 insertions(+), 29 deletions(-) diff --git a/actor-sdk/sdk-api/api-language/.mps/misc.xml b/actor-sdk/sdk-api/api-language/.mps/misc.xml index 8e3bf350fc..8662aa97f9 100644 --- a/actor-sdk/sdk-api/api-language/.mps/misc.xml +++ b/actor-sdk/sdk-api/api-language/.mps/misc.xml @@ -1,6 +1,4 @@ - - + \ No newline at end of file diff --git a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps index 8b90c3a517..a59e64fdc3 100644 --- a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps +++ b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps @@ -18640,46 +18640,90 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + - - + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 4c4be3d2e13dd7e8e0102626a9b72abbb25196bf Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 31 Jan 2017 14:51:50 -0200 Subject: [PATCH 229/253] adicao da api de grupos pre definidos --- actor-sdk/sdk-api/actor-extension.json | 12 +- actor-sdk/sdk-api/actor.json | 22898 +++------------- .../models/im/actor/api/scheme.mps | 117 +- .../java/im/actor/core/api/ApiGroupPre.java | 85 + .../java/im/actor/core/api/ApiSurvey.java | 51 +- .../im/actor/core/api/ApiSurveyAnswer.java | 62 + .../actor/core/api/ApiUserSurveyAnswer.java | 58 + .../im/actor/core/api/parser/RpcParser.java | 4 + .../core/api/rpc/RequestCreateGroupPre.java | 68 + .../core/api/rpc/RequestCreateSurvey.java | 15 +- .../core/api/rpc/RequestLoadGroupsPre.java | 60 + .../core/api/rpc/ResponseCreateGroupPre.java | 84 + .../core/api/rpc/ResponseLoadGroupsPre.java | 65 + .../im/actor/core/xloto/api/ApiGroupPre.java | 0 .../core/xloto/api/parser/UpdatesParser.java | 25 + .../actor-core/src/main/actor-api/actor.json | 22898 +++------------- .../groupspre/GroupsPreServiceImpl.scala | 28 + .../service/survey/SurveyServiceImpl.scala | 18 +- 18 files changed, 9263 insertions(+), 37285 deletions(-) create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiGroupPre.java create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiSurveyAnswer.java create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiUserSurveyAnswer.java create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestCreateGroupPre.java create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestLoadGroupsPre.java create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/ResponseCreateGroupPre.java create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/ResponseLoadGroupsPre.java create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/ApiGroupPre.java create mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/parser/UpdatesParser.java create mode 100644 actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groupspre/GroupsPreServiceImpl.scala diff --git a/actor-sdk/sdk-api/actor-extension.json b/actor-sdk/sdk-api/actor-extension.json index 31f2c8782f..2c50475b07 100644 --- a/actor-sdk/sdk-api/actor-extension.json +++ b/actor-sdk/sdk-api/actor-extension.json @@ -1,7 +1,9 @@ { "version": "0.1", - "scala-package": "im.actor.extension.api", - "java-package": "im.actor.extension.api", - "aliases": [], - "sections": [] -} + "scala-package": "im.actor.api.xloto.rpc", + "java-package": "im.actor.core.xloto.api", + "aliases": [ + + ], + "sections": [ +]} \ No newline at end of file diff --git a/actor-sdk/sdk-api/actor.json b/actor-sdk/sdk-api/actor.json index c9ce0603d7..f9184686d1 100644 --- a/actor-sdk/sdk-api/actor.json +++ b/actor-sdk/sdk-api/actor.json @@ -2,18619 +2,4321 @@ "version": "1.6", "scala-package": "im.actor.api.rpc", "java-package": "im.actor.core.api", - "aliases": [{ - "type": "bytes", - "alias": "seq_state" - }, { - "type": "int64", - "alias": "date" - }, { - "type": "int64", - "alias": "randomId" - }, { - "type": "int64", - "alias": "msec" - }, { - "type": "int32", - "alias": "sec" - }, { - "type": "int32", - "alias": "userId" - }, { - "type": "int32", - "alias": "groupId" - }, { - "type": "int32", - "alias": "keyId" - }, { - "type": "int32", - "alias": "keyGroupId" - }, { - "type": "string", - "alias": "busId" - }], - "sections": [{ - "title": "Authentication", - "package": "auth", - "doc": [ - "

    Actor now support only one way for authentication - by SMS or phone call.

    ", - "

    Authorization steps:", - "

      ", - "
    1. Request SMS Code by calling RequestAuthCode
    2. ", - "
    3. If SMS arrives than send Authorization code in SignIn/SignUp
    4. ", - "
    5. If sms doesn't arrive for a long time - request phone activation by", - "calling AuthCodeCall
    6. ", - "
    ", - "

    ", - "Some rules
    ", - "If RequestAuthCode return isRegistered = false than use SignUp method else SignIn.
    ", - "If on any step API return PHONE_CODE_EXPIRED than application MUST start", - "authorization process from begining.
    " - ], - "items": [{ - "type": "enum", - "content": { - "name": "PhoneActivationType", - "values": [{ - "name": "CODE", - "id": 1 - }, { - "name": "PASSWORD", - "id": 2 - }] - } - }, { - "type": "enum", - "content": { - "name": "EmailActivationType", - "values": [{ - "name": "CODE", - "id": 1 - }, { - "name": "OAUTH2", - "id": 2 - }, { - "name": "PASSWORD", - "id": 3 - }] - } - }, { - "type": "rpc", - "content": { - "name": "StartPhoneAuth", - "header": 191, - "response": { - "type": "anonymous", - "header": 193, - "doc": [ - "Phone Activation response", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": " Hash of transaction" - }, { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " Is User registered" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "bool", - "id": 2, - "name": "isRegistered" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "PhoneActivationType" + "aliases": [ + { + "type": "bytes", + "alias": "seq_state" + }, + { + "type": "int64", + "alias": "date" + }, + { + "type": "int64", + "alias": "randomId" + }, + { + "type": "int64", + "alias": "msec" + }, + { + "type": "int32", + "alias": "sec" + }, + { + "type": "int32", + "alias": "userId" + }, + { + "type": "int32", + "alias": "groupId" + }, + { + "type": "int32", + "alias": "keyId" + }, + { + "type": "int32", + "alias": "keyGroupId" + }, + { + "type": "string", + "alias": "busId" + } + ], + "sections": [ + { + "title": "Authentication", + "package": "auth", + "doc": [ + "

    Actor now support only one way for authentication - by SMS or phone call.

    ", + "

    Authorization steps:", + "

      ", + "
    1. Request SMS Code by calling RequestAuthCode
    2. ", + "
    3. If SMS arrives than send Authorization code in SignIn/SignUp
    4. ", + "
    5. If sms doesn't arrive for a long time - request phone activation by", + "calling AuthCodeCall
    6. ", + "
    ", + "

    ", + "Some rules
    ", + "If RequestAuthCode return isRegistered = false than use SignUp method else SignIn.
    ", + "If on any step API return PHONE_CODE_EXPIRED than application MUST start", + "authorization process from begining.
    " + ], + "items": [ + { + "type": "enum", + "content": { + "name": "PhoneActivationType", + "values": [ + { + "name": "CODE", + "id": 1 + }, + { + "name": "PASSWORD", + "id": 2 } - }, - "id": 3, - "name": "activationType" - }] - }, - "doc": [ - "Start Phone Activation", { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": "Phone number" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Appication Id" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages of device" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, { - "type": "int32", - "id": 2, - "name": "appId" - }, { - "type": "string", - "id": 3, - "name": "apiKey" - }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SendCodeByPhoneCall", - "header": 197, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Dial phone and dictate auth code", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Transaction hash" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }] - } - }, { - "type": "rpc", - "content": { - "name": "StartEmailAuth", - "header": 185, - "response": { - "type": "anonymous", - "header": 186, - "doc": [ - "Email Activation response", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": " Hash of activation transaction" - }, { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " true if user is registered" - }, { - "type": "reference", - "argument": "activationType", - "category": "full", - "description": " Email Activation type" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "bool", - "id": 2, - "name": "isRegistered" - }, { - "type": { - "type": "enum", - "childType": "EmailActivationType" - }, - "id": 3, - "name": "activationType" - }] - }, - "doc": [ - "Start EMail Activation", { - "type": "reference", - "argument": "email", - "category": "full", - "description": "Email" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application Id" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "email" - }, { - "type": "int32", - "id": 2, - "name": "appId" - }, { - "type": "string", - "id": 3, - "name": "apiKey" - }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - }] - } - }, { - "type": "rpc", - "content": { - "name": "StartAnonymousAuth", - "header": 198, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Starting Anonymous login", { - "type": "reference", - "argument": "name", - "category": "full", - "description": "Name of new user" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application Id" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "name" - }, { - "type": "int32", - "id": 2, - "name": "appId" - }, { - "type": "string", - "id": 3, - "name": "apiKey" - }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - }] - } - }, { - "type": "rpc", - "content": { - "name": "StartTokenAuth", - "header": 203, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Starting token-based login", { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Token for authentication" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application Id" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }, { - "type": "int32", - "id": 2, - "name": "appId" - }, { - "type": "string", - "id": 3, - "name": "apiKey" - }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - }] - } - }, { - "type": "rpc", - "content": { - "name": "StartUsernameAuth", - "header": 2571, - "response": { - "type": "anonymous", - "header": 2572, - "doc": [ - "Result of login auth start. If is not registered move to signup.", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": " Authentication transaction hash" - }, { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " If user is registered with this username" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "bool", - "id": 2, - "name": "isRegistered" - }] - }, - "doc": [ - "Starting Login Authentication", { - "type": "reference", - "argument": "username", - "category": "full", - "description": "Username for signing in" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application id" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "Time Zone of device" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages of device" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "username" - }, { - "type": "int32", - "id": 2, - "name": "appId" - }, { - "type": "string", - "id": 3, - "name": "apiKey" - }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ValidateCode", - "header": 189, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Performing user sign in.", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, { - "type": "reference", - "argument": "code", - "category": "hidden", - "description": "Activation code" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "string", - "id": 2, - "name": "code" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ValidatePassword", - "header": 207, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Validation of account password", { - "type": "reference", - "argument": "transactionHash", - "category": "full", - "description": "Hash of transaction" - }, { - "type": "reference", - "argument": "password", - "category": "full", - "description": "Password for account" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "string", - "id": 2, - "name": "password" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetOAuth2Params", - "header": 194, - "response": { - "type": "anonymous", - "header": 195, - "doc": [{ - "type": "reference", - "argument": "authUrl", - "category": "hidden", - "description": " Authentication url" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "authUrl" - }] - }, - "doc": [ - "Loading OAuth2 Parameters", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, { - "type": "reference", - "argument": "redirectUrl", - "category": "full", - "description": "Redirect URL for Application" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "string", - "id": 2, - "name": "redirectUrl" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CompleteOAuth2", - "header": 196, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Complete OAuth2 Authentication", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, { - "type": "reference", - "argument": "code", - "category": "danger", - "description": "Authentication Code" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "string", - "id": 2, - "name": "code" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SignUp", - "header": 190, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Perform user SignUp", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": "User name" - }, { - "type": "reference", - "argument": "sex", - "category": "full", - "description": "Optional user sex" - }, { - "type": "reference", - "argument": "password", - "category": "full", - "description": "Password for password-based accounts" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "string", - "id": 2, - "name": "name" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "Sex" - } - }, - "id": 3, - "name": "sex" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "password" - }] - } - }, { - "type": "response", - "content": { - "name": "Auth", - "header": 5, - "doc": [ - "Authentication result", { - "type": "reference", - "argument": "user", - "category": "compact", - "description": " The authenticated User" - }, { - "type": "reference", - "argument": "config", - "category": "full", - "description": " Current config of server" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "User" - }, - "id": 2, - "name": "user" - }, { - "type": { - "type": "struct", - "childType": "Config" - }, - "id": 3, - "name": "config" - }] - } - }, { - "type": "struct", - "content": { - "name": "AuthSession", - "doc": [ - "Authentication session", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Unuque ID of session" - }, { - "type": "reference", - "argument": "authHolder", - "category": "full", - "description": " holder of session. 0 - this device, 1 - other." - }, { - "type": "reference", - "argument": "appId", - "category": "full", - "description": " Application Id (user in SignIn/SignUp)" - }, { - "type": "reference", - "argument": "appTitle", - "category": "full", - "description": " Title of application" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": " Title of device" - }, { - "type": "reference", - "argument": "authTime", - "category": "full", - "description": " Time of session creating" - }, { - "type": "reference", - "argument": "authLocation", - "category": "hidden", - "description": " two-letter country code of session create" - }, { - "type": "reference", - "argument": "latitude", - "category": "hidden", - "description": " optional latitude of auth if available" - }, { - "type": "reference", - "argument": "longitude", - "category": "hidden", - "description": " optional longitude of auth if available" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": { - "type": "enum", - "childType": "AuthHolder" - }, - "id": 2, - "name": "authHolder" - }, { - "type": "int32", - "id": 3, - "name": "appId" - }, { - "type": "string", - "id": 4, - "name": "appTitle" - }, { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, { - "type": "int32", - "id": 6, - "name": "authTime" - }, { - "type": "string", - "id": 7, - "name": "authLocation" - }, { - "type": { - "type": "opt", - "childType": "double" - }, - "id": 8, - "name": "latitude" - }, { - "type": { - "type": "opt", - "childType": "double" - }, - "id": 9, - "name": "longitude" - }] - } - }, { - "type": "enum", - "content": { - "name": "AuthHolder", - "values": [{ - "name": "ThisDevice", - "id": 1 - }, { - "name": "OtherDevice", - "id": 2 - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetAuthSessions", - "header": 80, - "response": { - "type": "anonymous", - "header": 81, - "doc": [ - "Current Auth sessions", { - "type": "reference", - "argument": "userAuths", - "category": "compact", - "description": " User authentications" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "AuthSession" + ] + } + }, { + "type": "enum", + "content": { + "name": "EmailActivationType", + "values": [ + { + "name": "CODE", + "id": 1 + }, + { + "name": "OAUTH2", + "id": 2 + }, + { + "name": "PASSWORD", + "id": 3 } - }, - "id": 1, - "name": "userAuths" - }] - }, - "doc": [ - "Getting of all active user's authentication sessions" - ], - "attributes": [] - } - }, { - "type": "rpc", - "content": { - "name": "TerminateSession", - "header": 82, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "SignOut on specified user's session", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "id from AuthItem" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }] - } - }, { - "type": "rpc", - "content": { - "name": "TerminateAllSessions", - "header": 83, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "SignOut on all exept current sessions" - ], - "attributes": [] - } - }, { - "type": "rpc", - "content": { - "name": "SignOut", - "header": 84, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "SignOut current session" - ], - "attributes": [] - } - }, { - "type": "comment", - "content": "OBSOLETE METHODS" - }, { - "type": "rpc", - "content": { - "name": "SignInObsolete", - "header": 3, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Performing user signin", { - "type": "reference", - "argument": "phoneNumber", - "category": "danger", - "description": "Phone number in international format" - }, { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": "Code request hash from RequestAuthCode" - }, { - "type": "reference", - "argument": "smsCode", - "category": "danger", - "description": "Confirmation code from SMS" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device title like 'Steven's iPhone'" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, { - "type": "reference", - "argument": "appKey", - "category": "hidden", - "description": "Application API key" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, { - "type": "string", - "id": 2, - "name": "smsHash" - }, { - "type": "string", - "id": 3, - "name": "smsCode" - }, { - "type": "bytes", - "id": 5, - "name": "deviceHash" - }, { - "type": "string", - "id": 6, - "name": "deviceTitle" - }, { - "type": "int32", - "id": 7, - "name": "appId" - }, { - "type": "string", - "id": 8, - "name": "appKey" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SignUpObsolete", - "header": 4, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Performing user signup. If user perform signup on already registered user it just override previous", "profile information", { - "type": "reference", - "argument": "phoneNumber", - "category": "danger", - "description": "Phone number in international format" - }, { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": "Code request hash from RequestAuthCode" - }, { - "type": "reference", - "argument": "smsCode", - "category": "danger", - "description": "Confirmation code from SMS" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": "User name" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device title like 'Steven's iPhone'" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, { - "type": "reference", - "argument": "appKey", - "category": "hidden", - "description": "pplication API key" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, { - "type": "string", - "id": 2, - "name": "smsHash" - }, { - "type": "string", - "id": 3, - "name": "smsCode" - }, { - "type": "string", - "id": 4, - "name": "name" - }, { - "type": "bytes", - "id": 7, - "name": "deviceHash" - }, { - "type": "string", - "id": 8, - "name": "deviceTitle" - }, { - "type": "int32", - "id": 9, - "name": "appId" - }, { - "type": "string", - "id": 10, - "name": "appKey" - }, { - "type": "bool", - "id": 11, - "name": "isSilent" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SendAuthCodeObsolete", - "header": 1, - "response": { - "type": "anonymous", - "header": 2, - "doc": [ - "Sms Request response", { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": " Hash of SMS request" - }, { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " true if user is registered" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "smsHash" - }, { - "type": "bool", - "id": 2, - "name": "isRegistered" - }] - }, - "doc": [ - "Sending SMS with activation code", { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": "Phone number in international format" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, { - "type": "int32", - "id": 2, - "name": "appId" - }, { - "type": "string", - "id": 3, - "name": "apiKey" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SendAuthCallObsolete", - "header": 90, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Requesting Phone activation", { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": "Phone number in international format" - }, { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": "Code request hash from RequestAuthCode" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, { - "type": "string", - "id": 2, - "name": "smsHash" - }, { - "type": "int32", - "id": 3, - "name": "appId" - }, { - "type": "string", - "id": 4, - "name": "apiKey" - }] - } - }] - }, { - "title": "Users", - "package": "users", - "doc": [ - "Users are objects that secured by accessHash. You can't load user profile by it's id.", - "You can't send message to user without finding it's object in Updates or by calling", - "method for user search, contacts import or some other methods.", - "", - "Applications need to keep all Users information forever.", - "", - "Each User have optional localName - name of user that was set by current user and can be changed", - "any time by calling EditUserLocalName method." - ], - "items": [{ - "type": "enum", - "content": { - "name": "Sex", - "values": [{ - "name": "Unknown", - "id": 1 - }, { - "name": "Male", - "id": 2 - }, { - "name": "Female", - "id": 3 - }] - } - }, { - "type": "enum", - "content": { - "name": "ContactType", - "values": [{ - "name": "Phone", - "id": 1 - }, { - "name": "Email", - "id": 2 - }, { - "name": "Web", - "id": 3 - }, { - "name": "Social", - "id": 4 - }] - } - }, { - "type": "struct", - "content": { - "name": "ContactRecord", - "doc": [ - "Contact information record", { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Record type" - }, { - "type": "reference", - "argument": "typeSpec", - "category": "hidden", - "description": " Value for specification type of contact, for example 'mobile/standalone/office' for phones or 'vk/fb/telegram' for extenrnal networks." - }, { - "type": "reference", - "argument": "stringValue", - "category": "full", - "description": " String value of record" - }, { - "type": "reference", - "argument": "longValue", - "category": "full", - "description": " Long value of record" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Title of record" - }, { - "type": "reference", - "argument": "subtitle", - "category": "hidden", - "description": " Subtitle of record" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "enum", - "childType": "ContactType" - }, - "id": 1, - "name": "type" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "typeSpec" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "stringValue" - }, { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 3, - "name": "longValue" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "title" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 5, - "name": "subtitle" - }] - } - }, { - "type": "struct", - "content": { - "name": "User", - "doc": [ - "Main user object", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " uid" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " user's access hash" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " user's name" - }, { - "type": "reference", - "argument": "localName", - "category": "full", - "description": " user's local name" - }, { - "type": "reference", - "argument": "nick", - "category": "full", - "description": " User's nickname" - }, { - "type": "reference", - "argument": "sex", - "category": "full", - "description": " optional sex of user" - }, { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " avatar of user" - }, { - "type": "reference", - "argument": "isBot", - "category": "full", - "description": " Is user actually bot. By default is false." - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Extension values" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": " [DEPRECATED] User's about information" - }, { - "type": "reference", - "argument": "contactInfo", - "category": "compact", - "description": " [DEPRECATED] Contact information of user" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": " [DEPRECATED] Preferred user languages" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": " [DEPRECATED] Time Zone of user in TZ format" - }, { - "type": "reference", - "argument": "botCommands", - "category": "full", - "description": " [DEPRECATED] Available Bot Commands" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": "string", - "id": 3, - "name": "name" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "localName" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 13, - "name": "nick" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "Sex" - } - }, - "id": 5, - "name": "sex" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 8, - "name": "avatar" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 11, - "name": "isBot" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 20, - "name": "ext" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ContactRecord" - } - }, - "id": 12, - "name": "contactInfo", - "deprecated": "true" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 14, - "name": "about", - "deprecated": "true" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 16, - "name": "preferredLanguages", - "deprecated": "true" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 17, - "name": "timeZone", - "deprecated": "true" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "BotCommand" - } - }, - "id": 19, - "name": "botCommands", - "deprecated": "true" - }] - } - }, { - "type": "struct", - "content": { - "name": "FullUser", - "doc": [ - "Full User representation", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " User's Id" - }, { - "type": "reference", - "argument": "contactInfo", - "category": "compact", - "description": " User's contact information" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": " User's about information" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": " Preferred user languages" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": " Time Zone of user in TZ format" - }, { - "type": "reference", - "argument": "botCommands", - "category": "full", - "description": " Available Commands for Bot" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Extension values. NOTE: This values are not related to ext field in User object." - }, { - "type": "reference", - "argument": "isBlocked", - "category": "full", - "description": " Is user blocked. Default is false." - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ContactRecord" - } - }, - "id": 2, - "name": "contactInfo" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "about" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 4, - "name": "preferredLanguages" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 5, - "name": "timeZone" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "BotCommand" - } - }, - "id": 6, - "name": "botCommands" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 7, - "name": "ext" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 8, - "name": "isBlocked" - }] - } - }, { - "type": "struct", - "content": { - "name": "BotCommand", - "doc": [ - "Available bot commands", { - "type": "reference", - "argument": "slashCommand", - "category": "full", - "description": " Slash command name (wihtout slash)" - }, { - "type": "reference", - "argument": "description", - "category": "full", - "description": " Slash command description" - }, { - "type": "reference", - "argument": "locKey", - "category": "full", - "description": " Optional Localization Key for i18n" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "slashCommand" - }, { - "type": "string", - "id": 2, - "name": "description" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "locKey" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditUserLocalName", - "header": 96, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Renaming of user's visible name", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": "target User's uid" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": "User's accessHash" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": "New user name" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": "string", - "id": 3, - "name": "name" - }] - } - }, { - "type": "update", - "content": { - "name": "UserAvatarChanged", - "header": 16, - "doc": [ - "Update about avatar changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " user's new avatar" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 2, - "name": "avatar" - }] - } - }, { - "type": "update", - "content": { - "name": "UserNameChanged", - "header": 32, - "doc": [ - "Update about name changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " user's name" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": "string", - "id": 2, - "name": "name" - }] - } - }, { - "type": "update", - "content": { - "name": "UserLocalNameChanged", - "header": 51, - "doc": [ - "Update about local name changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, { - "type": "reference", - "argument": "localName", - "category": "full", - "description": " new user's local name" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "localName" - }] - } - }, { - "type": "update", - "content": { - "name": "UserContactsChanged", - "header": 134, - "doc": [ - "Update about contact information change", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, { - "type": "reference", - "argument": "contactRecords", - "category": "compact", - "description": " new phones list" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ContactRecord" - } - }, - "id": 4, - "name": "contactRecords" - }] - } - }, { - "type": "update", - "content": { - "name": "UserNickChanged", - "header": 209, - "doc": [ - "Update about nick changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, { - "type": "reference", - "argument": "nickname", - "category": "full", - "description": " user's new nickname" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "nickname" - }] - } - }, { - "type": "update", - "content": { - "name": "UserAboutChanged", - "header": 210, - "doc": [ - "Update about user's about changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's uid" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": " User's about" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "about" - }] - } - }, { - "type": "update", - "content": { - "name": "UserPreferredLanguagesChanged", - "header": 212, - "doc": [ - "Update about user's preferred languages", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's uid" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": " User's preferred languages. Can be empty." - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 2, - "name": "preferredLanguages" - }] - } - }, { - "type": "update", - "content": { - "name": "UserTimeZoneChanged", - "header": 216, - "doc": [ - "User TimeZone changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's uid" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": " User's new time zone in TZ format" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "timeZone" - }] - } - }, { - "type": "update", - "content": { - "name": "UserBotCommandsChanged", - "header": 217, - "doc": [ - "Update about bot commands changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's Id" - }, { - "type": "reference", - "argument": "commands", - "category": "full", - "description": " New List of commands" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "BotCommand" - } - }, - "id": 2, - "name": "commands" - }] - } - }, { - "type": "update", - "content": { - "name": "UserExtChanged", - "header": 218, - "doc": [ - "Update about user ext changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " New Ext Value in User (NOT FullUser) object." - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 2, - "name": "ext" - }] - } - }, { - "type": "update", - "content": { - "name": "UserFullExtChanged", - "header": 219, - "doc": [ - "Update about user ext changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's Id" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " New Ext Value in FullUser (NOT User) object." - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 3, - "name": "ext" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadFullUsers", - "header": 2649, - "response": { - "type": "anonymous", - "header": 2650, - "doc": [{ - "type": "reference", - "argument": "fullUsers", - "category": "compact", - "description": " Loaded users" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "FullUser" + ] + } + },{"type":"rpc","content":{ +"name":"StartPhoneAuth", +"header":191, +"response":{"type":"anonymous","header":193, "doc":[ +"Phone Activation response",{"type":"reference","argument":"transactionHash","category":"danger","description":" Hash of transaction"},{"type":"reference","argument":"isRegistered","category":"full","description":" Is User registered"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"PhoneActivationType"}},"id":3,"name":"activationType"} +]}, +"doc":[ +"Start Phone Activation",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number"},{"type":"reference","argument":"appId","category":"hidden","description":"Appication Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages of device"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"SendCodeByPhoneCall", +"header":197, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Dial phone and dictate auth code",{"type":"reference","argument":"transactionHash","category":"danger","description":"Transaction hash"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +]}},{"type":"rpc","content":{ +"name":"StartEmailAuth", +"header":185, +"response":{"type":"anonymous","header":186, "doc":[ +"Email Activation response",{"type":"reference","argument":"transactionHash","category":"danger","description":" Hash of activation transaction"},{"type":"reference","argument":"isRegistered","category":"full","description":" true if user is registered"},{"type":"reference","argument":"activationType","category":"full","description":" Email Activation type"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +,{"type":{"type":"enum","childType":"EmailActivationType"},"id":3,"name":"activationType"} +]}, +"doc":[ +"Start EMail Activation",{"type":"reference","argument":"email","category":"full","description":"Email"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"StartAnonymousAuth", +"header":198, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Starting Anonymous login",{"type":"reference","argument":"name","category":"full","description":"Name of new user"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ +{"type":"string","id":1,"name":"name"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"StartTokenAuth", +"header":203, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Starting token-based login",{"type":"reference","argument":"token","category":"full","description":"Token for authentication"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"StartUsernameAuth", +"header":2571, +"response":{"type":"anonymous","header":2572, "doc":[ +"Result of login auth start. If is not registered move to signup.",{"type":"reference","argument":"transactionHash","category":"danger","description":" Authentication transaction hash"},{"type":"reference","argument":"isRegistered","category":"full","description":" If user is registered with this username"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +]}, +"doc":[ +"Starting Login Authentication",{"type":"reference","argument":"username","category":"full","description":"Username for signing in"},{"type":"reference","argument":"appId","category":"hidden","description":"Application id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"Time Zone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages of device"}],"attributes":[ +{"type":"string","id":1,"name":"username"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"ValidateCode", +"header":189, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Performing user sign in.",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"code","category":"hidden","description":"Activation code"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"code"} +]}},{"type":"rpc","content":{ +"name":"ValidatePassword", +"header":207, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Validation of account password",{"type":"reference","argument":"transactionHash","category":"full","description":"Hash of transaction"},{"type":"reference","argument":"password","category":"full","description":"Password for account"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"password"} +]}},{"type":"rpc","content":{ +"name":"GetOAuth2Params", +"header":194, +"response":{"type":"anonymous","header":195, "doc":[ +{"type":"reference","argument":"authUrl","category":"hidden","description":" Authentication url"}] ,"attributes":[{"type":"string","id":1,"name":"authUrl"} +]}, +"doc":[ +"Loading OAuth2 Parameters",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"redirectUrl","category":"full","description":"Redirect URL for Application"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"redirectUrl"} +]}},{"type":"rpc","content":{ +"name":"CompleteOAuth2", +"header":196, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Complete OAuth2 Authentication",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"code","category":"danger","description":"Authentication Code"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"code"} +]}},{"type":"rpc","content":{ +"name":"SignUp", +"header":190, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Perform user SignUp",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"name","category":"full","description":"User name"},{"type":"reference","argument":"sex","category":"full","description":"Optional user sex"},{"type":"reference","argument":"password","category":"full","description":"Password for password-based accounts"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"name"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"Sex"}},"id":3,"name":"sex"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"password"} +]}},{"type":"response","content":{ +"name":"Auth", +"header":5, +"doc":[ +"Authentication result",{"type":"reference","argument":"user","category":"compact","description":" The authenticated User"},{"type":"reference","argument":"config","category":"full","description":" Current config of server"}],"attributes":[ +{"type":{"type":"struct","childType":"User"},"id":2,"name":"user"} +,{"type":{"type":"struct","childType":"Config"},"id":3,"name":"config"} +]}}, { + "type":"struct", + "content": { + "name":"AuthSession", +"doc":[ +"Authentication session",{"type":"reference","argument":"id","category":"full","description":" Unuque ID of session"},{"type":"reference","argument":"authHolder","category":"full","description":" holder of session. 0 - this device, 1 - other."},{"type":"reference","argument":"appId","category":"full","description":" Application Id (user in SignIn/SignUp)"},{"type":"reference","argument":"appTitle","category":"full","description":" Title of application"},{"type":"reference","argument":"deviceTitle","category":"full","description":" Title of device"},{"type":"reference","argument":"authTime","category":"full","description":" Time of session creating"},{"type":"reference","argument":"authLocation","category":"hidden","description":" two-letter country code of session create"},{"type":"reference","argument":"latitude","category":"hidden","description":" optional latitude of auth if available"},{"type":"reference","argument":"longitude","category":"hidden","description":" optional longitude of auth if available"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":{"type":"enum","childType":"AuthHolder"},"id":2,"name":"authHolder"} +,{"type":"int32","id":3,"name":"appId"} +,{"type":"string","id":4,"name":"appTitle"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":"int32","id":6,"name":"authTime"} +,{"type":"string","id":7,"name":"authLocation"} +,{"type":{"type":"opt","childType":"double"},"id":8,"name":"latitude"} +,{"type":{"type":"opt","childType":"double"},"id":9,"name":"longitude"} +]}}, { + "type": "enum", + "content": { + "name": "AuthHolder", + "values": [ + { + "name": "ThisDevice", + "id": 1 + }, + { + "name": "OtherDevice", + "id": 2 } - }, - "id": 1, - "name": "fullUsers" - }] - }, - "doc": [ - "Loading Full User information", { - "type": "reference", - "argument": "userPeers", - "category": "compact", - "description": "User's peers to load. Should be non-empy" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "userPeers" - }] - } - }] - }, { - "title": "Profile", - "package": "profile", - "items": [{ - "type": "rpc", - "content": { - "name": "EditName", - "header": 53, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing account's name", { - "type": "reference", - "argument": "name", - "category": "full", - "description": "New name" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "name" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditNickName", - "header": 205, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing account's nickname", { - "type": "reference", - "argument": "nickname", - "category": "full", - "description": "New Nickname" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "nickname" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CheckNickName", - "header": 206, - "response": { - "type": "reference", - "name": "Bool" - }, - "doc": [ - "Checking availability of nickname", { - "type": "reference", - "argument": "nickname", - "category": "full", - "description": "Nickname for checking" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "nickname" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditAbout", - "header": 212, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing about information", { - "type": "reference", - "argument": "about", - "category": "full", - "description": "new about information" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "about" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditAvatar", - "header": 31, - "response": { - "type": "anonymous", - "header": 103, - "doc": [ - "Response for change account avatar", { - "type": "reference", - "argument": "avatar", - "category": "full", - "description": " New avatar" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Avatar" - }, - "id": 1, - "name": "avatar" - }, { - "type": "int32", - "id": 2, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }] - }, - "doc": [ - "Changing account's avatar", { - "type": "reference", - "argument": "fileLocation", - "category": "compact", - "description": "File Location of uploaded unencrypted avatar" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "fileLocation" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RemoveAvatar", - "header": 91, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Removing account's avatar" - ], - "attributes": [] - } - }, { - "type": "rpc", - "content": { - "name": "EditMyTimeZone", - "header": 144, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Updating user's time zone", { - "type": "reference", - "argument": "tz", - "category": "full", - "description": "New Time Zone" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "tz" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditMyPreferredLanguages", - "header": 145, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing preffered languages", { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preffered Languages" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": "string" - }, - "id": 1, - "name": "preferredLanguages" - }] - } - }] - }, { - "title": "Contacts", - "package": "contacts", - "doc": [ - "Before working with contact list is is useful to import contacts from phone first by calling", - "method ImportContacts#0x07.", - "", - "All phone numbers MUST be preprocessed before import by some library (like libphonenumber)", - "and build international phone number depending on current users phone and/or locale.", - "", - "For loading contact list from server use GetContacts#0x57.", - "If during this call there are some updates about contact list change", - "it is recommended to call it again. Also applications need to sync contacts on application start.", - "", - "For searching for users without adding to contacts list use method FindContacts#0x70.", - "", - "For adding/deleting contacts AddContact#0x72 and DeleteContact#0x59." - ], - "items": [{ - "type": "struct", - "content": { - "name": "PhoneToImport", - "doc": [ - "Phone for import", { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": " phone number for import in international format" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " optional name for contact" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - }] - } - }, { - "type": "struct", - "content": { - "name": "EmailToImport", - "doc": [ - "Email for import", { - "type": "reference", - "argument": "email", - "category": "full", - "description": " email for importing" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " optional name for contact" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "email" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ImportContacts", - "header": 7, - "response": { - "type": "anonymous", - "header": 8, - "doc": [ - "Imported contacts", { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Imported users" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number if users are imported" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state if users are imported" - }, { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Imported user peers" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" + ] + } + },{"type":"rpc","content":{ +"name":"GetAuthSessions", +"header":80, +"response":{"type":"anonymous","header":81, "doc":[ +"Current Auth sessions",{"type":"reference","argument":"userAuths","category":"compact","description":" User authentications"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"AuthSession"}},"id":1,"name":"userAuths"} +]}, +"doc":[ +"Getting of all active user's authentication sessions"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"TerminateSession", +"header":82, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"SignOut on specified user's session",{"type":"reference","argument":"id","category":"full","description":"id from AuthItem"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +]}},{"type":"rpc","content":{ +"name":"TerminateAllSessions", +"header":83, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"SignOut on all exept current sessions"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"SignOut", +"header":84, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"SignOut current session"],"attributes":[ +]}},{"type":"comment","content":"OBSOLETE METHODS"},{"type":"rpc","content":{ +"name":"SignInObsolete", +"header":3, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Performing user signin",{"type":"reference","argument":"phoneNumber","category":"danger","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"smsCode","category":"danger","description":"Confirmation code from SMS"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device title like 'Steven's iPhone'"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"appKey","category":"hidden","description":"Application API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"string","id":2,"name":"smsHash"} +,{"type":"string","id":3,"name":"smsCode"} +,{"type":"bytes","id":5,"name":"deviceHash"} +,{"type":"string","id":6,"name":"deviceTitle"} +,{"type":"int32","id":7,"name":"appId"} +,{"type":"string","id":8,"name":"appKey"} +]}},{"type":"rpc","content":{ +"name":"SignUpObsolete", +"header":4, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Performing user signup. If user perform signup on already registered user it just override previous","profile information",{"type":"reference","argument":"phoneNumber","category":"danger","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"smsCode","category":"danger","description":"Confirmation code from SMS"},{"type":"reference","argument":"name","category":"full","description":"User name"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device title like 'Steven's iPhone'"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"appKey","category":"hidden","description":"pplication API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"string","id":2,"name":"smsHash"} +,{"type":"string","id":3,"name":"smsCode"} +,{"type":"string","id":4,"name":"name"} +,{"type":"bytes","id":7,"name":"deviceHash"} +,{"type":"string","id":8,"name":"deviceTitle"} +,{"type":"int32","id":9,"name":"appId"} +,{"type":"string","id":10,"name":"appKey"} +,{"type":"bool","id":11,"name":"isSilent"} +]}},{"type":"rpc","content":{ +"name":"SendAuthCodeObsolete", +"header":1, +"response":{"type":"anonymous","header":2, "doc":[ +"Sms Request response",{"type":"reference","argument":"smsHash","category":"danger","description":" Hash of SMS request"},{"type":"reference","argument":"isRegistered","category":"full","description":" true if user is registered"}] ,"attributes":[{"type":"string","id":1,"name":"smsHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +]}, +"doc":[ +"Sending SMS with activation code",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number in international format"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +]}},{"type":"rpc","content":{ +"name":"SendAuthCallObsolete", +"header":90, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Requesting Phone activation",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"string","id":2,"name":"smsHash"} +,{"type":"int32","id":3,"name":"appId"} +,{"type":"string","id":4,"name":"apiKey"} +]}}]}, { + "title": "Users", + "package": "users", + "doc": [ + "Users are objects that secured by accessHash. You can't load user profile by it's id.", + "You can't send message to user without finding it's object in Updates or by calling", + "method for user search, contacts import or some other methods.", + "", + "Applications need to keep all Users information forever.", + "", + "Each User have optional localName - name of user that was set by current user and can be changed", + "any time by calling EditUserLocalName method." + ], + "items": [ + { + "type": "enum", + "content": { + "name": "Sex", + "values": [ + { + "name": "Unknown", + "id": 1 + }, + { + "name": "Male", + "id": 2 + }, + { + "name": "Female", + "id": 3 } - }, - "id": 1, - "name": "users" - }, { - "type": "int32", - "id": 2, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" + ] + } + }, { + "type": "enum", + "content": { + "name": "ContactType", + "values": [ + { + "name": "Phone", + "id": 1 + }, + { + "name": "Email", + "id": 2 + }, + { + "name": "Web", + "id": 3 + }, + { + "name": "Social", + "id": 4 } - }, - "id": 4, - "name": "userPeers" - }] - }, - "doc": [ - "Importing phones and emails for building contact list", "Maximum amount of items for import per method call equals to 100.", { - "type": "reference", - "argument": "phones", - "category": "compact", - "description": "Phones for import" - }, { - "type": "reference", - "argument": "emails", - "category": "compact", - "description": "Emails for import" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "PhoneToImport" - } - }, - "id": 1, - "name": "phones" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EmailToImport" - } - }, - "id": 2, - "name": "emails" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - }] - } - }, { - "type": "empty" - }, { - "type": "rpc", - "content": { - "name": "GetContacts", - "header": 87, - "response": { - "type": "anonymous", - "header": 88, - "doc": [ - "Current contact list", { - "type": "reference", - "argument": "users", - "category": "hidden", - "description": " User list if list is changed" - }, { - "type": "reference", - "argument": "isNotChanged", - "category": "full", - "description": " is list changed" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" + ] + } + }, { + "type":"struct", + "content": { + "name":"ContactRecord", +"doc":[ +"Contact information record",{"type":"reference","argument":"type","category":"full","description":" Record type"},{"type":"reference","argument":"typeSpec","category":"hidden","description":" Value for specification type of contact, for example 'mobile/standalone/office' for phones or 'vk/fb/telegram' for extenrnal networks."},{"type":"reference","argument":"stringValue","category":"full","description":" String value of record"},{"type":"reference","argument":"longValue","category":"full","description":" Long value of record"},{"type":"reference","argument":"title","category":"full","description":" Title of record"},{"type":"reference","argument":"subtitle","category":"hidden","description":" Subtitle of record"}],"expandable":"true","attributes":[ +{"type":{"type":"enum","childType":"ContactType"},"id":1,"name":"type"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"typeSpec"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"stringValue"} +,{"type":{"type":"opt","childType":"int64"},"id":3,"name":"longValue"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"title"} +,{"type":{"type":"opt","childType":"string"},"id":5,"name":"subtitle"} +]}}, { + "type":"struct", + "content": { + "name":"User", +"doc":[ +"Main user object",{"type":"reference","argument":"id","category":"full","description":" uid"},{"type":"reference","argument":"accessHash","category":"danger","description":" user's access hash"},{"type":"reference","argument":"name","category":"full","description":" user's name"},{"type":"reference","argument":"localName","category":"full","description":" user's local name"},{"type":"reference","argument":"nick","category":"full","description":" User's nickname"},{"type":"reference","argument":"sex","category":"full","description":" optional sex of user"},{"type":"reference","argument":"avatar","category":"compact","description":" avatar of user"},{"type":"reference","argument":"isBot","category":"full","description":" Is user actually bot. By default is false."},{"type":"reference","argument":"ext","category":"full","description":" Extension values"},{"type":"reference","argument":"about","category":"full","description":" [DEPRECATED] User's about information"},{"type":"reference","argument":"contactInfo","category":"compact","description":" [DEPRECATED] Contact information of user"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" [DEPRECATED] Preferred user languages"},{"type":"reference","argument":"timeZone","category":"full","description":" [DEPRECATED] Time Zone of user in TZ format"},{"type":"reference","argument":"botCommands","category":"full","description":" [DEPRECATED] Available Bot Commands"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"name"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"localName"} +,{"type":{"type":"opt","childType":"string"},"id":13,"name":"nick"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"Sex"}},"id":5,"name":"sex"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":8,"name":"avatar"} +,{"type":{"type":"opt","childType":"bool"},"id":11,"name":"isBot"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":20,"name":"ext"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":12,"name":"contactInfo", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":14,"name":"about", "deprecated":"true"} +,{"type":{"type":"list","childType":"string"},"id":16,"name":"preferredLanguages", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":17,"name":"timeZone", "deprecated":"true"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":19,"name":"botCommands", "deprecated":"true"} +]}}, { + "type":"struct", + "content": { + "name":"FullUser", +"doc":[ +"Full User representation",{"type":"reference","argument":"id","category":"full","description":" User's Id"},{"type":"reference","argument":"contactInfo","category":"compact","description":" User's contact information"},{"type":"reference","argument":"about","category":"full","description":" User's about information"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" Preferred user languages"},{"type":"reference","argument":"timeZone","category":"full","description":" Time Zone of user in TZ format"},{"type":"reference","argument":"botCommands","category":"full","description":" Available Commands for Bot"},{"type":"reference","argument":"ext","category":"full","description":" Extension values. NOTE: This values are not related to ext field in User object."},{"type":"reference","argument":"isBlocked","category":"full","description":" Is user blocked. Default is false."}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"id"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":2,"name":"contactInfo"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} +,{"type":{"type":"list","childType":"string"},"id":4,"name":"preferredLanguages"} +,{"type":{"type":"opt","childType":"string"},"id":5,"name":"timeZone"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":6,"name":"botCommands"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":7,"name":"ext"} +,{"type":{"type":"opt","childType":"bool"},"id":8,"name":"isBlocked"} +]}}, { + "type":"struct", + "content": { + "name":"BotCommand", +"doc":[ +"Available bot commands",{"type":"reference","argument":"slashCommand","category":"full","description":" Slash command name (wihtout slash)"},{"type":"reference","argument":"description","category":"full","description":" Slash command description"},{"type":"reference","argument":"locKey","category":"full","description":" Optional Localization Key for i18n"}],"attributes":[ +{"type":"string","id":1,"name":"slashCommand"} +,{"type":"string","id":2,"name":"description"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"locKey"} +]}},{"type":"rpc","content":{ +"name":"EditUserLocalName", +"header":96, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Renaming of user's visible name",{"type":"reference","argument":"uid","category":"full","description":"target User's uid"},{"type":"reference","argument":"accessHash","category":"danger","description":"User's accessHash"},{"type":"reference","argument":"name","category":"full","description":"New user name"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"name"} +]}},{"type":"update","content":{ +"name":"UserAvatarChanged", +"header":16, +"doc":[ +"Update about avatar changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"avatar","category":"compact","description":" user's new avatar"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":2,"name":"avatar"} +]}},{"type":"update","content":{ +"name":"UserNameChanged", +"header":32, +"doc":[ +"Update about name changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"name","category":"full","description":" user's name"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"string","id":2,"name":"name"} +]}},{"type":"update","content":{ +"name":"UserLocalNameChanged", +"header":51, +"doc":[ +"Update about local name changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"localName","category":"full","description":" new user's local name"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"localName"} +]}},{"type":"update","content":{ +"name":"UserContactsChanged", +"header":134, +"doc":[ +"Update about contact information change",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"contactRecords","category":"compact","description":" new phones list"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":4,"name":"contactRecords"} +]}},{"type":"update","content":{ +"name":"UserNickChanged", +"header":209, +"doc":[ +"Update about nick changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"nickname","category":"full","description":" user's new nickname"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"nickname"} +]}},{"type":"update","content":{ +"name":"UserAboutChanged", +"header":210, +"doc":[ +"Update about user's about changed",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"about","category":"full","description":" User's about"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} +]}},{"type":"update","content":{ +"name":"UserPreferredLanguagesChanged", +"header":212, +"doc":[ +"Update about user's preferred languages",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" User's preferred languages. Can be empty."}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"list","childType":"string"},"id":2,"name":"preferredLanguages"} +]}},{"type":"update","content":{ +"name":"UserTimeZoneChanged", +"header":216, +"doc":[ +"User TimeZone changed",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"timeZone","category":"full","description":" User's new time zone in TZ format"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"timeZone"} +]}},{"type":"update","content":{ +"name":"UserBotCommandsChanged", +"header":217, +"doc":[ +"Update about bot commands changed",{"type":"reference","argument":"uid","category":"full","description":" User's Id"},{"type":"reference","argument":"commands","category":"full","description":" New List of commands"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":2,"name":"commands"} +]}},{"type":"update","content":{ +"name":"UserExtChanged", +"header":218, +"doc":[ +"Update about user ext changed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"ext","category":"full","description":" New Ext Value in User (NOT FullUser) object."}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} +]}},{"type":"update","content":{ +"name":"UserFullExtChanged", +"header":219, +"doc":[ +"Update about user ext changed",{"type":"reference","argument":"uid","category":"full","description":" User's Id"},{"type":"reference","argument":"ext","category":"full","description":" New Ext Value in FullUser (NOT User) object."}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":3,"name":"ext"} +]}},{"type":"rpc","content":{ +"name":"LoadFullUsers", +"header":2649, +"response":{"type":"anonymous","header":2650, "doc":[ +{"type":"reference","argument":"fullUsers","category":"compact","description":" Loaded users"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"FullUser"}},"id":1,"name":"fullUsers"} +]}, +"doc":[ +"Loading Full User information",{"type":"reference","argument":"userPeers","category":"compact","description":"User's peers to load. Should be non-empy"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"userPeers"} +]}}]}, { + "title": "Profile", + "package": "profile", + "items": [ +{"type":"rpc","content":{ +"name":"EditName", +"header":53, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing account's name",{"type":"reference","argument":"name","category":"full","description":"New name"}],"attributes":[ +{"type":"string","id":1,"name":"name"} +]}},{"type":"rpc","content":{ +"name":"EditNickName", +"header":205, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing account's nickname",{"type":"reference","argument":"nickname","category":"full","description":"New Nickname"}],"attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"nickname"} +]}},{"type":"rpc","content":{ +"name":"CheckNickName", +"header":206, +"response":{"type":"reference","name":"Bool"}, +"doc":[ +"Checking availability of nickname",{"type":"reference","argument":"nickname","category":"full","description":"Nickname for checking"}],"attributes":[ +{"type":"string","id":1,"name":"nickname"} +]}},{"type":"rpc","content":{ +"name":"EditAbout", +"header":212, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing about information",{"type":"reference","argument":"about","category":"full","description":"new about information"}],"attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"about"} +]}},{"type":"rpc","content":{ +"name":"EditAvatar", +"header":31, +"response":{"type":"anonymous","header":103, "doc":[ +"Response for change account avatar",{"type":"reference","argument":"avatar","category":"full","description":" New avatar"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"}] ,"attributes":[{"type":{"type":"struct","childType":"Avatar"},"id":1,"name":"avatar"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +]}, +"doc":[ +"Changing account's avatar",{"type":"reference","argument":"fileLocation","category":"compact","description":"File Location of uploaded unencrypted avatar"}],"attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} +]}},{"type":"rpc","content":{ +"name":"RemoveAvatar", +"header":91, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Removing account's avatar"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"EditMyTimeZone", +"header":144, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Updating user's time zone",{"type":"reference","argument":"tz","category":"full","description":"New Time Zone"}],"attributes":[ +{"type":"string","id":1,"name":"tz"} +]}},{"type":"rpc","content":{ +"name":"EditMyPreferredLanguages", +"header":145, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing preffered languages",{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preffered Languages"}],"attributes":[ +{"type":{"type":"list","childType":"string"},"id":1,"name":"preferredLanguages"} +]}}]}, { + "title": "Contacts", + "package": "contacts", + "doc": [ + "Before working with contact list is is useful to import contacts from phone first by calling", + "method ImportContacts#0x07.", + "", + "All phone numbers MUST be preprocessed before import by some library (like libphonenumber)", + "and build international phone number depending on current users phone and/or locale.", + "", + "For loading contact list from server use GetContacts#0x57.", + "If during this call there are some updates about contact list change", + "it is recommended to call it again. Also applications need to sync contacts on application start.", + "", + "For searching for users without adding to contacts list use method FindContacts#0x70.", + "", + "For adding/deleting contacts AddContact#0x72 and DeleteContact#0x59." + ], + "items": [ + { + "type":"struct", + "content": { + "name":"PhoneToImport", +"doc":[ +"Phone for import",{"type":"reference","argument":"phoneNumber","category":"full","description":" phone number for import in international format"},{"type":"reference","argument":"name","category":"full","description":" optional name for contact"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +]}}, { + "type":"struct", + "content": { + "name":"EmailToImport", +"doc":[ +"Email for import",{"type":"reference","argument":"email","category":"full","description":" email for importing"},{"type":"reference","argument":"name","category":"full","description":" optional name for contact"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +]}},{"type":"rpc","content":{ +"name":"ImportContacts", +"header":7, +"response":{"type":"anonymous","header":8, "doc":[ +"Imported contacts",{"type":"reference","argument":"users","category":"compact","description":" Imported users"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number if users are imported"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state if users are imported"},{"type":"reference","argument":"userPeers","category":"full","description":" Imported user peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +]}, +"doc":[ +"Importing phones and emails for building contact list","Maximum amount of items for import per method call equals to 100.",{"type":"reference","argument":"phones","category":"compact","description":"Phones for import"},{"type":"reference","argument":"emails","category":"compact","description":"Emails for import"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"PhoneToImport"}},"id":1,"name":"phones"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EmailToImport"}},"id":2,"name":"emails"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"empty"},{"type":"rpc","content":{ +"name":"GetContacts", +"header":87, +"response":{"type":"anonymous","header":88, "doc":[ +"Current contact list",{"type":"reference","argument":"users","category":"hidden","description":" User list if list is changed"},{"type":"reference","argument":"isNotChanged","category":"full","description":" is list changed"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":"bool","id":2,"name":"isNotChanged"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"userPeers"} +]}, +"doc":[ +"Getting current contact list","SHA256 hash of list of a comma-separated list of contact UIDs in ascending","order may be passed in contactsHash parameter.","If the contact list was not changed, isNotChanged will be true.",{"type":"reference","argument":"contactsHash","category":"full","description":"Hash of saved list in application"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":"string","id":1,"name":"contactsHash"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"RemoveContact", +"header":89, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Removing contact from contact list",{"type":"reference","argument":"uid","category":"full","description":"Contact's UID"},{"type":"reference","argument":"accessHash","category":"danger","description":"Contact's AccessHash"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"AddContact", +"header":114, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Adding contact to contact list",{"type":"reference","argument":"uid","category":"full","description":"Contact's UID"},{"type":"reference","argument":"accessHash","category":"danger","description":"Contact's AccessHash"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"SearchContacts", +"header":112, +"response":{"type":"anonymous","header":113, "doc":[ +"Founded users",{"type":"reference","argument":"users","category":"compact","description":" Founded users"},{"type":"reference","argument":"userPeers","category":"compact","description":" Founded users peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":2,"name":"userPeers"} +]}, +"doc":[ +"Searching contacts by user's query",{"type":"reference","argument":"request","category":"full","description":"Search query"}],"attributes":[ +{"type":"string","id":1,"name":"request"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"empty"},{"type":"update","content":{ +"name":"ContactRegistered", +"header":5, +"doc":[ +"Update about contact registration",{"type":"reference","argument":"uid","category":"full","description":" contact's uid"},{"type":"reference","argument":"isSilent","category":"full","description":" is registration silent. If this value is true then don't show notification about registration"},{"type":"reference","argument":"date","category":"full","description":" date of registration"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"bool","id":2,"name":"isSilent"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +]}},{"type":"update","content":{ +"name":"ContactsAdded", +"header":40, +"doc":[ +"Update about contacts added",{"type":"reference","argument":"uids","category":"compact","description":" added contacts"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"uids"} +]}},{"type":"update","content":{ +"name":"ContactsRemoved", +"header":41, +"doc":[ +"Update about contacts removed",{"type":"reference","argument":"uids","category":"compact","description":" removed contacts"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"uids"} +]}}]}, { + "title": "Privacy", + "package": "privacy", + "items": [ +{"type":"rpc","content":{ +"name":"BlockUser", +"header":2636, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Block User",{"type":"reference","argument":"peer","category":"full","description":"Peer for blocking"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"UnblockUser", +"header":2637, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Unblock User",{"type":"reference","argument":"peer","category":"full","description":"Peer for unblocking"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"LoadBlockedUsers", +"header":2638, +"response":{"type":"anonymous","header":2639, "doc":[ +{"type":"reference","argument":"userPeers","category":"full","description":" Blocked user peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"userPeers"} +]}, +"doc":[ +"Load Blocked Users"],"attributes":[ +]}},{"type":"update","content":{ +"name":"UserBlocked", +"header":2629, +"doc":[ +"Update about User Blocked",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +]}},{"type":"update","content":{ +"name":"UserUnblocked", +"header":2630, +"doc":[ +"Update about User Unblocked",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +]}}]}, { + "title": "Messaging", + "package": "messaging", + "doc": [ + "Actor can work with encrypted and plain messages in one conversation. For both types of messages API", + "contains a bit different methods. Also encrypted and plain messages have different schemes.", + "

    Messages

    ", + "Message entity contains:", + "
      ", + "
    • PeerType - group chat or private
    • ", + "
    • PeerId - group or user id of conversation
    • ", + "
    • RandomId - unique id of message that generated by sender. In Encrypted messages random id is encrypted.
    • ", + "
    • Date - date of message (calculated on server)
    • ", + "
    • Content
    • ", + "
    ", + "

    Message content

    ", + "Message can be one of three basic types of messages: Text Message, File Message and Service message.", + "All messages can contain extensions. For example we can send text message and add markdown extension with", + "formatted text in markdown and clients that support this extension will show markdown, and that clients that", + "not supported extension then show simple text. File messages can have photo, video or voice extensions.", + "Service message can have extensions extensions such as \"user added\", \"group created\", \"avatar changed\", etc.", + "

    Send messages

    ", + "Sending messages looks same for encrypted and plain messages. Client MUST prepare all required data", + "before sending message (for example FastThumb for photo/video/documents) and call required methods.", + "Encrypted messages differs here only by a little different scheme and encryption.", + "

    WRONG_KEYS and incorrect keys

    ", + "For sending encrypted messages client MUST send messages encrypted for all own and receivers keys.", + "If client send encryption with missing, old or incorrect keys it will receive WRONG_KEYS.", + "In WRONG_KEYS you need to deserialize relatedData from RpcError to WrongKeysErrorData", + "and get detailed information about keys. Sometimes there are some broken keys on server and client can't", + "encrypt messages with it than client MUST send empty encrypted key in request elsewhere API return WRONG_KEYS.", + "

    Encrypted messages and New Devices

    ", + "When you send message to someone and when he registered with new device there are no way to receive old encrypted", + "messages on new device and because of this there are a problem about read/delivery statuses.", + "Alice send messages to Bob, but Bob lose his device and buy new iPhone and installed Actor.", + "Alice receive notification about new device and send another message. Bob open chat with Alice and", + "send read status with maximum message read date. Alice will mark all sent messages as read and one that", + "was not delivered. We can use status notifications per message, but in VERY heavy conversations it will be", + "a lot of unnecessary traffic. For resolving this small issue we have different ways of message statuses", + "for encrypted and plain messages. Also it is recomended to mark all undelivered messages on new device update as", + "not devered with warring sign.", + "

    Message Read and Delivery

    ", + "There are two different ways for read and delivery statuses for encrypted and plain messages.", + "For encrypted messages used status change by RandomId and for plain messages used by maximum", + "date of read/delivered message." + ], + "items": [ + { + "type":"struct", + "content": { + "name":"MessageAttributes", +"doc":[ +"Message Attributes",{"type":"reference","argument":"isMentioned","category":"full","description":" Is mentioned. If set overrides built-in value."},{"type":"reference","argument":"isHighlighted","category":"full","description":" Is message highlighted. Default is false."},{"type":"reference","argument":"isNotified","category":"full","description":" Is notified. If set overrides built-in settings."},{"type":"reference","argument":"isOnlyForYou","category":"full","description":" If this message is only for you. Default is false"}],"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"isMentioned"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isHighlighted"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isNotified"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isOnlyForYou"} +]}}, { + "type":"struct", + "content": { + "name":"QuotedMessage", +"doc":[ +"Quoted Message",{"type":"reference","argument":"messageId","category":"full","description":" Message Id if present"},{"type":"reference","argument":"publicGroupId","category":"full","description":" Public Group id if present"},{"type":"reference","argument":"senderUserId","category":"full","description":" Sender of message"},{"type":"reference","argument":"messageDate","category":"full","description":" Date of message"},{"type":"reference","argument":"quotedMessageContent","category":"full","description":" Optional Quoted Message Content. Can be empty if messageId is present and message is in current peer."}],"attributes":[ +{"type":{"type":"opt","childType":{"type":"alias","childType":"randomId"}},"id":1,"name":"messageId"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"groupId"}},"id":2,"name":"publicGroupId"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"senderUserId"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"messageDate"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"Message"}},"id":5,"name":"quotedMessageContent"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"Message","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"TextMessage", +"doc":[ +"Text message",{"type":"reference","argument":"text","category":"danger","description":" the text"},{"type":"reference","argument":"mentions","category":"full","description":" User mentions in message"},{"type":"reference","argument":"ext","category":"full","description":" Optional bytes of extension"}],"trait":{"name":"Message","key":1},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"text"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"mentions"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"TextMessageEx"}},"id":3,"name":"ext"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"TextMessageEx","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"TextExMarkdown", +"doc":[ +"Markdown extension",{"type":"reference","argument":"markdown","category":"full","description":" Markdown text"}],"trait":{"name":"TextMessageEx","key":1},"expandable":"true","attributes":[ +{"type":"string","id":2,"name":"markdown"} +]}}, { + "type":"struct", + "content": { + "name":"TextModernMessage", +"doc":[ +"Modern text message",{"type":"reference","argument":"text","category":"full","description":" optional text of message"},{"type":"reference","argument":"senderNameOverride","category":"full","description":" optional overriding of sender"},{"type":"reference","argument":"senderPhotoOverride","category":"full","description":" optional overriding sender's photo"},{"type":"reference","argument":"style","category":"full","description":" optional paragraph style"},{"type":"reference","argument":"attaches","category":"full","description":" optional Attaches of message"}],"trait":{"name":"TextMessageEx","key":2},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"text"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"senderNameOverride"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":3,"name":"senderPhotoOverride"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ParagraphStyle"}},"id":4,"name":"style"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"TextModernAttach"}},"id":5,"name":"attaches"} +]}}, { + "type":"struct", + "content": { + "name":"ParagraphStyle", +"doc":[ +"Paragraph style",{"type":"reference","argument":"showParagraph","category":"full","description":" Show quote-like paragraph?"},{"type":"reference","argument":"paragraphColor","category":"full","description":" Override paragraph color"},{"type":"reference","argument":"bgColor","category":"full","description":" Override background color"}],"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"showParagraph"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"Color"}},"id":2,"name":"paragraphColor"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"Color"}},"id":3,"name":"bgColor"} +]}}, { + "type":"struct", + "content": { + "name":"TextModernAttach", +"doc":[ +"Attaches to message",{"type":"reference","argument":"title","category":"full","description":" Attach of message"},{"type":"reference","argument":"titleUrl","category":"full","description":" Attach title url"},{"type":"reference","argument":"titleIcon","category":"full","description":" Attach title icon"},{"type":"reference","argument":"text","category":"full","description":" Attach text"},{"type":"reference","argument":"style","category":"full","description":" Attach style"}],"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"title"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"titleUrl"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":3,"name":"titleIcon"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"text"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ParagraphStyle"}},"id":5,"name":"style"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"TextModernField"}},"id":6,"name":"fields"} +]}}, { + "type":"struct", + "content": { + "name":"TextModernField", +"doc":[ +"Modern message fields",{"type":"reference","argument":"title","category":"full","description":" Field title"},{"type":"reference","argument":"value","category":"full","description":" Field value"},{"type":"reference","argument":"isShort","category":"full","description":" Is field can be shown in compact way (default is TRUE)"}],"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"title"} +,{"type":"string","id":2,"name":"value"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isShort"} +]}}, { + "type":"struct", + "content": { + "name":"TextCommand", +"doc":[ +"Text Command Message for bots",{"type":"reference","argument":"command","category":"full","description":" Slash-Command For execution"},{"type":"reference","argument":"args","category":"full","description":" Arguments of slash command"}],"trait":{"name":"TextMessageEx","key":3},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"command"} +,{"type":"string","id":2,"name":"args"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceMessage", +"doc":[ +"Service message",{"type":"reference","argument":"text","category":"full","description":" service message text"},{"type":"reference","argument":"ext","category":"compact","description":" Extension"}],"trait":{"name":"Message","key":2},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"text"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"ServiceEx"}},"id":3,"name":"ext"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"ServiceEx","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserInvited", +"doc":[ +"Service message about adding user to group",{"type":"reference","argument":"invitedUid","category":"full","description":" added user id"}],"trait":{"name":"ServiceEx","key":1},"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"invitedUid"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserJoined", +"doc":[ +"Service message about user join to group"],"trait":{"name":"ServiceEx","key":17},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserKicked", +"doc":[ +"Service message about kicking user from group",{"type":"reference","argument":"kickedUid","category":"full","description":" kicked user id"}],"trait":{"name":"ServiceEx","key":2},"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"kickedUid"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserLeft", +"doc":[ +"Service message about user left group"],"trait":{"name":"ServiceEx","key":3},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExGroupCreated", +"doc":[ +"Service message about group creating"],"trait":{"name":"ServiceEx","key":4},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedTitle", +"doc":[ +"Service message about group title change",{"type":"reference","argument":"title","category":"full","description":" New group title"}],"trait":{"name":"ServiceEx","key":5},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"title"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedTopic", +"doc":[ +"Service message on group topic change",{"type":"reference","argument":"topic","category":"full","description":" New group topic"}],"trait":{"name":"ServiceEx","key":18},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"topic"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedAbout", +"doc":[ +"Service message on group about change",{"type":"reference","argument":"about","category":"full","description":" New group about"}],"trait":{"name":"ServiceEx","key":19},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"about"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedAvatar", +"doc":[ +"Service message about avatar change",{"type":"reference","argument":"avatar","category":"compact","description":" Updated avatar"}],"trait":{"name":"ServiceEx","key":6},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":1,"name":"avatar"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExContactRegistered", +"doc":[ +"Service message about user registration",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"trait":{"name":"ServiceEx","key":8},"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExPhoneMissed", +"doc":[ +"Update about missing phone call"],"trait":{"name":"ServiceEx","key":9},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExPhoneCall", +"doc":[ +"Update about phone call",{"type":"reference","argument":"duration","category":"full","description":" Duration of a phone call"}],"trait":{"name":"ServiceEx","key":16},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChatArchived", +"doc":[ +"Message about chat archived"],"trait":{"name":"ServiceEx","key":20},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChatRestored", +"doc":[ +"Message about chat restored"],"trait":{"name":"ServiceEx","key":21},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"DocumentMessage", +"doc":[ +"File message",{"type":"reference","argument":"fileId","category":"full","description":" file id"},{"type":"reference","argument":"accessHash","category":"danger","description":" file access hash"},{"type":"reference","argument":"fileSize","category":"full","description":" file size"},{"type":"reference","argument":"name","category":"full","description":" name of file"},{"type":"reference","argument":"mimeType","category":"full","description":" mimetype of file"},{"type":"reference","argument":"thumb","category":"compact","description":" optional thumb of file. JPEG less that 90x90 with 60-70 quality."},{"type":"reference","argument":"ext","category":"compact","description":" Extension"}],"trait":{"name":"Message","key":3},"expandable":"true","attributes":[ +{"type":"int64","id":1,"name":"fileId"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"int32","id":3,"name":"fileSize"} +,{"type":"string","id":4,"name":"name"} +,{"type":"string","id":5,"name":"mimeType"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"FastThumb"}},"id":6,"name":"thumb"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"DocumentEx"}},"id":8,"name":"ext"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"DocumentEx","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"DocumentExPhoto", +"doc":[ +"File photo extension. Can be set ONLY for JPEG.",{"type":"reference","argument":"w","category":"full","description":" image width"},{"type":"reference","argument":"h","category":"full","description":" image height"}],"trait":{"name":"DocumentEx","key":1},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExVideo", +"doc":[ +"File video extension",{"type":"reference","argument":"w","category":"full","description":" video width"},{"type":"reference","argument":"h","category":"full","description":" video height"},{"type":"reference","argument":"duration","category":"full","description":" video duration"}],"trait":{"name":"DocumentEx","key":2},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"int32","id":3,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExVoice", +"doc":[ +"File voice extension",{"type":"reference","argument":"duration","category":"full","description":" voice duration"}],"trait":{"name":"DocumentEx","key":3},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExAnimation", +"doc":[ +"Animation extension. Can be set ONLY for GIF.",{"type":"reference","argument":"w","category":"full","description":" Animation width"},{"type":"reference","argument":"h","category":"full","description":" Animation height"}],"trait":{"name":"DocumentEx","key":6},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExAnimationVid", +"doc":[ +"Animation video extension. More compact version of Animation with video codec instead of GIF.","Can be set ONLY for MP4.",{"type":"reference","argument":"w","category":"full","description":" Animation width"},{"type":"reference","argument":"h","category":"full","description":" Animation height"},{"type":"reference","argument":"duration","category":"full","description":" Animation duration"}],"trait":{"name":"DocumentEx","key":7},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"int32","id":3,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"JsonMessage", +"doc":[ +"Custom-data JsonMessage",{"type":"reference","argument":"rawJson","category":"danger","description":" JSON object"}],"trait":{"name":"Message","key":4},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"rawJson"} +]}}, { + "type":"struct", + "content": { + "name":"UnsupportedMessage", +"doc":[ +"Explicit type for unsupported message"],"trait":{"name":"Message","key":5},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"StickerMessage", +"doc":[ +"Sticker message",{"type":"reference","argument":"stickerId","category":"full","description":" Optional Unique ID of sticker"},{"type":"reference","argument":"fastPreview","category":"full","description":" Optional Fast preview of sticker in webp format"},{"type":"reference","argument":"image512","category":"full","description":" Optional 512x512 sticker image in webp format"},{"type":"reference","argument":"image256","category":"full","description":" Optional 256x256 sticker image in webp format"},{"type":"reference","argument":"stickerCollectionId","category":"full","description":" Optional Collection ID"},{"type":"reference","argument":"stickerCollectionAccessHash","category":"full","description":" Optional Collection Access Hash"}],"trait":{"name":"Message","key":6},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"int32"},"id":1,"name":"stickerId"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"fastPreview"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":3,"name":"image512"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":4,"name":"image256"} +,{"type":{"type":"opt","childType":"int32"},"id":5,"name":"stickerCollectionId"} +,{"type":{"type":"opt","childType":"int64"},"id":6,"name":"stickerCollectionAccessHash"} +]}}, { + "type":"struct", + "content": { + "name":"BinaryMessage", +"doc":[ +"Binary Message. Useful for implementing your own content types",{"type":"reference","argument":"contentTag","category":"full","description":" Content Tag"},{"type":"reference","argument":"msg","category":"compact","description":" Message contents"}],"trait":{"name":"Message","key":7},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"contentTag"} +,{"type":"bytes","id":2,"name":"msg"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptedMessage", +"doc":[ +"Encrypted Message",{"type":"reference","argument":"box","category":"full","description":" Encrypted box"}],"trait":{"name":"Message","key":8},"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"EncryptedBox"},"id":1,"name":"box"} +]}}, { + "type":"struct", + "content": { + "name":"EmptyMessage", +"doc":[ +"Empty Message"],"trait":{"name":"Message","key":9},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"DialogShort", +"doc":[ +"Short Dialog from grouped conversation list",{"type":"reference","argument":"peer","category":"full","description":" Peer of conversation"},{"type":"reference","argument":"counter","category":"full","description":" Conversation unread count"},{"type":"reference","argument":"date","category":"full","description":" Conversation top message date"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":"int32","id":2,"name":"counter"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}}, { + "type":"struct", + "content": { + "name":"DialogGroup", +"doc":[ +"Grouped dialog list",{"type":"reference","argument":"title","category":"full","description":" Title of group"},{"type":"reference","argument":"key","category":"full","description":" Key of group"},{"type":"reference","argument":"dialogs","category":"full","description":" Conversations in group"}],"attributes":[ +{"type":"string","id":1,"name":"title"} +,{"type":"string","id":2,"name":"key"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"DialogShort"}},"id":3,"name":"dialogs"} +]}}, { + "type":"struct", + "content": { + "name":"MessageReaction", +"doc":[ +"Reaction to message",{"type":"reference","argument":"users","category":"full","description":" User's reaction"},{"type":"reference","argument":"code","category":"full","description":" Reaction EMOJI code"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"users"} +,{"type":"string","id":2,"name":"code"} +]}}, { + "type":"struct", + "content": { + "name":"MessageOutReference", +"doc":[ +"Message Out Reference",{"type":"reference","argument":"peer","category":"full","description":" Out Peer of message"},{"type":"reference","argument":"rid","category":"full","description":" Message random id"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +]}},{"type":"rpc","content":{ +"name":"SendMessage", +"header":92, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Sending plain message",{"type":"reference","argument":"peer","category":"full","description":"Destination peer for message"},{"type":"reference","argument":"rid","category":"full","description":"Message random id (generated on client side)"},{"type":"reference","argument":"message","category":"full","description":"The message"},{"type":"reference","argument":"isOnlyForUser","category":"full","description":"If message is shown only for specific user"},{"type":"reference","argument":"quotedMessageReference","category":"full","description":"Quoted message if present"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":4,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":5,"name":"isOnlyForUser"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageOutReference"}},"id":6,"name":"quotedMessageReference"} +]}},{"type":"rpc","content":{ +"name":"UpdateMessage", +"header":2658, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Changing Message content",{"type":"reference","argument":"peer","category":"full","description":"Destination Peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"updatedMessage","category":"full","description":"Updated Message content"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":3,"name":"updatedMessage"} +]}},{"type":"rpc","content":{ +"name":"MessageReceived", +"header":55, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Confirmation of plain message receive by device",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"date","category":"full","description":"Maximum date of received messages"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"rpc","content":{ +"name":"MessageRead", +"header":57, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Marking plain messages as read",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"date","category":"full","description":"Maximum date of read messages"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"rpc","content":{ +"name":"DeleteMessage", +"header":98, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Deleting messages",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rids","category":"full","description":"Message random id"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":3,"name":"rids"} +]}},{"type":"rpc","content":{ +"name":"ClearChat", +"header":99, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Clearing of conversation (without removing dialog from dialogs list)",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"DeleteChat", +"header":100, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Deleting of conversation (also leave group for group conversations)",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"ArchiveChat", +"header":2654, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Archiving chat",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"MessageSetReaction", +"header":210, +"response":{"type":"reference","name":"ReactionsResponse"}, +"doc":[ +"Setting Message reaction",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"code","category":"full","description":"Reaction code"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":"string","id":3,"name":"code"} +]}},{"type":"rpc","content":{ +"name":"MessageRemoveReaction", +"header":220, +"response":{"type":"reference","name":"ReactionsResponse"}, +"doc":[ +"Removing Message reaction",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"code","category":"full","description":"Reaction code"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":"string","id":3,"name":"code"} +]}},{"type":"response","content":{ +"name":"ReactionsResponse", +"header":219, +"doc":[ +"Response for reactions change"],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":3,"name":"reactions"} +]}},{"type":"update","content":{ +"name":"Message", +"header":55, +"doc":[ +"Update about plain message",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"senderUid","category":"full","description":" Sender of message"},{"type":"reference","argument":"date","category":"full","description":" date of message"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"message","category":"full","description":" message content"},{"type":"reference","argument":"attributes","category":"full","description":" optional message attributes"},{"type":"reference","argument":"quotedMessage","category":"full","description":" optional quoted message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"senderUid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":6,"name":"attributes"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":7,"name":"quotedMessage"} +]}},{"type":"update","content":{ +"name":"MessageContentChanged", +"header":162, +"doc":[ +"Update about message change",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"message","category":"full","description":" Message content"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":3,"name":"message"} +]}},{"type":"update","content":{ +"name":"MessageQuotedChanged", +"header":169, +"doc":[ +"Update about quoted message changed",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"quotedMessage","category":"full","description":" Quoted Message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":3,"name":"quotedMessage"} +]}},{"type":"update","content":{ +"name":"MessageDateChanged", +"header":163, +"doc":[ +"Update about message date changed",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"update","content":{ +"name":"MessageSent", +"header":4, +"doc":[ +"Update about message sent",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"update","content":{ +"name":"MessageReceived", +"header":54, +"doc":[ +"Update about message received",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of received message"},{"type":"reference","argument":"receivedDate","category":"full","description":" Date of receive"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"receivedDate"} +]}},{"type":"update","content":{ +"name":"MessageRead", +"header":19, +"doc":[ +"Update about message read",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of read message"},{"type":"reference","argument":"readDate","category":"full","description":" Date of read"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"readDate"} +]}},{"type":"update","content":{ +"name":"MessageReadByMe", +"header":50, +"doc":[ +"Update about message read by me",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of read message"},{"type":"reference","argument":"unreadCounter","category":"full","description":" Optional unread counter in conversation"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} +,{"type":{"type":"opt","childType":"int32"},"id":3,"name":"unreadCounter"} +]}},{"type":"update","content":{ +"name":"MessageDelete", +"header":46, +"doc":[ +"Update about message delete",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rids","category":"full","description":" Deleted messages"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"rids"} +]}},{"type":"update","content":{ +"name":"ChatClear", +"header":47, +"doc":[ +"Update about chat clear",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatDelete", +"header":48, +"doc":[ +"Update about chat delete",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatArchive", +"header":94, +"doc":[ +"Update about chat archive",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatDropCache", +"header":2690, +"doc":[ +"Update about cache drop",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatGroupsChanged", +"header":1, +"doc":[ +"Update about chat groups changed. Called only when adding, removing and reordering of grouped dialog.",{"type":"reference","argument":"dialogs","category":"compact","description":" New dialgos list"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":1,"name":"dialogs"} +]}},{"type":"update","content":{ +"name":"ReactionsUpdate", +"header":222, +"doc":[ +"Update about reactions change",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Message random id"},{"type":"reference","argument":"reactions","category":"full","description":" New Reactions"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":3,"name":"reactions"} +]}}, { + "type": "enum", + "content": { + "name": "MessageState", + "values": [ + { + "name": "Sent", + "id": 1 + }, + { + "name": "Received", + "id": 2 + }, + { + "name": "Read", + "id": 3 } - }, - "id": 1, - "name": "users" - }, { - "type": "bool", - "id": 2, - "name": "isNotChanged" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" + ] + } + }, { + "type":"struct", + "content": { + "name":"MessageContainer", +"doc":[ +"Message from history",{"type":"reference","argument":"senderUid","category":"full","description":" Sender of mesasge"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"},{"type":"reference","argument":"message","category":"full","description":" Content of message"},{"type":"reference","argument":"reactions","category":"full","description":" Message reactions"},{"type":"reference","argument":"attribute","category":"full","description":" Optional message attributes"},{"type":"reference","argument":"quotedMessage","category":"full","description":" Optional quoted Message"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"senderUid"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"MessageState"}},"id":6,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":7,"name":"reactions"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":8,"name":"attribute"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":9,"name":"quotedMessage"} +]}}, { + "type": "enum", + "content": { + "name": "ListLoadMode", + "values": [ + { + "name": "Forward", + "id": 1 + }, + { + "name": "Backward", + "id": 2 + }, + { + "name": "Both", + "id": 3 } - }, - "id": 3, - "name": "userPeers" - }] - }, - "doc": [ - "Getting current contact list", "SHA256 hash of list of a comma-separated list of contact UIDs in ascending", "order may be passed in contactsHash parameter.", "If the contact list was not changed, isNotChanged will be true.", { - "type": "reference", - "argument": "contactsHash", - "category": "full", - "description": "Hash of saved list in application" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "contactsHash" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RemoveContact", - "header": 89, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Removing contact from contact list", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": "Contact's UID" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": "Contact's AccessHash" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "rpc", - "content": { - "name": "AddContact", - "header": 114, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Adding contact to contact list", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": "Contact's UID" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": "Contact's AccessHash" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SearchContacts", - "header": 112, - "response": { - "type": "anonymous", - "header": 113, - "doc": [ - "Founded users", { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Founded users" - }, { - "type": "reference", - "argument": "userPeers", - "category": "compact", - "description": " Founded users peers" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" + ] + } + },{"type":"rpc","content":{ +"name":"LoadHistory", +"header":118, +"response":{"type":"anonymous","header":119, "doc":[ +"Loaded history",{"type":"reference","argument":"history","category":"compact","description":" Messages"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":1,"name":"history"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupPeers"} +]}, +"doc":[ +"Loading history of chat",{"type":"reference","argument":"peer","category":"full","description":"Peer of conversation"},{"type":"reference","argument":"date","category":"full","description":"start date of messages for loading or 0 for loading from start"},{"type":"reference","argument":"loadMode","category":"full","description":"Loading mode: Forward loading, backward or both ways"},{"type":"reference","argument":"limit","category":"full","description":"maximum amount of messages (max is 100)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"ListLoadMode"}},"id":5,"name":"loadMode"} +,{"type":"int32","id":4,"name":"limit"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":6,"name":"optimizations"} +]}}, { + "type":"struct", + "content": { + "name":"Dialog", +"doc":[ +"Conversation from history",{"type":"reference","argument":"peer","category":"full","description":" Peer of conversation"},{"type":"reference","argument":"unreadCount","category":"full","description":" plain messages unread messages count"},{"type":"reference","argument":"sortDate","category":"full","description":" date of conversation for sorting"},{"type":"reference","argument":"senderUid","category":"full","description":" Sender of top message (may be zero)"},{"type":"reference","argument":"rid","category":"full","description":" Random ID of top message (may be zero)"},{"type":"reference","argument":"date","category":"full","description":" Date of top message (can't be zero)"},{"type":"reference","argument":"message","category":"full","description":" Content of message"},{"type":"reference","argument":"firstUnreadDate","category":"full","description":" Date of first unread message"},{"type":"reference","argument":"attributes","category":"full","description":" Optional top message attributes"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":"int32","id":3,"name":"unreadCount"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"sortDate"} +,{"type":{"type":"alias","childType":"userId"},"id":5,"name":"senderUid"} +,{"type":{"type":"alias","childType":"randomId"},"id":6,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":7,"name":"date"} +,{"type":{"type":"trait","childType":"Message"},"id":8,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"MessageState"}},"id":9,"name":"state"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"date"}},"id":10,"name":"firstUnreadDate"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":11,"name":"attributes"} +]}},{"type":"rpc","content":{ +"name":"LoadDialogs", +"header":104, +"response":{"type":"anonymous","header":105, "doc":[ +"Loaded dialogs",{"type":"reference","argument":"groups","category":"compact","description":" Loaded groups"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"dialogs","category":"compact","description":" Loaded dialogs"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Dialog"}},"id":3,"name":"dialogs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":5,"name":"groupPeers"} +]}, +"doc":[ +"Loading conversation history",{"type":"reference","argument":"minDate","category":"full","description":"start date of conversation loading. Use 0 to load latest messages"},{"type":"reference","argument":"limit","category":"full","description":"limit maximum amount of messages (max is 100)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"alias","childType":"date"},"id":1,"name":"minDate"} +,{"type":"int32","id":2,"name":"limit"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LoadArchived", +"header":2651, +"response":{"type":"anonymous","header":2652, "doc":[ +"Archived dialogs",{"type":"reference","argument":"groups","category":"full","description":" Referenced groups"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"dialogs","category":"full","description":" Archived dialogs"},{"type":"reference","argument":"nextOffset","category":"compact","description":" Offset for next bunch"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Dialog"}},"id":3,"name":"dialogs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupPeers"} +,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"nextOffset"} +]}, +"doc":[ +"Loading archived messages",{"type":"reference","argument":"nextOffset","category":"compact","description":"Optional next offset"},{"type":"reference","argument":"limit","category":"full","description":"Maximum number of elements"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"opt","childType":"bytes"},"id":1,"name":"nextOffset"} +,{"type":"int32","id":2,"name":"limit"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LoadGroupedDialogs", +"header":225, +"response":{"type":"anonymous","header":226, "doc":[ +"Loaded grouped dialogs",{"type":"reference","argument":"dialogs","category":"compact","description":" Loaded groups of dialogs"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"groups","category":"full","description":" Loaded groups"},{"type":"reference","argument":"showArchived","category":"full","description":" Show archived section"},{"type":"reference","argument":"showInvite","category":"full","description":" Show invite message"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":1,"name":"dialogs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"showArchived"} +,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"showInvite"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":6,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":7,"name":"groupPeers"} +]}, +"doc":[ +"Load all dialogs from grouped list"],"attributes":[ +{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":1,"name":"optimizations"} +]}},{"type":"response","content":{ +"name":"DialogsOrder", +"header":235, +"doc":[ +"Dialogs order response",{"type":"reference","argument":"seq","category":"full","description":" update seq"},{"type":"reference","argument":"state","category":"full","description":" update state"},{"type":"reference","argument":"groups","category":"full","description":" Update groups"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":3,"name":"groups"} +]}},{"type":"rpc","content":{ +"name":"HideDialog", +"header":231, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Hide Dialog from grouped list",{"type":"reference","argument":"peer","category":"full","description":"Dialog peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"ShowDialog", +"header":232, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Show Dialog in grouped list"],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"FavouriteDialog", +"header":224, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Marking dialog as favourite",{"type":"reference","argument":"peer","category":"full","description":"Peer for favouriting"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"UnfavouriteDialog", +"header":227, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Making dialog as unfavourite",{"type":"reference","argument":"peer","category":"full","description":"Peer for favouriting"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"NotifyDialogOpened", +"header":2785, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Notifying about dialog open",{"type":"reference","argument":"peer","category":"full","description":"Peer that was opened"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}}]}, { + "title": "Groups", + "package": "groups", + "items": [ +{"type":"comment","content":"Entities"}, { + "type":"struct", + "content": { + "name":"Member", +"doc":[ +"Member information",{"type":"reference","argument":"uid","category":"full","description":" User id"},{"type":"reference","argument":"inviterUid","category":"full","description":" User inviter id"},{"type":"reference","argument":"date","category":"full","description":" Adding date"},{"type":"reference","argument":"isAdmin","category":"full","description":" is member admin of group"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"inviterUid"} +,{"type":"int64","id":3,"name":"date"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isAdmin"} +]}}, { + "type": "enum", + "content": { + "name": "GroupType", + "values": [ + { + "name": "GROUP", + "id": 1 + }, + { + "name": "CHANNEL", + "id": 2 } - }, - "id": 1, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" + ] + } + }, { + "type": "enum", + "content": { + "name": "GroupPermissions", + "values": [ + { + "name": "SEND_MESSAGE", + "id": 1 + }, + { + "name": "CLEAR", + "id": 2 + }, + { + "name": "LEAVE", + "id": 3 + }, + { + "name": "DELETE", + "id": 4 + }, + { + "name": "JOIN", + "id": 5 + }, + { + "name": "VIEW_INFO", + "id": 6 } - }, - "id": 2, - "name": "userPeers" - }] - }, - "doc": [ - "Searching contacts by user's query", { - "type": "reference", - "argument": "request", - "category": "full", - "description": "Search query" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "request" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - }] - } - }, { - "type": "empty" - }, { - "type": "update", - "content": { - "name": "ContactRegistered", - "header": 5, - "doc": [ - "Update about contact registration", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " contact's uid" - }, { - "type": "reference", - "argument": "isSilent", - "category": "full", - "description": " is registration silent. If this value is true then don't show notification about registration" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " date of registration" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": "bool", - "id": 2, - "name": "isSilent" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }] - } - }, { - "type": "update", - "content": { - "name": "ContactsAdded", - "header": 40, - "doc": [ - "Update about contacts added", { - "type": "reference", - "argument": "uids", - "category": "compact", - "description": " added contacts" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 1, - "name": "uids" - }] - } - }, { - "type": "update", - "content": { - "name": "ContactsRemoved", - "header": 41, - "doc": [ - "Update about contacts removed", { - "type": "reference", - "argument": "uids", - "category": "compact", - "description": " removed contacts" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 1, - "name": "uids" - }] - } - }] - }, { - "title": "Privacy", - "package": "privacy", - "items": [{ - "type": "rpc", - "content": { - "name": "BlockUser", - "header": 2636, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Block User", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for blocking" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnblockUser", - "header": 2637, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Unblock User", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for unblocking" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadBlockedUsers", - "header": 2638, - "response": { - "type": "anonymous", - "header": 2639, - "doc": [{ - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Blocked user peers" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" + ] + } + }, { + "type": "enum", + "content": { + "name": "GroupFullPermissions", + "values": [ + { + "name": "EDIT_INFO", + "id": 1 + }, + { + "name": "VIEW_MEMBERS", + "id": 2 + }, + { + "name": "INVITE_MEMBERS", + "id": 3 + }, + { + "name": "INVITE_VIA_LINK", + "id": 4 + }, + { + "name": "CALL", + "id": 5 + }, + { + "name": "EDIT_ADMIN_SETTINGS", + "id": 6 + }, + { + "name": "VIEW_ADMINS", + "id": 7 + }, + { + "name": "EDIT_ADMINS", + "id": 8 + }, + { + "name": "KICK_INVITED", + "id": 9 + }, + { + "name": "KICK_ANYONE", + "id": 10 + }, + { + "name": "EDIT_FOREIGN", + "id": 11 + }, + { + "name": "DELETE_FOREIGN", + "id": 12 } - }, - "id": 1, - "name": "userPeers" - }] - }, - "doc": [ - "Load Blocked Users" - ], - "attributes": [] - } - }, { - "type": "update", - "content": { - "name": "UserBlocked", - "header": 2629, - "doc": [ - "Update about User Blocked", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }] - } - }, { - "type": "update", - "content": { - "name": "UserUnblocked", - "header": 2630, - "doc": [ - "Update about User Unblocked", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }] - } - }] - }, { - "title": "Messaging", - "package": "messaging", - "doc": [ - "Actor can work with encrypted and plain messages in one conversation. For both types of messages API", - "contains a bit different methods. Also encrypted and plain messages have different schemes.", - "

    Messages

    ", - "Message entity contains:", - "
      ", - "
    • PeerType - group chat or private
    • ", - "
    • PeerId - group or user id of conversation
    • ", - "
    • RandomId - unique id of message that generated by sender. In Encrypted messages random id is encrypted.
    • ", - "
    • Date - date of message (calculated on server)
    • ", - "
    • Content
    • ", - "
    ", - "

    Message content

    ", - "Message can be one of three basic types of messages: Text Message, File Message and Service message.", - "All messages can contain extensions. For example we can send text message and add markdown extension with", - "formatted text in markdown and clients that support this extension will show markdown, and that clients that", - "not supported extension then show simple text. File messages can have photo, video or voice extensions.", - "Service message can have extensions extensions such as \"user added\", \"group created\", \"avatar changed\", etc.", - "

    Send messages

    ", - "Sending messages looks same for encrypted and plain messages. Client MUST prepare all required data", - "before sending message (for example FastThumb for photo/video/documents) and call required methods.", - "Encrypted messages differs here only by a little different scheme and encryption.", - "

    WRONG_KEYS and incorrect keys

    ", - "For sending encrypted messages client MUST send messages encrypted for all own and receivers keys.", - "If client send encryption with missing, old or incorrect keys it will receive WRONG_KEYS.", - "In WRONG_KEYS you need to deserialize relatedData from RpcError to WrongKeysErrorData", - "and get detailed information about keys. Sometimes there are some broken keys on server and client can't", - "encrypt messages with it than client MUST send empty encrypted key in request elsewhere API return WRONG_KEYS.", - "

    Encrypted messages and New Devices

    ", - "When you send message to someone and when he registered with new device there are no way to receive old encrypted", - "messages on new device and because of this there are a problem about read/delivery statuses.", - "Alice send messages to Bob, but Bob lose his device and buy new iPhone and installed Actor.", - "Alice receive notification about new device and send another message. Bob open chat with Alice and", - "send read status with maximum message read date. Alice will mark all sent messages as read and one that", - "was not delivered. We can use status notifications per message, but in VERY heavy conversations it will be", - "a lot of unnecessary traffic. For resolving this small issue we have different ways of message statuses", - "for encrypted and plain messages. Also it is recomended to mark all undelivered messages on new device update as", - "not devered with warring sign.", - "

    Message Read and Delivery

    ", - "There are two different ways for read and delivery statuses for encrypted and plain messages.", - "For encrypted messages used status change by RandomId and for plain messages used by maximum", - "date of read/delivered message." - ], - "items": [{ - "type": "struct", - "content": { - "name": "MessageAttributes", - "doc": [ - "Message Attributes", { - "type": "reference", - "argument": "isMentioned", - "category": "full", - "description": " Is mentioned. If set overrides built-in value." - }, { - "type": "reference", - "argument": "isHighlighted", - "category": "full", - "description": " Is message highlighted. Default is false." - }, { - "type": "reference", - "argument": "isNotified", - "category": "full", - "description": " Is notified. If set overrides built-in settings." - }, { - "type": "reference", - "argument": "isOnlyForYou", - "category": "full", - "description": " If this message is only for you. Default is false" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "isMentioned" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isHighlighted" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isNotified" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "isOnlyForYou" - }] - } - }, { - "type": "struct", - "content": { - "name": "QuotedMessage", - "doc": [ - "Quoted Message", { - "type": "reference", - "argument": "messageId", - "category": "full", - "description": " Message Id if present" - }, { - "type": "reference", - "argument": "publicGroupId", - "category": "full", - "description": " Public Group id if present" - }, { - "type": "reference", - "argument": "senderUserId", - "category": "full", - "description": " Sender of message" - }, { - "type": "reference", - "argument": "messageDate", - "category": "full", - "description": " Date of message" - }, { - "type": "reference", - "argument": "quotedMessageContent", - "category": "full", - "description": " Optional Quoted Message Content. Can be empty if messageId is present and message is in current peer." - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 1, - "name": "messageId" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "groupId" - } - }, - "id": 2, - "name": "publicGroupId" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "senderUserId" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "messageDate" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "Message" - } - }, - "id": 5, - "name": "quotedMessageContent" - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "Message", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "TextMessage", - "doc": [ - "Text message", { - "type": "reference", - "argument": "text", - "category": "danger", - "description": " the text" - }, { - "type": "reference", - "argument": "mentions", - "category": "full", - "description": " User mentions in message" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Optional bytes of extension" - } - ], - "trait": { - "name": "Message", - "key": 1 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "text" - }, { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "mentions" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "TextMessageEx" - } - }, - "id": 3, - "name": "ext" - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "TextMessageEx", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "TextExMarkdown", - "doc": [ - "Markdown extension", { - "type": "reference", - "argument": "markdown", - "category": "full", - "description": " Markdown text" - } - ], - "trait": { - "name": "TextMessageEx", - "key": 1 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 2, - "name": "markdown" - }] - } - }, { - "type": "struct", - "content": { - "name": "TextModernMessage", - "doc": [ - "Modern text message", { - "type": "reference", - "argument": "text", - "category": "full", - "description": " optional text of message" - }, { - "type": "reference", - "argument": "senderNameOverride", - "category": "full", - "description": " optional overriding of sender" - }, { - "type": "reference", - "argument": "senderPhotoOverride", - "category": "full", - "description": " optional overriding sender's photo" - }, { - "type": "reference", - "argument": "style", - "category": "full", - "description": " optional paragraph style" - }, { - "type": "reference", - "argument": "attaches", - "category": "full", - "description": " optional Attaches of message" - } - ], - "trait": { - "name": "TextMessageEx", - "key": 2 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "text" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "senderNameOverride" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 3, - "name": "senderPhotoOverride" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ParagraphStyle" - } - }, - "id": 4, - "name": "style" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "TextModernAttach" - } - }, - "id": 5, - "name": "attaches" - }] - } - }, { - "type": "struct", - "content": { - "name": "ParagraphStyle", - "doc": [ - "Paragraph style", { - "type": "reference", - "argument": "showParagraph", - "category": "full", - "description": " Show quote-like paragraph?" - }, { - "type": "reference", - "argument": "paragraphColor", - "category": "full", - "description": " Override paragraph color" - }, { - "type": "reference", - "argument": "bgColor", - "category": "full", - "description": " Override background color" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "showParagraph" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "Color" - } - }, - "id": 2, - "name": "paragraphColor" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "Color" - } - }, - "id": 3, - "name": "bgColor" - }] - } - }, { - "type": "struct", - "content": { - "name": "TextModernAttach", - "doc": [ - "Attaches to message", { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Attach of message" - }, { - "type": "reference", - "argument": "titleUrl", - "category": "full", - "description": " Attach title url" - }, { - "type": "reference", - "argument": "titleIcon", - "category": "full", - "description": " Attach title icon" - }, { - "type": "reference", - "argument": "text", - "category": "full", - "description": " Attach text" - }, { - "type": "reference", - "argument": "style", - "category": "full", - "description": " Attach style" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "title" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "titleUrl" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 3, - "name": "titleIcon" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "text" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ParagraphStyle" - } - }, - "id": 5, - "name": "style" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "TextModernField" - } - }, - "id": 6, - "name": "fields" - }] - } - }, { - "type": "struct", - "content": { - "name": "TextModernField", - "doc": [ - "Modern message fields", { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Field title" - }, { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Field value" - }, { - "type": "reference", - "argument": "isShort", - "category": "full", - "description": " Is field can be shown in compact way (default is TRUE)" - } - ], - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "title" - }, { - "type": "string", - "id": 2, - "name": "value" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isShort" - }] - } - }, { - "type": "struct", - "content": { - "name": "TextCommand", - "doc": [ - "Text Command Message for bots", { - "type": "reference", - "argument": "command", - "category": "full", - "description": " Slash-Command For execution" - }, { - "type": "reference", - "argument": "args", - "category": "full", - "description": " Arguments of slash command" - } - ], - "trait": { - "name": "TextMessageEx", - "key": 3 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "command" - }, { - "type": "string", - "id": 2, - "name": "args" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceMessage", - "doc": [ - "Service message", { - "type": "reference", - "argument": "text", - "category": "full", - "description": " service message text" - }, { - "type": "reference", - "argument": "ext", - "category": "compact", - "description": " Extension" - } - ], - "trait": { - "name": "Message", - "key": 2 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "text" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "ServiceEx" - } - }, - "id": 3, - "name": "ext" - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "ServiceEx", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExUserInvited", - "doc": [ - "Service message about adding user to group", { - "type": "reference", - "argument": "invitedUid", - "category": "full", - "description": " added user id" - } - ], - "trait": { - "name": "ServiceEx", - "key": 1 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "invitedUid" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExUserJoined", - "doc": [ - "Service message about user join to group" - ], - "trait": { - "name": "ServiceEx", - "key": 17 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExUserKicked", - "doc": [ - "Service message about kicking user from group", { - "type": "reference", - "argument": "kickedUid", - "category": "full", - "description": " kicked user id" - } - ], - "trait": { - "name": "ServiceEx", - "key": 2 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "kickedUid" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExUserLeft", - "doc": [ - "Service message about user left group" - ], - "trait": { - "name": "ServiceEx", - "key": 3 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExGroupCreated", - "doc": [ - "Service message about group creating" - ], - "trait": { - "name": "ServiceEx", - "key": 4 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExChangedTitle", - "doc": [ - "Service message about group title change", { - "type": "reference", - "argument": "title", - "category": "full", - "description": " New group title" - } - ], - "trait": { - "name": "ServiceEx", - "key": 5 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "title" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExChangedTopic", - "doc": [ - "Service message on group topic change", { - "type": "reference", - "argument": "topic", - "category": "full", - "description": " New group topic" - } - ], - "trait": { - "name": "ServiceEx", - "key": 18 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "topic" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExChangedAbout", - "doc": [ - "Service message on group about change", { - "type": "reference", - "argument": "about", - "category": "full", - "description": " New group about" - } - ], - "trait": { - "name": "ServiceEx", - "key": 19 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "about" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExChangedAvatar", - "doc": [ - "Service message about avatar change", { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " Updated avatar" - } - ], - "trait": { - "name": "ServiceEx", - "key": 6 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 1, - "name": "avatar" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExContactRegistered", - "doc": [ - "Service message about user registration", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User Id" - } - ], - "trait": { - "name": "ServiceEx", - "key": 8 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExPhoneMissed", - "doc": [ - "Update about missing phone call" - ], - "trait": { - "name": "ServiceEx", - "key": 9 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExPhoneCall", - "doc": [ - "Update about phone call", { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " Duration of a phone call" - } - ], - "trait": { - "name": "ServiceEx", - "key": 16 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "duration" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExChatArchived", - "doc": [ - "Message about chat archived" - ], - "trait": { - "name": "ServiceEx", - "key": 20 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExChatRestored", - "doc": [ - "Message about chat restored" - ], - "trait": { - "name": "ServiceEx", - "key": 21 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "DocumentMessage", - "doc": [ - "File message", { - "type": "reference", - "argument": "fileId", - "category": "full", - "description": " file id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " file access hash" - }, { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " file size" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " name of file" - }, { - "type": "reference", - "argument": "mimeType", - "category": "full", - "description": " mimetype of file" - }, { - "type": "reference", - "argument": "thumb", - "category": "compact", - "description": " optional thumb of file. JPEG less that 90x90 with 60-70 quality." - }, { - "type": "reference", - "argument": "ext", - "category": "compact", - "description": " Extension" - } - ], - "trait": { - "name": "Message", - "key": 3 - }, - "expandable": "true", - "attributes": [{ - "type": "int64", - "id": 1, - "name": "fileId" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": "int32", - "id": 3, - "name": "fileSize" - }, { - "type": "string", - "id": 4, - "name": "name" - }, { - "type": "string", - "id": 5, - "name": "mimeType" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "FastThumb" - } - }, - "id": 6, - "name": "thumb" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "DocumentEx" - } - }, - "id": 8, - "name": "ext" - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "DocumentEx", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "DocumentExPhoto", - "doc": [ - "File photo extension. Can be set ONLY for JPEG.", { - "type": "reference", - "argument": "w", - "category": "full", - "description": " image width" - }, { - "type": "reference", - "argument": "h", - "category": "full", - "description": " image height" - } - ], - "trait": { - "name": "DocumentEx", - "key": 1 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "w" - }, { - "type": "int32", - "id": 2, - "name": "h" - }] - } - }, { - "type": "struct", - "content": { - "name": "DocumentExVideo", - "doc": [ - "File video extension", { - "type": "reference", - "argument": "w", - "category": "full", - "description": " video width" - }, { - "type": "reference", - "argument": "h", - "category": "full", - "description": " video height" - }, { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " video duration" - } - ], - "trait": { - "name": "DocumentEx", - "key": 2 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "w" - }, { - "type": "int32", - "id": 2, - "name": "h" - }, { - "type": "int32", - "id": 3, - "name": "duration" - }] - } - }, { - "type": "struct", - "content": { - "name": "DocumentExVoice", - "doc": [ - "File voice extension", { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " voice duration" - } - ], - "trait": { - "name": "DocumentEx", - "key": 3 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "duration" - }] - } - }, { - "type": "struct", - "content": { - "name": "DocumentExAnimation", - "doc": [ - "Animation extension. Can be set ONLY for GIF.", { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Animation width" - }, { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Animation height" - } - ], - "trait": { - "name": "DocumentEx", - "key": 6 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "w" - }, { - "type": "int32", - "id": 2, - "name": "h" - }] - } - }, { - "type": "struct", - "content": { - "name": "DocumentExAnimationVid", - "doc": [ - "Animation video extension. More compact version of Animation with video codec instead of GIF.", "Can be set ONLY for MP4.", { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Animation width" - }, { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Animation height" - }, { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " Animation duration" - } - ], - "trait": { - "name": "DocumentEx", - "key": 7 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "w" - }, { - "type": "int32", - "id": 2, - "name": "h" - }, { - "type": "int32", - "id": 3, - "name": "duration" - }] - } - }, { - "type": "struct", - "content": { - "name": "JsonMessage", - "doc": [ - "Custom-data JsonMessage", { - "type": "reference", - "argument": "rawJson", - "category": "danger", - "description": " JSON object" - } - ], - "trait": { - "name": "Message", - "key": 4 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "rawJson" - }] - } - }, { - "type": "struct", - "content": { - "name": "UnsupportedMessage", - "doc": [ - "Explicit type for unsupported message" - ], - "trait": { - "name": "Message", - "key": 5 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "StickerMessage", - "doc": [ - "Sticker message", { - "type": "reference", - "argument": "stickerId", - "category": "full", - "description": " Optional Unique ID of sticker" - }, { - "type": "reference", - "argument": "fastPreview", - "category": "full", - "description": " Optional Fast preview of sticker in webp format" - }, { - "type": "reference", - "argument": "image512", - "category": "full", - "description": " Optional 512x512 sticker image in webp format" - }, { - "type": "reference", - "argument": "image256", - "category": "full", - "description": " Optional 256x256 sticker image in webp format" - }, { - "type": "reference", - "argument": "stickerCollectionId", - "category": "full", - "description": " Optional Collection ID" - }, { - "type": "reference", - "argument": "stickerCollectionAccessHash", - "category": "full", - "description": " Optional Collection Access Hash" - } - ], - "trait": { - "name": "Message", - "key": 6 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 1, - "name": "stickerId" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "fastPreview" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 3, - "name": "image512" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 4, - "name": "image256" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 5, - "name": "stickerCollectionId" - }, { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 6, - "name": "stickerCollectionAccessHash" - }] - } - }, { - "type": "struct", - "content": { - "name": "BinaryMessage", - "doc": [ - "Binary Message. Useful for implementing your own content types", { - "type": "reference", - "argument": "contentTag", - "category": "full", - "description": " Content Tag" - }, { - "type": "reference", - "argument": "msg", - "category": "compact", - "description": " Message contents" - } - ], - "trait": { - "name": "Message", - "key": 7 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "contentTag" - }, { - "type": "bytes", - "id": 2, - "name": "msg" - }] - } - }, { - "type": "struct", - "content": { - "name": "EncryptedMessage", - "doc": [ - "Encrypted Message", { - "type": "reference", - "argument": "box", - "category": "full", - "description": " Encrypted box" - } - ], - "trait": { - "name": "Message", - "key": 8 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "struct", - "childType": "EncryptedBox" - }, - "id": 1, - "name": "box" - }] - } - }, { - "type": "struct", - "content": { - "name": "EmptyMessage", - "doc": [ - "Empty Message" - ], - "trait": { - "name": "Message", - "key": 9 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "DialogShort", - "doc": [ - "Short Dialog from grouped conversation list", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer of conversation" - }, { - "type": "reference", - "argument": "counter", - "category": "full", - "description": " Conversation unread count" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Conversation top message date" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": "int32", - "id": 2, - "name": "counter" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - } - }, { - "type": "struct", - "content": { - "name": "DialogGroup", - "doc": [ - "Grouped dialog list", { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Title of group" - }, { - "type": "reference", - "argument": "key", - "category": "full", - "description": " Key of group" - }, { - "type": "reference", - "argument": "dialogs", - "category": "full", - "description": " Conversations in group" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "title" - }, { - "type": "string", - "id": 2, - "name": "key" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogShort" - } - }, - "id": 3, - "name": "dialogs" - }] - } - }, { - "type": "struct", - "content": { - "name": "MessageReaction", - "doc": [ - "Reaction to message", { - "type": "reference", - "argument": "users", - "category": "full", - "description": " User's reaction" - }, { - "type": "reference", - "argument": "code", - "category": "full", - "description": " Reaction EMOJI code" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 1, - "name": "users" - }, { - "type": "string", - "id": 2, - "name": "code" - }] - } - }, { - "type": "struct", - "content": { - "name": "MessageOutReference", - "doc": [ - "Message Out Reference", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Out Peer of message" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Message random id" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SendMessage", - "header": 92, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Sending plain message", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer for message" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id (generated on client side)" - }, { - "type": "reference", - "argument": "message", - "category": "full", - "description": "The message" - }, { - "type": "reference", - "argument": "isOnlyForUser", - "category": "full", - "description": "If message is shown only for specific user" - }, { - "type": "reference", - "argument": "quotedMessageReference", - "category": "full", - "description": "Quoted message if present" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "rid" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 4, - "name": "message" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 5, - "name": "isOnlyForUser" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageOutReference" - } - }, - "id": 6, - "name": "quotedMessageReference" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UpdateMessage", - "header": 2658, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Changing Message content", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination Peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id" - }, { - "type": "reference", - "argument": "updatedMessage", - "category": "full", - "description": "Updated Message content" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 3, - "name": "updatedMessage" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MessageReceived", - "header": 55, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Confirmation of plain message receive by device", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": "Maximum date of received messages" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MessageRead", - "header": 57, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Marking plain messages as read", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": "Maximum date of read messages" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DeleteMessage", - "header": 98, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Deleting messages", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "rids", - "category": "full", - "description": "Message random id" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 3, - "name": "rids" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ClearChat", - "header": 99, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Clearing of conversation (without removing dialog from dialogs list)", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Conversation peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DeleteChat", - "header": 100, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Deleting of conversation (also leave group for group conversations)", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Conversation peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ArchiveChat", - "header": 2654, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Archiving chat", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Conversation peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MessageSetReaction", - "header": 210, - "response": { - "type": "reference", - "name": "ReactionsResponse" - }, - "doc": [ - "Setting Message reaction", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id" - }, { - "type": "reference", - "argument": "code", - "category": "full", - "description": "Reaction code" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": "string", - "id": 3, - "name": "code" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MessageRemoveReaction", - "header": 220, - "response": { - "type": "reference", - "name": "ReactionsResponse" - }, - "doc": [ - "Removing Message reaction", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id" - }, { - "type": "reference", - "argument": "code", - "category": "full", - "description": "Reaction code" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": "string", - "id": 3, - "name": "code" - }] - } - }, { - "type": "response", - "content": { - "name": "ReactionsResponse", - "header": 219, - "doc": [ - "Response for reactions change" - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageReaction" - } - }, - "id": 3, - "name": "reactions" - }] - } - }, { - "type": "update", - "content": { - "name": "Message", - "header": 55, - "doc": [ - "Update about plain message", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "senderUid", - "category": "full", - "description": " Sender of message" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " date of message" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, { - "type": "reference", - "argument": "message", - "category": "full", - "description": " message content" - }, { - "type": "reference", - "argument": "attributes", - "category": "full", - "description": " optional message attributes" - }, { - "type": "reference", - "argument": "quotedMessage", - "category": "full", - "description": " optional quoted message" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "senderUid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 5, - "name": "message" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageAttributes" - } - }, - "id": 6, - "name": "attributes" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "QuotedMessage" - } - }, - "id": 7, - "name": "quotedMessage" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageContentChanged", - "header": 162, - "doc": [ - "Update about message change", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, { - "type": "reference", - "argument": "message", - "category": "full", - "description": " Message content" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 3, - "name": "message" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageQuotedChanged", - "header": 169, - "doc": [ - "Update about quoted message changed", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, { - "type": "reference", - "argument": "quotedMessage", - "category": "full", - "description": " Quoted Message" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "QuotedMessage" - } - }, - "id": 3, - "name": "quotedMessage" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageDateChanged", - "header": 163, - "doc": [ - "Update about message date changed", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of message" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageSent", - "header": 4, - "doc": [ - "Update about message sent", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of message" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageReceived", - "header": 54, - "doc": [ - "Update about message received", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "startDate", - "category": "full", - "description": " Start date of received message" - }, { - "type": "reference", - "argument": "receivedDate", - "category": "full", - "description": " Date of receive" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "startDate" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "receivedDate" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageRead", - "header": 19, - "doc": [ - "Update about message read", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "startDate", - "category": "full", - "description": " Start date of read message" - }, { - "type": "reference", - "argument": "readDate", - "category": "full", - "description": " Date of read" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "startDate" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "readDate" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageReadByMe", - "header": 50, - "doc": [ - "Update about message read by me", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "startDate", - "category": "full", - "description": " Start date of read message" - }, { - "type": "reference", - "argument": "unreadCounter", - "category": "full", - "description": " Optional unread counter in conversation" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "startDate" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 3, - "name": "unreadCounter" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageDelete", - "header": 46, - "doc": [ - "Update about message delete", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "rids", - "category": "full", - "description": " Deleted messages" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 2, - "name": "rids" - }] - } - }, { - "type": "update", - "content": { - "name": "ChatClear", - "header": 47, - "doc": [ - "Update about chat clear", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "update", - "content": { - "name": "ChatDelete", - "header": 48, - "doc": [ - "Update about chat delete", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "update", - "content": { - "name": "ChatArchive", - "header": 94, - "doc": [ - "Update about chat archive", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "update", - "content": { - "name": "ChatDropCache", - "header": 2690, - "doc": [ - "Update about cache drop", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "update", - "content": { - "name": "ChatGroupsChanged", - "header": 1, - "doc": [ - "Update about chat groups changed. Called only when adding, removing and reordering of grouped dialog.", { - "type": "reference", - "argument": "dialogs", - "category": "compact", - "description": " New dialgos list" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogGroup" - } - }, - "id": 1, - "name": "dialogs" - }] - } - }, { - "type": "update", - "content": { - "name": "ReactionsUpdate", - "header": 222, - "doc": [ - "Update about reactions change", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Message random id" - }, { - "type": "reference", - "argument": "reactions", - "category": "full", - "description": " New Reactions" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageReaction" - } - }, - "id": 3, - "name": "reactions" - }] - } - }, { - "type": "enum", - "content": { - "name": "MessageState", - "values": [{ - "name": "Sent", - "id": 1 - }, { - "name": "Received", - "id": 2 - }, { - "name": "Read", - "id": 3 - }] - } - }, { - "type": "struct", - "content": { - "name": "MessageContainer", - "doc": [ - "Message from history", { - "type": "reference", - "argument": "senderUid", - "category": "full", - "description": " Sender of mesasge" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of message" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of message" - }, { - "type": "reference", - "argument": "message", - "category": "full", - "description": " Content of message" - }, { - "type": "reference", - "argument": "reactions", - "category": "full", - "description": " Message reactions" - }, { - "type": "reference", - "argument": "attribute", - "category": "full", - "description": " Optional message attributes" - }, { - "type": "reference", - "argument": "quotedMessage", - "category": "full", - "description": " Optional quoted Message" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "senderUid" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 5, - "name": "message" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "MessageState" - } - }, - "id": 6, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageReaction" - } - }, - "id": 7, - "name": "reactions" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageAttributes" - } - }, - "id": 8, - "name": "attribute" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "QuotedMessage" - } - }, - "id": 9, - "name": "quotedMessage" - }] - } - }, { - "type": "enum", - "content": { - "name": "ListLoadMode", - "values": [{ - "name": "Forward", - "id": 1 - }, { - "name": "Backward", - "id": 2 - }, { - "name": "Both", - "id": 3 - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadHistory", - "header": 118, - "response": { - "type": "anonymous", - "header": 119, - "doc": [ - "Loaded history", { - "type": "reference", - "argument": "history", - "category": "compact", - "description": " Messages" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageContainer" + ] + } + }, { + "type":"struct", + "content": { + "name":"Group", +"doc":[ +"Group information","","Permissions.","Permissions of this structure is about group messages operation, such as","ability to send messages, clear chat, leave group and so on. This operations","Can be held outside of the Group Info page.","","Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.","If default is TRUE then ONE == FALSE.","Bits:","0 - canSendMessage. Default is FALSE.","1 - canClear. Default is FALSE.","2 - canLeave. Default is FALSE.","3 - canDelete. Default is FALSE.","4 - canJoin. Default is FALSE.","5 - canViewInfo. Default is FALSE.","",{"type":"reference","argument":"id","category":"full","description":" group id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Access hash of group"},{"type":"reference","argument":"title","category":"full","description":" Title of group"},{"type":"reference","argument":"avatar","category":"compact","description":" Avatar of group"},{"type":"reference","argument":"membersCount","category":"full","description":" Number of members"},{"type":"reference","argument":"isHidden","category":"full","description":" Is group hidden (not showing it in recent list). Default is false."},{"type":"reference","argument":"isMember","category":"full","description":" Is current user a member of a group. Default is true."},{"type":"reference","argument":"groupType","category":"full","description":" Group Type. Used only for displaying information. Default is GROUP."},{"type":"reference","argument":"permissions","category":"full","description":" Permissions of group object"},{"type":"reference","argument":"isDeleted","category":"full","description":" Is this group deleted"},{"type":"reference","argument":"ext","category":"full","description":" Group extension Data"},{"type":"reference","argument":"isAdmin","category":"full","description":" [DEPRECATED] Is current user an admin of a group"},{"type":"reference","argument":"theme","category":"hidden","description":" [DEPRECATED] Theme of group"},{"type":"reference","argument":"about","category":"hidden","description":" [DEPRECATED] About of group"},{"type":"reference","argument":"creatorUid","category":"hidden","description":" [DEPRECATED] Group creator"},{"type":"reference","argument":"members","category":"compact","description":" [DEPRECATED] Members of group"},{"type":"reference","argument":"createDate","category":"full","description":" [DEPRECATED] Date of creation"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":4,"name":"avatar"} +,{"type":{"type":"opt","childType":"int32"},"id":24,"name":"membersCount"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isMember"} +,{"type":{"type":"opt","childType":"bool"},"id":20,"name":"isHidden"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"GroupType"}},"id":25,"name":"groupType"} +,{"type":{"type":"opt","childType":"int64"},"id":26,"name":"permissions"} +,{"type":{"type":"opt","childType":"bool"},"id":27,"name":"isDeleted"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":22,"name":"ext"} +,{"type":{"type":"opt","childType":"bool"},"id":16,"name":"isAdmin", "deprecated":"true"} +,{"type":{"type":"alias","childType":"userId"},"id":8,"name":"creatorUid", "deprecated":"true"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":9,"name":"members", "deprecated":"true"} +,{"type":{"type":"alias","childType":"date"},"id":10,"name":"createDate", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":17,"name":"theme", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":18,"name":"about", "deprecated":"true"} +]}}, { + "type":"struct", + "content": { + "name":"GroupFull", +"doc":[ +"Goup Full information","Permissions.","Idea of Group Full mermissions is about Group Info pages. This permissions","are usefull only when trying to view and update group settings and not related","to chat messages itself.","Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.","If default is TRUE then ONE == FALSE.","Bits:","0 - canEditInfo. Default is FALSE.","1 - canViewMembers. Default is FALSE.","2 - canInviteMembers. Default is FALSE.","3 - canInviteViaLink. Default is FALSE.","4 - canCall. Default is FALSE.","5 - canEditAdminSettings. Default is FALSE.","6 - canViewAdmins. Default is FALSE.","7 - canEditAdmins. Default is FALSE.","8 - canKickInvited. Default is FALSE.","9 - canKickAnyone. Default is FALSE.","10 - canEditForeign. Default is FALSE.","11 - canDeleteForeign. Default is FALSE.","",{"type":"reference","argument":"id","category":"full","description":" Group Id"},{"type":"reference","argument":"createDate","category":"full","description":" Date created"},{"type":"reference","argument":"ownerUid","category":"full","description":" Optional group owner"},{"type":"reference","argument":"members","category":"full","description":" Group members. Can be empty when isAsyncMembers enabled."},{"type":"reference","argument":"theme","category":"full","description":" Group Theme"},{"type":"reference","argument":"about","category":"full","description":" Group about"},{"type":"reference","argument":"isAsyncMembers","category":"full","description":" Is Members need to be loaded asynchronous. Default is false."},{"type":"reference","argument":"isSharedHistory","category":"full","description":" Is history shared among all users. Default is false."},{"type":"reference","argument":"shortName","category":"full","description":" Group's short name"},{"type":"reference","argument":"permissions","category":"full","description":" Group Permissions"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"id"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"createDate"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":5,"name":"ownerUid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":12,"name":"members"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"theme"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":7,"name":"ext"} +,{"type":{"type":"opt","childType":"bool"},"id":11,"name":"isAsyncMembers"} +,{"type":{"type":"opt","childType":"bool"},"id":10,"name":"isSharedHistory"} +,{"type":{"type":"opt","childType":"string"},"id":14,"name":"shortName"} +,{"type":{"type":"opt","childType":"int64"},"id":27,"name":"permissions"} +]}},{"type":"rpc","content":{ +"name":"LoadFullGroups", +"header":2782, +"response":{"type":"anonymous","header":2783, "doc":[ +{"type":"reference","argument":"groups","category":"compact","description":" Groups to load"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"GroupFull"}},"id":1,"name":"groups"} +]}, +"doc":[ +"Loading Full Groups",{"type":"reference","argument":"groups","category":"compact","description":"Groups to load"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} +]}},{"type":"rpc","content":{ +"name":"LoadMembers", +"header":2786, +"response":{"type":"anonymous","header":2787, "doc":[ +{"type":"reference","argument":"users","category":"full","description":" Group members"},{"type":"reference","argument":"next","category":"full","description":" Load more reference"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":3,"name":"members"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"next"} +]}, +"doc":[ +"Loading group members",{"type":"reference","argument":"group","category":"full","description":"Group peer"},{"type":"reference","argument":"limit","category":"full","description":"Limit members"},{"type":"reference","argument":"next","category":"full","description":"Load more reference"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"group"} +,{"type":"int32","id":2,"name":"limit"} +,{"type":{"type":"opt","childType":"bytes"},"id":3,"name":"next"} +]}},{"type":"comment","content":"Update"},{"type":"update","content":{ +"name":"GroupTitleChanged", +"header":2609, +"doc":[ +"Update about title changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"title","category":"full","description":" Group Title"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"string","id":2,"name":"title"} +]}},{"type":"update","content":{ +"name":"GroupAvatarChanged", +"header":2610, +"doc":[ +"Update about avatar changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"avatar","category":"full","description":" Group Avatar"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":2,"name":"avatar"} +]}},{"type":"update","content":{ +"name":"GroupTopicChanged", +"header":2616, +"doc":[ +"Update about topic changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"topic","category":"full","description":" Updated topic"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"topic"} +]}},{"type":"update","content":{ +"name":"GroupAboutChanged", +"header":2617, +"doc":[ +"Update about about changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"about","category":"full","description":" Updated about"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} +]}},{"type":"update","content":{ +"name":"GroupExtChanged", +"header":2613, +"doc":[ +"Update about ext changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"ext","category":"full","description":" Updated ext"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} +]}},{"type":"update","content":{ +"name":"GroupFullExtChanged", +"header":2618, +"doc":[ +"Update about full ext changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"ext","category":"full","description":" Updated ext"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} +]}},{"type":"update","content":{ +"name":"GroupShortNameChanged", +"header":2628, +"doc":[ +"Group's short name changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"shortName","category":"full","description":" Group short name"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"shortName"} +]}},{"type":"update","content":{ +"name":"GroupOwnerChanged", +"header":2619, +"doc":[ +"Update about owner changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"userId","category":"full","description":" New Owner"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"userId"} +]}},{"type":"update","content":{ +"name":"GroupHistoryShared", +"header":2620, +"doc":[ +"Update about history shared",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"update","content":{ +"name":"GroupDeleted", +"header":2658, +"doc":[ +"Update about group deleted",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"update","content":{ +"name":"GroupPermissionsChanged", +"header":2663, +"doc":[ +"Update about group permissions changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"permissions","category":"full","description":" New Permissions"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int64","id":2,"name":"permissions"} +]}},{"type":"update","content":{ +"name":"GroupFullPermissionsChanged", +"header":2664, +"doc":[ +"Update about Full Group permissions changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"permissions","category":"full","description":" New Permissions"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int64","id":2,"name":"permissions"} +]}},{"type":"comment","content":" "},{"type":"update","content":{ +"name":"GroupMemberChanged", +"header":2612, +"doc":[ +"Update about membership changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"isMember","category":"full","description":" Is current user a member"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"bool","id":2,"name":"isMember"} +]}},{"type":"update","content":{ +"name":"GroupMembersBecameAsync", +"header":2615, +"doc":[ +"Update about members became async",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"update","content":{ +"name":"GroupMembersUpdated", +"header":2614, +"doc":[ +"Update about members updated",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"members","category":"full","description":" Group Members"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":2,"name":"members"} +]}},{"type":"update","content":{ +"name":"GroupMemberDiff", +"header":2623, +"doc":[ +"Update about members changed",{"type":"reference","argument":"removedUsers","category":"full","description":" Removed Users"},{"type":"reference","argument":"addedMembers","category":"full","description":" Added members"},{"type":"reference","argument":"membersCount","category":"full","description":" Current Members count"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"removedUsers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":3,"name":"addedMembers"} +,{"type":"int32","id":4,"name":"membersCount"} +]}},{"type":"update","content":{ +"name":"GroupMembersCountChanged", +"header":2622, +"doc":[ +"Update about members count changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"membersCount","category":"full","description":" Members count"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int32","id":2,"name":"membersCount"} +]}},{"type":"update","content":{ +"name":"GroupMemberAdminChanged", +"header":2627, +"doc":[ +"Update about member admin changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"userId","category":"full","description":" User Id"},{"type":"reference","argument":"isAdmin","category":"full","description":" Is Admin flag"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"userId"} +,{"type":"bool","id":3,"name":"isAdmin"} +]}},{"type":"comment","content":"Actions"},{"type":"rpc","content":{ +"name":"CreateGroup", +"header":230, +"response":{"type":"anonymous","header":216, "doc":[ +"Created group",{"type":"reference","argument":"seq","category":"full","description":" Update Seq"},{"type":"reference","argument":"state","category":"compact","description":" Update state"},{"type":"reference","argument":"group","category":"full","description":" Created group"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"userPeers","category":"full","description":" Referenced users"},{"type":"reference","argument":"date","category":"full","description":" Group creation date"}] ,"attributes":[{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} +,{"type":{"type":"struct","childType":"Group"},"id":3,"name":"group"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userPeers"} +]}, +"doc":[ +"Creating group chat",{"type":"reference","argument":"rid","category":"full","description":"Random Id for avoiding double create"},{"type":"reference","argument":"title","category":"full","description":"Group Title"},{"type":"reference","argument":"users","category":"hidden","description":"Members of group"},{"type":"reference","argument":"groupType","category":"full","description":"Group Type"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"rid"} +,{"type":"string","id":2,"name":"title"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"GroupType"}},"id":6,"name":"groupType"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":7,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupTitle", +"header":85, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Changing group title",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"title","category":"full","description":"new group title"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupAvatar", +"header":86, +"response":{"type":"anonymous","header":115, "doc":[ +"Updated group avatar",{"type":"reference","argument":"avatar","category":"compact","description":" Changed avatar"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"},{"type":"reference","argument":"date","category":"full","description":" Avatar change date"}] ,"attributes":[{"type":{"type":"struct","childType":"Avatar"},"id":1,"name":"avatar"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}, +"doc":[ +"Changing group avatar",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"fileLocation","category":"compact","description":"uploaded file for avatar"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"struct","childType":"FileLocation"},"id":3,"name":"fileLocation"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"RemoveGroupAvatar", +"header":101, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Removing group avatar",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupShortName", +"header":2793, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Edit Group Short Name",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"shortName","category":"full","description":"New group's short name"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"shortName"} +]}},{"type":"rpc","content":{ +"name":"EditGroupTopic", +"header":211, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Edit group topic",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random id of operation"},{"type":"reference","argument":"topic","category":"full","description":"New Topic"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"topic"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":4,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupAbout", +"header":213, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Edit Group About",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random id of operation"},{"type":"reference","argument":"about","category":"full","description":"New About"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"InviteUser", +"header":69, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Inviting user to group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"user","category":"full","description":"Users for invitation"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":3,"name":"user"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LeaveGroup", +"header":70, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Leaving group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LeaveAndDelete", +"header":2721, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Leave group and Delete Chat",{"type":"reference","argument":"groupPeer","category":"full","description":"Group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"KickUser", +"header":71, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Kicking user from group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"user","category":"full","description":"users for removing"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":3,"name":"user"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"JoinGroupByPeer", +"header":2722, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Join group by peer",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"JoinGroupByGroupId", +"header":44561, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Join group by peer without a necessity of invite",{"type":"reference","argument":"groupId","category":"hidden","description":"Groups peer"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"comment","content":"Administration"},{"type":"rpc","content":{ +"name":"MakeUserAdmin", +"header":2784, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Make user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} +]}},{"type":"rpc","content":{ +"name":"DismissUserAdmin", +"header":2791, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Dismissing user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} +]}},{"type":"rpc","content":{ +"name":"TransferOwnership", +"header":2789, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Transfer ownership of group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"newOwner","category":"full","description":"New group's owner"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"newOwner"} +]}}, { + "type":"struct", + "content": { + "name":"AdminSettings", +"doc":[ +"Admin Settings",{"type":"reference","argument":"showAdminsToMembers","category":"full","description":" Show admins in member list"},{"type":"reference","argument":"canMembersInvite","category":"full","description":" Can members of a group invite people"},{"type":"reference","argument":"canMembersEditGroupInfo","category":"full","description":" Can members edit group info"},{"type":"reference","argument":"canAdminsEditGroupInfo","category":"full","description":" Can admins edit group info"},{"type":"reference","argument":"showJoinLeaveMessages","category":"full","description":" Should join and leave messages be visible to members"}],"expandable":"true","attributes":[ +{"type":"bool","id":1,"name":"showAdminsToMembers"} +,{"type":"bool","id":2,"name":"canMembersInvite"} +,{"type":"bool","id":3,"name":"canMembersEditGroupInfo"} +,{"type":"bool","id":4,"name":"canAdminsEditGroupInfo"} +,{"type":"bool","id":5,"name":"showJoinLeaveMessages"} +]}},{"type":"rpc","content":{ +"name":"LoadAdminSettings", +"header":2790, +"response":{"type":"anonymous","header":2794, "doc":[ +"Loaded settings",{"type":"reference","argument":"settings","category":"full","description":" Current group admin settings"}] ,"attributes":[{"type":{"type":"struct","childType":"AdminSettings"},"id":1,"name":"settings"} +]}, +"doc":[ +"Loading administration settings",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"SaveAdminSettings", +"header":2792, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Save administartion settings",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's Peer"},{"type":"reference","argument":"settings","category":"full","description":"Group's settings"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"AdminSettings"},"id":2,"name":"settings"} +]}},{"type":"rpc","content":{ +"name":"DeleteGroup", +"header":2795, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Delete Group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"ShareHistory", +"header":2796, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Share History",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"comment","content":"Invite"},{"type":"response","content":{ +"name":"InviteUrl", +"header":178, +"doc":[ +"Response for invite url methods"],"attributes":[ +{"type":"string","id":1,"name":"url"} +]}},{"type":"rpc","content":{ +"name":"GetGroupInviteUrl", +"header":177, +"response":{"type":"reference","name":"InviteUrl"}, +"doc":[ +"Building invite url",{"type":"reference","argument":"groupPeer","category":"full","description":"Destination group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"RevokeInviteUrl", +"header":179, +"response":{"type":"reference","name":"InviteUrl"}, +"doc":[ +"Revoking invite urls",{"type":"reference","argument":"groupPeer","category":"full","description":"Destination group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"JoinGroup", +"header":180, +"response":{"type":"anonymous","header":181, "doc":[ +{"type":"reference","argument":"group","category":"hidden","description":" Joined group"},{"type":"reference","argument":"users","category":"hidden","description":" Users from members"},{"type":"reference","argument":"userPeers","category":"hidden","description":" User Peers"},{"type":"reference","argument":"rid","category":"full","description":" Random id"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"hidden","description":" State"},{"type":"reference","argument":"date","category":"full","description":" Date of join"}] ,"attributes":[{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":5,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":7,"name":"userPeers"} +,{"type":{"type":"alias","childType":"randomId"},"id":6,"name":"rid"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}, +"doc":[ +"Join group method",{"type":"reference","argument":"token","category":"full","description":"Url or Token for joining to group"},{"type":"reference","argument":"optimizations","category":"hidden","description":"Enabled Optimizations"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"comment","content":"Obsolete Actions"},{"type":"rpc","content":{ +"name":"CreateGroupObsolete", +"header":65, +"response":{"type":"anonymous","header":66, "doc":[ +"Created group",{"type":"reference","argument":"groupPeer","category":"full","description":" Peer of created group"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"},{"type":"reference","argument":"users","category":"compact","description":" Members of created group"},{"type":"reference","argument":"date","category":"full","description":" Group creation date"}] ,"attributes":[{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":"int32","id":3,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":4,"name":"state"} +,{"type":{"type":"list","childType":"int32"},"id":5,"name":"users"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} +]}, +"doc":[ +"[OBSOLETE] Creating group chat",{"type":"reference","argument":"rid","category":"full","description":"Random Id for avoiding double create"},{"type":"reference","argument":"title","category":"full","description":"Title of new group"},{"type":"reference","argument":"users","category":"compact","description":"Members of new group"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"rid"} +,{"type":"string","id":2,"name":"title"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} +]}},{"type":"rpc","content":{ +"name":"EnterGroupObsolete", +"header":199, +"response":{"type":"anonymous","header":200, "doc":[ +"Joined group",{"type":"reference","argument":"group","category":"full","description":" Joined group"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"rid","category":"full","description":" Rid of join message"},{"type":"reference","argument":"seq","category":"full","description":" Seq of Update"},{"type":"reference","argument":"state","category":"full","description":" State of Update"},{"type":"reference","argument":"date","category":"full","description":" Date of update"}] ,"attributes":[{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"rid"} +,{"type":"int32","id":4,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":5,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} +]}, +"doc":[ +"[OBSOLETE] Join random group by peer id",{"type":"reference","argument":"peer","category":"full","description":"Public group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"MakeUserAdminObsolete", +"header":214, +"response":{"type":"anonymous","header":215, "doc":[ +{"type":"reference","argument":"members","category":"full","description":" new members"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":1,"name":"members"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +]}, +"doc":[ +"[OBSOLETE] Make user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} +]}},{"type":"comment","content":"Obsolete Updates"},{"type":"update","content":{ +"name":"GroupInviteObsolete", +"header":36, +"doc":[ +"Update about inviting current user to group",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"inviteUid","category":"full","description":" Inviter UID. If equals to current uid than group created by user."},{"type":"reference","argument":"date","category":"full","description":" Date of creating"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":9,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":5,"name":"inviteUid"} +,{"type":{"type":"alias","childType":"date"},"id":8,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupUserInvitedObsolete", +"header":21, +"doc":[ +"Update about inviting user to group",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Added user ID"},{"type":"reference","argument":"inviterUid","category":"full","description":" Inviter user ID"},{"type":"reference","argument":"date","category":"full","description":" Date of adding user to group"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"inviterUid"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupUserLeaveObsolete", +"header":23, +"doc":[ +"Update about leaving user",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" User's ID"},{"type":"reference","argument":"date","category":"full","description":" Date of user leave"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupUserKickObsolete", +"header":24, +"doc":[ +"Update about kicking user",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Kicked user's ID"},{"type":"reference","argument":"kickerUid","category":"full","description":" Kicker user's ID"},{"type":"reference","argument":"date","category":"full","description":" Date of user kick"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"kickerUid"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupMembersUpdateObsolete", +"header":44, +"doc":[ +"Silent group members update",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"members","category":"full","description":" New members list"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":2,"name":"members"} +]}},{"type":"update","content":{ +"name":"GroupTitleChangedObsolete", +"header":38, +"doc":[ +"Update about group title change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Changer UID"},{"type":"reference","argument":"title","category":"full","description":" New Title of group"},{"type":"reference","argument":"date","category":"full","description":" Date of title change"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupTopicChangedObsolete", +"header":213, +"doc":[ +"Update about group topic change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Changer UID"},{"type":"reference","argument":"topic","category":"full","description":" New topic of group"},{"type":"reference","argument":"date","category":"full","description":" Date of theme change"},{"type":"reference","argument":"rid","category":"full","description":" Randomd Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"topic"} +,{"type":{"type":"alias","childType":"date"},"id":5,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupAboutChangedObsolete", +"header":214, +"doc":[ +"Update about group about change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"about","category":"full","description":" Group about"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} +]}},{"type":"update","content":{ +"name":"GroupAvatarChangedObsolete", +"header":39, +"doc":[ +"Update about group avatar change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Avatar changer uid"},{"type":"reference","argument":"avatar","category":"compact","description":" New Avatar. If null then avatar is removed"},{"type":"reference","argument":"date","category":"full","description":" Date of avatar change"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":3,"name":"avatar"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}}]}, { + "title": "Stickers", + "package": "stickers", + "doc": [ + "Stickers support in Actor" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"StickerDescriptor", +"doc":[ +"Descriptor of a Sticker",{"type":"reference","argument":"id","category":"full","description":" Sticker unique id"},{"type":"reference","argument":"emoji","category":"full","description":" Emoji code for sticker"},{"type":"reference","argument":"image128","category":"full","description":" Image of sticker 128x128 in WebP format"},{"type":"reference","argument":"image512","category":"full","description":" Image of sticker 512x512 in WebP format"},{"type":"reference","argument":"image256","category":"full","description":" Image of sticker 256x256 in WebP format"}],"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"emoji"} +,{"type":{"type":"struct","childType":"ImageLocation"},"id":3,"name":"image128"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":4,"name":"image512"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":5,"name":"image256"} +]}}, { + "type":"struct", + "content": { + "name":"StickerCollection", +"doc":[ +"Sticker collection",{"type":"reference","argument":"id","category":"full","description":" Unique id of a collection"},{"type":"reference","argument":"accessHash","category":"full","description":" Access Hash of a collection"},{"type":"reference","argument":"stickers","category":"compact","description":" Sticker list"}],"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"StickerDescriptor"}},"id":3,"name":"stickers"} +]}},{"type":"response","content":{ +"name":"StickersReponse", +"header":240, +"doc":[ +"Stickers response",{"type":"reference","argument":"collections","category":"full","description":" Sticker collections"},{"type":"reference","argument":"seq","category":"full","description":" Seq of update"},{"type":"reference","argument":"state","category":"full","description":" State of update"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +]}},{"type":"rpc","content":{ +"name":"LoadOwnStickers", +"header":238, +"response":{"type":"anonymous","header":239, "doc":[ +"Own Stickers collections",{"type":"reference","argument":"ownStickers","category":"hidden","description":" Own sticker collections"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"ownStickers"} +]}, +"doc":[ +"Loading own stickers"],"attributes":[ +]}},{"type":"update","content":{ +"name":"OwnStickersChanged", +"header":161, +"doc":[ +"Own Stickers changed",{"type":"reference","argument":"collections","category":"compact","description":" New own sticker collections"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} +]}},{"type":"update","content":{ +"name":"StickerCollectionsChanged", +"header":164, +"doc":[ +"Sticker collection changed",{"type":"reference","argument":"collections","category":"full","description":" Updated sticker collections"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} +]}},{"type":"rpc","content":{ +"name":"AddStickerCollection", +"header":244, +"response":{"type":"reference","name":"StickersReponse"}, +"doc":[ +"Adding sticker collection",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"RemoveStickerCollection", +"header":245, +"response":{"type":"reference","name":"StickersReponse"}, +"doc":[ +"Removing sticker collection",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"LoadStickerCollection", +"header":246, +"response":{"type":"anonymous","header":247, "doc":[ +"Loaded collection",{"type":"reference","argument":"collection","category":"full","description":" Collection of stickers"}] ,"attributes":[{"type":{"type":"struct","childType":"StickerCollection"},"id":1,"name":"collection"} +]}, +"doc":[ +"Loading stickers",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}]}, { + "title": "Search", + "package": "search", + "doc": [ + "Searching API" + ], + "items": [ + { + "type": "enum", + "content": { + "name": "SearchPeerType", + "values": [ + { + "name": "Groups", + "id": 1 + }, + { + "name": "Contacts", + "id": 2 + }, + { + "name": "Public", + "id": 3 } - }, - "id": 1, - "name": "history" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" + ] + } + }, { + "type": "enum", + "content": { + "name": "SearchContentType", + "values": [ + { + "name": "Any", + "id": 1 + }, + { + "name": "Text", + "id": 2 + }, + { + "name": "Links", + "id": 3 + }, + { + "name": "Documents", + "id": 4 + }, + { + "name": "Photos", + "id": 5 } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" + ] + } + },{"type":"trait","content":{ +"isContainer":"true","name":"SearchCondition","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"SearchPeerTypeCondition", +"doc":[ +"Search peer type condition",{"type":"reference","argument":"peerType","category":"full","description":" Peer type for searching"}],"trait":{"name":"SearchCondition","key":1},"attributes":[ +{"type":{"type":"enum","childType":"SearchPeerType"},"id":1,"name":"peerType"} +]}}, { + "type":"struct", + "content": { + "name":"SearchPieceText", +"doc":[ +"Search peer name condition",{"type":"reference","argument":"query","category":"full","description":" Search query"}],"trait":{"name":"SearchCondition","key":2},"attributes":[ +{"type":"string","id":1,"name":"query"} +]}}, { + "type":"struct", + "content": { + "name":"SearchAndCondition", +"doc":[ +"Search AND condion",{"type":"reference","argument":"andQuery","category":"full","description":" And Query"}],"trait":{"name":"SearchCondition","key":3},"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":1,"name":"andQuery"} +]}}, { + "type":"struct", + "content": { + "name":"SearchOrCondition", +"doc":[ +"Search OR condition",{"type":"reference","argument":"orQuery","category":"full","description":" Or Query"}],"trait":{"name":"SearchCondition","key":4},"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":2,"name":"orQuery"} +]}}, { + "type":"struct", + "content": { + "name":"SearchPeerCondition", +"doc":[ +"Serch Peer condition",{"type":"reference","argument":"peer","category":"full","description":" Peer condition"}],"trait":{"name":"SearchCondition","key":5},"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}}, { + "type":"struct", + "content": { + "name":"SearchPeerContentType", +"doc":[ +"Search content type condition",{"type":"reference","argument":"contentType","category":"full","description":" Content Type"}],"trait":{"name":"SearchCondition","key":6},"attributes":[ +{"type":{"type":"enum","childType":"SearchContentType"},"id":1,"name":"contentType"} +]}}, { + "type":"struct", + "content": { + "name":"SearchSenderIdConfition", +"doc":[ +"Searching sender uid condition",{"type":"reference","argument":"senderId","category":"full","description":" sender UID"}],"trait":{"name":"SearchCondition","key":7},"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"senderId"} +]}}, { + "type":"struct", + "content": { + "name":"PeerSearchResult", +"doc":[ +"Peer search result",{"type":"reference","argument":"peer","category":"full","description":" Peer information"},{"type":"reference","argument":"optMatchString","category":"full","description":" Description"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"optMatchString"} +]}},{"type":"rpc","content":{ +"name":"PeerSearch", +"header":233, +"response":{"type":"anonymous","header":234, "doc":[ +"Found peers",{"type":"reference","argument":"searchResults","category":"full","description":" Search Results"},{"type":"reference","argument":"users","category":"full","description":" Related users"},{"type":"reference","argument":"groups","category":"full","description":" Related groups"},{"type":"reference","argument":"userPeers","category":"full","description":" Related user peers"},{"type":"reference","argument":"groupPeers","category":"full","description":" Related group peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"PeerSearchResult"}},"id":1,"name":"searchResults"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":5,"name":"groupPeers"} +]}, +"doc":[ +"Performing peer search",{"type":"reference","argument":"query","category":"full","description":"Search query. Warring not all combinations can be processed by server. (acts as OR)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":1,"name":"query"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}}, { + "type":"struct", + "content": { + "name":"MessageSearchResult", +"doc":[ +"Message container",{"type":"reference","argument":"peer","category":"full","description":" Message Peer"},{"type":"reference","argument":"rid","category":"full","description":" Message Random Id"},{"type":"reference","argument":"date","category":"full","description":" Message Date"},{"type":"reference","argument":"senderId","category":"full","description":" Message sender UID"},{"type":"reference","argument":"content","category":"full","description":" Message content"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"alias","childType":"userId"},"id":4,"name":"senderId"} +,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"content"} +]}}, { + "type":"struct", + "content": { + "name":"MessageSearchItem", +"doc":[ +"Message Search result container"],"attributes":[ +{"type":{"type":"struct","childType":"MessageSearchResult"},"id":1,"name":"result"} +]}},{"type":"response","content":{ +"name":"MessageSearchResponse", +"header":218, +"doc":[ +"Search Result",{"type":"reference","argument":"searchResults","category":"full","description":" Search results"},{"type":"reference","argument":"users","category":"full","description":" Search users"},{"type":"reference","argument":"groups","category":"full","description":" Search groups"},{"type":"reference","argument":"loadMoreState","category":"hidden","description":" State for loading more results"},{"type":"reference","argument":"userOutPeers","category":"full","description":" Search user peers"},{"type":"reference","argument":"groupOutPeers","category":"full","description":" Search group peers"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"MessageSearchItem"}},"id":1,"name":"searchResults"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} +,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"loadMoreState"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userOutPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupOutPeers"} +]}},{"type":"rpc","content":{ +"name":"MessageSearch", +"header":217, +"response":{"type":"reference","name":"MessageSearchResponse"}, +"doc":[ +"Performing message search",{"type":"reference","argument":"query","category":"full","description":"Search query"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"trait","childType":"SearchCondition"},"id":1,"name":"query"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"MessageSearchMore", +"header":222, +"response":{"type":"reference","name":"MessageSearchResponse"}, +"doc":[ +"Performing message search paging",{"type":"reference","argument":"loadMoreState","category":"hidden","description":"State for loading more results"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":"bytes","id":1,"name":"loadMoreState"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}}]}, { + "title": "Public Groups", + "package": "pubgroups", + "doc": [ + "Public group is easy way to find communities" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"PublicGroup", +"doc":[ +"Public Group description",{"type":"reference","argument":"id","category":"full","description":" Group id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Group Access hash"},{"type":"reference","argument":"title","category":"full","description":" Group title"},{"type":"reference","argument":"avatar","category":"full","description":" Group avatar"},{"type":"reference","argument":"membersCount","category":"full","description":" Members count in group"},{"type":"reference","argument":"friendsCount","category":"full","description":" Friends count int group"},{"type":"reference","argument":"description","category":"full","description":" Description of group"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":7,"name":"avatar"} +,{"type":"int32","id":4,"name":"membersCount"} +,{"type":"int32","id":5,"name":"friendsCount"} +,{"type":"string","id":6,"name":"description"} +]}},{"type":"rpc","content":{ +"name":"GetPublicGroups", +"header":201, +"response":{"type":"anonymous","header":202, "doc":[ +"Loaded public groups",{"type":"reference","argument":"groups","category":"full","description":" All available groups"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"PublicGroup"}},"id":1,"name":"groups"} +]}, +"doc":[ +"Getting public groups"],"attributes":[ +]}}]}, { + "title": "Invites", + "package": "invites", + "doc": [ + "Invite mechanizm" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"InviteState", +"doc":[ +"Invite state",{"type":"reference","argument":"email","category":"full","description":" Email of invite"},{"type":"reference","argument":"name","category":"full","description":" Name of invited user"},{"type":"reference","argument":"uid","category":"full","description":" Uid of registered user"},{"type":"reference","argument":"tid","category":"full","description":" Team id of invite"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +,{"type":{"type":"opt","childType":"int32"},"id":3,"name":"uid"} +,{"type":{"type":"opt","childType":"int32"},"id":4,"name":"tid"} +]}},{"type":"response","content":{ +"name":"InviteList", +"header":2564, +"doc":[ +"Intites list",{"type":"reference","argument":"invites","category":"full","description":" Intvites"},{"type":"reference","argument":"relatedUsers","category":"full","description":" Related users in invites"},{"type":"reference","argument":"relatedGroups","category":"full","description":" Related groups in invites"},{"type":"reference","argument":"relatedTeams","category":"full","description":" Related teams in invites"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"InviteState"}},"id":1,"name":"invites"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"relatedUsers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"relatedGroups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":4,"name":"relatedTeams"} +]}},{"type":"rpc","content":{ +"name":"LoadOwnSentInvites", +"header":2563, +"response":{"type":"reference","name":"InviteList"}, +"doc":[ +"Loading current invite states"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"SendInvite", +"header":2565, +"response":{"type":"reference","name":"InviteList"}, +"doc":[ +"Sending an email invite",{"type":"reference","argument":"email","category":"full","description":"Email for invite"},{"type":"reference","argument":"name","category":"full","description":"Optional name for invite"},{"type":"reference","argument":"destTeam","category":"full","description":"Optional team for invite"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"OutTeam"}},"id":3,"name":"destTeam"} +]}}]}, { + "title": "Teams", + "package": "teams", + "doc": [ + "Teams support for Actor" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Team", +"doc":[ +"Team entity",{"type":"reference","argument":"id","category":"full","description":" Team Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Team Access Hash"},{"type":"reference","argument":"name","category":"full","description":" Team name"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"name"} +]}}, { + "type":"struct", + "content": { + "name":"OutTeam", +"doc":[ +"Reference to a team",{"type":"reference","argument":"id","category":"full","description":" Team Id"},{"type":"reference","argument":"accessHash","category":"full","description":" Team access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"response","content":{ +"name":"TeamsList", +"header":2562, +"doc":[ +"Teams response",{"type":"reference","argument":"teams","category":"hidden","description":" Teams list"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":1,"name":"teams"} +]}},{"type":"rpc","content":{ +"name":"LoadOwnTeams", +"header":2561, +"response":{"type":"reference","name":"TeamsList"}, +"doc":[ +"Loading own teams"],"attributes":[ +]}},{"type":"update","content":{ +"name":"OwnTeamsChanged", +"header":165, +"doc":[ +"Update about own teams changed",{"type":"reference","argument":"ownTeams","category":"full","description":" Updated own teams list"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":1,"name":"ownTeams"} +]}},{"type":"rpc","content":{ +"name":"CreateTeam", +"header":2566, +"response":{"type":"anonymous","header":2567, "doc":[ +"Created team response",{"type":"reference","argument":"createdTeam","category":"full","description":" Created Team"}] ,"attributes":[{"type":{"type":"struct","childType":"Team"},"id":1,"name":"createdTeam"} +]}, +"doc":[ +"Creation of a Team",{"type":"reference","argument":"title","category":"full","description":"Title of a team"}],"attributes":[ +{"type":"string","id":1,"name":"title"} +]}},{"type":"rpc","content":{ +"name":"InviteToTeam", +"header":2568, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Inviting people to team",{"type":"reference","argument":"user","category":"full","description":"Dest user"},{"type":"reference","argument":"destTeam","category":"full","description":"Dest team"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"user"} +,{"type":{"type":"struct","childType":"OutTeam"},"id":3,"name":"destTeam"} +]}}]}, { + "title": "Integrations", + "package": "integrations", + "doc": [ + "Package contains methods for providing integration" + ], + "items": [ +{"type":"response","content":{ +"name":"IntegrationToken", +"header":183, +"doc":[ +"Group token response",{"type":"reference","argument":"token","category":"danger","description":" current group token"},{"type":"reference","argument":"url","category":"danger","description":" current group url"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +,{"type":"string","id":2,"name":"url"} +]}},{"type":"rpc","content":{ +"name":"GetIntegrationToken", +"header":182, +"response":{"type":"reference","name":"IntegrationToken"}, +"doc":[ +"Getting current group token",{"type":"reference","argument":"groupPeer","category":"full","description":"Peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"RevokeIntegrationToken", +"header":184, +"response":{"type":"reference","name":"IntegrationToken"}, +"doc":[ +"Revoke group token",{"type":"reference","argument":"groupPeer","category":"full","description":"Peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"groupPeer"} +]}}]}, { + "title": "Typing and Online", + "package": "weak", + "items": [ + { + "type": "enum", + "content": { + "name": "TypingType", + "values": [ + { + "name": "Text", + "id": 0 } - }, - "id": 4, - "name": "userPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" + ] + } + },{"type":"rpc","content":{ +"name":"Typing", +"header":27, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Sending typing notification",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"typingType","category":"full","description":"typing type."}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} +]}},{"type":"rpc","content":{ +"name":"StopTyping", +"header":30, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Stop typing",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"typingType","category":"full","description":"typing type"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"enum","childType":"TypingType"},"id":2,"name":"typingType"} +]}}, { + "type": "enum", + "content": { + "name": "DeviceType", + "values": [ + { + "name": "GENERIC", + "id": 1 + }, + { + "name": "PC", + "id": 2 + }, + { + "name": "MOBILE", + "id": 3 + }, + { + "name": "TABLET", + "id": 4 + }, + { + "name": "WATCH", + "id": 5 + }, + { + "name": "MIRROR", + "id": 6 + }, + { + "name": "CAR", + "id": 7 + }, + { + "name": "TABLE", + "id": 8 } - }, - "id": 5, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" + ] + } + },{"type":"rpc","content":{ +"name":"SetOnline", +"header":29, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Sending online state",{"type":"reference","argument":"isOnline","category":"full","description":"is user online"},{"type":"reference","argument":"timeout","category":"full","description":"timeout of online state in milliseconds"},{"type":"reference","argument":"deviceType","category":"full","description":"Optional device type"},{"type":"reference","argument":"deviceCategory","category":"full","description":"Optional device category, for example android or ios"}],"attributes":[ +{"type":"bool","id":1,"name":"isOnline"} +,{"type":{"type":"alias","childType":"msec"},"id":2,"name":"timeout"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":3,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"PauseNotifications", +"header":166, +"doc":[ +"Update about pausing notifications",{"type":"reference","argument":"timeout","category":"full","description":" Timeout for notifications resume"}],"attributes":[ +{"type":{"type":"alias","childType":"sec"},"id":1,"name":"timeout"} +]}},{"type":"update","content":{ +"name":"RestoreNotifications", +"header":167, +"doc":[ +"Update about restoring notifications"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"PauseNotifications", +"header":2641, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Pause notifications",{"type":"reference","argument":"timeout","category":"hidden","description":"Timeout of pause"}],"attributes":[ +{"type":{"type":"alias","childType":"sec"},"id":1,"name":"timeout"} +]}},{"type":"rpc","content":{ +"name":"RestoreNotifications", +"header":2642, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Restoring notifications"],"attributes":[ +]}},{"type":"empty"},{"type":"update","content":{ +"name":"Typing", +"header":6, +"doc":[ +"Update about user's typing",{"type":"reference","argument":"peer","category":"full","description":" Conversation peer"},{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"typingType","category":"full","description":" Type of typing"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} +]}},{"type":"update","content":{ +"name":"TypingStop", +"header":81, +"doc":[ +"Update about user's typing stop",{"type":"reference","argument":"peer","category":"full","description":" Conversation peer"},{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"typingType","category":"hidden","description":" Type of typing"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} +]}},{"type":"update","content":{ +"name":"UserOnline", +"header":7, +"doc":[ +"Update about user became online",{"type":"reference","argument":"uid","category":"full","description":" User's Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":2,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"UserOffline", +"header":8, +"doc":[ +"Update about user became offline",{"type":"reference","argument":"uid","category":"full","description":" User's id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":2,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"UserLastSeen", +"header":9, +"doc":[ +"Update about user's last seen state",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"date","category":"full","description":" Last seen time"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"date"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":3,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"GroupOnline", +"header":33, +"doc":[ +"Update about group online change",{"type":"reference","argument":"groupId","category":"full","description":" Group id"},{"type":"reference","argument":"count","category":"full","description":" current online user's count"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int32","id":2,"name":"count"} +]}}]}, { + "title": "Media and Files", + "package": "files", + "items": [ + { + "type":"struct", + "content": { + "name":"FileLocation", +"doc":[ +"Location of file on server",{"type":"reference","argument":"fileId","category":"full","description":" Unique Id of file"},{"type":"reference","argument":"accessHash","category":"danger","description":" Access hash of file"}],"expandable":"true","attributes":[ +{"type":"int64","id":1,"name":"fileId"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}, { + "type":"struct", + "content": { + "name":"ImageLocation", +"doc":[ +"Image location",{"type":"reference","argument":"fileLocation","category":"full","description":" Location of file"},{"type":"reference","argument":"width","category":"full","description":" Width of avatar image"},{"type":"reference","argument":"height","category":"full","description":" Height of avatar image"},{"type":"reference","argument":"fileSize","category":"full","description":" Size of file"}],"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} +,{"type":"int32","id":2,"name":"width"} +,{"type":"int32","id":3,"name":"height"} +,{"type":"int32","id":4,"name":"fileSize"} +]}}, { + "type":"struct", + "content": { + "name":"AvatarImage", +"doc":[ +"Avatar Image",{"type":"reference","argument":"fileLocation","category":"full","description":" Location of file"},{"type":"reference","argument":"width","category":"full","description":" Width of avatar image"},{"type":"reference","argument":"height","category":"full","description":" Height of avatar image"},{"type":"reference","argument":"fileSize","category":"full","description":" Size of file"}],"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} +,{"type":"int32","id":2,"name":"width"} +,{"type":"int32","id":3,"name":"height"} +,{"type":"int32","id":4,"name":"fileSize"} +]}}, { + "type":"struct", + "content": { + "name":"Avatar", +"doc":[ +"Avatar of User or Group",{"type":"reference","argument":"smallImage","category":"compact","description":" Optional small image of avatar box in 100x100"},{"type":"reference","argument":"largeImage","category":"compact","description":" Optional large image of avatar box in 200x200"},{"type":"reference","argument":"fullImage","category":"compact","description":" Optional full screen image of avatar"}],"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":1,"name":"smallImage"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":2,"name":"largeImage"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":3,"name":"fullImage"} +]}}, { + "type":"struct", + "content": { + "name":"FastThumb", +"doc":[ +"Fast thumb of media messages. Less than 90x90 and compressed by JPEG with low quality",{"type":"reference","argument":"w","category":"full","description":" Width of thumb"},{"type":"reference","argument":"h","category":"full","description":" Height of thump"},{"type":"reference","argument":"thumb","category":"compact","description":" compressed image data"}],"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"bytes","id":3,"name":"thumb"} +]}}, { + "type": "enum", + "content": { + "name": "Colors", + "values": [ + { + "name": "red", + "id": 1 + }, + { + "name": "yellow", + "id": 2 + }, + { + "name": "green", + "id": 3 } - }, - "id": 6, - "name": "groupPeers" - }] - }, - "doc": [ - "Loading history of chat", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer of conversation" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": "start date of messages for loading or 0 for loading from start" - }, { - "type": "reference", - "argument": "loadMode", - "category": "full", - "description": "Loading mode: Forward loading, backward or both ways" - }, { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "maximum amount of messages (max is 100)" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "ListLoadMode" - } - }, - "id": 5, - "name": "loadMode" - }, { - "type": "int32", - "id": 4, - "name": "limit" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 6, - "name": "optimizations" - }] - } - }, { - "type": "struct", - "content": { - "name": "Dialog", - "doc": [ - "Conversation from history", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer of conversation" - }, { - "type": "reference", - "argument": "unreadCount", - "category": "full", - "description": " plain messages unread messages count" - }, { - "type": "reference", - "argument": "sortDate", - "category": "full", - "description": " date of conversation for sorting" - }, { - "type": "reference", - "argument": "senderUid", - "category": "full", - "description": " Sender of top message (may be zero)" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random ID of top message (may be zero)" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of top message (can't be zero)" - }, { - "type": "reference", - "argument": "message", - "category": "full", - "description": " Content of message" - }, { - "type": "reference", - "argument": "firstUnreadDate", - "category": "full", - "description": " Date of first unread message" - }, { - "type": "reference", - "argument": "attributes", - "category": "full", - "description": " Optional top message attributes" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": "int32", - "id": 3, - "name": "unreadCount" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "sortDate" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 5, - "name": "senderUid" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 6, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 7, - "name": "date" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 8, - "name": "message" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "MessageState" - } - }, - "id": 9, - "name": "state" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "date" - } - }, - "id": 10, - "name": "firstUnreadDate" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageAttributes" - } - }, - "id": 11, - "name": "attributes" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadDialogs", - "header": 104, - "response": { - "type": "anonymous", - "header": 105, - "doc": [ - "Loaded dialogs", { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Loaded groups" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - }, { - "type": "reference", - "argument": "dialogs", - "category": "compact", - "description": " Loaded dialogs" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" + ] + } + },{"type":"trait","content":{ +"isContainer":"true","name":"Color","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"RgbColor", +"doc":[ +"RGB Color",{"type":"reference","argument":"rgb","category":"full","description":" RGB color value"}],"trait":{"name":"Color","key":1},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"rgb"} +]}}, { + "type":"struct", + "content": { + "name":"PredefinedColor", +"doc":[ +"Predefined color",{"type":"reference","argument":"color","category":"hidden","description":" Predefined color value"}],"trait":{"name":"Color","key":2},"expandable":"true","attributes":[ +{"type":{"type":"enum","childType":"Colors"},"id":1,"name":"color"} +]}},{"type":"empty"}, { + "type":"struct", + "content": { + "name":"HTTPHeader", +"doc":[ +"HTTP Header record",{"type":"reference","argument":"key","category":"full","description":" HTTP Header name"},{"type":"reference","argument":"value","category":"full","description":" HTTP Header value"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":"string","id":2,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"FileUrlDescription", +"doc":[ +"File url description",{"type":"reference","argument":"fileId","category":"full","description":" File id of url"},{"type":"reference","argument":"url","category":"full","description":" Url for downloading"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url"},{"type":"reference","argument":"unsignedUrl","category":"hidden","description":" Unsigned URL (used to honor web caches)"},{"type":"reference","argument":"unsignedUrlHeaders","category":"hidden","description":" Headers that is required to download files with unsigned url"}],"attributes":[ +{"type":"int64","id":1,"name":"fileId"} +,{"type":"string","id":2,"name":"url"} +,{"type":{"type":"alias","childType":"sec"},"id":3,"name":"timeout"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"unsignedUrl"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"HTTPHeader"}},"id":5,"name":"unsignedUrlHeaders"} +]}},{"type":"rpc","content":{ +"name":"GetFileUrl", +"header":77, +"response":{"type":"anonymous","header":78, "doc":[ +{"type":"reference","argument":"url","category":"full","description":" Url for downloading"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url"},{"type":"reference","argument":"unsignedUrl","category":"full","description":" Unsigned URL (used to honor web caches)"},{"type":"reference","argument":"unsignedUrlHeaders","category":"full","description":" Headers that is required to download files with unsigned url"}] ,"attributes":[{"type":"string","id":1,"name":"url"} +,{"type":{"type":"alias","childType":"sec"},"id":2,"name":"timeout"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"unsignedUrl"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"HTTPHeader"}},"id":4,"name":"unsignedUrlHeaders"} +]}, +"doc":[ +"Requesting file URL for downloading",{"type":"reference","argument":"file","category":"full","description":"file's location"}],"attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"file"} +]}},{"type":"rpc","content":{ +"name":"GetFileUrls", +"header":2573, +"response":{"type":"anonymous","header":2574, "doc":[ +{"type":"reference","argument":"fileUrls","category":"full","description":" File urls"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"FileUrlDescription"}},"id":1,"name":"fileUrls"} +]}, +"doc":[ +"Requesting multiple fle URL for downloading",{"type":"reference","argument":"files","category":"hidden","description":"File locations to load urls"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"FileLocation"}},"id":1,"name":"files"} +]}},{"type":"rpc","content":{ +"name":"GetFileUrlBuilder", +"header":2579, +"response":{"type":"anonymous","header":2580, "doc":[ +{"type":"reference","argument":"baseUrl","category":"full","description":" Base Url for files"},{"type":"reference","argument":"algo","category":"full","description":" Signature algorithm"},{"type":"reference","argument":"seed","category":"full","description":" Public-visible seed of signature"},{"type":"reference","argument":"signatureSecret","category":"full","description":" Signature Secret"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url builder"}] ,"attributes":[{"type":"string","id":1,"name":"baseUrl"} +,{"type":"string","id":2,"name":"algo"} +,{"type":"string","id":5,"name":"seed"} +,{"type":"bytes","id":3,"name":"signatureSecret"} +,{"type":{"type":"alias","childType":"sec"},"id":4,"name":"timeout"} +]}, +"doc":[ +"Get File URL Builder that allows to build file urls from client side",{"type":"reference","argument":"supportedSignatureAlgorithms","category":"hidden","description":"Supported signature algorithms by client"}],"attributes":[ +{"type":{"type":"list","childType":"string"},"id":1,"name":"supportedSignatureAlgorithms"} +]}},{"type":"rpc","content":{ +"name":"GetFileUploadUrl", +"header":97, +"response":{"type":"anonymous","header":121, "doc":[ +{"type":"reference","argument":"url","category":"full","description":" Url for uploading"},{"type":"reference","argument":"uploadKey","category":"compact","description":" Upload key for upload"}] ,"attributes":[{"type":"string","id":1,"name":"url"} +,{"type":"bytes","id":2,"name":"uploadKey"} +]}, +"doc":[ +"Requesting pload url",{"type":"reference","argument":"expectedSize","category":"full","description":"Expected size of uploading file. May be inaccurate. Used for size allocation optimizations."}],"attributes":[ +{"type":"int32","id":1,"name":"expectedSize"} +]}},{"type":"rpc","content":{ +"name":"CommitFileUpload", +"header":122, +"response":{"type":"anonymous","header":138, "doc":[ +{"type":"reference","argument":"uploadedFileLocation","category":"hidden","description":" Result file location"}] ,"attributes":[{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"uploadedFileLocation"} +]}, +"doc":[ +"Comminting uploaded file to storage"],"attributes":[ +{"type":"bytes","id":1,"name":"uploadKey"} +,{"type":"string","id":2,"name":"fileName"} +]}},{"type":"rpc","content":{ +"name":"GetFileUploadPartUrl", +"header":142, +"response":{"type":"anonymous","header":141, "doc":[ +{"type":"reference","argument":"url","category":"full","description":" Upload file part url"}] ,"attributes":[{"type":"string","id":1,"name":"url"} +]}, +"doc":[ +"Upload file part",{"type":"reference","argument":"uploadKey","category":"compact","description":"Upload Key from requestFileUploadUrl"}],"attributes":[ +{"type":"int32","id":1,"name":"partNumber"} +,{"type":"int32","id":2,"name":"partSize"} +,{"type":"bytes","id":3,"name":"uploadKey"} +]}}]}, { + "title": "Features", + "package": "features", + "doc": [ + "Enable feature discovery. Currently available features:", + "* \"call\" - private audio calls" + ], + "items": [ +{"type":"rpc","content":{ +"name":"EnableFeature", +"header":2588, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Enabling feature on the device",{"type":"reference","argument":"featureName","category":"full","description":"Feature name"},{"type":"reference","argument":"args","category":"danger","description":"Optional arguments to a feature"}],"attributes":[ +{"type":"string","id":1,"name":"featureName"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"args"} +]}},{"type":"rpc","content":{ +"name":"DisableFeature", +"header":2589, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Disabling feature on the device",{"type":"reference","argument":"featureName","category":"full","description":"Feature name"}],"attributes":[ +{"type":"string","id":1,"name":"featureName"} +]}},{"type":"rpc","content":{ +"name":"CheckFeatureEnabled", +"header":2590, +"response":{"type":"reference","name":"Bool"}, +"doc":[ +"Method for checking if feature is available to user"],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userOutPeer"} +,{"type":"string","id":2,"name":"featureName"} +]}}]}, { + "title": "EventBus", + "package": "eventbus", + "items": [ +{"type":"rpc","content":{ +"name":"CreateNewEventBus", +"header":2665, +"response":{"type":"anonymous","header":2666, "doc":[ +"Created new Event Bus",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Your Device Id"}] ,"attributes":[{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"deviceId"} +]}, +"doc":[ +"Create new Event Bus",{"type":"reference","argument":"timeout","category":"full","description":"Optional timeout of Event Bus"},{"type":"reference","argument":"isOwned","category":"full","description":"Is Event Bus owned by creator"}],"attributes":[ +{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":1,"name":"timeout"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isOwned"} +]}},{"type":"rpc","content":{ +"name":"JoinEventBus", +"header":2668, +"response":{"type":"anonymous","header":2669, "doc":[ +{"type":"reference","argument":"deviceId","category":"full","description":" Your Device Id"},{"type":"reference","argument":"rejoinToken","category":"full","description":" Token that can be used for rejoining event bus with same device id"}] ,"attributes":[{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"deviceId"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"rejoinToken"} +]}, +"doc":[ +"Joining Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"timeout","category":"full","description":"Join timeout"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} +]}},{"type":"rpc","content":{ +"name":"ReJoinEventBus", +"header":2675, +"response":{"type":"anonymous","header":2676, "doc":[ +{"type":"reference","argument":"deviceId","category":"hidden","description":" Your Device Id"}] ,"attributes":[{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"deviceId"} +]}, +"doc":[ +"Rejoining to event bus after session was disposed",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"rejoinToken","category":"full","description":"Rejoin Token"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":"bytes","id":2,"name":"rejoinToken"} +]}},{"type":"rpc","content":{ +"name":"KeepAliveEventBus", +"header":2670, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Keep Alive Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"timeout","category":"full","description":"Optional timeout for keep alive"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} +]}},{"type":"rpc","content":{ +"name":"DisposeEventBus", +"header":2667, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Dispose Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +]}},{"type":"rpc","content":{ +"name":"PostToEventBus", +"header":2671, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Event Bus Destination",{"type":"reference","argument":"id","category":"full","description":"Bus Id"},{"type":"reference","argument":"destinations","category":"full","description":"If Empty need to broadcase message to everyone"},{"type":"reference","argument":"message","category":"hidden","description":"Message"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"destinations"} +,{"type":"bytes","id":3,"name":"message"} +]}},{"type":"update","content":{ +"name":"EventBusDeviceConnected", +"header":2561, +"doc":[ +"Update about pubsub device connected",{"type":"reference","argument":"id","category":"full","description":" ID of Event Bus"},{"type":"reference","argument":"userId","category":"full","description":" Joined User Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Joined Device Unique Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"userId"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} +]}},{"type":"update","content":{ +"name":"EventBusDeviceDisconnected", +"header":2563, +"doc":[ +"Update about device disconnected",{"type":"reference","argument":"id","category":"full","description":" ID of Event Bus"},{"type":"reference","argument":"userId","category":"full","description":" Joined User Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Disconnected Device unique Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"userId"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} +]}},{"type":"update","content":{ +"name":"EventBusMessage", +"header":2562, +"doc":[ +"Event Bus Message",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"senderId","category":"full","description":" Sender of message"},{"type":"reference","argument":"senderDeviceId","category":"full","description":" Device Id of sender"},{"type":"reference","argument":"message","category":"hidden","description":" Message"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"senderId"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"randomId"}},"id":3,"name":"senderDeviceId"} +,{"type":"bytes","id":4,"name":"message"} +]}},{"type":"update","content":{ +"name":"EventBusDisposed", +"header":2564, +"doc":[ +"Event Bus dispose",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +]}}]}, { + "title": "Values", + "package": "values", + "doc": [ + "Synced Values" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"SyncedValue", +"doc":[ +"Synced Value container",{"type":"reference","argument":"id","category":"full","description":" Unique Id of a value. Unique in the scope of one named value."},{"type":"reference","argument":"value","category":"full","description":" Optional value"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"value"} +]}},{"type":"rpc","content":{ +"name":"LoadSyncedSet", +"header":2679, +"response":{"type":"anonymous","header":2680, "doc":[ +{"type":"reference","argument":"values","category":"full","description":" Current set values"},{"type":"reference","argument":"isStrong","category":"full","description":" Is this value strong and stored in sequence. By default is true."}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":1,"name":"values"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isStrong"} +]}, +"doc":[ +"Loading synced set",{"type":"reference","argument":"setName","category":"hidden","description":"readable name of the set"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +]}},{"type":"update","content":{ +"name":"SynedSetUpdated", +"header":72, +"doc":[ +"Update about synced set update",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"syncedValues","category":"full","description":" Current set values"},{"type":"reference","argument":"isStrong","category":"full","description":" Is this value strong and need to be stored on disk"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":2,"name":"syncedValues"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isStrong"} +]}},{"type":"update","content":{ +"name":"SyncedSetAddedOrUpdated", +"header":73, +"doc":[ +"Update about added or updated values in the synced set",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"addedOrUpdatedValues","category":"hidden","description":" Added or updated values"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":2,"name":"addedOrUpdatedValues"} +]}},{"type":"update","content":{ +"name":"SyncedSetRemoved", +"header":74, +"doc":[ +"Update about removed items from synced set",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"removedItems","category":"full","description":" Removed Items from the set"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"removedItems"} +]}}]}, { + "title": "WebRTC", + "package": "webrtc", + "doc": [ + "WebRTC package that enables support to audio and video calls" + ], + "items": [ +{"type":"update","content":{ +"name":"IncomingCall", +"header":52, +"doc":[ +"Update about incoming call (Sent every 10 seconds)",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"attemptIndex","category":"full","description":" Optional attempt Index"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"opt","childType":"int32"},"id":2,"name":"attemptIndex"} +]}},{"type":"update","content":{ +"name":"CallHandled", +"header":53, +"doc":[ +"Update about incoming call handled",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"attemptIndex","category":"full","description":" Optional attempt Index"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"opt","childType":"int32"},"id":2,"name":"attemptIndex"} +]}},{"type":"update","content":{ +"name":"CallUpgraded", +"header":56, +"doc":[ +"Update about call moved to other peer",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"groupId","category":"full","description":" Upgraded group id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupId"} +]}},{"type":"rpc","content":{ +"name":"GetCallInfo", +"header":2600, +"response":{"type":"anonymous","header":2606, "doc":[ +{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"groups","category":"compact","description":" Groups"},{"type":"reference","argument":"users","category":"compact","description":" Users"},{"type":"reference","argument":"eventBusId","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"isAudioOnlyCall","category":"full","description":" Is Audio Only Call. Default is true"},{"type":"reference","argument":"isVideoOnlyCall","category":"full","description":" Is Video Only Call. Default is false."},{"type":"reference","argument":"isVideoPreferred","category":"full","description":" Is Video preferred"}] ,"attributes":[{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":2,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} +,{"type":{"type":"alias","childType":"busId"},"id":4,"name":"eventBusId"} +,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"isAudioOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isVideoOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":7,"name":"isVideoPreferred"} +]}, +"doc":[ +"Getting Call Information",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +]}},{"type":"rpc","content":{ +"name":"DoCall", +"header":2597, +"response":{"type":"anonymous","header":2598, "doc":[ +{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"eventBusId","category":"full","description":" Call Event Bus Id"}] ,"attributes":[{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"alias","childType":"busId"},"id":2,"name":"eventBusId"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} +]}, +"doc":[ +"Do Call. Right after a call client need to start sending CallInProgress",{"type":"reference","argument":"peer","category":"full","description":"destination peer"},{"type":"reference","argument":"timeout","category":"full","description":"Initial timeout"},{"type":"reference","argument":"isAudioOnlyCall","category":"full","description":"Is Audio only call. Default is true."},{"type":"reference","argument":"isVideoOnlyCall","category":"full","description":"Is Video Only call. Default is false."},{"type":"reference","argument":"isVideoPreferred","category":"full","description":"Is Video preferred"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isAudioOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isVideoOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isVideoPreferred"} +]}},{"type":"rpc","content":{ +"name":"UpgradeCall", +"header":2677, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Method for upgrading a call from private call to group call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"},{"type":"reference","argument":"peer","category":"full","description":"Destination peer for upgrading"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"struct","childType":"GroupOutPeer"},"id":2,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"DoCallAgain", +"header":2678, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Call again to user",{"type":"reference","argument":"callId","category":"full","description":"Call Id"},{"type":"reference","argument":"user","category":"full","description":"User to call again"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"user"} +]}},{"type":"rpc","content":{ +"name":"JoinCall", +"header":2683, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Joining Call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +]}},{"type":"rpc","content":{ +"name":"RejectCall", +"header":2684, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Rejecting Call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +]}},{"type":"rpc","content":{ +"name":"OptimizeSDP", +"header":2685, +"response":{"type":"anonymous","header":2686, "doc":[ +{"type":"reference","argument":"optimizedSDP","category":"hidden","description":" Optimized version of SDP"}] ,"attributes":[{"type":"string","id":1,"name":"optimizedSDP"} +]}, +"doc":[ +"Optimizing SDP",{"type":"reference","argument":"type","category":"full","description":"Type of SDP (offer or answer)"},{"type":"reference","argument":"sdp","category":"full","description":"SDP value"},{"type":"reference","argument":"ownSettings","category":"full","description":"Own Settings"},{"type":"reference","argument":"theirSettings","category":"full","description":"Their Settings"}],"attributes":[ +{"type":"string","id":1,"name":"type"} +,{"type":"string","id":2,"name":"sdp"} +,{"type":{"type":"struct","childType":"PeerSettings"},"id":3,"name":"ownSettings"} +,{"type":{"type":"struct","childType":"PeerSettings"},"id":4,"name":"theirSettings"} +]}}, { + "type":"struct", + "content": { + "name":"ICEServer", +"doc":[ +"ICE Server description",{"type":"reference","argument":"url","category":"full","description":" Url to server"},{"type":"reference","argument":"username","category":"full","description":" Optional username"},{"type":"reference","argument":"credential","category":"danger","description":" Optional credential"}],"attributes":[ +{"type":"string","id":1,"name":"url"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"username"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"credential"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"WebRTCSignaling","attributes":[ +]}},{"type":"comment","content":"Advertising"}, { + "type":"struct", + "content": { + "name":"AdvertiseSelf", +"doc":[ +"Advertizing self to a master mode",{"type":"reference","argument":"peerSettings","category":"full","description":" Optional peer Settings"}],"trait":{"name":"WebRTCSignaling","key":21},"attributes":[ +{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":1,"name":"peerSettings"} +]}}, { + "type":"struct", + "content": { + "name":"AdvertiseMaster", +"doc":[ +"Sent by master"],"trait":{"name":"WebRTCSignaling","key":26},"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"ICEServer"}},"id":1,"name":"server"} +]}},{"type":"comment","content":"Web RTC signaling"}, { + "type":"struct", + "content": { + "name":"Candidate", +"doc":[ +"Candidate signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of candidate"},{"type":"reference","argument":"index","category":"full","description":" Index of candidate"},{"type":"reference","argument":"id","category":"full","description":" Id of candidate"},{"type":"reference","argument":"sdp","category":"full","description":" SDP of candidate"}],"trait":{"name":"WebRTCSignaling","key":3},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} +,{"type":"int32","id":2,"name":"index"} +,{"type":"string","id":3,"name":"id"} +,{"type":"string","id":4,"name":"sdp"} +]}}, { + "type":"struct", + "content": { + "name":"Offer", +"doc":[ +"Offer signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of offer"},{"type":"reference","argument":"sdp","category":"full","description":" Offer SDP"},{"type":"reference","argument":"ownPeerSettings","category":"full","description":" Optional Own Peer settings"}],"trait":{"name":"WebRTCSignaling","key":4},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} +,{"type":"string","id":2,"name":"sdp"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":3,"name":"ownPeerSettings"} +]}}, { + "type":"struct", + "content": { + "name":"Answer", +"doc":[ +"Answer signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of answer"},{"type":"reference","argument":"sdp","category":"full","description":" Answer SDP"}],"trait":{"name":"WebRTCSignaling","key":5},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} +,{"type":"string","id":2,"name":"sdp"} +]}}, { + "type":"struct", + "content": { + "name":"MediaStreamsUpdated", +"doc":[ +"Update about media stream settings updated. Can be sent before offer/answer.",{"type":"reference","argument":"isAudioEnabled","category":"full","description":" Is Audio Enabled in current connection. True by default."},{"type":"reference","argument":"isVideoEnabled","category":"full","description":" Is Video Enabled in current connection. False by default."}],"trait":{"name":"WebRTCSignaling","key":28},"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"isAudioEnabled"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isVideoEnabled"} +]}},{"type":"comment","content":"Call Controlling events"}, { + "type":"struct", + "content": { + "name":"NeedOffer", +"doc":[ +"Notification from master that offer is required",{"type":"reference","argument":"device","category":"full","description":" Destination Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"},{"type":"reference","argument":"peerSettings","category":"full","description":" Optional peer settings"}],"trait":{"name":"WebRTCSignaling","key":8},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":3,"name":"peerSettings"} +]}}, { + "type":"struct", + "content": { + "name":"NegotinationSuccessful", +"doc":[ +"Notification about on negotiation is successful",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":24},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"EnableConnection", +"doc":[ +"Notification about enabling connection to peer",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":22},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"OnRenegotiationNeeded", +"doc":[ +"Need renegotiate session. For example when streams are changed.",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":25},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"CloseSession", +"doc":[ +"Close this session and be ready to",{"type":"reference","argument":"device","category":"hidden","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id for renegotiation"}],"trait":{"name":"WebRTCSignaling","key":6},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"NeedDisconnect", +"doc":[ +"Notification about requirement about required disconnection from peer",{"type":"reference","argument":"device","category":"hidden","description":" Device Id"}],"trait":{"name":"WebRTCSignaling","key":20},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +]}}, { + "type":"struct", + "content": { + "name":"ActiveCall", +"doc":[ +"Active Calls. Used in broadcasting states of current calls.",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"peer","category":"full","description":" Call's peer"},{"type":"reference","argument":"callMembers","category":"full","description":" Call Members"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"struct","childType":"Peer"},"id":2,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"CallMember"}},"id":3,"name":"callMembers"} +]}}, { + "type": "enum", + "content": { + "name": "CallMemberState", + "values": [ + { + "name": "RINGING", + "id": 1 + }, + { + "name": "RINGING_REACHED", + "id": 4 + }, + { + "name": "CONNECTING", + "id": 2 + }, + { + "name": "CONNECTED", + "id": 3 + }, + { + "name": "ENDED", + "id": 5 } - }, - "id": 1, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" + ] + } + }, { + "type":"struct", + "content": { + "name":"CallMemberStateHolder", +"doc":[ +"Call Member state holder",{"type":"reference","argument":"state","category":"full","description":" State Value"},{"type":"reference","argument":"fallbackIsRinging","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsConnected","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsConnecting","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsRingingReached","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsEnded","category":"full","description":" Fallback flag for future compatibility of state"}],"attributes":[ +{"type":{"type":"enum","childType":"CallMemberState"},"id":1,"name":"state"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"fallbackIsRinging"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"fallbackIsConnected"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"fallbackIsConnecting"} +,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"fallbackIsRingingReached"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"fallbackIsEnded"} +]}}, { + "type":"struct", + "content": { + "name":"CallMember", +"doc":[ +"Call Member",{"type":"reference","argument":"userId","category":"full","description":" Member User Id"},{"type":"reference","argument":"state","category":"full","description":" State of member"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"userId"} +,{"type":{"type":"struct","childType":"CallMemberStateHolder"},"id":3,"name":"state"} +]}}, { + "type":"struct", + "content": { + "name":"PeerSettings", +"doc":[ +"Peer Settings",{"type":"reference","argument":"is3DESSupported","category":"full","description":" Marking if 3DES supported. Default is false."},{"type":"reference","argument":"isMobile","category":"full","description":" Is Peer a mobile phone. Default is false."},{"type":"reference","argument":"canBeAudioRelay","category":"full","description":" If peer can audio relay. Default is false."},{"type":"reference","argument":"canPreConnect","category":"full","description":" If peer can preconnect before answer"}],"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"is3DESSupported"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isMobile"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"canBeAudioRelay"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"canPreConnect"} +]}}]}, { + "title": "Config sync", + "package": "configs", + "doc": [ + "Parameter Syncronization across devices. Can be used for simple sync", + "across devices without rewriting server side code." + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Parameter", +"doc":[ +"Syncing Parameter",{"type":"reference","argument":"key","category":"full","description":" Key of parameter"},{"type":"reference","argument":"value","category":"full","description":" Value of parameter"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":"string","id":2,"name":"value"} +]}},{"type":"rpc","content":{ +"name":"GetParameters", +"header":134, +"response":{"type":"anonymous","header":135, "doc":[ +{"type":"reference","argument":"parameters","category":"full","description":" Current parameters"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Parameter"}},"id":1,"name":"parameters"} +]}, +"doc":[ +"Getting Parameters"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"EditParameter", +"header":128, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Change parameter value",{"type":"reference","argument":"key","category":"full","description":"Key of parameter"},{"type":"reference","argument":"value","category":"full","description":"Value of parameter"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"value"} +]}},{"type":"update","content":{ +"name":"ParameterChanged", +"header":131, +"doc":[ +"Update about parameter change",{"type":"reference","argument":"key","category":"full","description":" Key of parameter"},{"type":"reference","argument":"value","category":"full","description":" Value of parameter"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"value"} +]}}]}, { + "title": "Stats", + "package": "stats", + "doc": [ + "Saving statistics information" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"EventRecord", +"doc":[ +"Record for stored event"],"attributes":[ +{"type":{"type":"alias","childType":"date"},"id":1,"name":"date"} +,{"type":{"type":"trait","childType":"Event"},"id":2,"name":"event"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"Event","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"UntypedEvent", +"doc":[ +"Untyped event",{"type":"reference","argument":"eventType","category":"full","description":" Event type"},{"type":"reference","argument":"params","category":"full","description":" optional params for event"}],"trait":{"name":"Event","key":1},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"eventType"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":2,"name":"params"} +]}}, { + "type":"struct", + "content": { + "name":"ContentViewChanged", +"doc":[ +"Content view event",{"type":"reference","argument":"contentType","category":"full","description":" unique content id"},{"type":"reference","argument":"visible","category":"full","description":" Is content visible"},{"type":"reference","argument":"params","category":"full","description":" optional params for content view"}],"trait":{"name":"Event","key":2},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"contentType"} +,{"type":"string","id":2,"name":"contentId"} +,{"type":"bool","id":3,"name":"visible"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":4,"name":"params"} +]}}, { + "type":"struct", + "content": { + "name":"AppVisibleChanged", +"doc":[ +"On App Visible event",{"type":"reference","argument":"visible","category":"full","description":" Is app visible"}],"trait":{"name":"Event","key":4},"expandable":"true","attributes":[ +{"type":"bool","id":1,"name":"visible"} +]}},{"type":"rpc","content":{ +"name":"StoreEvents", +"header":243, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Storing events on server",{"type":"reference","argument":"events","category":"full","description":"Events for storing"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"Event"}},"id":1,"name":"events"} +]}}]}, { + "title": "Raw API", + "package": "raw", + "doc": [ + "Schema-less API that is useful for external integrations" + ], + "items": [ +{"type":"rpc","content":{ +"name":"RawRequest", +"header":2569, +"response":{"type":"anonymous","header":2570, "doc":[ +"Response of a raw request",{"type":"reference","argument":"result","category":"full","description":" Result of request"}] ,"attributes":[{"type":{"type":"trait","childType":"RawValue"},"id":1,"name":"result"} +]}, +"doc":[ +"Making raw request to external service via shema-less RPC request",{"type":"reference","argument":"service","category":"full","description":"Service name for RPC request"},{"type":"reference","argument":"method","category":"full","description":"Method for execution"},{"type":"reference","argument":"params","category":"full","description":"Optional params for the method"}],"attributes":[ +{"type":"string","id":1,"name":"service"} +,{"type":"string","id":2,"name":"method"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":3,"name":"params"} +]}}]}, { + "title": "Wallpappers", + "package": "wallpappers", + "doc": [ + "Wallpappers support" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Wallpapper", +"doc":[ +"Wallpapper structure",{"type":"reference","argument":"id","category":"full","description":" Wallpapper id"},{"type":"reference","argument":"w","category":"full","description":" Image width"},{"type":"reference","argument":"h","category":"full","description":" Image height"},{"type":"reference","argument":"fileSize","category":"full","description":" Image file size"},{"type":"reference","argument":"file","category":"full","description":" Image file reference"},{"type":"reference","argument":"thumb","category":"full","description":" Image thumb"}],"attributes":[ +{"type":"int32","id":7,"name":"id"} +,{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"int32","id":3,"name":"fileSize"} +,{"type":{"type":"struct","childType":"FileLocation"},"id":5,"name":"file"} +,{"type":{"type":"struct","childType":"FastThumb"},"id":6,"name":"thumb"} +]}},{"type":"rpc","content":{ +"name":"LoadWallpappers", +"header":241, +"response":{"type":"anonymous","header":242, "doc":[ +"Loaded Wallpappers",{"type":"reference","argument":"wallpappers","category":"full","description":" Available wallpapper list"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Wallpapper"}},"id":1,"name":"wallpappers"} +]}, +"doc":[ +"Load available wallpappers",{"type":"reference","argument":"maxWidth","category":"full","description":"Maximum width of wallpapper"},{"type":"reference","argument":"maxHeight","category":"full","description":"Maximum height of wallpapper"}],"attributes":[ +{"type":"int32","id":1,"name":"maxWidth"} +,{"type":"int32","id":2,"name":"maxHeight"} +]}}]}, { + "title": "Push", + "package": "push", + "doc": [ + "Vendor's pushes for receiving push notifications.", + "Push notification contains current sequence number of main sequence." + ], + "items": [ +{"type":"rpc","content":{ +"name":"RegisterGooglePush", +"header":51, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registering push token on server",{"type":"reference","argument":"projectId","category":"hidden","description":"Project Id of token"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ +{"type":"int64","id":1,"name":"projectId"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterGooglePush", +"header":2631, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregistering Google Push",{"type":"reference","argument":"token","category":"danger","description":"Token value"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterApplePush", +"header":76, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registering apple push on server",{"type":"reference","argument":"apnsKey","category":"hidden","description":"apns key id"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ +{"type":"int32","id":1,"name":"apnsKey"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterApplePush", +"header":2632, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregistering Apple Push",{"type":"reference","argument":"token","category":"full","description":"Token"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterApplePushKit", +"header":2576, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registration of a new Apple's PushKit tokens",{"type":"reference","argument":"apnsKey","category":"hidden","description":"APNS key id"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ +{"type":"int32","id":1,"name":"apnsKey"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterApplePushKit", +"header":2633, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregistering Apple Push Kit token",{"type":"reference","argument":"token","category":"hidden","description":"Token Value"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterApplePushToken", +"header":2593, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registering Apple Push Token",{"type":"reference","argument":"bundleId","category":"full","description":"Bundle Id of app"},{"type":"reference","argument":"token","category":"full","description":"Push token"}],"attributes":[ +{"type":"string","id":1,"name":"bundleId"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterApplePushToken", +"header":2634, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregister Apple Push token",{"type":"reference","argument":"token","category":"hidden","description":"Token value"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterActorPush", +"header":2575, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Register Actor Push endpoint",{"type":"reference","argument":"endpoint","category":"full","description":"Endpoint for push sending"},{"type":"reference","argument":"encryptionKeys","category":"full","description":"Push Encryption keys"}],"attributes":[ +{"type":"string","id":1,"name":"endpoint"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":2,"name":"encryptionKeys"} +]}},{"type":"rpc","content":{ +"name":"UnregisterActorPush", +"header":2635, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregister Actor Push endpoint",{"type":"reference","argument":"endpoint","category":"full","description":"Endpoint for unregistering"}],"attributes":[ +{"type":"string","id":1,"name":"endpoint"} +]}}]}, { + "title": "Encryption", + "package": "encryption", + "doc": [ + "Package that include encryption support", + "Key alg types:", + "* curve25519 - https://en.wikipedia.org/wiki/Curve25519", + "* rsa-2048", + "* rsa-4096", + "* aes-128", + "* kuznechik-128", + "", + "Signature alg types:", + "* Ed25519 - used curve25519 conveted to Ed255519 for signing and validataion" + ], + "items": [ +{"type":"comment","content":"Public Keys"}, { + "type":"struct", + "content": { + "name":"EncryptionKeyGroup", +"doc":[ +"Encryption Key Group",{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"identityKey","category":"full","description":" Key that is used as identity and for validation of Key Group changes"},{"type":"reference","argument":"supportedEncryption","category":"full","description":" Supported encryption methods by this key group"},{"type":"reference","argument":"keys","category":"compact","description":" keys of Key Group"},{"type":"reference","argument":"signatures","category":"compact","description":" Signatures of keys"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +,{"type":{"type":"list","childType":"string"},"id":2,"name":"supportedEncryption"} +,{"type":{"type":"struct","childType":"EncryptionKey"},"id":3,"name":"identityKey"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":4,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":5,"name":"signatures"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptionKeySignature", +"doc":[ +"Signed Key. Usually used for public keys.",{"type":"reference","argument":"keyId","category":"full","description":" Key Id used for signature"},{"type":"reference","argument":"signatureAlg","category":"full","description":" Signature algorithm"},{"type":"reference","argument":"signature","category":"full","description":" Signature value"}],"attributes":[ +{"type":"int64","id":1,"name":"keyId"} +,{"type":"string","id":2,"name":"signatureAlg"} +,{"type":"bytes","id":3,"name":"signature"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptionKey", +"doc":[ +"Encryption Key",{"type":"reference","argument":"keyId","category":"full","description":" Key Id"},{"type":"reference","argument":"keyAlg","category":"full","description":" Key Algorithm"},{"type":"reference","argument":"keyMaterial","category":"compact","description":" Public key material. Can be null, but always not null for LoadPublicKey"},{"type":"reference","argument":"keyHash","category":"hidden","description":" If keyMaterial is null, pass keyHash - SHA256 of key"}],"expandable":"true","attributes":[ +{"type":"int64","id":1,"name":"keyId"} +,{"type":"string","id":2,"name":"keyAlg"} +,{"type":{"type":"opt","childType":"bytes"},"id":3,"name":"keyMaterial"} +,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"keyHash"} +]}},{"type":"response","content":{ +"name":"PublicKeys", +"header":2602, +"doc":[ +"Public Keys response",{"type":"reference","argument":"publicKey","category":"full","description":" Public keys"},{"type":"reference","argument":"signatures","category":"full","description":" Signatures of public keys"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":1,"name":"publicKey"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":2,"name":"signatures"} +]}},{"type":"response","content":{ +"name":"PublicKeyGroups", +"header":2604, +"doc":[ +"Public key groups response"],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeyGroup"}},"id":1,"name":"publicKeyGroups"} +]}},{"type":"rpc","content":{ +"name":"LoadPublicKeyGroups", +"header":2601, +"response":{"type":"reference","name":"PublicKeyGroups"}, +"doc":[ +"Loading Public key groups",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} +]}},{"type":"rpc","content":{ +"name":"LoadPublicKey", +"header":2605, +"response":{"type":"reference","name":"PublicKeys"}, +"doc":[ +"Loading public key explictly",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"},{"type":"reference","argument":"keyGroupId","category":"full","description":"Key group's id"},{"type":"reference","argument":"keyIds","category":"full","description":"Key ids for loading"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} +,{"type":"int32","id":2,"name":"keyGroupId"} +,{"type":{"type":"list","childType":"int64"},"id":3,"name":"keyIds"} +]}},{"type":"rpc","content":{ +"name":"LoadPrePublicKeys", +"header":2603, +"response":{"type":"reference","name":"PublicKeys"}, +"doc":[ +"Loading SOME of ephermal public keys",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"},{"type":"reference","argument":"keyGroupId","category":"full","description":"User's key group id"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} +,{"type":"int32","id":2,"name":"keyGroupId"} +]}},{"type":"update","content":{ +"name":"PublicKeyGroupChanged", +"header":103, +"doc":[ +"Update about public key group changed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Updated Key Group"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} +]}},{"type":"update","content":{ +"name":"KeysAdded", +"header":112, +"doc":[ +"Update about keys added to Key Group",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"keys","category":"compact","description":" Added keys"},{"type":"reference","argument":"signatures","category":"compact","description":" Signatures of a public key"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":3,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":4,"name":"signatures"} +]}},{"type":"update","content":{ +"name":"KeysRemoved", +"header":113, +"doc":[ +"Update about keys removed from Key Group",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"keyIds","category":"full","description":" Removed keys"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +,{"type":{"type":"list","childType":"int64"},"id":3,"name":"keyIds"} +]}},{"type":"update","content":{ +"name":"PublicKeyGroupAdded", +"header":104, +"doc":[ +"Update about public key group added",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Added Key Group"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} +]}},{"type":"update","content":{ +"name":"PublicKeyGroupRemoved", +"header":105, +"doc":[ +"Update about public key group removed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Removed Key Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +]}},{"type":"comment","content":"Device Side"},{"type":"rpc","content":{ +"name":"CreateNewKeyGroup", +"header":2609, +"response":{"type":"anonymous","header":2610, "doc":[ +{"type":"reference","argument":"keyGroupId","category":"full","description":" Created Key Group id"}] ,"attributes":[{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}, +"doc":[ +"Creation of a new Key Group",{"type":"reference","argument":"identityKey","category":"full","description":"Identity Key of a new group"},{"type":"reference","argument":"supportedEncryptions","category":"full","description":"Supported encryption methods"},{"type":"reference","argument":"keys","category":"full","description":"keys of current group"},{"type":"reference","argument":"signatures","category":"full","description":"signatures of keys"}],"attributes":[ +{"type":{"type":"struct","childType":"EncryptionKey"},"id":1,"name":"identityKey"} +,{"type":{"type":"list","childType":"string"},"id":2,"name":"supportedEncryptions"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":3,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":4,"name":"signatures"} +]}},{"type":"rpc","content":{ +"name":"DeleteKeyGroup", +"header":2611, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Deletion of a Key Group",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for deletion"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}},{"type":"rpc","content":{ +"name":"DisconnectKeyGroup", +"header":2613, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Disconnect Key Group from device",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for disconnection"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}},{"type":"rpc","content":{ +"name":"ConnectKeyGroup", +"header":2614, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Connectiong Key Group to device",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for connection"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}},{"type":"rpc","content":{ +"name":"UploadPreKey", +"header":2612, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Uploading Ephermal Keys",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id"},{"type":"reference","argument":"keys","category":"compact","description":"Encryprion keys"},{"type":"reference","argument":"signatures","category":"compact","description":"Key signatures"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":2,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":3,"name":"signatures"} +]}},{"type":"comment","content":"Encrypted Packages"}, { + "type":"struct", + "content": { + "name":"EncryptedBox", +"doc":[ +"Encrypted package that is encrypted for multiple keys",{"type":"reference","argument":"keys","category":"full","description":" Encrypted encryption keys"},{"type":"reference","argument":"algType","category":"full","description":" Package encryption type"},{"type":"reference","argument":"encPackage","category":"full","description":" Encrypted package"},{"type":"reference","argument":"senderKeyGroupId","category":"full","description":" Sender key group"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":4,"name":"senderKeyGroupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncyptedBoxKey"}},"id":1,"name":"keys"} +,{"type":"string","id":2,"name":"algType"} +,{"type":"bytes","id":3,"name":"encPackage"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptedBoxSignature"}},"id":5,"name":"signatures"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptedBoxSignature", +"doc":[ +"Signature for encrypted package",{"type":"reference","argument":"algType","category":"full","description":" Alg Type"},{"type":"reference","argument":"signature","category":"full","description":" Signature of encrypted package"}],"attributes":[ +{"type":"string","id":1,"name":"algType"} +,{"type":"bytes","id":2,"name":"signature"} +]}}, { + "type":"struct", + "content": { + "name":"EncyptedBoxKey", +"doc":[ +"Encrypted package encryption key",{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"algType","category":"full","description":" Key encryption algorithm"},{"type":"reference","argument":"encryptedKey","category":"hidden","description":" Encrypted encryption key"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"usersId"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +,{"type":"string","id":3,"name":"algType"} +,{"type":"bytes","id":4,"name":"encryptedKey"} +]}}, { + "type":"struct", + "content": { + "name":"KeyGroupId", +"doc":[ +"References to key groups",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +]}}, { + "type":"struct", + "content": { + "name":"KeyGroupHolder", +"doc":[ +"Key Group Holder",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Key Group"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} +]}},{"type":"rpc","content":{ +"name":"SendEncryptedPackage", +"header":2657, +"response":{"type":"anonymous","header":2664, "doc":[ +{"type":"reference","argument":"date","category":"full","description":" date"},{"type":"reference","argument":"obsoleteKeyGroups","category":"full","description":" obsolete key group ids"},{"type":"reference","argument":"missedKeyGroups","category":"full","description":" missed key groups"}] ,"attributes":[{"type":{"type":"opt","childType":{"type":"alias","childType":"date"}},"id":1,"name":"date"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupId"}},"id":2,"name":"obsoleteKeyGroups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupHolder"}},"id":3,"name":"missedKeyGroups"} +]}, +"doc":[ +"Sending encrypted package",{"type":"reference","argument":"randomId","category":"hidden","description":"Random id"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"randomId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":2,"name":"destPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupId"}},"id":3,"name":"ignoredKeyGroups"} +,{"type":{"type":"struct","childType":"EncryptedBox"},"id":4,"name":"encryptedBox"} +]}},{"type":"update","content":{ +"name":"EncryptedPackage", +"header":177, +"doc":[ +"Update about encrypted package",{"type":"reference","argument":"randomId","category":"full","description":" Random Id of package"},{"type":"reference","argument":"date","category":"full","description":" Sending date of package"},{"type":"reference","argument":"senderId","category":"full","description":" Sender id of package"},{"type":"reference","argument":"encryptedBox","category":"full","description":" Encrypted box"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"randomId"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"date"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"senderId"} +,{"type":{"type":"struct","childType":"EncryptedBox"},"id":4,"name":"encryptedBox"} +]}}]}, { + "title": "Storage", + "package": "storage", + "items": [ +{"type":"rpc","content":{ +"name":"UploadSharedBlob", +"header":2660, +"response":{"type":"anonymous","header":2661, "doc":[ +{"type":"reference","argument":"sharedObjectId","category":"full","description":" Id of shared object"}] ,"attributes":[{"type":"int32","id":1,"name":"sharedObjectId"} +]}, +"doc":[ +"Upload shared blob with user",{"type":"reference","argument":"destPeer","category":"full","description":"Destination peer"},{"type":"reference","argument":"bucket","category":"full","description":"Bucked name"},{"type":"reference","argument":"blob","category":"full","description":"Blob data"},{"type":"reference","argument":"randomId","category":"full","description":"Random id for protecting from double upload"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"destPeer"} +,{"type":"string","id":2,"name":"bucket"} +,{"type":"bytes","id":3,"name":"blob"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"randomId"} +]}},{"type":"rpc","content":{ +"name":"DownloadSharedBlob", +"header":2662, +"response":{"type":"anonymous","header":2663, "doc":[ +{"type":"reference","argument":"blob","category":"full","description":" Blob contents"}] ,"attributes":[{"type":"bytes","id":1,"name":"blob"} +]}, +"doc":[ +"Download shared blob",{"type":"reference","argument":"destPeer","category":"full","description":"Destination peer"},{"type":"reference","argument":"bucket","category":"full","description":"Bucket name"},{"type":"reference","argument":"objectId","category":"full","description":"Object Id"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"destPeer"} +,{"type":"string","id":2,"name":"bucket"} +,{"type":"int32","id":3,"name":"objectId"} +]}}]}, { + "title": "Peers", + "package": "peers", + "doc": [ + "Peer is an identificator of specific conversation." + ], + "items": [ + { + "type": "enum", + "content": { + "name": "PeerType", + "values": [ + { + "name": "Private", + "id": 1 + }, + { + "name": "Group", + "id": 2 + }, + { + "name": "EncryptedPrivate", + "id": 3 } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Dialog" + ] + } + }, { + "type":"struct", + "content": { + "name":"Peer", +"doc":[ +"Peer",{"type":"reference","argument":"type","category":"full","description":" Peer Type"},{"type":"reference","argument":"id","category":"full","description":" Peer Id"}],"attributes":[ +{"type":{"type":"enum","childType":"PeerType"},"id":1,"name":"type"} +,{"type":"int32","id":2,"name":"id"} +]}}, { + "type":"struct", + "content": { + "name":"OutPeer", +"doc":[ +"Out peer with access hash",{"type":"reference","argument":"type","category":"full","description":" Peer Type"},{"type":"reference","argument":"id","category":"full","description":" Peer Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Peer access hash"}],"attributes":[ +{"type":{"type":"enum","childType":"PeerType"},"id":1,"name":"type"} +,{"type":"int32","id":2,"name":"id"} +,{"type":"int64","id":3,"name":"accessHash"} +]}}, { + "type":"struct", + "content": { + "name":"UserOutPeer", +"doc":[ +"User's out peer",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"accessHash","category":"danger","description":" User's access hash"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}, { + "type":"struct", + "content": { + "name":"GroupOutPeer", +"doc":[ +"Group's out peer",{"type":"reference","argument":"groupId","category":"full","description":" Group's Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Group's access hash"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}]}, { + "title": "Sequence and Updates", + "package": "sequence", + "doc": [ + "Each device has it's own update sequence. At the begining application request initial sequence state by", + "calling GetState. On each application restart or NewSessionCreated application calls GetDifference for receiving", + "updates in update sequence.", + "GetState and GetDifference automatically subscribes session to receiving updates in session.", + "Each update has seq and state. Seq is sequental index of updated and used for detecting of holes in update sequence", + "(because of server failure or session die) on client side.", + "All updates needed to be processed in partucular order according to seq values.", + "In some updates there can be references to users that are not available at client yer. In this case application need", + "to ignore such update and init getting difference." + ], + "items": [ +{"type":"update_box","content":{ +"name":"SeqUpdate", +"header":13, +"doc":[ +"Sequence update",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of update"},{"type":"reference","argument":"state","category":"compact","description":" Sequece state of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":"int32","id":3,"name":"updateHeader"} +,{"type":"bytes","id":4,"name":"update"} +]}},{"type":"update_box","content":{ +"name":"FatSeqUpdate", +"header":73, +"doc":[ +"Fat sequence update with additional data",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of update"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"},{"type":"reference","argument":"users","category":"compact","description":" Users that are referenced in update"},{"type":"reference","argument":"groups","category":"compact","description":" Groups that are referenced in update"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":"int32","id":3,"name":"updateHeader"} +,{"type":"bytes","id":4,"name":"update"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":5,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":6,"name":"groups"} +]}},{"type":"update_box","content":{ +"name":"WeakUpdate", +"header":26, +"doc":[ +"Out of sequence update (for typing and online statuses)",{"type":"reference","argument":"date","category":"full","description":" Date of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"}],"attributes":[ +{"type":"int64","id":1,"name":"date"} +,{"type":"int32","id":2,"name":"updateHeader"} +,{"type":"bytes","id":3,"name":"update"} +]}},{"type":"update_box","content":{ +"name":"WeakFatUpdate", +"header":2673, +"doc":[ +"Fat Weak Update",{"type":"reference","argument":"date","category":"full","description":" Date of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"full","description":" The update"},{"type":"reference","argument":"users","category":"full","description":" Users that are referenced in update"},{"type":"reference","argument":"groups","category":"full","description":" Groups that are referenced in update"}],"attributes":[ +{"type":"int64","id":1,"name":"date"} +,{"type":"int32","id":2,"name":"updateHeader"} +,{"type":"bytes","id":3,"name":"update"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} +]}},{"type":"update_box","content":{ +"name":"SeqUpdateTooLong", +"header":25, +"doc":[ +"Notification about requiring performing manual GetDifference"],"attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"UpdateContainer", +"doc":[ +"Update container",{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"compact","description":" The updatre"}],"attributes":[ +{"type":"int32","id":1,"name":"updateHeader"} +,{"type":"bytes","id":2,"name":"update"} +]}},{"type":"update_box","content":{ +"name":"CombinedUpdate", +"header":2625, +"doc":[ +"Combined update",{"type":"reference","argument":"seqStart","category":"full","description":" Sequence number start"},{"type":"reference","argument":"seqEnd","category":"full","description":" Sequence number end"},{"type":"reference","argument":"state","category":"full","description":" Sequence state"},{"type":"reference","argument":"users","category":"compact","description":" Update's users"},{"type":"reference","argument":"groups","category":"compact","description":" Update's groups"},{"type":"reference","argument":"updates","category":"full","description":" Updates (can be empty)"},{"type":"reference","argument":"messages","category":"full","description":" New messages"}],"attributes":[ +{"type":"int32","id":1,"name":"seqStart"} +,{"type":"int32","id":2,"name":"seqEnd"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UpdateContainer"}},"id":6,"name":"updates"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":7,"name":"messages"} +]}}, { + "type": "enum", + "content": { + "name": "UpdateOptimization", + "values": [ + { + "name": "NONE", + "id": 1 + }, + { + "name": "STRIP_ENTITIES", + "id": 2 + }, + { + "name": "ENABLE_COMBINED", + "id": 3 + }, + { + "name": "FASTER_MESSAGES", + "id": 4 + }, + { + "name": "STRIP_COUNTERS", + "id": 5 + }, + { + "name": "COMPACT_USERS", + "id": 6 + }, + { + "name": "GROUPS_V2", + "id": 7 } - }, - "id": 3, - "name": "dialogs" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 4, - "name": "userPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 5, - "name": "groupPeers" - }] - }, - "doc": [ - "Loading conversation history", { - "type": "reference", - "argument": "minDate", - "category": "full", - "description": "start date of conversation loading. Use 0 to load latest messages" - }, { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "limit maximum amount of messages (max is 100)" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "date" - }, - "id": 1, - "name": "minDate" - }, { - "type": "int32", - "id": 2, - "name": "limit" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadArchived", - "header": 2651, - "response": { - "type": "anonymous", - "header": 2652, - "doc": [ - "Archived dialogs", { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Referenced groups" - }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Referenced users" - }, { - "type": "reference", - "argument": "dialogs", - "category": "full", - "description": " Archived dialogs" - }, { - "type": "reference", - "argument": "nextOffset", - "category": "compact", - "description": " Offset for next bunch" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 1, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Dialog" - } - }, - "id": 3, - "name": "dialogs" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 5, - "name": "userPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 6, - "name": "groupPeers" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 4, - "name": "nextOffset" - }] - }, - "doc": [ - "Loading archived messages", { - "type": "reference", - "argument": "nextOffset", - "category": "compact", - "description": "Optional next offset" - }, { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "Maximum number of elements" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 1, - "name": "nextOffset" - }, { - "type": "int32", - "id": 2, - "name": "limit" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadGroupedDialogs", - "header": 225, - "response": { - "type": "anonymous", - "header": 226, - "doc": [ - "Loaded grouped dialogs", { - "type": "reference", - "argument": "dialogs", - "category": "compact", - "description": " Loaded groups of dialogs" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - }, { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Loaded groups" - }, { - "type": "reference", - "argument": "showArchived", - "category": "full", - "description": " Show archived section" - }, { - "type": "reference", - "argument": "showInvite", - "category": "full", - "description": " Show invite message" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogGroup" - } - }, - "id": 1, - "name": "dialogs" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "groups" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "showArchived" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 5, - "name": "showInvite" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 6, - "name": "userPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 7, - "name": "groupPeers" - }] - }, - "doc": [ - "Load all dialogs from grouped list" - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 1, - "name": "optimizations" - }] - } - }, { - "type": "response", - "content": { - "name": "DialogsOrder", - "header": 235, - "doc": [ - "Dialogs order response", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " update seq" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " update state" - }, { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Update groups" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogGroup" - } - }, - "id": 3, - "name": "groups" - }] - } - }, { - "type": "rpc", - "content": { - "name": "HideDialog", - "header": 231, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Hide Dialog from grouped list", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Dialog peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ShowDialog", - "header": 232, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Show Dialog in grouped list" - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "FavouriteDialog", - "header": 224, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Marking dialog as favourite", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for favouriting" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnfavouriteDialog", - "header": 227, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Making dialog as unfavourite", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for favouriting" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "NotifyDialogOpened", - "header": 2785, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Notifying about dialog open", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer that was opened" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }] - }, { - "title": "Groups", - "package": "groups", - "items": [{ - "type": "comment", - "content": "Entities" - }, { - "type": "struct", - "content": { - "name": "Member", - "doc": [ - "Member information", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User id" - }, { - "type": "reference", - "argument": "inviterUid", - "category": "full", - "description": " User inviter id" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Adding date" - }, { - "type": "reference", - "argument": "isAdmin", - "category": "full", - "description": " is member admin of group" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "inviterUid" - }, { - "type": "int64", - "id": 3, - "name": "date" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "isAdmin" - }] - } - }, { - "type": "enum", - "content": { - "name": "GroupType", - "values": [{ - "name": "GROUP", - "id": 1 - }, { - "name": "CHANNEL", - "id": 2 - }] - } - }, { - "type": "enum", - "content": { - "name": "GroupPermissions", - "values": [{ - "name": "SEND_MESSAGE", - "id": 1 - }, { - "name": "CLEAR", - "id": 2 - }, { - "name": "LEAVE", - "id": 3 - }, { - "name": "DELETE", - "id": 4 - }, { - "name": "JOIN", - "id": 5 - }, { - "name": "VIEW_INFO", - "id": 6 - }] - } - }, { - "type": "enum", - "content": { - "name": "GroupFullPermissions", - "values": [{ - "name": "EDIT_INFO", - "id": 1 - }, { - "name": "VIEW_MEMBERS", - "id": 2 - }, { - "name": "INVITE_MEMBERS", - "id": 3 - }, { - "name": "INVITE_VIA_LINK", - "id": 4 - }, { - "name": "CALL", - "id": 5 - }, { - "name": "EDIT_ADMIN_SETTINGS", - "id": 6 - }, { - "name": "VIEW_ADMINS", - "id": 7 - }, { - "name": "EDIT_ADMINS", - "id": 8 - }, { - "name": "KICK_INVITED", - "id": 9 - }, { - "name": "KICK_ANYONE", - "id": 10 - }, { - "name": "EDIT_FOREIGN", - "id": 11 - }, { - "name": "DELETE_FOREIGN", - "id": 12 - }] - } - }, { - "type": "struct", - "content": { - "name": "Group", - "doc": [ - "Group information", "", "Permissions.", "Permissions of this structure is about group messages operation, such as", "ability to send messages, clear chat, leave group and so on. This operations", "Can be held outside of the Group Info page.", "", "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", "If default is TRUE then ONE == FALSE.", "Bits:", "0 - canSendMessage. Default is FALSE.", "1 - canClear. Default is FALSE.", "2 - canLeave. Default is FALSE.", "3 - canDelete. Default is FALSE.", "4 - canJoin. Default is FALSE.", "5 - canViewInfo. Default is FALSE.", "", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " group id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Access hash of group" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Title of group" - }, { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " Avatar of group" - }, { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Number of members" - }, { - "type": "reference", - "argument": "isHidden", - "category": "full", - "description": " Is group hidden (not showing it in recent list). Default is false." - }, { - "type": "reference", - "argument": "isMember", - "category": "full", - "description": " Is current user a member of a group. Default is true." - }, { - "type": "reference", - "argument": "groupType", - "category": "full", - "description": " Group Type. Used only for displaying information. Default is GROUP." - }, { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " Permissions of group object" - }, { - "type": "reference", - "argument": "isDeleted", - "category": "full", - "description": " Is this group deleted" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Group extension Data" - }, { - "type": "reference", - "argument": "isAdmin", - "category": "full", - "description": " [DEPRECATED] Is current user an admin of a group" - }, { - "type": "reference", - "argument": "theme", - "category": "hidden", - "description": " [DEPRECATED] Theme of group" - }, { - "type": "reference", - "argument": "about", - "category": "hidden", - "description": " [DEPRECATED] About of group" - }, { - "type": "reference", - "argument": "creatorUid", - "category": "hidden", - "description": " [DEPRECATED] Group creator" - }, { - "type": "reference", - "argument": "members", - "category": "compact", - "description": " [DEPRECATED] Members of group" - }, { - "type": "reference", - "argument": "createDate", - "category": "full", - "description": " [DEPRECATED] Date of creation" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": "string", - "id": 3, - "name": "title" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 4, - "name": "avatar" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 24, - "name": "membersCount" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "isMember" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 20, - "name": "isHidden" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "GroupType" - } - }, - "id": 25, - "name": "groupType" - }, { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 26, - "name": "permissions" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 27, - "name": "isDeleted" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 22, - "name": "ext" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 16, - "name": "isAdmin", - "deprecated": "true" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 8, - "name": "creatorUid", - "deprecated": "true" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 9, - "name": "members", - "deprecated": "true" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 10, - "name": "createDate", - "deprecated": "true" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 17, - "name": "theme", - "deprecated": "true" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 18, - "name": "about", - "deprecated": "true" - }] - } - }, { - "type": "struct", - "content": { - "name": "GroupFull", - "doc": [ - "Goup Full information", "Permissions.", "Idea of Group Full mermissions is about Group Info pages. This permissions", "are usefull only when trying to view and update group settings and not related", "to chat messages itself.", "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", "If default is TRUE then ONE == FALSE.", "Bits:", "0 - canEditInfo. Default is FALSE.", "1 - canViewMembers. Default is FALSE.", "2 - canInviteMembers. Default is FALSE.", "3 - canInviteViaLink. Default is FALSE.", "4 - canCall. Default is FALSE.", "5 - canEditAdminSettings. Default is FALSE.", "6 - canViewAdmins. Default is FALSE.", "7 - canEditAdmins. Default is FALSE.", "8 - canKickInvited. Default is FALSE.", "9 - canKickAnyone. Default is FALSE.", "10 - canEditForeign. Default is FALSE.", "11 - canDeleteForeign. Default is FALSE.", "", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "createDate", - "category": "full", - "description": " Date created" - }, { - "type": "reference", - "argument": "ownerUid", - "category": "full", - "description": " Optional group owner" - }, { - "type": "reference", - "argument": "members", - "category": "full", - "description": " Group members. Can be empty when isAsyncMembers enabled." - }, { - "type": "reference", - "argument": "theme", - "category": "full", - "description": " Group Theme" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": " Group about" - }, { - "type": "reference", - "argument": "isAsyncMembers", - "category": "full", - "description": " Is Members need to be loaded asynchronous. Default is false." - }, { - "type": "reference", - "argument": "isSharedHistory", - "category": "full", - "description": " Is history shared among all users. Default is false." - }, { - "type": "reference", - "argument": "shortName", - "category": "full", - "description": " Group's short name" - }, { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " Group Permissions" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "createDate" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 5, - "name": "ownerUid" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 12, - "name": "members" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "theme" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "about" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 7, - "name": "ext" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 11, - "name": "isAsyncMembers" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 10, - "name": "isSharedHistory" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 14, - "name": "shortName" - }, { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 27, - "name": "permissions" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadFullGroups", - "header": 2782, - "response": { - "type": "anonymous", - "header": 2783, - "doc": [{ - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups to load" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupFull" - } - }, - "id": 1, - "name": "groups" - }] - }, - "doc": [ - "Loading Full Groups", { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups to load" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 1, - "name": "groups" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadMembers", - "header": 2786, - "response": { - "type": "anonymous", - "header": 2787, - "doc": [{ - "type": "reference", - "argument": "users", - "category": "full", - "description": " Group members" - }, { - "type": "reference", - "argument": "next", - "category": "full", - "description": " Load more reference" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 3, - "name": "members" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "next" - }] - }, - "doc": [ - "Loading group members", { - "type": "reference", - "argument": "group", - "category": "full", - "description": "Group peer" - }, { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "Limit members" - }, { - "type": "reference", - "argument": "next", - "category": "full", - "description": "Load more reference" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "group" - }, { - "type": "int32", - "id": 2, - "name": "limit" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 3, - "name": "next" - }] - } - }, { - "type": "comment", - "content": "Update" - }, { - "type": "update", - "content": { - "name": "GroupTitleChanged", - "header": 2609, - "doc": [ - "Update about title changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Group Title" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "string", - "id": 2, - "name": "title" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupAvatarChanged", - "header": 2610, - "doc": [ - "Update about avatar changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "avatar", - "category": "full", - "description": " Group Avatar" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 2, - "name": "avatar" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupTopicChanged", - "header": 2616, - "doc": [ - "Update about topic changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "topic", - "category": "full", - "description": " Updated topic" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "topic" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupAboutChanged", - "header": 2617, - "doc": [ - "Update about about changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": " Updated about" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "about" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupExtChanged", - "header": 2613, - "doc": [ - "Update about ext changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Updated ext" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 2, - "name": "ext" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupFullExtChanged", - "header": 2618, - "doc": [ - "Update about full ext changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Updated ext" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 2, - "name": "ext" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupShortNameChanged", - "header": 2628, - "doc": [ - "Group's short name changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "shortName", - "category": "full", - "description": " Group short name" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "shortName" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupOwnerChanged", - "header": 2619, - "doc": [ - "Update about owner changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " New Owner" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "userId" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupHistoryShared", - "header": 2620, - "doc": [ - "Update about history shared", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupDeleted", - "header": 2658, - "doc": [ - "Update about group deleted", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupPermissionsChanged", - "header": 2663, - "doc": [ - "Update about group permissions changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " New Permissions" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "int64", - "id": 2, - "name": "permissions" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupFullPermissionsChanged", - "header": 2664, - "doc": [ - "Update about Full Group permissions changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " New Permissions" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "int64", - "id": 2, - "name": "permissions" - }] - } - }, { - "type": "comment", - "content": " " - }, { - "type": "update", - "content": { - "name": "GroupMemberChanged", - "header": 2612, - "doc": [ - "Update about membership changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "isMember", - "category": "full", - "description": " Is current user a member" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "bool", - "id": 2, - "name": "isMember" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupMembersBecameAsync", - "header": 2615, - "doc": [ - "Update about members became async", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupMembersUpdated", - "header": 2614, - "doc": [ - "Update about members updated", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "members", - "category": "full", - "description": " Group Members" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 2, - "name": "members" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupMemberDiff", - "header": 2623, - "doc": [ - "Update about members changed", { - "type": "reference", - "argument": "removedUsers", - "category": "full", - "description": " Removed Users" - }, { - "type": "reference", - "argument": "addedMembers", - "category": "full", - "description": " Added members" - }, { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Current Members count" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "removedUsers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 3, - "name": "addedMembers" - }, { - "type": "int32", - "id": 4, - "name": "membersCount" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupMembersCountChanged", - "header": 2622, - "doc": [ - "Update about members count changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Members count" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "int32", - "id": 2, - "name": "membersCount" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupMemberAdminChanged", - "header": 2627, - "doc": [ - "Update about member admin changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " User Id" - }, { - "type": "reference", - "argument": "isAdmin", - "category": "full", - "description": " Is Admin flag" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "userId" - }, { - "type": "bool", - "id": 3, - "name": "isAdmin" - }] - } - }, { - "type": "comment", - "content": "Actions" - }, { - "type": "rpc", - "content": { - "name": "CreateGroup", - "header": 230, - "response": { - "type": "anonymous", - "header": 216, - "doc": [ - "Created group", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Update Seq" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Update state" - }, { - "type": "reference", - "argument": "group", - "category": "full", - "description": " Created group" - }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Referenced users" - }, { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Referenced users" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Group creation date" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "date" - }, { - "type": { - "type": "struct", - "childType": "Group" - }, - "id": 3, - "name": "group" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 4, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 5, - "name": "userPeers" - }] - }, - "doc": [ - "Creating group chat", { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id for avoiding double create" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": "Group Title" - }, { - "type": "reference", - "argument": "users", - "category": "hidden", - "description": "Members of group" - }, { - "type": "reference", - "argument": "groupType", - "category": "full", - "description": "Group Type" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "rid" - }, { - "type": "string", - "id": 2, - "name": "title" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "users" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "GroupType" - } - }, - "id": 6, - "name": "groupType" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 7, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditGroupTitle", - "header": 85, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Changing group title", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": "new group title" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": "string", - "id": 3, - "name": "title" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditGroupAvatar", - "header": 86, - "response": { - "type": "anonymous", - "header": 115, - "doc": [ - "Updated group avatar", { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " Changed avatar" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Avatar change date" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Avatar" - }, - "id": 1, - "name": "avatar" - }, { - "type": "int32", - "id": 2, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - }, - "doc": [ - "Changing group avatar", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "fileLocation", - "category": "compact", - "description": "uploaded file for avatar" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 3, - "name": "fileLocation" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RemoveGroupAvatar", - "header": 101, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Removing group avatar", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditGroupShortName", - "header": 2793, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Edit Group Short Name", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "shortName", - "category": "full", - "description": "New group's short name" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "shortName" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditGroupTopic", - "header": 211, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Edit group topic", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random id of operation" - }, { - "type": "reference", - "argument": "topic", - "category": "full", - "description": "New Topic" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "topic" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 4, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditGroupAbout", - "header": 213, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Edit Group About", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random id of operation" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": "New About" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "about" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "InviteUser", - "header": 69, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Inviting user to group", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "user", - "category": "full", - "description": "Users for invitation" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 3, - "name": "user" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LeaveGroup", - "header": 70, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Leaving group", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LeaveAndDelete", - "header": 2721, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Leave group and Delete Chat", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "KickUser", - "header": 71, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Kicking user from group", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "user", - "category": "full", - "description": "users for removing" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 3, - "name": "user" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "JoinGroupByPeer", - "header": 2722, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Join group by peer", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "JoinGroupByGroupId", - "header": 44561, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Join group by peer without a necessity of invite", { - "type": "reference", - "argument": "groupId", - "category": "hidden", - "description": "Groups peer" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }] - } - }, { - "type": "comment", - "content": "Administration" - }, { - "type": "rpc", - "content": { - "name": "MakeUserAdmin", - "header": 2784, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Make user admin", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "userPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DismissUserAdmin", - "header": 2791, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Dismissing user admin", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "userPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "TransferOwnership", - "header": 2789, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Transfer ownership of group", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "newOwner", - "category": "full", - "description": "New group's owner" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "newOwner" - }] - } - }, { - "type": "struct", - "content": { - "name": "AdminSettings", - "doc": [ - "Admin Settings", { - "type": "reference", - "argument": "showAdminsToMembers", - "category": "full", - "description": " Show admins in member list" - }, { - "type": "reference", - "argument": "canMembersInvite", - "category": "full", - "description": " Can members of a group invite people" - }, { - "type": "reference", - "argument": "canMembersEditGroupInfo", - "category": "full", - "description": " Can members edit group info" - }, { - "type": "reference", - "argument": "canAdminsEditGroupInfo", - "category": "full", - "description": " Can admins edit group info" - }, { - "type": "reference", - "argument": "showJoinLeaveMessages", - "category": "full", - "description": " Should join and leave messages be visible to members" - } - ], - "expandable": "true", - "attributes": [{ - "type": "bool", - "id": 1, - "name": "showAdminsToMembers" - }, { - "type": "bool", - "id": 2, - "name": "canMembersInvite" - }, { - "type": "bool", - "id": 3, - "name": "canMembersEditGroupInfo" - }, { - "type": "bool", - "id": 4, - "name": "canAdminsEditGroupInfo" - }, { - "type": "bool", - "id": 5, - "name": "showJoinLeaveMessages" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadAdminSettings", - "header": 2790, - "response": { - "type": "anonymous", - "header": 2794, - "doc": [ - "Loaded settings", { - "type": "reference", - "argument": "settings", - "category": "full", - "description": " Current group admin settings" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "AdminSettings" - }, - "id": 1, - "name": "settings" - }] - }, - "doc": [ - "Loading administration settings", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SaveAdminSettings", - "header": 2792, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Save administartion settings", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's Peer" - }, { - "type": "reference", - "argument": "settings", - "category": "full", - "description": "Group's settings" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "struct", - "childType": "AdminSettings" - }, - "id": 2, - "name": "settings" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DeleteGroup", - "header": 2795, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Delete Group", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ShareHistory", - "header": 2796, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Share History", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "comment", - "content": "Invite" - }, { - "type": "response", - "content": { - "name": "InviteUrl", - "header": 178, - "doc": [ - "Response for invite url methods" - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "url" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetGroupInviteUrl", - "header": 177, - "response": { - "type": "reference", - "name": "InviteUrl" - }, - "doc": [ - "Building invite url", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Destination group peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RevokeInviteUrl", - "header": 179, - "response": { - "type": "reference", - "name": "InviteUrl" - }, - "doc": [ - "Revoking invite urls", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Destination group peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "JoinGroup", - "header": 180, - "response": { - "type": "anonymous", - "header": 181, - "doc": [{ - "type": "reference", - "argument": "group", - "category": "hidden", - "description": " Joined group" - }, { - "type": "reference", - "argument": "users", - "category": "hidden", - "description": " Users from members" - }, { - "type": "reference", - "argument": "userPeers", - "category": "hidden", - "description": " User Peers" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random id" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, { - "type": "reference", - "argument": "state", - "category": "hidden", - "description": " State" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of join" - }], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Group" - }, - "id": 1, - "name": "group" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 5, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 7, - "name": "userPeers" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 6, - "name": "rid" - }, { - "type": "int32", - "id": 2, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - }, - "doc": [ - "Join group method", { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Url or Token for joining to group" - }, { - "type": "reference", - "argument": "optimizations", - "category": "hidden", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - }] - } - }, { - "type": "comment", - "content": "Obsolete Actions" - }, { - "type": "rpc", - "content": { - "name": "CreateGroupObsolete", - "header": 65, - "response": { - "type": "anonymous", - "header": 66, - "doc": [ - "Created group", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": " Peer of created group" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Members of created group" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Group creation date" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": "int32", - "id": 3, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 4, - "name": "state" - }, { - "type": { - "type": "list", - "childType": "int32" - }, - "id": 5, - "name": "users" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "date" - }] - }, - "doc": [ - "[OBSOLETE] Creating group chat", { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id for avoiding double create" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": "Title of new group" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Members of new group" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "rid" - }, { - "type": "string", - "id": 2, - "name": "title" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "users" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EnterGroupObsolete", - "header": 199, - "response": { - "type": "anonymous", - "header": 200, - "doc": [ - "Joined group", { - "type": "reference", - "argument": "group", - "category": "full", - "description": " Joined group" - }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Referenced users" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of join message" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Seq of Update" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of Update" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of update" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Group" - }, - "id": 1, - "name": "group" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "rid" - }, { - "type": "int32", - "id": 4, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 5, - "name": "state" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "date" - }] - }, - "doc": [ - "[OBSOLETE] Join random group by peer id", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Public group peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MakeUserAdminObsolete", - "header": 214, - "response": { - "type": "anonymous", - "header": 215, - "doc": [{ - "type": "reference", - "argument": "members", - "category": "full", - "description": " new members" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 1, - "name": "members" - }, { - "type": "int32", - "id": 2, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }] - }, - "doc": [ - "[OBSOLETE] Make user admin", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "userPeer" - }] - } - }, { - "type": "comment", - "content": "Obsolete Updates" - }, { - "type": "update", - "content": { - "name": "GroupInviteObsolete", - "header": 36, - "doc": [ - "Update about inviting current user to group", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "inviteUid", - "category": "full", - "description": " Inviter UID. If equals to current uid than group created by user." - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of creating" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 9, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 5, - "name": "inviteUid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 8, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupUserInvitedObsolete", - "header": 21, - "doc": [ - "Update about inviting user to group", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Added user ID" - }, { - "type": "reference", - "argument": "inviterUid", - "category": "full", - "description": " Inviter user ID" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of adding user to group" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "inviterUid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupUserLeaveObsolete", - "header": 23, - "doc": [ - "Update about leaving user", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's ID" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of user leave" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupUserKickObsolete", - "header": 24, - "doc": [ - "Update about kicking user", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Kicked user's ID" - }, { - "type": "reference", - "argument": "kickerUid", - "category": "full", - "description": " Kicker user's ID" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of user kick" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "kickerUid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupMembersUpdateObsolete", - "header": 44, - "doc": [ - "Silent group members update", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "members", - "category": "full", - "description": " New members list" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 2, - "name": "members" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupTitleChangedObsolete", - "header": 38, - "doc": [ - "Update about group title change", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Changer UID" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": " New Title of group" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of title change" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": "string", - "id": 3, - "name": "title" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupTopicChangedObsolete", - "header": 213, - "doc": [ - "Update about group topic change", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Changer UID" - }, { - "type": "reference", - "argument": "topic", - "category": "full", - "description": " New topic of group" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of theme change" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Randomd Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "topic" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 5, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupAboutChangedObsolete", - "header": 214, - "doc": [ - "Update about group about change", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": " Group about" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "about" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupAvatarChangedObsolete", - "header": 39, - "doc": [ - "Update about group avatar change", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Avatar changer uid" - }, { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " New Avatar. If null then avatar is removed" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of avatar change" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 3, - "name": "avatar" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - } - }] - }, { - "title": "Stickers", - "package": "stickers", - "doc": [ - "Stickers support in Actor" - ], - "items": [{ - "type": "struct", - "content": { - "name": "StickerDescriptor", - "doc": [ - "Descriptor of a Sticker", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Sticker unique id" - }, { - "type": "reference", - "argument": "emoji", - "category": "full", - "description": " Emoji code for sticker" - }, { - "type": "reference", - "argument": "image128", - "category": "full", - "description": " Image of sticker 128x128 in WebP format" - }, { - "type": "reference", - "argument": "image512", - "category": "full", - "description": " Image of sticker 512x512 in WebP format" - }, { - "type": "reference", - "argument": "image256", - "category": "full", - "description": " Image of sticker 256x256 in WebP format" - } - ], - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "emoji" - }, { - "type": { - "type": "struct", - "childType": "ImageLocation" - }, - "id": 3, - "name": "image128" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 4, - "name": "image512" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 5, - "name": "image256" - }] - } - }, { - "type": "struct", - "content": { - "name": "StickerCollection", - "doc": [ - "Sticker collection", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Unique id of a collection" - }, { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": " Access Hash of a collection" - }, { - "type": "reference", - "argument": "stickers", - "category": "compact", - "description": " Sticker list" - } - ], - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerDescriptor" - } - }, - "id": 3, - "name": "stickers" - }] - } - }, { - "type": "response", - "content": { - "name": "StickersReponse", - "header": 240, - "doc": [ - "Stickers response", { - "type": "reference", - "argument": "collections", - "category": "full", - "description": " Sticker collections" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Seq of update" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of update" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "collections" - }, { - "type": "int32", - "id": 2, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadOwnStickers", - "header": 238, - "response": { - "type": "anonymous", - "header": 239, - "doc": [ - "Own Stickers collections", { - "type": "reference", - "argument": "ownStickers", - "category": "hidden", - "description": " Own sticker collections" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "ownStickers" - }] - }, - "doc": [ - "Loading own stickers" - ], - "attributes": [] - } - }, { - "type": "update", - "content": { - "name": "OwnStickersChanged", - "header": 161, - "doc": [ - "Own Stickers changed", { - "type": "reference", - "argument": "collections", - "category": "compact", - "description": " New own sticker collections" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "collections" - }] - } - }, { - "type": "update", - "content": { - "name": "StickerCollectionsChanged", - "header": 164, - "doc": [ - "Sticker collection changed", { - "type": "reference", - "argument": "collections", - "category": "full", - "description": " Updated sticker collections" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "collections" - }] - } - }, { - "type": "rpc", - "content": { - "name": "AddStickerCollection", - "header": 244, - "response": { - "type": "reference", - "name": "StickersReponse" - }, - "doc": [ - "Adding sticker collection", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Collection id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": "Collection access hash" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RemoveStickerCollection", - "header": 245, - "response": { - "type": "reference", - "name": "StickersReponse" - }, - "doc": [ - "Removing sticker collection", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Collection id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": "Collection access hash" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadStickerCollection", - "header": 246, - "response": { - "type": "anonymous", - "header": 247, - "doc": [ - "Loaded collection", { - "type": "reference", - "argument": "collection", - "category": "full", - "description": " Collection of stickers" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "StickerCollection" - }, - "id": 1, - "name": "collection" - }] - }, - "doc": [ - "Loading stickers", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Collection id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": "Collection access hash" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }] - }, { - "title": "Search", - "package": "search", - "doc": [ - "Searching API" - ], - "items": [{ - "type": "enum", - "content": { - "name": "SearchPeerType", - "values": [{ - "name": "Groups", - "id": 1 - }, { - "name": "Contacts", - "id": 2 - }, { - "name": "Public", - "id": 3 - }] - } - }, { - "type": "enum", - "content": { - "name": "SearchContentType", - "values": [{ - "name": "Any", - "id": 1 - }, { - "name": "Text", - "id": 2 - }, { - "name": "Links", - "id": 3 - }, { - "name": "Documents", - "id": 4 - }, { - "name": "Photos", - "id": 5 - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "SearchCondition", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "SearchPeerTypeCondition", - "doc": [ - "Search peer type condition", { - "type": "reference", - "argument": "peerType", - "category": "full", - "description": " Peer type for searching" - } - ], - "trait": { - "name": "SearchCondition", - "key": 1 - }, - "attributes": [{ - "type": { - "type": "enum", - "childType": "SearchPeerType" - }, - "id": 1, - "name": "peerType" - }] - } - }, { - "type": "struct", - "content": { - "name": "SearchPieceText", - "doc": [ - "Search peer name condition", { - "type": "reference", - "argument": "query", - "category": "full", - "description": " Search query" - } - ], - "trait": { - "name": "SearchCondition", - "key": 2 - }, - "attributes": [{ - "type": "string", - "id": 1, - "name": "query" - }] - } - }, { - "type": "struct", - "content": { - "name": "SearchAndCondition", - "doc": [ - "Search AND condion", { - "type": "reference", - "argument": "andQuery", - "category": "full", - "description": " And Query" - } - ], - "trait": { - "name": "SearchCondition", - "key": 3 - }, - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "SearchCondition" - } - }, - "id": 1, - "name": "andQuery" - }] - } - }, { - "type": "struct", - "content": { - "name": "SearchOrCondition", - "doc": [ - "Search OR condition", { - "type": "reference", - "argument": "orQuery", - "category": "full", - "description": " Or Query" - } - ], - "trait": { - "name": "SearchCondition", - "key": 4 - }, - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "SearchCondition" - } - }, - "id": 2, - "name": "orQuery" - }] - } - }, { - "type": "struct", - "content": { - "name": "SearchPeerCondition", - "doc": [ - "Serch Peer condition", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer condition" - } - ], - "trait": { - "name": "SearchCondition", - "key": 5 - }, - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "struct", - "content": { - "name": "SearchPeerContentType", - "doc": [ - "Search content type condition", { - "type": "reference", - "argument": "contentType", - "category": "full", - "description": " Content Type" - } - ], - "trait": { - "name": "SearchCondition", - "key": 6 - }, - "attributes": [{ - "type": { - "type": "enum", - "childType": "SearchContentType" - }, - "id": 1, - "name": "contentType" - }] - } - }, { - "type": "struct", - "content": { - "name": "SearchSenderIdConfition", - "doc": [ - "Searching sender uid condition", { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " sender UID" - } - ], - "trait": { - "name": "SearchCondition", - "key": 7 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "senderId" - }] - } - }, { - "type": "struct", - "content": { - "name": "PeerSearchResult", - "doc": [ - "Peer search result", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer information" - }, { - "type": "reference", - "argument": "optMatchString", - "category": "full", - "description": " Description" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "optMatchString" - }] - } - }, { - "type": "rpc", - "content": { - "name": "PeerSearch", - "header": 233, - "response": { - "type": "anonymous", - "header": 234, - "doc": [ - "Found peers", { - "type": "reference", - "argument": "searchResults", - "category": "full", - "description": " Search Results" - }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Related users" - }, { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Related groups" - }, { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Related user peers" - }, { - "type": "reference", - "argument": "groupPeers", - "category": "full", - "description": " Related group peers" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "PeerSearchResult" - } - }, - "id": 1, - "name": "searchResults" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 4, - "name": "userPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 5, - "name": "groupPeers" - }] - }, - "doc": [ - "Performing peer search", { - "type": "reference", - "argument": "query", - "category": "full", - "description": "Search query. Warring not all combinations can be processed by server. (acts as OR)" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "SearchCondition" - } - }, - "id": 1, - "name": "query" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - }] - } - }, { - "type": "struct", - "content": { - "name": "MessageSearchResult", - "doc": [ - "Message container", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Message Peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Message Random Id" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Message Date" - }, { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " Message sender UID" - }, { - "type": "reference", - "argument": "content", - "category": "full", - "description": " Message content" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 4, - "name": "senderId" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 5, - "name": "content" - }] - } - }, { - "type": "struct", - "content": { - "name": "MessageSearchItem", - "doc": [ - "Message Search result container" - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "MessageSearchResult" - }, - "id": 1, - "name": "result" - }] - } - }, { - "type": "response", - "content": { - "name": "MessageSearchResponse", - "header": 218, - "doc": [ - "Search Result", { - "type": "reference", - "argument": "searchResults", - "category": "full", - "description": " Search results" - }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Search users" - }, { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Search groups" - }, { - "type": "reference", - "argument": "loadMoreState", - "category": "hidden", - "description": " State for loading more results" - }, { - "type": "reference", - "argument": "userOutPeers", - "category": "full", - "description": " Search user peers" - }, { - "type": "reference", - "argument": "groupOutPeers", - "category": "full", - "description": " Search group peers" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageSearchItem" - } - }, - "id": 1, - "name": "searchResults" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "groups" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 4, - "name": "loadMoreState" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 5, - "name": "userOutPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 6, - "name": "groupOutPeers" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MessageSearch", - "header": 217, - "response": { - "type": "reference", - "name": "MessageSearchResponse" - }, - "doc": [ - "Performing message search", { - "type": "reference", - "argument": "query", - "category": "full", - "description": "Search query" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "trait", - "childType": "SearchCondition" - }, - "id": 1, - "name": "query" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MessageSearchMore", - "header": 222, - "response": { - "type": "reference", - "name": "MessageSearchResponse" - }, - "doc": [ - "Performing message search paging", { - "type": "reference", - "argument": "loadMoreState", - "category": "hidden", - "description": "State for loading more results" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": "bytes", - "id": 1, - "name": "loadMoreState" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - }] - } - }] - }, { - "title": "Public Groups", - "package": "pubgroups", - "doc": [ - "Public group is easy way to find communities" - ], - "items": [{ - "type": "struct", - "content": { - "name": "PublicGroup", - "doc": [ - "Public Group description", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Group id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Group Access hash" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Group title" - }, { - "type": "reference", - "argument": "avatar", - "category": "full", - "description": " Group avatar" - }, { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Members count in group" - }, { - "type": "reference", - "argument": "friendsCount", - "category": "full", - "description": " Friends count int group" - }, { - "type": "reference", - "argument": "description", - "category": "full", - "description": " Description of group" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": "string", - "id": 3, - "name": "title" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 7, - "name": "avatar" - }, { - "type": "int32", - "id": 4, - "name": "membersCount" - }, { - "type": "int32", - "id": 5, - "name": "friendsCount" - }, { - "type": "string", - "id": 6, - "name": "description" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetPublicGroups", - "header": 201, - "response": { - "type": "anonymous", - "header": 202, - "doc": [ - "Loaded public groups", { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " All available groups" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "PublicGroup" - } - }, - "id": 1, - "name": "groups" - }] - }, - "doc": [ - "Getting public groups" - ], - "attributes": [] - } - }] - }, { - "title": "Invites", - "package": "invites", - "doc": [ - "Invite mechanizm" - ], - "items": [{ - "type": "struct", - "content": { - "name": "InviteState", - "doc": [ - "Invite state", { - "type": "reference", - "argument": "email", - "category": "full", - "description": " Email of invite" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " Name of invited user" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Uid of registered user" - }, { - "type": "reference", - "argument": "tid", - "category": "full", - "description": " Team id of invite" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "email" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 3, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 4, - "name": "tid" - }] - } - }, { - "type": "response", - "content": { - "name": "InviteList", - "header": 2564, - "doc": [ - "Intites list", { - "type": "reference", - "argument": "invites", - "category": "full", - "description": " Intvites" - }, { - "type": "reference", - "argument": "relatedUsers", - "category": "full", - "description": " Related users in invites" - }, { - "type": "reference", - "argument": "relatedGroups", - "category": "full", - "description": " Related groups in invites" - }, { - "type": "reference", - "argument": "relatedTeams", - "category": "full", - "description": " Related teams in invites" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "InviteState" - } - }, - "id": 1, - "name": "invites" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "relatedUsers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "relatedGroups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Team" - } - }, - "id": 4, - "name": "relatedTeams" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadOwnSentInvites", - "header": 2563, - "response": { - "type": "reference", - "name": "InviteList" - }, - "doc": [ - "Loading current invite states" - ], - "attributes": [] - } - }, { - "type": "rpc", - "content": { - "name": "SendInvite", - "header": 2565, - "response": { - "type": "reference", - "name": "InviteList" - }, - "doc": [ - "Sending an email invite", { - "type": "reference", - "argument": "email", - "category": "full", - "description": "Email for invite" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": "Optional name for invite" - }, { - "type": "reference", - "argument": "destTeam", - "category": "full", - "description": "Optional team for invite" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "email" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "OutTeam" - } - }, - "id": 3, - "name": "destTeam" - }] - } - }] - }, { - "title": "Teams", - "package": "teams", - "doc": [ - "Teams support for Actor" - ], - "items": [{ - "type": "struct", - "content": { - "name": "Team", - "doc": [ - "Team entity", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Team Id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Team Access Hash" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " Team name" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": "string", - "id": 3, - "name": "name" - }] - } - }, { - "type": "struct", - "content": { - "name": "OutTeam", - "doc": [ - "Reference to a team", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Team Id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": " Team access hash" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "response", - "content": { - "name": "TeamsList", - "header": 2562, - "doc": [ - "Teams response", { - "type": "reference", - "argument": "teams", - "category": "hidden", - "description": " Teams list" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Team" - } - }, - "id": 1, - "name": "teams" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadOwnTeams", - "header": 2561, - "response": { - "type": "reference", - "name": "TeamsList" - }, - "doc": [ - "Loading own teams" - ], - "attributes": [] - } - }, { - "type": "update", - "content": { - "name": "OwnTeamsChanged", - "header": 165, - "doc": [ - "Update about own teams changed", { - "type": "reference", - "argument": "ownTeams", - "category": "full", - "description": " Updated own teams list" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Team" - } - }, - "id": 1, - "name": "ownTeams" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CreateTeam", - "header": 2566, - "response": { - "type": "anonymous", - "header": 2567, - "doc": [ - "Created team response", { - "type": "reference", - "argument": "createdTeam", - "category": "full", - "description": " Created Team" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Team" - }, - "id": 1, - "name": "createdTeam" - }] - }, - "doc": [ - "Creation of a Team", { - "type": "reference", - "argument": "title", - "category": "full", - "description": "Title of a team" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "title" - }] - } - }, { - "type": "rpc", - "content": { - "name": "InviteToTeam", - "header": 2568, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Inviting people to team", { - "type": "reference", - "argument": "user", - "category": "full", - "description": "Dest user" - }, { - "type": "reference", - "argument": "destTeam", - "category": "full", - "description": "Dest team" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "user" - }, { - "type": { - "type": "struct", - "childType": "OutTeam" - }, - "id": 3, - "name": "destTeam" - }] - } - }] - }, { - "title": "Integrations", - "package": "integrations", - "doc": [ - "Package contains methods for providing integration" - ], - "items": [{ - "type": "response", - "content": { - "name": "IntegrationToken", - "header": 183, - "doc": [ - "Group token response", { - "type": "reference", - "argument": "token", - "category": "danger", - "description": " current group token" - }, { - "type": "reference", - "argument": "url", - "category": "danger", - "description": " current group url" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }, { - "type": "string", - "id": 2, - "name": "url" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetIntegrationToken", - "header": 182, - "response": { - "type": "reference", - "name": "IntegrationToken" - }, - "doc": [ - "Getting current group token", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RevokeIntegrationToken", - "header": 184, - "response": { - "type": "reference", - "name": "IntegrationToken" - }, - "doc": [ - "Revoke group token", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }] - }, { - "title": "Typing and Online", - "package": "weak", - "items": [{ - "type": "enum", - "content": { - "name": "TypingType", - "values": [{ - "name": "Text", - "id": 0 - }] - } - }, { - "type": "rpc", - "content": { - "name": "Typing", - "header": 27, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Sending typing notification", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "typingType", - "category": "full", - "description": "typing type." - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 3, - "name": "typingType" - }] - } - }, { - "type": "rpc", - "content": { - "name": "StopTyping", - "header": 30, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Stop typing", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "typingType", - "category": "full", - "description": "typing type" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 2, - "name": "typingType" - }] - } - }, { - "type": "enum", - "content": { - "name": "DeviceType", - "values": [{ - "name": "GENERIC", - "id": 1 - }, { - "name": "PC", - "id": 2 - }, { - "name": "MOBILE", - "id": 3 - }, { - "name": "TABLET", - "id": 4 - }, { - "name": "WATCH", - "id": 5 - }, { - "name": "MIRROR", - "id": 6 - }, { - "name": "CAR", - "id": 7 - }, { - "name": "TABLE", - "id": 8 - }] - } - }, { - "type": "rpc", - "content": { - "name": "SetOnline", - "header": 29, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Sending online state", { - "type": "reference", - "argument": "isOnline", - "category": "full", - "description": "is user online" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "timeout of online state in milliseconds" - }, { - "type": "reference", - "argument": "deviceType", - "category": "full", - "description": "Optional device type" - }, { - "type": "reference", - "argument": "deviceCategory", - "category": "full", - "description": "Optional device category, for example android or ios" - } - ], - "attributes": [{ - "type": "bool", - "id": 1, - "name": "isOnline" - }, { - "type": { - "type": "alias", - "childType": "msec" - }, - "id": 2, - "name": "timeout" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 3, - "name": "deviceType" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "deviceCategory" - }] - } - }, { - "type": "update", - "content": { - "name": "PauseNotifications", - "header": 166, - "doc": [ - "Update about pausing notifications", { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout for notifications resume" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 1, - "name": "timeout" - }] - } - }, { - "type": "update", - "content": { - "name": "RestoreNotifications", - "header": 167, - "doc": [ - "Update about restoring notifications" - ], - "attributes": [] - } - }, { - "type": "rpc", - "content": { - "name": "PauseNotifications", - "header": 2641, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Pause notifications", { - "type": "reference", - "argument": "timeout", - "category": "hidden", - "description": "Timeout of pause" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 1, - "name": "timeout" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RestoreNotifications", - "header": 2642, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Restoring notifications" - ], - "attributes": [] - } - }, { - "type": "empty" - }, { - "type": "update", - "content": { - "name": "Typing", - "header": 6, - "doc": [ - "Update about user's typing", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Conversation peer" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "typingType", - "category": "full", - "description": " Type of typing" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 3, - "name": "typingType" - }] - } - }, { - "type": "update", - "content": { - "name": "TypingStop", - "header": 81, - "doc": [ - "Update about user's typing stop", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Conversation peer" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "typingType", - "category": "hidden", - "description": " Type of typing" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 3, - "name": "typingType" - }] - } - }, { - "type": "update", - "content": { - "name": "UserOnline", - "header": 7, - "doc": [ - "Update about user became online", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 2, - "name": "deviceType" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "deviceCategory" - }] - } - }, { - "type": "update", - "content": { - "name": "UserOffline", - "header": 8, - "doc": [ - "Update about user became offline", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 2, - "name": "deviceType" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "deviceCategory" - }] - } - }, { - "type": "update", - "content": { - "name": "UserLastSeen", - "header": 9, - "doc": [ - "Update about user's last seen state", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Last seen time" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "date" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 3, - "name": "deviceType" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "deviceCategory" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupOnline", - "header": 33, - "doc": [ - "Update about group online change", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group id" - }, { - "type": "reference", - "argument": "count", - "category": "full", - "description": " current online user's count" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "int32", - "id": 2, - "name": "count" - }] - } - }] - }, { - "title": "Media and Files", - "package": "files", - "items": [{ - "type": "struct", - "content": { - "name": "FileLocation", - "doc": [ - "Location of file on server", { - "type": "reference", - "argument": "fileId", - "category": "full", - "description": " Unique Id of file" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Access hash of file" - } - ], - "expandable": "true", - "attributes": [{ - "type": "int64", - "id": 1, - "name": "fileId" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "struct", - "content": { - "name": "ImageLocation", - "doc": [ - "Image location", { - "type": "reference", - "argument": "fileLocation", - "category": "full", - "description": " Location of file" - }, { - "type": "reference", - "argument": "width", - "category": "full", - "description": " Width of avatar image" - }, { - "type": "reference", - "argument": "height", - "category": "full", - "description": " Height of avatar image" - }, { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " Size of file" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "fileLocation" - }, { - "type": "int32", - "id": 2, - "name": "width" - }, { - "type": "int32", - "id": 3, - "name": "height" - }, { - "type": "int32", - "id": 4, - "name": "fileSize" - }] - } - }, { - "type": "struct", - "content": { - "name": "AvatarImage", - "doc": [ - "Avatar Image", { - "type": "reference", - "argument": "fileLocation", - "category": "full", - "description": " Location of file" - }, { - "type": "reference", - "argument": "width", - "category": "full", - "description": " Width of avatar image" - }, { - "type": "reference", - "argument": "height", - "category": "full", - "description": " Height of avatar image" - }, { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " Size of file" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "fileLocation" - }, { - "type": "int32", - "id": 2, - "name": "width" - }, { - "type": "int32", - "id": 3, - "name": "height" - }, { - "type": "int32", - "id": 4, - "name": "fileSize" - }] - } - }, { - "type": "struct", - "content": { - "name": "Avatar", - "doc": [ - "Avatar of User or Group", { - "type": "reference", - "argument": "smallImage", - "category": "compact", - "description": " Optional small image of avatar box in 100x100" - }, { - "type": "reference", - "argument": "largeImage", - "category": "compact", - "description": " Optional large image of avatar box in 200x200" - }, { - "type": "reference", - "argument": "fullImage", - "category": "compact", - "description": " Optional full screen image of avatar" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "AvatarImage" - } - }, - "id": 1, - "name": "smallImage" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "AvatarImage" - } - }, - "id": 2, - "name": "largeImage" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "AvatarImage" - } - }, - "id": 3, - "name": "fullImage" - }] - } - }, { - "type": "struct", - "content": { - "name": "FastThumb", - "doc": [ - "Fast thumb of media messages. Less than 90x90 and compressed by JPEG with low quality", { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Width of thumb" - }, { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Height of thump" - }, { - "type": "reference", - "argument": "thumb", - "category": "compact", - "description": " compressed image data" - } - ], - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "w" - }, { - "type": "int32", - "id": 2, - "name": "h" - }, { - "type": "bytes", - "id": 3, - "name": "thumb" - }] - } - }, { - "type": "enum", - "content": { - "name": "Colors", - "values": [{ - "name": "red", - "id": 1 - }, { - "name": "yellow", - "id": 2 - }, { - "name": "green", - "id": 3 - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "Color", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "RgbColor", - "doc": [ - "RGB Color", { - "type": "reference", - "argument": "rgb", - "category": "full", - "description": " RGB color value" - } - ], - "trait": { - "name": "Color", - "key": 1 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "rgb" - }] - } - }, { - "type": "struct", - "content": { - "name": "PredefinedColor", - "doc": [ - "Predefined color", { - "type": "reference", - "argument": "color", - "category": "hidden", - "description": " Predefined color value" - } - ], - "trait": { - "name": "Color", - "key": 2 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "enum", - "childType": "Colors" - }, - "id": 1, - "name": "color" - }] - } - }, { - "type": "empty" - }, { - "type": "struct", - "content": { - "name": "HTTPHeader", - "doc": [ - "HTTP Header record", { - "type": "reference", - "argument": "key", - "category": "full", - "description": " HTTP Header name" - }, { - "type": "reference", - "argument": "value", - "category": "full", - "description": " HTTP Header value" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "key" - }, { - "type": "string", - "id": 2, - "name": "value" - }] - } - }, { - "type": "struct", - "content": { - "name": "FileUrlDescription", - "doc": [ - "File url description", { - "type": "reference", - "argument": "fileId", - "category": "full", - "description": " File id of url" - }, { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url for downloading" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout of url" - }, { - "type": "reference", - "argument": "unsignedUrl", - "category": "hidden", - "description": " Unsigned URL (used to honor web caches)" - }, { - "type": "reference", - "argument": "unsignedUrlHeaders", - "category": "hidden", - "description": " Headers that is required to download files with unsigned url" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "fileId" - }, { - "type": "string", - "id": 2, - "name": "url" - }, { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 3, - "name": "timeout" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "unsignedUrl" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "HTTPHeader" - } - }, - "id": 5, - "name": "unsignedUrlHeaders" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetFileUrl", - "header": 77, - "response": { - "type": "anonymous", - "header": 78, - "doc": [{ - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url for downloading" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout of url" - }, { - "type": "reference", - "argument": "unsignedUrl", - "category": "full", - "description": " Unsigned URL (used to honor web caches)" - }, { - "type": "reference", - "argument": "unsignedUrlHeaders", - "category": "full", - "description": " Headers that is required to download files with unsigned url" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "url" - }, { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 2, - "name": "timeout" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "unsignedUrl" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "HTTPHeader" - } - }, - "id": 4, - "name": "unsignedUrlHeaders" - }] - }, - "doc": [ - "Requesting file URL for downloading", { - "type": "reference", - "argument": "file", - "category": "full", - "description": "file's location" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "file" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetFileUrls", - "header": 2573, - "response": { - "type": "anonymous", - "header": 2574, - "doc": [{ - "type": "reference", - "argument": "fileUrls", - "category": "full", - "description": " File urls" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "FileUrlDescription" - } - }, - "id": 1, - "name": "fileUrls" - }] - }, - "doc": [ - "Requesting multiple fle URL for downloading", { - "type": "reference", - "argument": "files", - "category": "hidden", - "description": "File locations to load urls" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "FileLocation" - } - }, - "id": 1, - "name": "files" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetFileUrlBuilder", - "header": 2579, - "response": { - "type": "anonymous", - "header": 2580, - "doc": [{ - "type": "reference", - "argument": "baseUrl", - "category": "full", - "description": " Base Url for files" - }, { - "type": "reference", - "argument": "algo", - "category": "full", - "description": " Signature algorithm" - }, { - "type": "reference", - "argument": "seed", - "category": "full", - "description": " Public-visible seed of signature" - }, { - "type": "reference", - "argument": "signatureSecret", - "category": "full", - "description": " Signature Secret" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout of url builder" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "baseUrl" - }, { - "type": "string", - "id": 2, - "name": "algo" - }, { - "type": "string", - "id": 5, - "name": "seed" - }, { - "type": "bytes", - "id": 3, - "name": "signatureSecret" - }, { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 4, - "name": "timeout" - }] - }, - "doc": [ - "Get File URL Builder that allows to build file urls from client side", { - "type": "reference", - "argument": "supportedSignatureAlgorithms", - "category": "hidden", - "description": "Supported signature algorithms by client" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": "string" - }, - "id": 1, - "name": "supportedSignatureAlgorithms" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetFileUploadUrl", - "header": 97, - "response": { - "type": "anonymous", - "header": 121, - "doc": [{ - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url for uploading" - }, { - "type": "reference", - "argument": "uploadKey", - "category": "compact", - "description": " Upload key for upload" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "url" - }, { - "type": "bytes", - "id": 2, - "name": "uploadKey" - }] - }, - "doc": [ - "Requesting pload url", { - "type": "reference", - "argument": "expectedSize", - "category": "full", - "description": "Expected size of uploading file. May be inaccurate. Used for size allocation optimizations." - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "expectedSize" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CommitFileUpload", - "header": 122, - "response": { - "type": "anonymous", - "header": 138, - "doc": [{ - "type": "reference", - "argument": "uploadedFileLocation", - "category": "hidden", - "description": " Result file location" - }], - "attributes": [{ - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "uploadedFileLocation" - }] - }, - "doc": [ - "Comminting uploaded file to storage" - ], - "attributes": [{ - "type": "bytes", - "id": 1, - "name": "uploadKey" - }, { - "type": "string", - "id": 2, - "name": "fileName" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetFileUploadPartUrl", - "header": 142, - "response": { - "type": "anonymous", - "header": 141, - "doc": [{ - "type": "reference", - "argument": "url", - "category": "full", - "description": " Upload file part url" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "url" - }] - }, - "doc": [ - "Upload file part", { - "type": "reference", - "argument": "uploadKey", - "category": "compact", - "description": "Upload Key from requestFileUploadUrl" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "partNumber" - }, { - "type": "int32", - "id": 2, - "name": "partSize" - }, { - "type": "bytes", - "id": 3, - "name": "uploadKey" - }] - } - }] - }, { - "title": "Features", - "package": "features", - "doc": [ - "Enable feature discovery. Currently available features:", - "* \"call\" - private audio calls" - ], - "items": [{ - "type": "rpc", - "content": { - "name": "EnableFeature", - "header": 2588, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Enabling feature on the device", { - "type": "reference", - "argument": "featureName", - "category": "full", - "description": "Feature name" - }, { - "type": "reference", - "argument": "args", - "category": "danger", - "description": "Optional arguments to a feature" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "featureName" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "args" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DisableFeature", - "header": 2589, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Disabling feature on the device", { - "type": "reference", - "argument": "featureName", - "category": "full", - "description": "Feature name" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "featureName" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CheckFeatureEnabled", - "header": 2590, - "response": { - "type": "reference", - "name": "Bool" - }, - "doc": [ - "Method for checking if feature is available to user" - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userOutPeer" - }, { - "type": "string", - "id": 2, - "name": "featureName" - }] - } - }] - }, { - "title": "EventBus", - "package": "eventbus", - "items": [{ - "type": "rpc", - "content": { - "name": "CreateNewEventBus", - "header": 2665, - "response": { - "type": "anonymous", - "header": 2666, - "doc": [ - "Created new Event Bus", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Event Bus Id" - }, { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Your Device Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "deviceId" - }] - }, - "doc": [ - "Create new Event Bus", { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Optional timeout of Event Bus" - }, { - "type": "reference", - "argument": "isOwned", - "category": "full", - "description": "Is Event Bus owned by creator" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 1, - "name": "timeout" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isOwned" - }] - } - }, { - "type": "rpc", - "content": { - "name": "JoinEventBus", - "header": 2668, - "response": { - "type": "anonymous", - "header": 2669, - "doc": [{ - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Your Device Id" - }, { - "type": "reference", - "argument": "rejoinToken", - "category": "full", - "description": " Token that can be used for rejoining event bus with same device id" - }], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "deviceId" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "rejoinToken" - }] - }, - "doc": [ - "Joining Event Bus", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Join timeout" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 2, - "name": "timeout" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ReJoinEventBus", - "header": 2675, - "response": { - "type": "anonymous", - "header": 2676, - "doc": [{ - "type": "reference", - "argument": "deviceId", - "category": "hidden", - "description": " Your Device Id" - }], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "deviceId" - }] - }, - "doc": [ - "Rejoining to event bus after session was disposed", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - }, { - "type": "reference", - "argument": "rejoinToken", - "category": "full", - "description": "Rejoin Token" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": "bytes", - "id": 2, - "name": "rejoinToken" - }] - } - }, { - "type": "rpc", - "content": { - "name": "KeepAliveEventBus", - "header": 2670, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Keep Alive Event Bus", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Optional timeout for keep alive" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 2, - "name": "timeout" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DisposeEventBus", - "header": 2667, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Dispose Event Bus", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }] - } - }, { - "type": "rpc", - "content": { - "name": "PostToEventBus", - "header": 2671, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Event Bus Destination", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Bus Id" - }, { - "type": "reference", - "argument": "destinations", - "category": "full", - "description": "If Empty need to broadcase message to everyone" - }, { - "type": "reference", - "argument": "message", - "category": "hidden", - "description": "Message" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 2, - "name": "destinations" - }, { - "type": "bytes", - "id": 3, - "name": "message" - }] - } - }, { - "type": "update", - "content": { - "name": "EventBusDeviceConnected", - "header": 2561, - "doc": [ - "Update about pubsub device connected", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " ID of Event Bus" - }, { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " Joined User Id" - }, { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Joined Device Unique Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "userId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "deviceId" - }] - } - }, { - "type": "update", - "content": { - "name": "EventBusDeviceDisconnected", - "header": 2563, - "doc": [ - "Update about device disconnected", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " ID of Event Bus" - }, { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " Joined User Id" - }, { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Disconnected Device unique Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "userId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "deviceId" - }] - } - }, { - "type": "update", - "content": { - "name": "EventBusMessage", - "header": 2562, - "doc": [ - "Event Bus Message", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Event Bus Id" - }, { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " Sender of message" - }, { - "type": "reference", - "argument": "senderDeviceId", - "category": "full", - "description": " Device Id of sender" - }, { - "type": "reference", - "argument": "message", - "category": "hidden", - "description": " Message" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "senderId" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 3, - "name": "senderDeviceId" - }, { - "type": "bytes", - "id": 4, - "name": "message" - }] - } - }, { - "type": "update", - "content": { - "name": "EventBusDisposed", - "header": 2564, - "doc": [ - "Event Bus dispose", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Event Bus Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }] - } - }] - }, { - "title": "Values", - "package": "values", - "doc": [ - "Synced Values" - ], - "items": [{ - "type": "struct", - "content": { - "name": "SyncedValue", - "doc": [ - "Synced Value container", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Unique Id of a value. Unique in the scope of one named value." - }, { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Optional value" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "value" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadSyncedSet", - "header": 2679, - "response": { - "type": "anonymous", - "header": 2680, - "doc": [{ - "type": "reference", - "argument": "values", - "category": "full", - "description": " Current set values" - }, { - "type": "reference", - "argument": "isStrong", - "category": "full", - "description": " Is this value strong and stored in sequence. By default is true." - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "SyncedValue" - } - }, - "id": 1, - "name": "values" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isStrong" - }] - }, - "doc": [ - "Loading synced set", { - "type": "reference", - "argument": "setName", - "category": "hidden", - "description": "readable name of the set" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "setName" - }] - } - }, { - "type": "update", - "content": { - "name": "SynedSetUpdated", - "header": 72, - "doc": [ - "Update about synced set update", { - "type": "reference", - "argument": "setName", - "category": "full", - "description": " Set Name" - }, { - "type": "reference", - "argument": "syncedValues", - "category": "full", - "description": " Current set values" - }, { - "type": "reference", - "argument": "isStrong", - "category": "full", - "description": " Is this value strong and need to be stored on disk" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "setName" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "SyncedValue" - } - }, - "id": 2, - "name": "syncedValues" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isStrong" - }] - } - }, { - "type": "update", - "content": { - "name": "SyncedSetAddedOrUpdated", - "header": 73, - "doc": [ - "Update about added or updated values in the synced set", { - "type": "reference", - "argument": "setName", - "category": "full", - "description": " Set Name" - }, { - "type": "reference", - "argument": "addedOrUpdatedValues", - "category": "hidden", - "description": " Added or updated values" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "setName" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "SyncedValue" - } - }, - "id": 2, - "name": "addedOrUpdatedValues" - }] - } - }, { - "type": "update", - "content": { - "name": "SyncedSetRemoved", - "header": 74, - "doc": [ - "Update about removed items from synced set", { - "type": "reference", - "argument": "setName", - "category": "full", - "description": " Set Name" - }, { - "type": "reference", - "argument": "removedItems", - "category": "full", - "description": " Removed Items from the set" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "setName" - }, { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 2, - "name": "removedItems" - }] - } - }] - }, { - "title": "WebRTC", - "package": "webrtc", - "doc": [ - "WebRTC package that enables support to audio and video calls" - ], - "items": [{ - "type": "update", - "content": { - "name": "IncomingCall", - "header": 52, - "doc": [ - "Update about incoming call (Sent every 10 seconds)", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, { - "type": "reference", - "argument": "attemptIndex", - "category": "full", - "description": " Optional attempt Index" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 2, - "name": "attemptIndex" - }] - } - }, { - "type": "update", - "content": { - "name": "CallHandled", - "header": 53, - "doc": [ - "Update about incoming call handled", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, { - "type": "reference", - "argument": "attemptIndex", - "category": "full", - "description": " Optional attempt Index" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 2, - "name": "attemptIndex" - }] - } - }, { - "type": "update", - "content": { - "name": "CallUpgraded", - "header": 56, - "doc": [ - "Update about call moved to other peer", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Upgraded group id" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 2, - "name": "groupId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetCallInfo", - "header": 2600, - "response": { - "type": "anonymous", - "header": 2606, - "doc": [{ - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Users" - }, { - "type": "reference", - "argument": "eventBusId", - "category": "full", - "description": " Event Bus Id" - }, { - "type": "reference", - "argument": "isAudioOnlyCall", - "category": "full", - "description": " Is Audio Only Call. Default is true" - }, { - "type": "reference", - "argument": "isVideoOnlyCall", - "category": "full", - "description": " Is Video Only Call. Default is false." - }, { - "type": "reference", - "argument": "isVideoPreferred", - "category": "full", - "description": " Is Video preferred" - }], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 2, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "users" - }, { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 4, - "name": "eventBusId" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 5, - "name": "isAudioOnlyCall" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "isVideoOnlyCall" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 7, - "name": "isVideoPreferred" - }] - }, - "doc": [ - "Getting Call Information", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DoCall", - "header": 2597, - "response": { - "type": "anonymous", - "header": 2598, - "doc": [{ - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, { - "type": "reference", - "argument": "eventBusId", - "category": "full", - "description": " Call Event Bus Id" - }], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 2, - "name": "eventBusId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "deviceId" - }] - }, - "doc": [ - "Do Call. Right after a call client need to start sending CallInProgress", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "destination peer" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Initial timeout" - }, { - "type": "reference", - "argument": "isAudioOnlyCall", - "category": "full", - "description": "Is Audio only call. Default is true." - }, { - "type": "reference", - "argument": "isVideoOnlyCall", - "category": "full", - "description": "Is Video Only call. Default is false." - }, { - "type": "reference", - "argument": "isVideoPreferred", - "category": "full", - "description": "Is Video preferred" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 2, - "name": "timeout" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isAudioOnlyCall" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "isVideoOnlyCall" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "isVideoPreferred" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UpgradeCall", - "header": 2677, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Method for upgrading a call from private call to group call", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - }, { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer for upgrading" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 2, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DoCallAgain", - "header": 2678, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Call again to user", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - }, { - "type": "reference", - "argument": "user", - "category": "full", - "description": "User to call again" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "user" - }] - } - }, { - "type": "rpc", - "content": { - "name": "JoinCall", - "header": 2683, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Joining Call", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RejectCall", - "header": 2684, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Rejecting Call", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "OptimizeSDP", - "header": 2685, - "response": { - "type": "anonymous", - "header": 2686, - "doc": [{ - "type": "reference", - "argument": "optimizedSDP", - "category": "hidden", - "description": " Optimized version of SDP" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "optimizedSDP" - }] - }, - "doc": [ - "Optimizing SDP", { - "type": "reference", - "argument": "type", - "category": "full", - "description": "Type of SDP (offer or answer)" - }, { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": "SDP value" - }, { - "type": "reference", - "argument": "ownSettings", - "category": "full", - "description": "Own Settings" - }, { - "type": "reference", - "argument": "theirSettings", - "category": "full", - "description": "Their Settings" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "type" - }, { - "type": "string", - "id": 2, - "name": "sdp" - }, { - "type": { - "type": "struct", - "childType": "PeerSettings" - }, - "id": 3, - "name": "ownSettings" - }, { - "type": { - "type": "struct", - "childType": "PeerSettings" - }, - "id": 4, - "name": "theirSettings" - }] - } - }, { - "type": "struct", - "content": { - "name": "ICEServer", - "doc": [ - "ICE Server description", { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url to server" - }, { - "type": "reference", - "argument": "username", - "category": "full", - "description": " Optional username" - }, { - "type": "reference", - "argument": "credential", - "category": "danger", - "description": " Optional credential" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "url" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "username" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "credential" - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "WebRTCSignaling", - "attributes": [] - } - }, { - "type": "comment", - "content": "Advertising" - }, { - "type": "struct", - "content": { - "name": "AdvertiseSelf", - "doc": [ - "Advertizing self to a master mode", { - "type": "reference", - "argument": "peerSettings", - "category": "full", - "description": " Optional peer Settings" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 21 - }, - "attributes": [{ - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "PeerSettings" - } - }, - "id": 1, - "name": "peerSettings" - }] - } - }, { - "type": "struct", - "content": { - "name": "AdvertiseMaster", - "doc": [ - "Sent by master" - ], - "trait": { - "name": "WebRTCSignaling", - "key": 26 - }, - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ICEServer" - } - }, - "id": 1, - "name": "server" - }] - } - }, { - "type": "comment", - "content": "Web RTC signaling" - }, { - "type": "struct", - "content": { - "name": "Candidate", - "doc": [ - "Candidate signal", { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id of candidate" - }, { - "type": "reference", - "argument": "index", - "category": "full", - "description": " Index of candidate" - }, { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Id of candidate" - }, { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": " SDP of candidate" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 3 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "sessionId" - }, { - "type": "int32", - "id": 2, - "name": "index" - }, { - "type": "string", - "id": 3, - "name": "id" - }, { - "type": "string", - "id": 4, - "name": "sdp" - }] - } - }, { - "type": "struct", - "content": { - "name": "Offer", - "doc": [ - "Offer signal", { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id of offer" - }, { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": " Offer SDP" - }, { - "type": "reference", - "argument": "ownPeerSettings", - "category": "full", - "description": " Optional Own Peer settings" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 4 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "sessionId" - }, { - "type": "string", - "id": 2, - "name": "sdp" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "PeerSettings" - } - }, - "id": 3, - "name": "ownPeerSettings" - }] - } - }, { - "type": "struct", - "content": { - "name": "Answer", - "doc": [ - "Answer signal", { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id of answer" - }, { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": " Answer SDP" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 5 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "sessionId" - }, { - "type": "string", - "id": 2, - "name": "sdp" - }] - } - }, { - "type": "struct", - "content": { - "name": "MediaStreamsUpdated", - "doc": [ - "Update about media stream settings updated. Can be sent before offer/answer.", { - "type": "reference", - "argument": "isAudioEnabled", - "category": "full", - "description": " Is Audio Enabled in current connection. True by default." - }, { - "type": "reference", - "argument": "isVideoEnabled", - "category": "full", - "description": " Is Video Enabled in current connection. False by default." - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 28 - }, - "attributes": [{ - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "isAudioEnabled" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isVideoEnabled" - }] - } - }, { - "type": "comment", - "content": "Call Controlling events" - }, { - "type": "struct", - "content": { - "name": "NeedOffer", - "doc": [ - "Notification from master that offer is required", { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Destination Device Id" - }, { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - }, { - "type": "reference", - "argument": "peerSettings", - "category": "full", - "description": " Optional peer settings" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 8 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "PeerSettings" - } - }, - "id": 3, - "name": "peerSettings" - }] - } - }, { - "type": "struct", - "content": { - "name": "NegotinationSuccessful", - "doc": [ - "Notification about on negotiation is successful", { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Device Id" - }, { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 24 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - }] - } - }, { - "type": "struct", - "content": { - "name": "EnableConnection", - "doc": [ - "Notification about enabling connection to peer", { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Device Id" - }, { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 22 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - }] - } - }, { - "type": "struct", - "content": { - "name": "OnRenegotiationNeeded", - "doc": [ - "Need renegotiate session. For example when streams are changed.", { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Device Id" - }, { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 25 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - }] - } - }, { - "type": "struct", - "content": { - "name": "CloseSession", - "doc": [ - "Close this session and be ready to", { - "type": "reference", - "argument": "device", - "category": "hidden", - "description": " Device Id" - }, { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id for renegotiation" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 6 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - }] - } - }, { - "type": "struct", - "content": { - "name": "NeedDisconnect", - "doc": [ - "Notification about requirement about required disconnection from peer", { - "type": "reference", - "argument": "device", - "category": "hidden", - "description": " Device Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 20 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }] - } - }, { - "type": "struct", - "content": { - "name": "ActiveCall", - "doc": [ - "Active Calls. Used in broadcasting states of current calls.", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Call's peer" - }, { - "type": "reference", - "argument": "callMembers", - "category": "full", - "description": " Call Members" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 2, - "name": "peer" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "CallMember" - } - }, - "id": 3, - "name": "callMembers" - }] - } - }, { - "type": "enum", - "content": { - "name": "CallMemberState", - "values": [{ - "name": "RINGING", - "id": 1 - }, { - "name": "RINGING_REACHED", - "id": 4 - }, { - "name": "CONNECTING", - "id": 2 - }, { - "name": "CONNECTED", - "id": 3 - }, { - "name": "ENDED", - "id": 5 - }] - } - }, { - "type": "struct", - "content": { - "name": "CallMemberStateHolder", - "doc": [ - "Call Member state holder", { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State Value" - }, { - "type": "reference", - "argument": "fallbackIsRinging", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, { - "type": "reference", - "argument": "fallbackIsConnected", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, { - "type": "reference", - "argument": "fallbackIsConnecting", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, { - "type": "reference", - "argument": "fallbackIsRingingReached", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, { - "type": "reference", - "argument": "fallbackIsEnded", - "category": "full", - "description": " Fallback flag for future compatibility of state" - } - ], - "attributes": [{ - "type": { - "type": "enum", - "childType": "CallMemberState" - }, - "id": 1, - "name": "state" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "fallbackIsRinging" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "fallbackIsConnected" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "fallbackIsConnecting" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 5, - "name": "fallbackIsRingingReached" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "fallbackIsEnded" - }] - } - }, { - "type": "struct", - "content": { - "name": "CallMember", - "doc": [ - "Call Member", { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " Member User Id" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of member" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "userId" - }, { - "type": { - "type": "struct", - "childType": "CallMemberStateHolder" - }, - "id": 3, - "name": "state" - }] - } - }, { - "type": "struct", - "content": { - "name": "PeerSettings", - "doc": [ - "Peer Settings", { - "type": "reference", - "argument": "is3DESSupported", - "category": "full", - "description": " Marking if 3DES supported. Default is false." - }, { - "type": "reference", - "argument": "isMobile", - "category": "full", - "description": " Is Peer a mobile phone. Default is false." - }, { - "type": "reference", - "argument": "canBeAudioRelay", - "category": "full", - "description": " If peer can audio relay. Default is false." - }, { - "type": "reference", - "argument": "canPreConnect", - "category": "full", - "description": " If peer can preconnect before answer" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "is3DESSupported" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isMobile" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "canBeAudioRelay" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "canPreConnect" - }] - } - }] - }, { - "title": "Config sync", - "package": "configs", - "doc": [ - "Parameter Syncronization across devices. Can be used for simple sync", - "across devices without rewriting server side code." - ], - "items": [{ - "type": "struct", - "content": { - "name": "Parameter", - "doc": [ - "Syncing Parameter", { - "type": "reference", - "argument": "key", - "category": "full", - "description": " Key of parameter" - }, { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Value of parameter" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "key" - }, { - "type": "string", - "id": 2, - "name": "value" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetParameters", - "header": 134, - "response": { - "type": "anonymous", - "header": 135, - "doc": [{ - "type": "reference", - "argument": "parameters", - "category": "full", - "description": " Current parameters" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Parameter" - } - }, - "id": 1, - "name": "parameters" - }] - }, - "doc": [ - "Getting Parameters" - ], - "attributes": [] - } - }, { - "type": "rpc", - "content": { - "name": "EditParameter", - "header": 128, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Change parameter value", { - "type": "reference", - "argument": "key", - "category": "full", - "description": "Key of parameter" - }, { - "type": "reference", - "argument": "value", - "category": "full", - "description": "Value of parameter" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "key" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "value" - }] - } - }, { - "type": "update", - "content": { - "name": "ParameterChanged", - "header": 131, - "doc": [ - "Update about parameter change", { - "type": "reference", - "argument": "key", - "category": "full", - "description": " Key of parameter" - }, { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Value of parameter" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "key" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "value" - }] - } - }] - }, { - "title": "Stats", - "package": "stats", - "doc": [ - "Saving statistics information" - ], - "items": [{ - "type": "struct", - "content": { - "name": "EventRecord", - "doc": [ - "Record for stored event" - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "date" - }, - "id": 1, - "name": "date" - }, { - "type": { - "type": "trait", - "childType": "Event" - }, - "id": 2, - "name": "event" - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "Event", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "UntypedEvent", - "doc": [ - "Untyped event", { - "type": "reference", - "argument": "eventType", - "category": "full", - "description": " Event type" - }, { - "type": "reference", - "argument": "params", - "category": "full", - "description": " optional params for event" - } - ], - "trait": { - "name": "Event", - "key": 1 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "eventType" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 2, - "name": "params" - }] - } - }, { - "type": "struct", - "content": { - "name": "ContentViewChanged", - "doc": [ - "Content view event", { - "type": "reference", - "argument": "contentType", - "category": "full", - "description": " unique content id" - }, { - "type": "reference", - "argument": "visible", - "category": "full", - "description": " Is content visible" - }, { - "type": "reference", - "argument": "params", - "category": "full", - "description": " optional params for content view" - } - ], - "trait": { - "name": "Event", - "key": 2 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "contentType" - }, { - "type": "string", - "id": 2, - "name": "contentId" - }, { - "type": "bool", - "id": 3, - "name": "visible" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 4, - "name": "params" - }] - } - }, { - "type": "struct", - "content": { - "name": "AppVisibleChanged", - "doc": [ - "On App Visible event", { - "type": "reference", - "argument": "visible", - "category": "full", - "description": " Is app visible" - } - ], - "trait": { - "name": "Event", - "key": 4 - }, - "expandable": "true", - "attributes": [{ - "type": "bool", - "id": 1, - "name": "visible" - }] - } - }, { - "type": "rpc", - "content": { - "name": "StoreEvents", - "header": 243, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Storing events on server", { - "type": "reference", - "argument": "events", - "category": "full", - "description": "Events for storing" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "Event" - } - }, - "id": 1, - "name": "events" - }] - } - }] - }, { - "title": "Raw API", - "package": "raw", - "doc": [ - "Schema-less API that is useful for external integrations" - ], - "items": [{ - "type": "rpc", - "content": { - "name": "RawRequest", - "header": 2569, - "response": { - "type": "anonymous", - "header": 2570, - "doc": [ - "Response of a raw request", { - "type": "reference", - "argument": "result", - "category": "full", - "description": " Result of request" - } - ], - "attributes": [{ - "type": { - "type": "trait", - "childType": "RawValue" - }, - "id": 1, - "name": "result" - }] - }, - "doc": [ - "Making raw request to external service via shema-less RPC request", { - "type": "reference", - "argument": "service", - "category": "full", - "description": "Service name for RPC request" - }, { - "type": "reference", - "argument": "method", - "category": "full", - "description": "Method for execution" - }, { - "type": "reference", - "argument": "params", - "category": "full", - "description": "Optional params for the method" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "service" - }, { - "type": "string", - "id": 2, - "name": "method" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 3, - "name": "params" - }] - } - }] - }, { - "title": "Wallpappers", - "package": "wallpappers", - "doc": [ - "Wallpappers support" - ], - "items": [{ - "type": "struct", - "content": { - "name": "Wallpapper", - "doc": [ - "Wallpapper structure", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Wallpapper id" - }, { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Image width" - }, { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Image height" - }, { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " Image file size" - }, { - "type": "reference", - "argument": "file", - "category": "full", - "description": " Image file reference" - }, { - "type": "reference", - "argument": "thumb", - "category": "full", - "description": " Image thumb" - } - ], - "attributes": [{ - "type": "int32", - "id": 7, - "name": "id" - }, { - "type": "int32", - "id": 1, - "name": "w" - }, { - "type": "int32", - "id": 2, - "name": "h" - }, { - "type": "int32", - "id": 3, - "name": "fileSize" - }, { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 5, - "name": "file" - }, { - "type": { - "type": "struct", - "childType": "FastThumb" - }, - "id": 6, - "name": "thumb" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadWallpappers", - "header": 241, - "response": { - "type": "anonymous", - "header": 242, - "doc": [ - "Loaded Wallpappers", { - "type": "reference", - "argument": "wallpappers", - "category": "full", - "description": " Available wallpapper list" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Wallpapper" - } - }, - "id": 1, - "name": "wallpappers" - }] - }, - "doc": [ - "Load available wallpappers", { - "type": "reference", - "argument": "maxWidth", - "category": "full", - "description": "Maximum width of wallpapper" - }, { - "type": "reference", - "argument": "maxHeight", - "category": "full", - "description": "Maximum height of wallpapper" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "maxWidth" - }, { - "type": "int32", - "id": 2, - "name": "maxHeight" - }] - } - }] - }, { - "title": "Push", - "package": "push", - "doc": [ - "Vendor's pushes for receiving push notifications.", - "Push notification contains current sequence number of main sequence." - ], - "items": [{ - "type": "rpc", - "content": { - "name": "RegisterGooglePush", - "header": 51, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registering push token on server", { - "type": "reference", - "argument": "projectId", - "category": "hidden", - "description": "Project Id of token" - }, { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "token value" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "projectId" - }, { - "type": "string", - "id": 2, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnregisterGooglePush", - "header": 2631, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregistering Google Push", { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "Token value" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RegisterApplePush", - "header": 76, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registering apple push on server", { - "type": "reference", - "argument": "apnsKey", - "category": "hidden", - "description": "apns key id" - }, { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "token value" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "apnsKey" - }, { - "type": "string", - "id": 2, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnregisterApplePush", - "header": 2632, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregistering Apple Push", { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Token" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RegisterApplePushKit", - "header": 2576, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registration of a new Apple's PushKit tokens", { - "type": "reference", - "argument": "apnsKey", - "category": "hidden", - "description": "APNS key id" - }, { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "token value" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "apnsKey" - }, { - "type": "string", - "id": 2, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnregisterApplePushKit", - "header": 2633, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregistering Apple Push Kit token", { - "type": "reference", - "argument": "token", - "category": "hidden", - "description": "Token Value" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RegisterApplePushToken", - "header": 2593, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registering Apple Push Token", { - "type": "reference", - "argument": "bundleId", - "category": "full", - "description": "Bundle Id of app" - }, { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Push token" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "bundleId" - }, { - "type": "string", - "id": 2, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnregisterApplePushToken", - "header": 2634, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregister Apple Push token", { - "type": "reference", - "argument": "token", - "category": "hidden", - "description": "Token value" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RegisterActorPush", - "header": 2575, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Register Actor Push endpoint", { - "type": "reference", - "argument": "endpoint", - "category": "full", - "description": "Endpoint for push sending" - }, { - "type": "reference", - "argument": "encryptionKeys", - "category": "full", - "description": "Push Encryption keys" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "endpoint" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 2, - "name": "encryptionKeys" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnregisterActorPush", - "header": 2635, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregister Actor Push endpoint", { - "type": "reference", - "argument": "endpoint", - "category": "full", - "description": "Endpoint for unregistering" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "endpoint" - }] - } - }] - }, { - "title": "Encryption", - "package": "encryption", - "doc": [ - "Package that include encryption support", - "Key alg types:", - "* curve25519 - https://en.wikipedia.org/wiki/Curve25519", - "* rsa-2048", - "* rsa-4096", - "* aes-128", - "* kuznechik-128", - "", - "Signature alg types:", - "* Ed25519 - used curve25519 conveted to Ed255519 for signing and validataion" - ], - "items": [{ - "type": "comment", - "content": "Public Keys" - }, { - "type": "struct", - "content": { - "name": "EncryptionKeyGroup", - "doc": [ - "Encryption Key Group", { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, { - "type": "reference", - "argument": "identityKey", - "category": "full", - "description": " Key that is used as identity and for validation of Key Group changes" - }, { - "type": "reference", - "argument": "supportedEncryption", - "category": "full", - "description": " Supported encryption methods by this key group" - }, { - "type": "reference", - "argument": "keys", - "category": "compact", - "description": " keys of Key Group" - }, { - "type": "reference", - "argument": "signatures", - "category": "compact", - "description": " Signatures of keys" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 2, - "name": "supportedEncryption" - }, { - "type": { - "type": "struct", - "childType": "EncryptionKey" - }, - "id": 3, - "name": "identityKey" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 4, - "name": "keys" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 5, - "name": "signatures" - }] - } - }, { - "type": "struct", - "content": { - "name": "EncryptionKeySignature", - "doc": [ - "Signed Key. Usually used for public keys.", { - "type": "reference", - "argument": "keyId", - "category": "full", - "description": " Key Id used for signature" - }, { - "type": "reference", - "argument": "signatureAlg", - "category": "full", - "description": " Signature algorithm" - }, { - "type": "reference", - "argument": "signature", - "category": "full", - "description": " Signature value" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "keyId" - }, { - "type": "string", - "id": 2, - "name": "signatureAlg" - }, { - "type": "bytes", - "id": 3, - "name": "signature" - }] - } - }, { - "type": "struct", - "content": { - "name": "EncryptionKey", - "doc": [ - "Encryption Key", { - "type": "reference", - "argument": "keyId", - "category": "full", - "description": " Key Id" - }, { - "type": "reference", - "argument": "keyAlg", - "category": "full", - "description": " Key Algorithm" - }, { - "type": "reference", - "argument": "keyMaterial", - "category": "compact", - "description": " Public key material. Can be null, but always not null for LoadPublicKey" - }, { - "type": "reference", - "argument": "keyHash", - "category": "hidden", - "description": " If keyMaterial is null, pass keyHash - SHA256 of key" - } - ], - "expandable": "true", - "attributes": [{ - "type": "int64", - "id": 1, - "name": "keyId" - }, { - "type": "string", - "id": 2, - "name": "keyAlg" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 3, - "name": "keyMaterial" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 4, - "name": "keyHash" - }] - } - }, { - "type": "response", - "content": { - "name": "PublicKeys", - "header": 2602, - "doc": [ - "Public Keys response", { - "type": "reference", - "argument": "publicKey", - "category": "full", - "description": " Public keys" - }, { - "type": "reference", - "argument": "signatures", - "category": "full", - "description": " Signatures of public keys" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 1, - "name": "publicKey" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 2, - "name": "signatures" - }] - } - }, { - "type": "response", - "content": { - "name": "PublicKeyGroups", - "header": 2604, - "doc": [ - "Public key groups response" - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeyGroup" - } - }, - "id": 1, - "name": "publicKeyGroups" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadPublicKeyGroups", - "header": 2601, - "response": { - "type": "reference", - "name": "PublicKeyGroups" - }, - "doc": [ - "Loading Public key groups", { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadPublicKey", - "header": 2605, - "response": { - "type": "reference", - "name": "PublicKeys" - }, - "doc": [ - "Loading public key explictly", { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - }, { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key group's id" - }, { - "type": "reference", - "argument": "keyIds", - "category": "full", - "description": "Key ids for loading" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userPeer" - }, { - "type": "int32", - "id": 2, - "name": "keyGroupId" - }, { - "type": { - "type": "list", - "childType": "int64" - }, - "id": 3, - "name": "keyIds" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadPrePublicKeys", - "header": 2603, - "response": { - "type": "reference", - "name": "PublicKeys" - }, - "doc": [ - "Loading SOME of ephermal public keys", { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - }, { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "User's key group id" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userPeer" - }, { - "type": "int32", - "id": 2, - "name": "keyGroupId" - }] - } - }, { - "type": "update", - "content": { - "name": "PublicKeyGroupChanged", - "header": 103, - "doc": [ - "Update about public key group changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroup", - "category": "full", - "description": " Updated Key Group" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "struct", - "childType": "EncryptionKeyGroup" - }, - "id": 2, - "name": "keyGroup" - }] - } - }, { - "type": "update", - "content": { - "name": "KeysAdded", - "header": 112, - "doc": [ - "Update about keys added to Key Group", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, { - "type": "reference", - "argument": "keys", - "category": "compact", - "description": " Added keys" - }, { - "type": "reference", - "argument": "signatures", - "category": "compact", - "description": " Signatures of a public key" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 3, - "name": "keys" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 4, - "name": "signatures" - }] - } - }, { - "type": "update", - "content": { - "name": "KeysRemoved", - "header": 113, - "doc": [ - "Update about keys removed from Key Group", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, { - "type": "reference", - "argument": "keyIds", - "category": "full", - "description": " Removed keys" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }, { - "type": { - "type": "list", - "childType": "int64" - }, - "id": 3, - "name": "keyIds" - }] - } - }, { - "type": "update", - "content": { - "name": "PublicKeyGroupAdded", - "header": 104, - "doc": [ - "Update about public key group added", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroup", - "category": "full", - "description": " Added Key Group" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "struct", - "childType": "EncryptionKeyGroup" - }, - "id": 2, - "name": "keyGroup" - }] - } - }, { - "type": "update", - "content": { - "name": "PublicKeyGroupRemoved", - "header": 105, - "doc": [ - "Update about public key group removed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Removed Key Group Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }] - } - }, { - "type": "comment", - "content": "Device Side" - }, { - "type": "rpc", - "content": { - "name": "CreateNewKeyGroup", - "header": 2609, - "response": { - "type": "anonymous", - "header": 2610, - "doc": [{ - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Created Key Group id" - }], - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }] - }, - "doc": [ - "Creation of a new Key Group", { - "type": "reference", - "argument": "identityKey", - "category": "full", - "description": "Identity Key of a new group" - }, { - "type": "reference", - "argument": "supportedEncryptions", - "category": "full", - "description": "Supported encryption methods" - }, { - "type": "reference", - "argument": "keys", - "category": "full", - "description": "keys of current group" - }, { - "type": "reference", - "argument": "signatures", - "category": "full", - "description": "signatures of keys" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "EncryptionKey" - }, - "id": 1, - "name": "identityKey" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 2, - "name": "supportedEncryptions" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 3, - "name": "keys" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 4, - "name": "signatures" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DeleteKeyGroup", - "header": 2611, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Deletion of a Key Group", { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id for deletion" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DisconnectKeyGroup", - "header": 2613, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Disconnect Key Group from device", { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id for disconnection" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ConnectKeyGroup", - "header": 2614, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Connectiong Key Group to device", { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id for connection" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UploadPreKey", - "header": 2612, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Uploading Ephermal Keys", { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id" - }, { - "type": "reference", - "argument": "keys", - "category": "compact", - "description": "Encryprion keys" - }, { - "type": "reference", - "argument": "signatures", - "category": "compact", - "description": "Key signatures" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 2, - "name": "keys" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 3, - "name": "signatures" - }] - } - }, { - "type": "comment", - "content": "Encrypted Packages" - }, { - "type": "struct", - "content": { - "name": "EncryptedBox", - "doc": [ - "Encrypted package that is encrypted for multiple keys", { - "type": "reference", - "argument": "keys", - "category": "full", - "description": " Encrypted encryption keys" - }, { - "type": "reference", - "argument": "algType", - "category": "full", - "description": " Package encryption type" - }, { - "type": "reference", - "argument": "encPackage", - "category": "full", - "description": " Encrypted package" - }, { - "type": "reference", - "argument": "senderKeyGroupId", - "category": "full", - "description": " Sender key group" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 4, - "name": "senderKeyGroupId" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncyptedBoxKey" - } - }, - "id": 1, - "name": "keys" - }, { - "type": "string", - "id": 2, - "name": "algType" - }, { - "type": "bytes", - "id": 3, - "name": "encPackage" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptedBoxSignature" - } - }, - "id": 5, - "name": "signatures" - }] - } - }, { - "type": "struct", - "content": { - "name": "EncryptedBoxSignature", - "doc": [ - "Signature for encrypted package", { - "type": "reference", - "argument": "algType", - "category": "full", - "description": " Alg Type" - }, { - "type": "reference", - "argument": "signature", - "category": "full", - "description": " Signature of encrypted package" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "algType" - }, { - "type": "bytes", - "id": 2, - "name": "signature" - }] - } - }, { - "type": "struct", - "content": { - "name": "EncyptedBoxKey", - "doc": [ - "Encrypted package encryption key", { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, { - "type": "reference", - "argument": "algType", - "category": "full", - "description": " Key encryption algorithm" - }, { - "type": "reference", - "argument": "encryptedKey", - "category": "hidden", - "description": " Encrypted encryption key" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "usersId" - }, { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }, { - "type": "string", - "id": 3, - "name": "algType" - }, { - "type": "bytes", - "id": 4, - "name": "encryptedKey" - }] - } - }, { - "type": "struct", - "content": { - "name": "KeyGroupId", - "doc": [ - "References to key groups", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }] - } - }, { - "type": "struct", - "content": { - "name": "KeyGroupHolder", - "doc": [ - "Key Group Holder", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroup", - "category": "full", - "description": " Key Group" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "struct", - "childType": "EncryptionKeyGroup" - }, - "id": 2, - "name": "keyGroup" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SendEncryptedPackage", - "header": 2657, - "response": { - "type": "anonymous", - "header": 2664, - "doc": [{ - "type": "reference", - "argument": "date", - "category": "full", - "description": " date" - }, { - "type": "reference", - "argument": "obsoleteKeyGroups", - "category": "full", - "description": " obsolete key group ids" - }, { - "type": "reference", - "argument": "missedKeyGroups", - "category": "full", - "description": " missed key groups" - }], - "attributes": [{ - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "date" - } - }, - "id": 1, - "name": "date" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "KeyGroupId" - } - }, - "id": 2, - "name": "obsoleteKeyGroups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "KeyGroupHolder" - } - }, - "id": 3, - "name": "missedKeyGroups" - }] - }, - "doc": [ - "Sending encrypted package", { - "type": "reference", - "argument": "randomId", - "category": "hidden", - "description": "Random id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "randomId" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 2, - "name": "destPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "KeyGroupId" - } - }, - "id": 3, - "name": "ignoredKeyGroups" - }, { - "type": { - "type": "struct", - "childType": "EncryptedBox" - }, - "id": 4, - "name": "encryptedBox" - }] - } - }, { - "type": "update", - "content": { - "name": "EncryptedPackage", - "header": 177, - "doc": [ - "Update about encrypted package", { - "type": "reference", - "argument": "randomId", - "category": "full", - "description": " Random Id of package" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Sending date of package" - }, { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " Sender id of package" - }, { - "type": "reference", - "argument": "encryptedBox", - "category": "full", - "description": " Encrypted box" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "randomId" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "date" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "senderId" - }, { - "type": { - "type": "struct", - "childType": "EncryptedBox" - }, - "id": 4, - "name": "encryptedBox" - }] - } - }] - }, { - "title": "Storage", - "package": "storage", - "items": [{ - "type": "rpc", - "content": { - "name": "UploadSharedBlob", - "header": 2660, - "response": { - "type": "anonymous", - "header": 2661, - "doc": [{ - "type": "reference", - "argument": "sharedObjectId", - "category": "full", - "description": " Id of shared object" - }], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "sharedObjectId" - }] - }, - "doc": [ - "Upload shared blob with user", { - "type": "reference", - "argument": "destPeer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "bucket", - "category": "full", - "description": "Bucked name" - }, { - "type": "reference", - "argument": "blob", - "category": "full", - "description": "Blob data" - }, { - "type": "reference", - "argument": "randomId", - "category": "full", - "description": "Random id for protecting from double upload" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "destPeer" - }, { - "type": "string", - "id": 2, - "name": "bucket" - }, { - "type": "bytes", - "id": 3, - "name": "blob" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "randomId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DownloadSharedBlob", - "header": 2662, - "response": { - "type": "anonymous", - "header": 2663, - "doc": [{ - "type": "reference", - "argument": "blob", - "category": "full", - "description": " Blob contents" - }], - "attributes": [{ - "type": "bytes", - "id": 1, - "name": "blob" - }] - }, - "doc": [ - "Download shared blob", { - "type": "reference", - "argument": "destPeer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "bucket", - "category": "full", - "description": "Bucket name" - }, { - "type": "reference", - "argument": "objectId", - "category": "full", - "description": "Object Id" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "destPeer" - }, { - "type": "string", - "id": 2, - "name": "bucket" - }, { - "type": "int32", - "id": 3, - "name": "objectId" - }] - } - }] - }, { - "title": "Peers", - "package": "peers", - "doc": [ - "Peer is an identificator of specific conversation." - ], - "items": [{ - "type": "enum", - "content": { - "name": "PeerType", - "values": [{ - "name": "Private", - "id": 1 - }, { - "name": "Group", - "id": 2 - }, { - "name": "EncryptedPrivate", - "id": 3 - }] - } - }, { - "type": "struct", - "content": { - "name": "Peer", - "doc": [ - "Peer", { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Peer Type" - }, { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Peer Id" - } - ], - "attributes": [{ - "type": { - "type": "enum", - "childType": "PeerType" - }, - "id": 1, - "name": "type" - }, { - "type": "int32", - "id": 2, - "name": "id" - }] - } - }, { - "type": "struct", - "content": { - "name": "OutPeer", - "doc": [ - "Out peer with access hash", { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Peer Type" - }, { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Peer Id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Peer access hash" - } - ], - "attributes": [{ - "type": { - "type": "enum", - "childType": "PeerType" - }, - "id": 1, - "name": "type" - }, { - "type": "int32", - "id": 2, - "name": "id" - }, { - "type": "int64", - "id": 3, - "name": "accessHash" - }] - } - }, { - "type": "struct", - "content": { - "name": "UserOutPeer", - "doc": [ - "User's out peer", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " User's access hash" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "struct", - "content": { - "name": "GroupOutPeer", - "doc": [ - "Group's out peer", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group's Id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Group's access hash" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }] - }, { - "title": "Sequence and Updates", - "package": "sequence", - "doc": [ - "Each device has it's own update sequence. At the begining application request initial sequence state by", - "calling GetState. On each application restart or NewSessionCreated application calls GetDifference for receiving", - "updates in update sequence.", - "GetState and GetDifference automatically subscribes session to receiving updates in session.", - "Each update has seq and state. Seq is sequental index of updated and used for detecting of holes in update sequence", - "(because of server failure or session die) on client side.", - "All updates needed to be processed in partucular order according to seq values.", - "In some updates there can be references to users that are not available at client yer. In this case application need", - "to ignore such update and init getting difference." - ], - "items": [{ - "type": "update_box", - "content": { - "name": "SeqUpdate", - "header": 13, - "doc": [ - "Sequence update", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of update" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequece state of update" - }, { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " header of update" - }, { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The update" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": "int32", - "id": 3, - "name": "updateHeader" - }, { - "type": "bytes", - "id": 4, - "name": "update" - }] - } - }, { - "type": "update_box", - "content": { - "name": "FatSeqUpdate", - "header": 73, - "doc": [ - "Fat sequence update with additional data", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of update" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state of update" - }, { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " header of update" - }, { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The update" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Users that are referenced in update" - }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups that are referenced in update" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": "int32", - "id": 3, - "name": "updateHeader" - }, { - "type": "bytes", - "id": 4, - "name": "update" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 5, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 6, - "name": "groups" - }] - } - }, { - "type": "update_box", - "content": { - "name": "WeakUpdate", - "header": 26, - "doc": [ - "Out of sequence update (for typing and online statuses)", { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of update" - }, { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " Header of update" - }, { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The update" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "date" - }, { - "type": "int32", - "id": 2, - "name": "updateHeader" - }, { - "type": "bytes", - "id": 3, - "name": "update" - }] - } - }, { - "type": "update_box", - "content": { - "name": "WeakFatUpdate", - "header": 2673, - "doc": [ - "Fat Weak Update", { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of update" - }, { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " Header of update" - }, { - "type": "reference", - "argument": "update", - "category": "full", - "description": " The update" - }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Users that are referenced in update" - }, { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Groups that are referenced in update" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "date" - }, { - "type": "int32", - "id": 2, - "name": "updateHeader" - }, { - "type": "bytes", - "id": 3, - "name": "update" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 4, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 5, - "name": "groups" - }] - } - }, { - "type": "update_box", - "content": { - "name": "SeqUpdateTooLong", - "header": 25, - "doc": [ - "Notification about requiring performing manual GetDifference" - ], - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "UpdateContainer", - "doc": [ - "Update container", { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " Header of update" - }, { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The updatre" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "updateHeader" - }, { - "type": "bytes", - "id": 2, - "name": "update" - }] - } - }, { - "type": "update_box", - "content": { - "name": "CombinedUpdate", - "header": 2625, - "doc": [ - "Combined update", { - "type": "reference", - "argument": "seqStart", - "category": "full", - "description": " Sequence number start" - }, { - "type": "reference", - "argument": "seqEnd", - "category": "full", - "description": " Sequence number end" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " Sequence state" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Update's users" - }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Update's groups" - }, { - "type": "reference", - "argument": "updates", - "category": "full", - "description": " Updates (can be empty)" - }, { - "type": "reference", - "argument": "messages", - "category": "full", - "description": " New messages" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seqStart" - }, { - "type": "int32", - "id": 2, - "name": "seqEnd" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 4, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 5, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UpdateContainer" - } - }, - "id": 6, - "name": "updates" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageContainer" - } - }, - "id": 7, - "name": "messages" - }] - } - }, { - "type": "enum", - "content": { - "name": "UpdateOptimization", - "values": [{ - "name": "NONE", - "id": 1 - }, { - "name": "STRIP_ENTITIES", - "id": 2 - }, { - "name": "ENABLE_COMBINED", - "id": 3 - }, { - "name": "FASTER_MESSAGES", - "id": 4 - }, { - "name": "STRIP_COUNTERS", - "id": 5 - }, { - "name": "COMPACT_USERS", - "id": 6 - }, { - "name": "GROUPS_V2", - "id": 7 - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetState", - "header": 9, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Get main sequence state", { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 1, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetDifference", - "header": 11, - "response": { - "type": "anonymous", - "header": 12, - "doc": [{ - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Seq of LAST update in updates" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of LAST update in updates" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Users referenced in updates" - }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups referenced in updates" - }, { - "type": "reference", - "argument": "updates", - "category": "compact", - "description": " Updates" - }, { - "type": "reference", - "argument": "needMore", - "category": "full", - "description": " Need to perform other difference" - }, { - "type": "reference", - "argument": "usersRefs", - "category": "full", - "description": " Direct references of users" - }, { - "type": "reference", - "argument": "groupsRefs", - "category": "full", - "description": " Direct References of groups" - }], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 3, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 6, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UpdateContainer" - } - }, - "id": 4, - "name": "updates" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageContainer" - } - }, - "id": 7, - "name": "messages" - }, { - "type": "bool", - "id": 5, - "name": "needMore" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 8, - "name": "usersRefs" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 9, - "name": "groupsRefs" - }] - }, - "doc": [ - "Getting difference of sequence", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": "Sequence number" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": "Sequence state" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetReferencedEntitites", - "header": 2628, - "response": { - "type": "anonymous", - "header": 2629, - "doc": [{ - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Loaded groups" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 1, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 2, - "name": "groups" - }] - }, - "doc": [ - "Loading referenced entities", { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Users to load" - }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups to load. Also returns all members of a group." - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 2, - "name": "groups" - }] - } - }, { - "type": "update", - "content": { - "name": "RawUpdate", - "header": 80, - "doc": [ - "Custom Raw Update", { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Type of content" - }, { - "type": "reference", - "argument": "bytes", - "category": "full", - "description": " Raw data" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "type" - }, { - "type": "bytes", - "id": 2, - "name": "bytes" - }] - } - }, { - "type": "update", - "content": { - "name": "EmptyUpdate", - "header": 85, - "doc": [ - "Empty update" - ], - "attributes": [] - } - }, { - "type": "empty" - }, { - "type": "rpc", - "content": { - "name": "SubscribeToOnline", - "header": 32, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Subscribing for users online", { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Users for subscription" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SubscribeFromOnline", - "header": 33, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Removing subscription for users online", { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Users of subscriptions" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SubscribeToGroupOnline", - "header": 74, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Subscribing for groups online", { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups for subscription" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 1, - "name": "groups" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SubscribeFromGroupOnline", - "header": 75, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Removing subscription for groups online", { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups of subscriptions" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 1, - "name": "groups" - }] - } - }] - }, { - "title": "Counters", - "package": "counters", - "doc": [ - "Application Counters, used to display various counters in application" - ], - "items": [{ - "type": "struct", - "content": { - "name": "AppCounters", - "doc": [ - "Application counters", { - "type": "reference", - "argument": "globalCounter", - "category": "full", - "description": " Global unread counter" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 1, - "name": "globalCounter" - }] - } - }, { - "type": "update", - "content": { - "name": "CountersChanged", - "header": 215, - "doc": [ - "Update about counters changed", { - "type": "reference", - "argument": "counters", - "category": "full", - "description": " Current Application counters" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "AppCounters" - }, - "id": 1, - "name": "counters" - }] - } - }] - }, { - "title": "Miscellaneous", - "package": "misc", - "items": [{ - "type": "response", - "content": { - "name": "Void", - "header": 50, - "doc": [ - "Empty response" - ], - "attributes": [] - } - }, { - "type": "response", - "content": { - "name": "Seq", - "header": 72, - "doc": [ - "Sequence response. Methods that return this value must process response in particular order", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of response" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " Sequence state of response" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }] - } - }, { - "type": "response", - "content": { - "name": "SeqDate", - "header": 102, - "doc": [ - "Sequence response with date. Methods that return this value must process response in particular order", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of response" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " Sequence state of response" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of response" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }] - } - }, { - "type": "response", - "content": { - "name": "Bool", - "header": 209, - "doc": [ - "Boolean response", { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Response value" - } - ], - "attributes": [{ - "type": "bool", - "id": 1, - "name": "value" - }] - } - }, { - "type": "struct", - "content": { - "name": "Config", - "doc": [ - "Configuration of system", { - "type": "reference", - "argument": "maxGroupSize", - "category": "full", - "description": " Current maximum group size" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "maxGroupSize" - }] - } - }, { - "type": "struct", - "content": { - "name": "Extension", - "doc": [ - "Extention", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Extension id" - }, { - "type": "reference", - "argument": "data", - "category": "full", - "description": " Extension data" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "bytes", - "id": 2, - "name": "data" - }] - } - }, { - "type": "update", - "content": { - "name": "Config", - "header": 42, - "doc": [ - "Update about config change", { - "type": "reference", - "argument": "config", - "category": "full", - "description": " new config" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Config" - }, - "id": 1, - "name": "config" - }] - } - }] - }, { - "title": "Device Info", - "package": "device", - "doc": [ - "Submiting various information about device for providing better experience.", - "For example, getting timezone or preffered languages" - ], - "items": [{ - "type": "rpc", - "content": { - "name": "NotifyAboutDeviceInfo", - "header": 229, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Notifying about device information", { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "Device Time Zone" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": "string" - }, - "id": 1, - "name": "preferredLanguages" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "timeZone" - }] - } - }] - }, { - "title": "Webactions", - "package": "webactions", - "doc": [ - "Web actions allow clients to visit some predefined web pages,", - "perform actions, and pass result on action completion" - ], - "items": [{ - "type": "rpc", - "content": { - "name": "InitWebaction", - "header": 116, - "response": { - "type": "anonymous", - "header": 117, - "doc": [{ - "type": "reference", - "argument": "uri", - "category": "full", - "description": " Web action uri" - }, { - "type": "reference", - "argument": "regexp", - "category": "full", - "description": " Regular expression. Required to match completion of web action" - }, { - "type": "reference", - "argument": "actionHash", - "category": "danger", - "description": " Identifier of current web action. Required to complete it" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "uri" - }, { - "type": "string", - "id": 2, - "name": "regexp" - }, { - "type": "string", - "id": 3, - "name": "actionHash" - }] - }, - "doc": [ - "Initialize start of web action", { - "type": "reference", - "argument": "actionName", - "category": "full", - "description": "Name of web action" - }, { - "type": "reference", - "argument": "params", - "category": "full", - "description": "Additional params required to make action's uri" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "actionName" - }, { - "type": { - "type": "struct", - "childType": "MapValue" - }, - "id": 2, - "name": "params" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CompleteWebaction", - "header": 123, - "response": { - "type": "anonymous", - "header": 124, - "doc": [{ - "type": "reference", - "argument": "result", - "category": "full", - "description": " Reslut of web action completion" - }], - "attributes": [{ - "type": { - "type": "struct", - "childType": "MapValue" - }, - "id": 1, - "name": "result" - }] - }, - "doc": [ - "Complete started web action", { - "type": "reference", - "argument": "actionHash", - "category": "danger", - "description": "Identifier of given web action" - }, { - "type": "reference", - "argument": "completeUri", - "category": "full", - "description": "Final uri of web action" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "actionHash" - }, { - "type": "string", - "id": 2, - "name": "completeUri" - }] - } - }] - }, { - "title": "Collections", - "package": "collections", - "doc": [ - "Flexible raw collections without structure" - ], - "items": [{ - "type": "trait", - "content": { - "isContainer": "true", - "name": "RawValue", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "StringValue", - "doc": [ - "Text value" - ], - "trait": { - "name": "RawValue", - "key": 1 - }, - "attributes": [{ - "type": "string", - "id": 1, - "name": "text" - }] - } - }, { - "type": "struct", - "content": { - "name": "Int32Value", - "doc": [ - "Int32 value" - ], - "trait": { - "name": "RawValue", - "key": 2 - }, - "attributes": [{ - "type": "int32", - "id": 1, - "name": "value" - }] - } - }, { - "type": "struct", - "content": { - "name": "Int64Value", - "doc": [ - "Int64 value" - ], - "trait": { - "name": "RawValue", - "key": 3 - }, - "attributes": [{ - "type": "int64", - "id": 1, - "name": "value" - }] - } - }, { - "type": "struct", - "content": { - "name": "DoubleValue", - "doc": [ - "Double value" - ], - "trait": { - "name": "RawValue", - "key": 4 - }, - "attributes": [{ - "type": "double", - "id": 1, - "name": "value" - }] - } - }, { - "type": "struct", - "content": { - "name": "ArrayValue", - "doc": [ - "Array value" - ], - "trait": { - "name": "RawValue", - "key": 5 - }, - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 1, - "name": "array" - }] - } - }, { - "type": "struct", - "content": { - "name": "MapValueItem", - "doc": [ - "Item of Map" - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "key" - }, { - "type": { - "type": "trait", - "childType": "RawValue" - }, - "id": 2, - "name": "value" - }] - } - }, { - "type": "struct", - "content": { - "name": "MapValue", - "doc": [ - "Map Value" - ], - "trait": { - "name": "RawValue", - "key": 6 - }, - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MapValueItem" - } - }, - "id": 1, - "name": "items" - }] - } - }] - }, { - "title": "Surveys", - "package": "surveys", - "doc": [ - "Surveys implementation for messages" - ], - "items": [{ - "type": "struct", - "content": { - "name": "Survey", - "doc": [ - "Main Survey Struct" - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "id" - }, { - "type": "string", - "id": 2, - "name": "titulo" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "uf" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "creationTime" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 5, - "name": "endTime" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 6, - "name": "ownerId" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "answers" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CreateSurvey", - "header": 139, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Criar uma nova enquete" - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Survey" - }, - "id": 1, - "name": "survey" - }] - } - }] - }] -} \ No newline at end of file + ] + } + },{"type":"rpc","content":{ +"name":"GetState", +"header":9, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Get main sequence state",{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":1,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"GetDifference", +"header":11, +"response":{"type":"anonymous","header":12, "doc":[ +{"type":"reference","argument":"seq","category":"full","description":" Seq of LAST update in updates"},{"type":"reference","argument":"state","category":"full","description":" State of LAST update in updates"},{"type":"reference","argument":"users","category":"compact","description":" Users referenced in updates"},{"type":"reference","argument":"groups","category":"compact","description":" Groups referenced in updates"},{"type":"reference","argument":"updates","category":"compact","description":" Updates"},{"type":"reference","argument":"needMore","category":"full","description":" Need to perform other difference"},{"type":"reference","argument":"usersRefs","category":"full","description":" Direct references of users"},{"type":"reference","argument":"groupsRefs","category":"full","description":" Direct References of groups"}] ,"attributes":[{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":3,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":6,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UpdateContainer"}},"id":4,"name":"updates"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":7,"name":"messages"} +,{"type":"bool","id":5,"name":"needMore"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":8,"name":"usersRefs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":9,"name":"groupsRefs"} +]}, +"doc":[ +"Getting difference of sequence",{"type":"reference","argument":"seq","category":"full","description":"Sequence number"},{"type":"reference","argument":"state","category":"compact","description":"Sequence state"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"GetReferencedEntitites", +"header":2628, +"response":{"type":"anonymous","header":2629, "doc":[ +{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"groups","category":"compact","description":" Loaded groups"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":2,"name":"groups"} +]}, +"doc":[ +"Loading referenced entities",{"type":"reference","argument":"users","category":"compact","description":"Users to load"},{"type":"reference","argument":"groups","category":"compact","description":"Groups to load. Also returns all members of a group."}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":2,"name":"groups"} +]}},{"type":"update","content":{ +"name":"RawUpdate", +"header":80, +"doc":[ +"Custom Raw Update",{"type":"reference","argument":"type","category":"full","description":" Type of content"},{"type":"reference","argument":"bytes","category":"full","description":" Raw data"}],"attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"type"} +,{"type":"bytes","id":2,"name":"bytes"} +]}},{"type":"update","content":{ +"name":"EmptyUpdate", +"header":85, +"doc":[ +"Empty update"],"attributes":[ +]}},{"type":"empty"},{"type":"rpc","content":{ +"name":"SubscribeToOnline", +"header":32, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Subscribing for users online",{"type":"reference","argument":"users","category":"compact","description":"Users for subscription"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +]}},{"type":"rpc","content":{ +"name":"SubscribeFromOnline", +"header":33, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Removing subscription for users online",{"type":"reference","argument":"users","category":"compact","description":"Users of subscriptions"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +]}},{"type":"rpc","content":{ +"name":"SubscribeToGroupOnline", +"header":74, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Subscribing for groups online",{"type":"reference","argument":"groups","category":"compact","description":"Groups for subscription"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} +]}},{"type":"rpc","content":{ +"name":"SubscribeFromGroupOnline", +"header":75, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Removing subscription for groups online",{"type":"reference","argument":"groups","category":"compact","description":"Groups of subscriptions"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} +]}}]}, { + "title": "Counters", + "package": "counters", + "doc": [ + "Application Counters, used to display various counters in application" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"AppCounters", +"doc":[ +"Application counters",{"type":"reference","argument":"globalCounter","category":"full","description":" Global unread counter"}],"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"int32"},"id":1,"name":"globalCounter"} +]}},{"type":"update","content":{ +"name":"CountersChanged", +"header":215, +"doc":[ +"Update about counters changed",{"type":"reference","argument":"counters","category":"full","description":" Current Application counters"}],"attributes":[ +{"type":{"type":"struct","childType":"AppCounters"},"id":1,"name":"counters"} +]}}]}, { + "title": "Miscellaneous", + "package": "misc", + "items": [ +{"type":"response","content":{ +"name":"Void", +"header":50, +"doc":[ +"Empty response"],"attributes":[ +]}},{"type":"response","content":{ +"name":"Seq", +"header":72, +"doc":[ +"Sequence response. Methods that return this value must process response in particular order",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of response"},{"type":"reference","argument":"state","category":"full","description":" Sequence state of response"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +]}},{"type":"response","content":{ +"name":"SeqDate", +"header":102, +"doc":[ +"Sequence response with date. Methods that return this value must process response in particular order",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of response"},{"type":"reference","argument":"state","category":"full","description":" Sequence state of response"},{"type":"reference","argument":"date","category":"full","description":" Date of response"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"response","content":{ +"name":"Bool", +"header":209, +"doc":[ +"Boolean response",{"type":"reference","argument":"value","category":"full","description":" Response value"}],"attributes":[ +{"type":"bool","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"Config", +"doc":[ +"Configuration of system",{"type":"reference","argument":"maxGroupSize","category":"full","description":" Current maximum group size"}],"attributes":[ +{"type":"int32","id":1,"name":"maxGroupSize"} +]}}, { + "type":"struct", + "content": { + "name":"Extension", +"doc":[ +"Extention",{"type":"reference","argument":"id","category":"full","description":" Extension id"},{"type":"reference","argument":"data","category":"full","description":" Extension data"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"bytes","id":2,"name":"data"} +]}},{"type":"update","content":{ +"name":"Config", +"header":42, +"doc":[ +"Update about config change",{"type":"reference","argument":"config","category":"full","description":" new config"}],"attributes":[ +{"type":{"type":"struct","childType":"Config"},"id":1,"name":"config"} +]}}]}, { + "title": "Device Info", + "package": "device", + "doc": [ + "Submiting various information about device for providing better experience.", + "For example, getting timezone or preffered languages" + ], + "items": [ +{"type":"rpc","content":{ +"name":"NotifyAboutDeviceInfo", +"header":229, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Notifying about device information",{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"},{"type":"reference","argument":"timeZone","category":"full","description":"Device Time Zone"}],"attributes":[ +{"type":{"type":"list","childType":"string"},"id":1,"name":"preferredLanguages"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"timeZone"} +]}}]}, { + "title": "Webactions", + "package": "webactions", + "doc": [ + "Web actions allow clients to visit some predefined web pages,", + "perform actions, and pass result on action completion" + ], + "items": [ +{"type":"rpc","content":{ +"name":"InitWebaction", +"header":116, +"response":{"type":"anonymous","header":117, "doc":[ +{"type":"reference","argument":"uri","category":"full","description":" Web action uri"},{"type":"reference","argument":"regexp","category":"full","description":" Regular expression. Required to match completion of web action"},{"type":"reference","argument":"actionHash","category":"danger","description":" Identifier of current web action. Required to complete it"}] ,"attributes":[{"type":"string","id":1,"name":"uri"} +,{"type":"string","id":2,"name":"regexp"} +,{"type":"string","id":3,"name":"actionHash"} +]}, +"doc":[ +"Initialize start of web action",{"type":"reference","argument":"actionName","category":"full","description":"Name of web action"},{"type":"reference","argument":"params","category":"full","description":"Additional params required to make action's uri"}],"attributes":[ +{"type":"string","id":1,"name":"actionName"} +,{"type":{"type":"struct","childType":"MapValue"},"id":2,"name":"params"} +]}},{"type":"rpc","content":{ +"name":"CompleteWebaction", +"header":123, +"response":{"type":"anonymous","header":124, "doc":[ +{"type":"reference","argument":"result","category":"full","description":" Reslut of web action completion"}] ,"attributes":[{"type":{"type":"struct","childType":"MapValue"},"id":1,"name":"result"} +]}, +"doc":[ +"Complete started web action",{"type":"reference","argument":"actionHash","category":"danger","description":"Identifier of given web action"},{"type":"reference","argument":"completeUri","category":"full","description":"Final uri of web action"}],"attributes":[ +{"type":"string","id":1,"name":"actionHash"} +,{"type":"string","id":2,"name":"completeUri"} +]}}]}, { + "title": "Collections", + "package": "collections", + "doc": [ + "Flexible raw collections without structure" + ], + "items": [ +{"type":"trait","content":{ +"isContainer":"true","name":"RawValue","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"StringValue", +"doc":[ +"Text value"],"trait":{"name":"RawValue","key":1},"attributes":[ +{"type":"string","id":1,"name":"text"} +]}}, { + "type":"struct", + "content": { + "name":"Int32Value", +"doc":[ +"Int32 value"],"trait":{"name":"RawValue","key":2},"attributes":[ +{"type":"int32","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"Int64Value", +"doc":[ +"Int64 value"],"trait":{"name":"RawValue","key":3},"attributes":[ +{"type":"int64","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"DoubleValue", +"doc":[ +"Double value"],"trait":{"name":"RawValue","key":4},"attributes":[ +{"type":"double","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"ArrayValue", +"doc":[ +"Array value"],"trait":{"name":"RawValue","key":5},"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"RawValue"}},"id":1,"name":"array"} +]}}, { + "type":"struct", + "content": { + "name":"MapValueItem", +"doc":[ +"Item of Map"],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":{"type":"trait","childType":"RawValue"},"id":2,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"MapValue", +"doc":[ +"Map Value"],"trait":{"name":"RawValue","key":6},"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"MapValueItem"}},"id":1,"name":"items"} +]}}]}, { + "title": "Surveys", + "package": "surveys", + "doc": [ + "Surveys implementation for messages" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Survey", +"doc":[ +"Main Survey Struct"],"attributes":[ +{"type":"int64","id":1,"name":"id"} +,{"type":"string","id":2,"name":"title"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"description"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"creationTime"} +,{"type":{"type":"alias","childType":"date"},"id":5,"name":"endTime"} +,{"type":{"type":"alias","childType":"userId"},"id":6,"name":"userId"} +]}}, { + "type":"struct", + "content": { + "name":"SurveyAnswer", +"doc":[ +"Main Survey Answer"],"attributes":[ +{"type":"int64","id":1,"name":"id"} +,{"type":"string","id":2,"name":"title"} +]}}, { + "type":"struct", + "content": { + "name":"UserSurveyAnswer", +"doc":[ +"Main UserSurveyAnser"],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"userId"} +,{"type":"int64","id":2,"name":"answerId"} +]}},{"type":"rpc","content":{ +"name":"CreateSurvey", +"header":139, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Criar uma nova enquete"],"attributes":[ +{"type":{"type":"struct","childType":"Survey"},"id":1,"name":"survey"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"SurveyAnswer"}},"id":2,"name":"answers"} +]}}]}, { + "title": "GroupsPre", + "package": "groupspre", + "doc": [ + "Api para grupos pre-definidos" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"GroupPre", +"doc":[ +"Main GroupPre Struct"],"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} +,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupFatherId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"childrens"} +]}},{"type":"rpc","content":{ +"name":"LoadGroupsPre", +"header":18, +"response":{"type":"anonymous","header":20, "doc":[ +"fasdfasdfas"] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} +]}, +"doc":[ +"Main LoadGroups"],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupFatherId"} +]}},{"type":"rpc","content":{ +"name":"CreateGroupPre", +"header":19, +"response":{"type":"anonymous","header":21, "doc":[ +"fasdfasdfa"] ,"attributes":[{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"struct","childType":"GroupPre"},"id":3,"name":"groupPre"} +]}, +"doc":[ +"fasdfasdfa"],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupFatherId"} +]}}]}]} \ No newline at end of file diff --git a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps index a59e64fdc3..1e8c3347a1 100644 --- a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps +++ b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps @@ -18634,103 +18634,132 @@ - - - - - - - + - + - + + - + - + - + + + + + + + + + + + + + - - - - + + + + + + + + + + + - - + + - - + + - - + + + + + + + + - + - + - + - + - + - - + + - - + + - + - + - + - + - - + + - - + + + + + + + + - - - - - + + + + + + + + diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiGroupPre.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiGroupPre.java new file mode 100644 index 0000000000..2613e5a76d --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiGroupPre.java @@ -0,0 +1,85 @@ +package im.actor.core.api; +/* + * Generated by the Actor API Scheme generator. DO NOT EDIT! + */ + +import im.actor.runtime.bser.*; +import im.actor.runtime.collections.*; +import static im.actor.runtime.bser.Utils.*; +import im.actor.core.network.parser.*; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; +import com.google.j2objc.annotations.ObjectiveCName; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; + +public class ApiGroupPre extends BserObject { + + private ApiGroup group; + private int groupFatherId; + private List childrens; + + public ApiGroupPre(@NotNull ApiGroup group, int groupFatherId, @NotNull List childrens) { + this.group = group; + this.groupFatherId = groupFatherId; + this.childrens = childrens; + } + + public ApiGroupPre() { + + } + + @NotNull + public ApiGroup getGroup() { + return this.group; + } + + public int getGroupFatherId() { + return this.groupFatherId; + } + + @NotNull + public List getChildrens() { + return this.childrens; + } + + @Override + public void parse(BserValues values) throws IOException { + this.group = values.getObj(1, new ApiGroup()); + this.groupFatherId = values.getInt(2); + List _childrens = new ArrayList(); + for (int i = 0; i < values.getRepeatedCount(3); i ++) { + _childrens.add(new ApiGroup()); + } + this.childrens = values.getRepeatedObj(3, _childrens); + if (values.hasRemaining()) { + setUnmappedObjects(values.buildRemaining()); + } + } + + @Override + public void serialize(BserWriter writer) throws IOException { + if (this.group == null) { + throw new IOException(); + } + writer.writeObject(1, this.group); + writer.writeInt(2, this.groupFatherId); + writer.writeRepeatedObj(3, this.childrens); + if (this.getUnmappedObjects() != null) { + SparseArray unmapped = this.getUnmappedObjects(); + for (int i = 0; i < unmapped.size(); i++) { + int key = unmapped.keyAt(i); + writer.writeUnmapped(key, unmapped.get(key)); + } + } + } + + @Override + public String toString() { + String res = "struct GroupPre{"; + res += "}"; + return res; + } + +} diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiSurvey.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiSurvey.java index 95e0228c0e..a1ab7670ba 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiSurvey.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiSurvey.java @@ -17,21 +17,19 @@ public class ApiSurvey extends BserObject { private long id; - private String titulo; - private String uf; + private String title; + private String description; private long creationTime; private long endTime; - private int ownerId; - private List answers; + private int userId; - public ApiSurvey(long id, @NotNull String titulo, @Nullable String uf, long creationTime, long endTime, int ownerId, @NotNull List answers) { + public ApiSurvey(long id, @NotNull String title, @Nullable String description, long creationTime, long endTime, int userId) { this.id = id; - this.titulo = titulo; - this.uf = uf; + this.title = title; + this.description = description; this.creationTime = creationTime; this.endTime = endTime; - this.ownerId = ownerId; - this.answers = answers; + this.userId = userId; } public ApiSurvey() { @@ -43,13 +41,13 @@ public long getId() { } @NotNull - public String getTitulo() { - return this.titulo; + public String getTitle() { + return this.title; } @Nullable - public String getUf() { - return this.uf; + public String getDescription() { + return this.description; } public long getCreationTime() { @@ -60,40 +58,33 @@ public long getEndTime() { return this.endTime; } - public int getOwnerId() { - return this.ownerId; - } - - @NotNull - public List getAnswers() { - return this.answers; + public int getUserId() { + return this.userId; } @Override public void parse(BserValues values) throws IOException { this.id = values.getLong(1); - this.titulo = values.getString(2); - this.uf = values.optString(3); + this.title = values.getString(2); + this.description = values.optString(3); this.creationTime = values.getLong(4); this.endTime = values.getLong(5); - this.ownerId = values.getInt(6); - this.answers = values.getRepeatedString(7); + this.userId = values.getInt(6); } @Override public void serialize(BserWriter writer) throws IOException { writer.writeLong(1, this.id); - if (this.titulo == null) { + if (this.title == null) { throw new IOException(); } - writer.writeString(2, this.titulo); - if (this.uf != null) { - writer.writeString(3, this.uf); + writer.writeString(2, this.title); + if (this.description != null) { + writer.writeString(3, this.description); } writer.writeLong(4, this.creationTime); writer.writeLong(5, this.endTime); - writer.writeInt(6, this.ownerId); - writer.writeRepeatedString(7, this.answers); + writer.writeInt(6, this.userId); } @Override diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiSurveyAnswer.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiSurveyAnswer.java new file mode 100644 index 0000000000..b3e4be1f29 --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiSurveyAnswer.java @@ -0,0 +1,62 @@ +package im.actor.core.api; +/* + * Generated by the Actor API Scheme generator. DO NOT EDIT! + */ + +import im.actor.runtime.bser.*; +import im.actor.runtime.collections.*; +import static im.actor.runtime.bser.Utils.*; +import im.actor.core.network.parser.*; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; +import com.google.j2objc.annotations.ObjectiveCName; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; + +public class ApiSurveyAnswer extends BserObject { + + private long id; + private String title; + + public ApiSurveyAnswer(long id, @NotNull String title) { + this.id = id; + this.title = title; + } + + public ApiSurveyAnswer() { + + } + + public long getId() { + return this.id; + } + + @NotNull + public String getTitle() { + return this.title; + } + + @Override + public void parse(BserValues values) throws IOException { + this.id = values.getLong(1); + this.title = values.getString(2); + } + + @Override + public void serialize(BserWriter writer) throws IOException { + writer.writeLong(1, this.id); + if (this.title == null) { + throw new IOException(); + } + writer.writeString(2, this.title); + } + + @Override + public String toString() { + String res = "struct SurveyAnswer{"; + res += "}"; + return res; + } + +} diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiUserSurveyAnswer.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiUserSurveyAnswer.java new file mode 100644 index 0000000000..6d97cbeb85 --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/ApiUserSurveyAnswer.java @@ -0,0 +1,58 @@ +package im.actor.core.api; +/* + * Generated by the Actor API Scheme generator. DO NOT EDIT! + */ + +import im.actor.runtime.bser.*; +import im.actor.runtime.collections.*; +import static im.actor.runtime.bser.Utils.*; +import im.actor.core.network.parser.*; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; +import com.google.j2objc.annotations.ObjectiveCName; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; + +public class ApiUserSurveyAnswer extends BserObject { + + private int userId; + private long answerId; + + public ApiUserSurveyAnswer(int userId, long answerId) { + this.userId = userId; + this.answerId = answerId; + } + + public ApiUserSurveyAnswer() { + + } + + public int getUserId() { + return this.userId; + } + + public long getAnswerId() { + return this.answerId; + } + + @Override + public void parse(BserValues values) throws IOException { + this.userId = values.getInt(1); + this.answerId = values.getLong(2); + } + + @Override + public void serialize(BserWriter writer) throws IOException { + writer.writeInt(1, this.userId); + writer.writeLong(2, this.answerId); + } + + @Override + public String toString() { + String res = "struct UserSurveyAnswer{"; + res += "}"; + return res; + } + +} diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java index 923a3004e9..9c94c1fb26 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java @@ -184,6 +184,8 @@ public RpcScope read(int type, byte[] payload) throws IOException { case 116: return RequestInitWebaction.fromBytes(payload); case 123: return RequestCompleteWebaction.fromBytes(payload); case 139: return RequestCreateSurvey.fromBytes(payload); + case 18: return RequestLoadGroupsPre.fromBytes(payload); + case 19: return RequestCreateGroupPre.fromBytes(payload); case 193: return ResponseStartPhoneAuth.fromBytes(payload); case 186: return ResponseStartEmailAuth.fromBytes(payload); case 2572: return ResponseStartUsernameAuth.fromBytes(payload); @@ -253,6 +255,8 @@ public RpcScope read(int type, byte[] payload) throws IOException { case 209: return ResponseBool.fromBytes(payload); case 117: return ResponseInitWebaction.fromBytes(payload); case 124: return ResponseCompleteWebaction.fromBytes(payload); + case 20: return ResponseLoadGroupsPre.fromBytes(payload); + case 21: return ResponseCreateGroupPre.fromBytes(payload); case 13: return SeqUpdate.fromBytes(payload); case 73: return FatSeqUpdate.fromBytes(payload); case 26: return WeakUpdate.fromBytes(payload); diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestCreateGroupPre.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestCreateGroupPre.java new file mode 100644 index 0000000000..e0e6cda215 --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestCreateGroupPre.java @@ -0,0 +1,68 @@ +package im.actor.core.api.rpc; +/* + * Generated by the Actor API Scheme generator. DO NOT EDIT! + */ + +import im.actor.runtime.bser.*; +import im.actor.runtime.collections.*; +import static im.actor.runtime.bser.Utils.*; +import im.actor.core.network.parser.*; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; +import com.google.j2objc.annotations.ObjectiveCName; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import im.actor.core.api.*; + +public class RequestCreateGroupPre extends Request { + + public static final int HEADER = 0x13; + public static RequestCreateGroupPre fromBytes(byte[] data) throws IOException { + return Bser.parse(new RequestCreateGroupPre(), data); + } + + private int groupId; + private int groupFatherId; + + public RequestCreateGroupPre(int groupId, int groupFatherId) { + this.groupId = groupId; + this.groupFatherId = groupFatherId; + } + + public RequestCreateGroupPre() { + + } + + public int getGroupId() { + return this.groupId; + } + + public int getGroupFatherId() { + return this.groupFatherId; + } + + @Override + public void parse(BserValues values) throws IOException { + this.groupId = values.getInt(1); + this.groupFatherId = values.getInt(2); + } + + @Override + public void serialize(BserWriter writer) throws IOException { + writer.writeInt(1, this.groupId); + writer.writeInt(2, this.groupFatherId); + } + + @Override + public String toString() { + String res = "rpc CreateGroupPre{"; + res += "}"; + return res; + } + + @Override + public int getHeaderKey() { + return HEADER; + } +} diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestCreateSurvey.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestCreateSurvey.java index 19d800ac69..4c8f56e221 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestCreateSurvey.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestCreateSurvey.java @@ -23,9 +23,11 @@ public static RequestCreateSurvey fromBytes(byte[] data) throws IOException { } private ApiSurvey survey; + private List answers; - public RequestCreateSurvey(@NotNull ApiSurvey survey) { + public RequestCreateSurvey(@NotNull ApiSurvey survey, @NotNull List answers) { this.survey = survey; + this.answers = answers; } public RequestCreateSurvey() { @@ -37,9 +39,19 @@ public ApiSurvey getSurvey() { return this.survey; } + @NotNull + public List getAnswers() { + return this.answers; + } + @Override public void parse(BserValues values) throws IOException { this.survey = values.getObj(1, new ApiSurvey()); + List _answers = new ArrayList(); + for (int i = 0; i < values.getRepeatedCount(2); i ++) { + _answers.add(new ApiSurveyAnswer()); + } + this.answers = values.getRepeatedObj(2, _answers); } @Override @@ -48,6 +60,7 @@ public void serialize(BserWriter writer) throws IOException { throw new IOException(); } writer.writeObject(1, this.survey); + writer.writeRepeatedObj(2, this.answers); } @Override diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestLoadGroupsPre.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestLoadGroupsPre.java new file mode 100644 index 0000000000..00b3e33d3b --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/RequestLoadGroupsPre.java @@ -0,0 +1,60 @@ +package im.actor.core.api.rpc; +/* + * Generated by the Actor API Scheme generator. DO NOT EDIT! + */ + +import im.actor.runtime.bser.*; +import im.actor.runtime.collections.*; +import static im.actor.runtime.bser.Utils.*; +import im.actor.core.network.parser.*; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; +import com.google.j2objc.annotations.ObjectiveCName; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import im.actor.core.api.*; + +public class RequestLoadGroupsPre extends Request { + + public static final int HEADER = 0x12; + public static RequestLoadGroupsPre fromBytes(byte[] data) throws IOException { + return Bser.parse(new RequestLoadGroupsPre(), data); + } + + private int groupFatherId; + + public RequestLoadGroupsPre(int groupFatherId) { + this.groupFatherId = groupFatherId; + } + + public RequestLoadGroupsPre() { + + } + + public int getGroupFatherId() { + return this.groupFatherId; + } + + @Override + public void parse(BserValues values) throws IOException { + this.groupFatherId = values.getInt(1); + } + + @Override + public void serialize(BserWriter writer) throws IOException { + writer.writeInt(1, this.groupFatherId); + } + + @Override + public String toString() { + String res = "rpc LoadGroupsPre{"; + res += "}"; + return res; + } + + @Override + public int getHeaderKey() { + return HEADER; + } +} diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/ResponseCreateGroupPre.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/ResponseCreateGroupPre.java new file mode 100644 index 0000000000..8939340032 --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/ResponseCreateGroupPre.java @@ -0,0 +1,84 @@ +package im.actor.core.api.rpc; +/* + * Generated by the Actor API Scheme generator. DO NOT EDIT! + */ + +import im.actor.runtime.bser.*; +import im.actor.runtime.collections.*; +import static im.actor.runtime.bser.Utils.*; +import im.actor.core.network.parser.*; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; +import com.google.j2objc.annotations.ObjectiveCName; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import im.actor.core.api.*; + +public class ResponseCreateGroupPre extends Response { + + public static final int HEADER = 0x15; + public static ResponseCreateGroupPre fromBytes(byte[] data) throws IOException { + return Bser.parse(new ResponseCreateGroupPre(), data); + } + + private int seq; + private byte[] state; + private ApiGroupPre groupPre; + + public ResponseCreateGroupPre(int seq, @NotNull byte[] state, @NotNull ApiGroupPre groupPre) { + this.seq = seq; + this.state = state; + this.groupPre = groupPre; + } + + public ResponseCreateGroupPre() { + + } + + public int getSeq() { + return this.seq; + } + + @NotNull + public byte[] getState() { + return this.state; + } + + @NotNull + public ApiGroupPre getGroupPre() { + return this.groupPre; + } + + @Override + public void parse(BserValues values) throws IOException { + this.seq = values.getInt(1); + this.state = values.getBytes(2); + this.groupPre = values.getObj(3, new ApiGroupPre()); + } + + @Override + public void serialize(BserWriter writer) throws IOException { + writer.writeInt(1, this.seq); + if (this.state == null) { + throw new IOException(); + } + writer.writeBytes(2, this.state); + if (this.groupPre == null) { + throw new IOException(); + } + writer.writeObject(3, this.groupPre); + } + + @Override + public String toString() { + String res = "tuple CreateGroupPre{"; + res += "}"; + return res; + } + + @Override + public int getHeaderKey() { + return HEADER; + } +} diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/ResponseLoadGroupsPre.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/ResponseLoadGroupsPre.java new file mode 100644 index 0000000000..ce2c2d5c65 --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/rpc/ResponseLoadGroupsPre.java @@ -0,0 +1,65 @@ +package im.actor.core.api.rpc; +/* + * Generated by the Actor API Scheme generator. DO NOT EDIT! + */ + +import im.actor.runtime.bser.*; +import im.actor.runtime.collections.*; +import static im.actor.runtime.bser.Utils.*; +import im.actor.core.network.parser.*; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; +import com.google.j2objc.annotations.ObjectiveCName; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import im.actor.core.api.*; + +public class ResponseLoadGroupsPre extends Response { + + public static final int HEADER = 0x14; + public static ResponseLoadGroupsPre fromBytes(byte[] data) throws IOException { + return Bser.parse(new ResponseLoadGroupsPre(), data); + } + + private List groups; + + public ResponseLoadGroupsPre(@NotNull List groups) { + this.groups = groups; + } + + public ResponseLoadGroupsPre() { + + } + + @NotNull + public List getGroups() { + return this.groups; + } + + @Override + public void parse(BserValues values) throws IOException { + List _groups = new ArrayList(); + for (int i = 0; i < values.getRepeatedCount(1); i ++) { + _groups.add(new ApiGroup()); + } + this.groups = values.getRepeatedObj(1, _groups); + } + + @Override + public void serialize(BserWriter writer) throws IOException { + writer.writeRepeatedObj(1, this.groups); + } + + @Override + public String toString() { + String res = "tuple LoadGroupsPre{"; + res += "}"; + return res; + } + + @Override + public int getHeaderKey() { + return HEADER; + } +} diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/ApiGroupPre.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/ApiGroupPre.java new file mode 100644 index 0000000000..e69de29bb2 diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/parser/UpdatesParser.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/parser/UpdatesParser.java new file mode 100644 index 0000000000..067326529d --- /dev/null +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/parser/UpdatesParser.java @@ -0,0 +1,25 @@ +package im.actor.core.xloto.api.parser; +/* + * Generated by the Actor API Scheme generator. DO NOT EDIT! + */ + +import im.actor.runtime.bser.*; +import im.actor.runtime.collections.*; +import static im.actor.runtime.bser.Utils.*; +import im.actor.core.network.parser.*; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; +import com.google.j2objc.annotations.ObjectiveCName; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import im.actor.core.xloto.api.updates.*; + +public class UpdatesParser extends BaseParser { + @Override + public Update read(int type, byte[] payload) throws IOException { + switch(type) { + } + throw new IOException(); + } +} diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index c9ce0603d7..f9184686d1 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -2,18619 +2,4321 @@ "version": "1.6", "scala-package": "im.actor.api.rpc", "java-package": "im.actor.core.api", - "aliases": [{ - "type": "bytes", - "alias": "seq_state" - }, { - "type": "int64", - "alias": "date" - }, { - "type": "int64", - "alias": "randomId" - }, { - "type": "int64", - "alias": "msec" - }, { - "type": "int32", - "alias": "sec" - }, { - "type": "int32", - "alias": "userId" - }, { - "type": "int32", - "alias": "groupId" - }, { - "type": "int32", - "alias": "keyId" - }, { - "type": "int32", - "alias": "keyGroupId" - }, { - "type": "string", - "alias": "busId" - }], - "sections": [{ - "title": "Authentication", - "package": "auth", - "doc": [ - "

    Actor now support only one way for authentication - by SMS or phone call.

    ", - "

    Authorization steps:", - "

      ", - "
    1. Request SMS Code by calling RequestAuthCode
    2. ", - "
    3. If SMS arrives than send Authorization code in SignIn/SignUp
    4. ", - "
    5. If sms doesn't arrive for a long time - request phone activation by", - "calling AuthCodeCall
    6. ", - "
    ", - "

    ", - "Some rules
    ", - "If RequestAuthCode return isRegistered = false than use SignUp method else SignIn.
    ", - "If on any step API return PHONE_CODE_EXPIRED than application MUST start", - "authorization process from begining.
    " - ], - "items": [{ - "type": "enum", - "content": { - "name": "PhoneActivationType", - "values": [{ - "name": "CODE", - "id": 1 - }, { - "name": "PASSWORD", - "id": 2 - }] - } - }, { - "type": "enum", - "content": { - "name": "EmailActivationType", - "values": [{ - "name": "CODE", - "id": 1 - }, { - "name": "OAUTH2", - "id": 2 - }, { - "name": "PASSWORD", - "id": 3 - }] - } - }, { - "type": "rpc", - "content": { - "name": "StartPhoneAuth", - "header": 191, - "response": { - "type": "anonymous", - "header": 193, - "doc": [ - "Phone Activation response", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": " Hash of transaction" - }, { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " Is User registered" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "bool", - "id": 2, - "name": "isRegistered" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "PhoneActivationType" + "aliases": [ + { + "type": "bytes", + "alias": "seq_state" + }, + { + "type": "int64", + "alias": "date" + }, + { + "type": "int64", + "alias": "randomId" + }, + { + "type": "int64", + "alias": "msec" + }, + { + "type": "int32", + "alias": "sec" + }, + { + "type": "int32", + "alias": "userId" + }, + { + "type": "int32", + "alias": "groupId" + }, + { + "type": "int32", + "alias": "keyId" + }, + { + "type": "int32", + "alias": "keyGroupId" + }, + { + "type": "string", + "alias": "busId" + } + ], + "sections": [ + { + "title": "Authentication", + "package": "auth", + "doc": [ + "

    Actor now support only one way for authentication - by SMS or phone call.

    ", + "

    Authorization steps:", + "

      ", + "
    1. Request SMS Code by calling RequestAuthCode
    2. ", + "
    3. If SMS arrives than send Authorization code in SignIn/SignUp
    4. ", + "
    5. If sms doesn't arrive for a long time - request phone activation by", + "calling AuthCodeCall
    6. ", + "
    ", + "

    ", + "Some rules
    ", + "If RequestAuthCode return isRegistered = false than use SignUp method else SignIn.
    ", + "If on any step API return PHONE_CODE_EXPIRED than application MUST start", + "authorization process from begining.
    " + ], + "items": [ + { + "type": "enum", + "content": { + "name": "PhoneActivationType", + "values": [ + { + "name": "CODE", + "id": 1 + }, + { + "name": "PASSWORD", + "id": 2 } - }, - "id": 3, - "name": "activationType" - }] - }, - "doc": [ - "Start Phone Activation", { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": "Phone number" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Appication Id" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages of device" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, { - "type": "int32", - "id": 2, - "name": "appId" - }, { - "type": "string", - "id": 3, - "name": "apiKey" - }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SendCodeByPhoneCall", - "header": 197, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Dial phone and dictate auth code", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Transaction hash" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }] - } - }, { - "type": "rpc", - "content": { - "name": "StartEmailAuth", - "header": 185, - "response": { - "type": "anonymous", - "header": 186, - "doc": [ - "Email Activation response", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": " Hash of activation transaction" - }, { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " true if user is registered" - }, { - "type": "reference", - "argument": "activationType", - "category": "full", - "description": " Email Activation type" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "bool", - "id": 2, - "name": "isRegistered" - }, { - "type": { - "type": "enum", - "childType": "EmailActivationType" - }, - "id": 3, - "name": "activationType" - }] - }, - "doc": [ - "Start EMail Activation", { - "type": "reference", - "argument": "email", - "category": "full", - "description": "Email" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application Id" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "email" - }, { - "type": "int32", - "id": 2, - "name": "appId" - }, { - "type": "string", - "id": 3, - "name": "apiKey" - }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - }] - } - }, { - "type": "rpc", - "content": { - "name": "StartAnonymousAuth", - "header": 198, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Starting Anonymous login", { - "type": "reference", - "argument": "name", - "category": "full", - "description": "Name of new user" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application Id" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "name" - }, { - "type": "int32", - "id": 2, - "name": "appId" - }, { - "type": "string", - "id": 3, - "name": "apiKey" - }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - }] - } - }, { - "type": "rpc", - "content": { - "name": "StartTokenAuth", - "header": 203, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Starting token-based login", { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Token for authentication" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application Id" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "TimeZone of device" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }, { - "type": "int32", - "id": 2, - "name": "appId" - }, { - "type": "string", - "id": 3, - "name": "apiKey" - }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - }] - } - }, { - "type": "rpc", - "content": { - "name": "StartUsernameAuth", - "header": 2571, - "response": { - "type": "anonymous", - "header": 2572, - "doc": [ - "Result of login auth start. If is not registered move to signup.", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": " Authentication transaction hash" - }, { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " If user is registered with this username" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "bool", - "id": 2, - "name": "isRegistered" - }] - }, - "doc": [ - "Starting Login Authentication", { - "type": "reference", - "argument": "username", - "category": "full", - "description": "Username for signing in" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application id" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device Title" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "Time Zone of device" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages of device" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "username" - }, { - "type": "int32", - "id": 2, - "name": "appId" - }, { - "type": "string", - "id": 3, - "name": "apiKey" - }, { - "type": "bytes", - "id": 4, - "name": "deviceHash" - }, { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "timeZone" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "preferredLanguages" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ValidateCode", - "header": 189, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Performing user sign in.", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, { - "type": "reference", - "argument": "code", - "category": "hidden", - "description": "Activation code" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "string", - "id": 2, - "name": "code" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ValidatePassword", - "header": 207, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Validation of account password", { - "type": "reference", - "argument": "transactionHash", - "category": "full", - "description": "Hash of transaction" - }, { - "type": "reference", - "argument": "password", - "category": "full", - "description": "Password for account" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "string", - "id": 2, - "name": "password" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetOAuth2Params", - "header": 194, - "response": { - "type": "anonymous", - "header": 195, - "doc": [{ - "type": "reference", - "argument": "authUrl", - "category": "hidden", - "description": " Authentication url" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "authUrl" - }] - }, - "doc": [ - "Loading OAuth2 Parameters", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, { - "type": "reference", - "argument": "redirectUrl", - "category": "full", - "description": "Redirect URL for Application" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "string", - "id": 2, - "name": "redirectUrl" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CompleteOAuth2", - "header": 196, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Complete OAuth2 Authentication", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, { - "type": "reference", - "argument": "code", - "category": "danger", - "description": "Authentication Code" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "string", - "id": 2, - "name": "code" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SignUp", - "header": 190, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Perform user SignUp", { - "type": "reference", - "argument": "transactionHash", - "category": "danger", - "description": "Hash of transaction" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": "User name" - }, { - "type": "reference", - "argument": "sex", - "category": "full", - "description": "Optional user sex" - }, { - "type": "reference", - "argument": "password", - "category": "full", - "description": "Password for password-based accounts" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "transactionHash" - }, { - "type": "string", - "id": 2, - "name": "name" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "Sex" - } - }, - "id": 3, - "name": "sex" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "password" - }] - } - }, { - "type": "response", - "content": { - "name": "Auth", - "header": 5, - "doc": [ - "Authentication result", { - "type": "reference", - "argument": "user", - "category": "compact", - "description": " The authenticated User" - }, { - "type": "reference", - "argument": "config", - "category": "full", - "description": " Current config of server" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "User" - }, - "id": 2, - "name": "user" - }, { - "type": { - "type": "struct", - "childType": "Config" - }, - "id": 3, - "name": "config" - }] - } - }, { - "type": "struct", - "content": { - "name": "AuthSession", - "doc": [ - "Authentication session", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Unuque ID of session" - }, { - "type": "reference", - "argument": "authHolder", - "category": "full", - "description": " holder of session. 0 - this device, 1 - other." - }, { - "type": "reference", - "argument": "appId", - "category": "full", - "description": " Application Id (user in SignIn/SignUp)" - }, { - "type": "reference", - "argument": "appTitle", - "category": "full", - "description": " Title of application" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": " Title of device" - }, { - "type": "reference", - "argument": "authTime", - "category": "full", - "description": " Time of session creating" - }, { - "type": "reference", - "argument": "authLocation", - "category": "hidden", - "description": " two-letter country code of session create" - }, { - "type": "reference", - "argument": "latitude", - "category": "hidden", - "description": " optional latitude of auth if available" - }, { - "type": "reference", - "argument": "longitude", - "category": "hidden", - "description": " optional longitude of auth if available" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": { - "type": "enum", - "childType": "AuthHolder" - }, - "id": 2, - "name": "authHolder" - }, { - "type": "int32", - "id": 3, - "name": "appId" - }, { - "type": "string", - "id": 4, - "name": "appTitle" - }, { - "type": "string", - "id": 5, - "name": "deviceTitle" - }, { - "type": "int32", - "id": 6, - "name": "authTime" - }, { - "type": "string", - "id": 7, - "name": "authLocation" - }, { - "type": { - "type": "opt", - "childType": "double" - }, - "id": 8, - "name": "latitude" - }, { - "type": { - "type": "opt", - "childType": "double" - }, - "id": 9, - "name": "longitude" - }] - } - }, { - "type": "enum", - "content": { - "name": "AuthHolder", - "values": [{ - "name": "ThisDevice", - "id": 1 - }, { - "name": "OtherDevice", - "id": 2 - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetAuthSessions", - "header": 80, - "response": { - "type": "anonymous", - "header": 81, - "doc": [ - "Current Auth sessions", { - "type": "reference", - "argument": "userAuths", - "category": "compact", - "description": " User authentications" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "AuthSession" + ] + } + }, { + "type": "enum", + "content": { + "name": "EmailActivationType", + "values": [ + { + "name": "CODE", + "id": 1 + }, + { + "name": "OAUTH2", + "id": 2 + }, + { + "name": "PASSWORD", + "id": 3 } - }, - "id": 1, - "name": "userAuths" - }] - }, - "doc": [ - "Getting of all active user's authentication sessions" - ], - "attributes": [] - } - }, { - "type": "rpc", - "content": { - "name": "TerminateSession", - "header": 82, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "SignOut on specified user's session", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "id from AuthItem" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }] - } - }, { - "type": "rpc", - "content": { - "name": "TerminateAllSessions", - "header": 83, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "SignOut on all exept current sessions" - ], - "attributes": [] - } - }, { - "type": "rpc", - "content": { - "name": "SignOut", - "header": 84, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "SignOut current session" - ], - "attributes": [] - } - }, { - "type": "comment", - "content": "OBSOLETE METHODS" - }, { - "type": "rpc", - "content": { - "name": "SignInObsolete", - "header": 3, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Performing user signin", { - "type": "reference", - "argument": "phoneNumber", - "category": "danger", - "description": "Phone number in international format" - }, { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": "Code request hash from RequestAuthCode" - }, { - "type": "reference", - "argument": "smsCode", - "category": "danger", - "description": "Confirmation code from SMS" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device title like 'Steven's iPhone'" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, { - "type": "reference", - "argument": "appKey", - "category": "hidden", - "description": "Application API key" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, { - "type": "string", - "id": 2, - "name": "smsHash" - }, { - "type": "string", - "id": 3, - "name": "smsCode" - }, { - "type": "bytes", - "id": 5, - "name": "deviceHash" - }, { - "type": "string", - "id": 6, - "name": "deviceTitle" - }, { - "type": "int32", - "id": 7, - "name": "appId" - }, { - "type": "string", - "id": 8, - "name": "appKey" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SignUpObsolete", - "header": 4, - "response": { - "type": "reference", - "name": "Auth" - }, - "doc": [ - "Performing user signup. If user perform signup on already registered user it just override previous", "profile information", { - "type": "reference", - "argument": "phoneNumber", - "category": "danger", - "description": "Phone number in international format" - }, { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": "Code request hash from RequestAuthCode" - }, { - "type": "reference", - "argument": "smsCode", - "category": "danger", - "description": "Confirmation code from SMS" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": "User name" - }, { - "type": "reference", - "argument": "deviceHash", - "category": "full", - "description": "Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled" - }, { - "type": "reference", - "argument": "deviceTitle", - "category": "full", - "description": "Device title like 'Steven's iPhone'" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, { - "type": "reference", - "argument": "appKey", - "category": "hidden", - "description": "pplication API key" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, { - "type": "string", - "id": 2, - "name": "smsHash" - }, { - "type": "string", - "id": 3, - "name": "smsCode" - }, { - "type": "string", - "id": 4, - "name": "name" - }, { - "type": "bytes", - "id": 7, - "name": "deviceHash" - }, { - "type": "string", - "id": 8, - "name": "deviceTitle" - }, { - "type": "int32", - "id": 9, - "name": "appId" - }, { - "type": "string", - "id": 10, - "name": "appKey" - }, { - "type": "bool", - "id": 11, - "name": "isSilent" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SendAuthCodeObsolete", - "header": 1, - "response": { - "type": "anonymous", - "header": 2, - "doc": [ - "Sms Request response", { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": " Hash of SMS request" - }, { - "type": "reference", - "argument": "isRegistered", - "category": "full", - "description": " true if user is registered" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "smsHash" - }, { - "type": "bool", - "id": 2, - "name": "isRegistered" - }] - }, - "doc": [ - "Sending SMS with activation code", { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": "Phone number in international format" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, { - "type": "int32", - "id": 2, - "name": "appId" - }, { - "type": "string", - "id": 3, - "name": "apiKey" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SendAuthCallObsolete", - "header": 90, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Requesting Phone activation", { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": "Phone number in international format" - }, { - "type": "reference", - "argument": "smsHash", - "category": "danger", - "description": "Code request hash from RequestAuthCode" - }, { - "type": "reference", - "argument": "appId", - "category": "hidden", - "description": "Application ID" - }, { - "type": "reference", - "argument": "apiKey", - "category": "hidden", - "description": "Application API key" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, { - "type": "string", - "id": 2, - "name": "smsHash" - }, { - "type": "int32", - "id": 3, - "name": "appId" - }, { - "type": "string", - "id": 4, - "name": "apiKey" - }] - } - }] - }, { - "title": "Users", - "package": "users", - "doc": [ - "Users are objects that secured by accessHash. You can't load user profile by it's id.", - "You can't send message to user without finding it's object in Updates or by calling", - "method for user search, contacts import or some other methods.", - "", - "Applications need to keep all Users information forever.", - "", - "Each User have optional localName - name of user that was set by current user and can be changed", - "any time by calling EditUserLocalName method." - ], - "items": [{ - "type": "enum", - "content": { - "name": "Sex", - "values": [{ - "name": "Unknown", - "id": 1 - }, { - "name": "Male", - "id": 2 - }, { - "name": "Female", - "id": 3 - }] - } - }, { - "type": "enum", - "content": { - "name": "ContactType", - "values": [{ - "name": "Phone", - "id": 1 - }, { - "name": "Email", - "id": 2 - }, { - "name": "Web", - "id": 3 - }, { - "name": "Social", - "id": 4 - }] - } - }, { - "type": "struct", - "content": { - "name": "ContactRecord", - "doc": [ - "Contact information record", { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Record type" - }, { - "type": "reference", - "argument": "typeSpec", - "category": "hidden", - "description": " Value for specification type of contact, for example 'mobile/standalone/office' for phones or 'vk/fb/telegram' for extenrnal networks." - }, { - "type": "reference", - "argument": "stringValue", - "category": "full", - "description": " String value of record" - }, { - "type": "reference", - "argument": "longValue", - "category": "full", - "description": " Long value of record" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Title of record" - }, { - "type": "reference", - "argument": "subtitle", - "category": "hidden", - "description": " Subtitle of record" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "enum", - "childType": "ContactType" - }, - "id": 1, - "name": "type" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 6, - "name": "typeSpec" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "stringValue" - }, { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 3, - "name": "longValue" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "title" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 5, - "name": "subtitle" - }] - } - }, { - "type": "struct", - "content": { - "name": "User", - "doc": [ - "Main user object", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " uid" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " user's access hash" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " user's name" - }, { - "type": "reference", - "argument": "localName", - "category": "full", - "description": " user's local name" - }, { - "type": "reference", - "argument": "nick", - "category": "full", - "description": " User's nickname" - }, { - "type": "reference", - "argument": "sex", - "category": "full", - "description": " optional sex of user" - }, { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " avatar of user" - }, { - "type": "reference", - "argument": "isBot", - "category": "full", - "description": " Is user actually bot. By default is false." - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Extension values" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": " [DEPRECATED] User's about information" - }, { - "type": "reference", - "argument": "contactInfo", - "category": "compact", - "description": " [DEPRECATED] Contact information of user" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": " [DEPRECATED] Preferred user languages" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": " [DEPRECATED] Time Zone of user in TZ format" - }, { - "type": "reference", - "argument": "botCommands", - "category": "full", - "description": " [DEPRECATED] Available Bot Commands" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": "string", - "id": 3, - "name": "name" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "localName" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 13, - "name": "nick" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "Sex" - } - }, - "id": 5, - "name": "sex" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 8, - "name": "avatar" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 11, - "name": "isBot" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 20, - "name": "ext" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ContactRecord" - } - }, - "id": 12, - "name": "contactInfo", - "deprecated": "true" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 14, - "name": "about", - "deprecated": "true" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 16, - "name": "preferredLanguages", - "deprecated": "true" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 17, - "name": "timeZone", - "deprecated": "true" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "BotCommand" - } - }, - "id": 19, - "name": "botCommands", - "deprecated": "true" - }] - } - }, { - "type": "struct", - "content": { - "name": "FullUser", - "doc": [ - "Full User representation", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " User's Id" - }, { - "type": "reference", - "argument": "contactInfo", - "category": "compact", - "description": " User's contact information" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": " User's about information" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": " Preferred user languages" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": " Time Zone of user in TZ format" - }, { - "type": "reference", - "argument": "botCommands", - "category": "full", - "description": " Available Commands for Bot" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Extension values. NOTE: This values are not related to ext field in User object." - }, { - "type": "reference", - "argument": "isBlocked", - "category": "full", - "description": " Is user blocked. Default is false." - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ContactRecord" - } - }, - "id": 2, - "name": "contactInfo" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "about" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 4, - "name": "preferredLanguages" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 5, - "name": "timeZone" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "BotCommand" - } - }, - "id": 6, - "name": "botCommands" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 7, - "name": "ext" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 8, - "name": "isBlocked" - }] - } - }, { - "type": "struct", - "content": { - "name": "BotCommand", - "doc": [ - "Available bot commands", { - "type": "reference", - "argument": "slashCommand", - "category": "full", - "description": " Slash command name (wihtout slash)" - }, { - "type": "reference", - "argument": "description", - "category": "full", - "description": " Slash command description" - }, { - "type": "reference", - "argument": "locKey", - "category": "full", - "description": " Optional Localization Key for i18n" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "slashCommand" - }, { - "type": "string", - "id": 2, - "name": "description" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "locKey" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditUserLocalName", - "header": 96, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Renaming of user's visible name", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": "target User's uid" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": "User's accessHash" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": "New user name" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": "string", - "id": 3, - "name": "name" - }] - } - }, { - "type": "update", - "content": { - "name": "UserAvatarChanged", - "header": 16, - "doc": [ - "Update about avatar changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " user's new avatar" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 2, - "name": "avatar" - }] - } - }, { - "type": "update", - "content": { - "name": "UserNameChanged", - "header": 32, - "doc": [ - "Update about name changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " user's name" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": "string", - "id": 2, - "name": "name" - }] - } - }, { - "type": "update", - "content": { - "name": "UserLocalNameChanged", - "header": 51, - "doc": [ - "Update about local name changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, { - "type": "reference", - "argument": "localName", - "category": "full", - "description": " new user's local name" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "localName" - }] - } - }, { - "type": "update", - "content": { - "name": "UserContactsChanged", - "header": 134, - "doc": [ - "Update about contact information change", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, { - "type": "reference", - "argument": "contactRecords", - "category": "compact", - "description": " new phones list" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ContactRecord" - } - }, - "id": 4, - "name": "contactRecords" - }] - } - }, { - "type": "update", - "content": { - "name": "UserNickChanged", - "header": 209, - "doc": [ - "Update about nick changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " user's uid" - }, { - "type": "reference", - "argument": "nickname", - "category": "full", - "description": " user's new nickname" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "nickname" - }] - } - }, { - "type": "update", - "content": { - "name": "UserAboutChanged", - "header": 210, - "doc": [ - "Update about user's about changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's uid" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": " User's about" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "about" - }] - } - }, { - "type": "update", - "content": { - "name": "UserPreferredLanguagesChanged", - "header": 212, - "doc": [ - "Update about user's preferred languages", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's uid" - }, { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": " User's preferred languages. Can be empty." - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 2, - "name": "preferredLanguages" - }] - } - }, { - "type": "update", - "content": { - "name": "UserTimeZoneChanged", - "header": 216, - "doc": [ - "User TimeZone changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's uid" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": " User's new time zone in TZ format" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "timeZone" - }] - } - }, { - "type": "update", - "content": { - "name": "UserBotCommandsChanged", - "header": 217, - "doc": [ - "Update about bot commands changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's Id" - }, { - "type": "reference", - "argument": "commands", - "category": "full", - "description": " New List of commands" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "BotCommand" - } - }, - "id": 2, - "name": "commands" - }] - } - }, { - "type": "update", - "content": { - "name": "UserExtChanged", - "header": 218, - "doc": [ - "Update about user ext changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " New Ext Value in User (NOT FullUser) object." - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 2, - "name": "ext" - }] - } - }, { - "type": "update", - "content": { - "name": "UserFullExtChanged", - "header": 219, - "doc": [ - "Update about user ext changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's Id" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " New Ext Value in FullUser (NOT User) object." - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 3, - "name": "ext" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadFullUsers", - "header": 2649, - "response": { - "type": "anonymous", - "header": 2650, - "doc": [{ - "type": "reference", - "argument": "fullUsers", - "category": "compact", - "description": " Loaded users" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "FullUser" + ] + } + },{"type":"rpc","content":{ +"name":"StartPhoneAuth", +"header":191, +"response":{"type":"anonymous","header":193, "doc":[ +"Phone Activation response",{"type":"reference","argument":"transactionHash","category":"danger","description":" Hash of transaction"},{"type":"reference","argument":"isRegistered","category":"full","description":" Is User registered"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"PhoneActivationType"}},"id":3,"name":"activationType"} +]}, +"doc":[ +"Start Phone Activation",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number"},{"type":"reference","argument":"appId","category":"hidden","description":"Appication Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages of device"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"SendCodeByPhoneCall", +"header":197, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Dial phone and dictate auth code",{"type":"reference","argument":"transactionHash","category":"danger","description":"Transaction hash"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +]}},{"type":"rpc","content":{ +"name":"StartEmailAuth", +"header":185, +"response":{"type":"anonymous","header":186, "doc":[ +"Email Activation response",{"type":"reference","argument":"transactionHash","category":"danger","description":" Hash of activation transaction"},{"type":"reference","argument":"isRegistered","category":"full","description":" true if user is registered"},{"type":"reference","argument":"activationType","category":"full","description":" Email Activation type"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +,{"type":{"type":"enum","childType":"EmailActivationType"},"id":3,"name":"activationType"} +]}, +"doc":[ +"Start EMail Activation",{"type":"reference","argument":"email","category":"full","description":"Email"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"StartAnonymousAuth", +"header":198, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Starting Anonymous login",{"type":"reference","argument":"name","category":"full","description":"Name of new user"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ +{"type":"string","id":1,"name":"name"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"StartTokenAuth", +"header":203, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Starting token-based login",{"type":"reference","argument":"token","category":"full","description":"Token for authentication"},{"type":"reference","argument":"appId","category":"hidden","description":"Application Id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"TimeZone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"StartUsernameAuth", +"header":2571, +"response":{"type":"anonymous","header":2572, "doc":[ +"Result of login auth start. If is not registered move to signup.",{"type":"reference","argument":"transactionHash","category":"danger","description":" Authentication transaction hash"},{"type":"reference","argument":"isRegistered","category":"full","description":" If user is registered with this username"}] ,"attributes":[{"type":"string","id":1,"name":"transactionHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +]}, +"doc":[ +"Starting Login Authentication",{"type":"reference","argument":"username","category":"full","description":"Username for signing in"},{"type":"reference","argument":"appId","category":"hidden","description":"Application id"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device Title"},{"type":"reference","argument":"timeZone","category":"full","description":"Time Zone of device"},{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages of device"}],"attributes":[ +{"type":"string","id":1,"name":"username"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +,{"type":"bytes","id":4,"name":"deviceHash"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"timeZone"} +,{"type":{"type":"list","childType":"string"},"id":7,"name":"preferredLanguages"} +]}},{"type":"rpc","content":{ +"name":"ValidateCode", +"header":189, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Performing user sign in.",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"code","category":"hidden","description":"Activation code"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"code"} +]}},{"type":"rpc","content":{ +"name":"ValidatePassword", +"header":207, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Validation of account password",{"type":"reference","argument":"transactionHash","category":"full","description":"Hash of transaction"},{"type":"reference","argument":"password","category":"full","description":"Password for account"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"password"} +]}},{"type":"rpc","content":{ +"name":"GetOAuth2Params", +"header":194, +"response":{"type":"anonymous","header":195, "doc":[ +{"type":"reference","argument":"authUrl","category":"hidden","description":" Authentication url"}] ,"attributes":[{"type":"string","id":1,"name":"authUrl"} +]}, +"doc":[ +"Loading OAuth2 Parameters",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"redirectUrl","category":"full","description":"Redirect URL for Application"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"redirectUrl"} +]}},{"type":"rpc","content":{ +"name":"CompleteOAuth2", +"header":196, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Complete OAuth2 Authentication",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"code","category":"danger","description":"Authentication Code"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"code"} +]}},{"type":"rpc","content":{ +"name":"SignUp", +"header":190, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Perform user SignUp",{"type":"reference","argument":"transactionHash","category":"danger","description":"Hash of transaction"},{"type":"reference","argument":"name","category":"full","description":"User name"},{"type":"reference","argument":"sex","category":"full","description":"Optional user sex"},{"type":"reference","argument":"password","category":"full","description":"Password for password-based accounts"}],"attributes":[ +{"type":"string","id":1,"name":"transactionHash"} +,{"type":"string","id":2,"name":"name"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"Sex"}},"id":3,"name":"sex"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"password"} +]}},{"type":"response","content":{ +"name":"Auth", +"header":5, +"doc":[ +"Authentication result",{"type":"reference","argument":"user","category":"compact","description":" The authenticated User"},{"type":"reference","argument":"config","category":"full","description":" Current config of server"}],"attributes":[ +{"type":{"type":"struct","childType":"User"},"id":2,"name":"user"} +,{"type":{"type":"struct","childType":"Config"},"id":3,"name":"config"} +]}}, { + "type":"struct", + "content": { + "name":"AuthSession", +"doc":[ +"Authentication session",{"type":"reference","argument":"id","category":"full","description":" Unuque ID of session"},{"type":"reference","argument":"authHolder","category":"full","description":" holder of session. 0 - this device, 1 - other."},{"type":"reference","argument":"appId","category":"full","description":" Application Id (user in SignIn/SignUp)"},{"type":"reference","argument":"appTitle","category":"full","description":" Title of application"},{"type":"reference","argument":"deviceTitle","category":"full","description":" Title of device"},{"type":"reference","argument":"authTime","category":"full","description":" Time of session creating"},{"type":"reference","argument":"authLocation","category":"hidden","description":" two-letter country code of session create"},{"type":"reference","argument":"latitude","category":"hidden","description":" optional latitude of auth if available"},{"type":"reference","argument":"longitude","category":"hidden","description":" optional longitude of auth if available"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":{"type":"enum","childType":"AuthHolder"},"id":2,"name":"authHolder"} +,{"type":"int32","id":3,"name":"appId"} +,{"type":"string","id":4,"name":"appTitle"} +,{"type":"string","id":5,"name":"deviceTitle"} +,{"type":"int32","id":6,"name":"authTime"} +,{"type":"string","id":7,"name":"authLocation"} +,{"type":{"type":"opt","childType":"double"},"id":8,"name":"latitude"} +,{"type":{"type":"opt","childType":"double"},"id":9,"name":"longitude"} +]}}, { + "type": "enum", + "content": { + "name": "AuthHolder", + "values": [ + { + "name": "ThisDevice", + "id": 1 + }, + { + "name": "OtherDevice", + "id": 2 } - }, - "id": 1, - "name": "fullUsers" - }] - }, - "doc": [ - "Loading Full User information", { - "type": "reference", - "argument": "userPeers", - "category": "compact", - "description": "User's peers to load. Should be non-empy" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "userPeers" - }] - } - }] - }, { - "title": "Profile", - "package": "profile", - "items": [{ - "type": "rpc", - "content": { - "name": "EditName", - "header": 53, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing account's name", { - "type": "reference", - "argument": "name", - "category": "full", - "description": "New name" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "name" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditNickName", - "header": 205, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing account's nickname", { - "type": "reference", - "argument": "nickname", - "category": "full", - "description": "New Nickname" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "nickname" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CheckNickName", - "header": 206, - "response": { - "type": "reference", - "name": "Bool" - }, - "doc": [ - "Checking availability of nickname", { - "type": "reference", - "argument": "nickname", - "category": "full", - "description": "Nickname for checking" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "nickname" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditAbout", - "header": 212, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing about information", { - "type": "reference", - "argument": "about", - "category": "full", - "description": "new about information" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "about" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditAvatar", - "header": 31, - "response": { - "type": "anonymous", - "header": 103, - "doc": [ - "Response for change account avatar", { - "type": "reference", - "argument": "avatar", - "category": "full", - "description": " New avatar" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Avatar" - }, - "id": 1, - "name": "avatar" - }, { - "type": "int32", - "id": 2, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }] - }, - "doc": [ - "Changing account's avatar", { - "type": "reference", - "argument": "fileLocation", - "category": "compact", - "description": "File Location of uploaded unencrypted avatar" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "fileLocation" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RemoveAvatar", - "header": 91, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Removing account's avatar" - ], - "attributes": [] - } - }, { - "type": "rpc", - "content": { - "name": "EditMyTimeZone", - "header": 144, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Updating user's time zone", { - "type": "reference", - "argument": "tz", - "category": "full", - "description": "New Time Zone" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "tz" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditMyPreferredLanguages", - "header": 145, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Changing preffered languages", { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preffered Languages" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": "string" - }, - "id": 1, - "name": "preferredLanguages" - }] - } - }] - }, { - "title": "Contacts", - "package": "contacts", - "doc": [ - "Before working with contact list is is useful to import contacts from phone first by calling", - "method ImportContacts#0x07.", - "", - "All phone numbers MUST be preprocessed before import by some library (like libphonenumber)", - "and build international phone number depending on current users phone and/or locale.", - "", - "For loading contact list from server use GetContacts#0x57.", - "If during this call there are some updates about contact list change", - "it is recommended to call it again. Also applications need to sync contacts on application start.", - "", - "For searching for users without adding to contacts list use method FindContacts#0x70.", - "", - "For adding/deleting contacts AddContact#0x72 and DeleteContact#0x59." - ], - "items": [{ - "type": "struct", - "content": { - "name": "PhoneToImport", - "doc": [ - "Phone for import", { - "type": "reference", - "argument": "phoneNumber", - "category": "full", - "description": " phone number for import in international format" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " optional name for contact" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "phoneNumber" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - }] - } - }, { - "type": "struct", - "content": { - "name": "EmailToImport", - "doc": [ - "Email for import", { - "type": "reference", - "argument": "email", - "category": "full", - "description": " email for importing" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " optional name for contact" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "email" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ImportContacts", - "header": 7, - "response": { - "type": "anonymous", - "header": 8, - "doc": [ - "Imported contacts", { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Imported users" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number if users are imported" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state if users are imported" - }, { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Imported user peers" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" + ] + } + },{"type":"rpc","content":{ +"name":"GetAuthSessions", +"header":80, +"response":{"type":"anonymous","header":81, "doc":[ +"Current Auth sessions",{"type":"reference","argument":"userAuths","category":"compact","description":" User authentications"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"AuthSession"}},"id":1,"name":"userAuths"} +]}, +"doc":[ +"Getting of all active user's authentication sessions"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"TerminateSession", +"header":82, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"SignOut on specified user's session",{"type":"reference","argument":"id","category":"full","description":"id from AuthItem"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +]}},{"type":"rpc","content":{ +"name":"TerminateAllSessions", +"header":83, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"SignOut on all exept current sessions"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"SignOut", +"header":84, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"SignOut current session"],"attributes":[ +]}},{"type":"comment","content":"OBSOLETE METHODS"},{"type":"rpc","content":{ +"name":"SignInObsolete", +"header":3, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Performing user signin",{"type":"reference","argument":"phoneNumber","category":"danger","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"smsCode","category":"danger","description":"Confirmation code from SMS"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device title like 'Steven's iPhone'"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"appKey","category":"hidden","description":"Application API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"string","id":2,"name":"smsHash"} +,{"type":"string","id":3,"name":"smsCode"} +,{"type":"bytes","id":5,"name":"deviceHash"} +,{"type":"string","id":6,"name":"deviceTitle"} +,{"type":"int32","id":7,"name":"appId"} +,{"type":"string","id":8,"name":"appKey"} +]}},{"type":"rpc","content":{ +"name":"SignUpObsolete", +"header":4, +"response":{"type":"reference","name":"Auth"}, +"doc":[ +"Performing user signup. If user perform signup on already registered user it just override previous","profile information",{"type":"reference","argument":"phoneNumber","category":"danger","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"smsCode","category":"danger","description":"Confirmation code from SMS"},{"type":"reference","argument":"name","category":"full","description":"User name"},{"type":"reference","argument":"deviceHash","category":"full","description":"Hash of device unique id and app bundle id. Used for autologout users when app is reinstalled"},{"type":"reference","argument":"deviceTitle","category":"full","description":"Device title like 'Steven's iPhone'"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"appKey","category":"hidden","description":"pplication API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"string","id":2,"name":"smsHash"} +,{"type":"string","id":3,"name":"smsCode"} +,{"type":"string","id":4,"name":"name"} +,{"type":"bytes","id":7,"name":"deviceHash"} +,{"type":"string","id":8,"name":"deviceTitle"} +,{"type":"int32","id":9,"name":"appId"} +,{"type":"string","id":10,"name":"appKey"} +,{"type":"bool","id":11,"name":"isSilent"} +]}},{"type":"rpc","content":{ +"name":"SendAuthCodeObsolete", +"header":1, +"response":{"type":"anonymous","header":2, "doc":[ +"Sms Request response",{"type":"reference","argument":"smsHash","category":"danger","description":" Hash of SMS request"},{"type":"reference","argument":"isRegistered","category":"full","description":" true if user is registered"}] ,"attributes":[{"type":"string","id":1,"name":"smsHash"} +,{"type":"bool","id":2,"name":"isRegistered"} +]}, +"doc":[ +"Sending SMS with activation code",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number in international format"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"int32","id":2,"name":"appId"} +,{"type":"string","id":3,"name":"apiKey"} +]}},{"type":"rpc","content":{ +"name":"SendAuthCallObsolete", +"header":90, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Requesting Phone activation",{"type":"reference","argument":"phoneNumber","category":"full","description":"Phone number in international format"},{"type":"reference","argument":"smsHash","category":"danger","description":"Code request hash from RequestAuthCode"},{"type":"reference","argument":"appId","category":"hidden","description":"Application ID"},{"type":"reference","argument":"apiKey","category":"hidden","description":"Application API key"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":"string","id":2,"name":"smsHash"} +,{"type":"int32","id":3,"name":"appId"} +,{"type":"string","id":4,"name":"apiKey"} +]}}]}, { + "title": "Users", + "package": "users", + "doc": [ + "Users are objects that secured by accessHash. You can't load user profile by it's id.", + "You can't send message to user without finding it's object in Updates or by calling", + "method for user search, contacts import or some other methods.", + "", + "Applications need to keep all Users information forever.", + "", + "Each User have optional localName - name of user that was set by current user and can be changed", + "any time by calling EditUserLocalName method." + ], + "items": [ + { + "type": "enum", + "content": { + "name": "Sex", + "values": [ + { + "name": "Unknown", + "id": 1 + }, + { + "name": "Male", + "id": 2 + }, + { + "name": "Female", + "id": 3 } - }, - "id": 1, - "name": "users" - }, { - "type": "int32", - "id": 2, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" + ] + } + }, { + "type": "enum", + "content": { + "name": "ContactType", + "values": [ + { + "name": "Phone", + "id": 1 + }, + { + "name": "Email", + "id": 2 + }, + { + "name": "Web", + "id": 3 + }, + { + "name": "Social", + "id": 4 } - }, - "id": 4, - "name": "userPeers" - }] - }, - "doc": [ - "Importing phones and emails for building contact list", "Maximum amount of items for import per method call equals to 100.", { - "type": "reference", - "argument": "phones", - "category": "compact", - "description": "Phones for import" - }, { - "type": "reference", - "argument": "emails", - "category": "compact", - "description": "Emails for import" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "PhoneToImport" - } - }, - "id": 1, - "name": "phones" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EmailToImport" - } - }, - "id": 2, - "name": "emails" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - }] - } - }, { - "type": "empty" - }, { - "type": "rpc", - "content": { - "name": "GetContacts", - "header": 87, - "response": { - "type": "anonymous", - "header": 88, - "doc": [ - "Current contact list", { - "type": "reference", - "argument": "users", - "category": "hidden", - "description": " User list if list is changed" - }, { - "type": "reference", - "argument": "isNotChanged", - "category": "full", - "description": " is list changed" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" + ] + } + }, { + "type":"struct", + "content": { + "name":"ContactRecord", +"doc":[ +"Contact information record",{"type":"reference","argument":"type","category":"full","description":" Record type"},{"type":"reference","argument":"typeSpec","category":"hidden","description":" Value for specification type of contact, for example 'mobile/standalone/office' for phones or 'vk/fb/telegram' for extenrnal networks."},{"type":"reference","argument":"stringValue","category":"full","description":" String value of record"},{"type":"reference","argument":"longValue","category":"full","description":" Long value of record"},{"type":"reference","argument":"title","category":"full","description":" Title of record"},{"type":"reference","argument":"subtitle","category":"hidden","description":" Subtitle of record"}],"expandable":"true","attributes":[ +{"type":{"type":"enum","childType":"ContactType"},"id":1,"name":"type"} +,{"type":{"type":"opt","childType":"string"},"id":6,"name":"typeSpec"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"stringValue"} +,{"type":{"type":"opt","childType":"int64"},"id":3,"name":"longValue"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"title"} +,{"type":{"type":"opt","childType":"string"},"id":5,"name":"subtitle"} +]}}, { + "type":"struct", + "content": { + "name":"User", +"doc":[ +"Main user object",{"type":"reference","argument":"id","category":"full","description":" uid"},{"type":"reference","argument":"accessHash","category":"danger","description":" user's access hash"},{"type":"reference","argument":"name","category":"full","description":" user's name"},{"type":"reference","argument":"localName","category":"full","description":" user's local name"},{"type":"reference","argument":"nick","category":"full","description":" User's nickname"},{"type":"reference","argument":"sex","category":"full","description":" optional sex of user"},{"type":"reference","argument":"avatar","category":"compact","description":" avatar of user"},{"type":"reference","argument":"isBot","category":"full","description":" Is user actually bot. By default is false."},{"type":"reference","argument":"ext","category":"full","description":" Extension values"},{"type":"reference","argument":"about","category":"full","description":" [DEPRECATED] User's about information"},{"type":"reference","argument":"contactInfo","category":"compact","description":" [DEPRECATED] Contact information of user"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" [DEPRECATED] Preferred user languages"},{"type":"reference","argument":"timeZone","category":"full","description":" [DEPRECATED] Time Zone of user in TZ format"},{"type":"reference","argument":"botCommands","category":"full","description":" [DEPRECATED] Available Bot Commands"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"name"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"localName"} +,{"type":{"type":"opt","childType":"string"},"id":13,"name":"nick"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"Sex"}},"id":5,"name":"sex"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":8,"name":"avatar"} +,{"type":{"type":"opt","childType":"bool"},"id":11,"name":"isBot"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":20,"name":"ext"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":12,"name":"contactInfo", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":14,"name":"about", "deprecated":"true"} +,{"type":{"type":"list","childType":"string"},"id":16,"name":"preferredLanguages", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":17,"name":"timeZone", "deprecated":"true"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":19,"name":"botCommands", "deprecated":"true"} +]}}, { + "type":"struct", + "content": { + "name":"FullUser", +"doc":[ +"Full User representation",{"type":"reference","argument":"id","category":"full","description":" User's Id"},{"type":"reference","argument":"contactInfo","category":"compact","description":" User's contact information"},{"type":"reference","argument":"about","category":"full","description":" User's about information"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" Preferred user languages"},{"type":"reference","argument":"timeZone","category":"full","description":" Time Zone of user in TZ format"},{"type":"reference","argument":"botCommands","category":"full","description":" Available Commands for Bot"},{"type":"reference","argument":"ext","category":"full","description":" Extension values. NOTE: This values are not related to ext field in User object."},{"type":"reference","argument":"isBlocked","category":"full","description":" Is user blocked. Default is false."}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"id"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":2,"name":"contactInfo"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} +,{"type":{"type":"list","childType":"string"},"id":4,"name":"preferredLanguages"} +,{"type":{"type":"opt","childType":"string"},"id":5,"name":"timeZone"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":6,"name":"botCommands"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":7,"name":"ext"} +,{"type":{"type":"opt","childType":"bool"},"id":8,"name":"isBlocked"} +]}}, { + "type":"struct", + "content": { + "name":"BotCommand", +"doc":[ +"Available bot commands",{"type":"reference","argument":"slashCommand","category":"full","description":" Slash command name (wihtout slash)"},{"type":"reference","argument":"description","category":"full","description":" Slash command description"},{"type":"reference","argument":"locKey","category":"full","description":" Optional Localization Key for i18n"}],"attributes":[ +{"type":"string","id":1,"name":"slashCommand"} +,{"type":"string","id":2,"name":"description"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"locKey"} +]}},{"type":"rpc","content":{ +"name":"EditUserLocalName", +"header":96, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Renaming of user's visible name",{"type":"reference","argument":"uid","category":"full","description":"target User's uid"},{"type":"reference","argument":"accessHash","category":"danger","description":"User's accessHash"},{"type":"reference","argument":"name","category":"full","description":"New user name"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"name"} +]}},{"type":"update","content":{ +"name":"UserAvatarChanged", +"header":16, +"doc":[ +"Update about avatar changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"avatar","category":"compact","description":" user's new avatar"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":2,"name":"avatar"} +]}},{"type":"update","content":{ +"name":"UserNameChanged", +"header":32, +"doc":[ +"Update about name changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"name","category":"full","description":" user's name"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"string","id":2,"name":"name"} +]}},{"type":"update","content":{ +"name":"UserLocalNameChanged", +"header":51, +"doc":[ +"Update about local name changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"localName","category":"full","description":" new user's local name"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"localName"} +]}},{"type":"update","content":{ +"name":"UserContactsChanged", +"header":134, +"doc":[ +"Update about contact information change",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"contactRecords","category":"compact","description":" new phones list"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"ContactRecord"}},"id":4,"name":"contactRecords"} +]}},{"type":"update","content":{ +"name":"UserNickChanged", +"header":209, +"doc":[ +"Update about nick changed",{"type":"reference","argument":"uid","category":"full","description":" user's uid"},{"type":"reference","argument":"nickname","category":"full","description":" user's new nickname"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"nickname"} +]}},{"type":"update","content":{ +"name":"UserAboutChanged", +"header":210, +"doc":[ +"Update about user's about changed",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"about","category":"full","description":" User's about"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} +]}},{"type":"update","content":{ +"name":"UserPreferredLanguagesChanged", +"header":212, +"doc":[ +"Update about user's preferred languages",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"preferredLanguages","category":"full","description":" User's preferred languages. Can be empty."}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"list","childType":"string"},"id":2,"name":"preferredLanguages"} +]}},{"type":"update","content":{ +"name":"UserTimeZoneChanged", +"header":216, +"doc":[ +"User TimeZone changed",{"type":"reference","argument":"uid","category":"full","description":" User's uid"},{"type":"reference","argument":"timeZone","category":"full","description":" User's new time zone in TZ format"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"timeZone"} +]}},{"type":"update","content":{ +"name":"UserBotCommandsChanged", +"header":217, +"doc":[ +"Update about bot commands changed",{"type":"reference","argument":"uid","category":"full","description":" User's Id"},{"type":"reference","argument":"commands","category":"full","description":" New List of commands"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"BotCommand"}},"id":2,"name":"commands"} +]}},{"type":"update","content":{ +"name":"UserExtChanged", +"header":218, +"doc":[ +"Update about user ext changed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"ext","category":"full","description":" New Ext Value in User (NOT FullUser) object."}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} +]}},{"type":"update","content":{ +"name":"UserFullExtChanged", +"header":219, +"doc":[ +"Update about user ext changed",{"type":"reference","argument":"uid","category":"full","description":" User's Id"},{"type":"reference","argument":"ext","category":"full","description":" New Ext Value in FullUser (NOT User) object."}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":3,"name":"ext"} +]}},{"type":"rpc","content":{ +"name":"LoadFullUsers", +"header":2649, +"response":{"type":"anonymous","header":2650, "doc":[ +{"type":"reference","argument":"fullUsers","category":"compact","description":" Loaded users"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"FullUser"}},"id":1,"name":"fullUsers"} +]}, +"doc":[ +"Loading Full User information",{"type":"reference","argument":"userPeers","category":"compact","description":"User's peers to load. Should be non-empy"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"userPeers"} +]}}]}, { + "title": "Profile", + "package": "profile", + "items": [ +{"type":"rpc","content":{ +"name":"EditName", +"header":53, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing account's name",{"type":"reference","argument":"name","category":"full","description":"New name"}],"attributes":[ +{"type":"string","id":1,"name":"name"} +]}},{"type":"rpc","content":{ +"name":"EditNickName", +"header":205, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing account's nickname",{"type":"reference","argument":"nickname","category":"full","description":"New Nickname"}],"attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"nickname"} +]}},{"type":"rpc","content":{ +"name":"CheckNickName", +"header":206, +"response":{"type":"reference","name":"Bool"}, +"doc":[ +"Checking availability of nickname",{"type":"reference","argument":"nickname","category":"full","description":"Nickname for checking"}],"attributes":[ +{"type":"string","id":1,"name":"nickname"} +]}},{"type":"rpc","content":{ +"name":"EditAbout", +"header":212, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing about information",{"type":"reference","argument":"about","category":"full","description":"new about information"}],"attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"about"} +]}},{"type":"rpc","content":{ +"name":"EditAvatar", +"header":31, +"response":{"type":"anonymous","header":103, "doc":[ +"Response for change account avatar",{"type":"reference","argument":"avatar","category":"full","description":" New avatar"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"}] ,"attributes":[{"type":{"type":"struct","childType":"Avatar"},"id":1,"name":"avatar"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +]}, +"doc":[ +"Changing account's avatar",{"type":"reference","argument":"fileLocation","category":"compact","description":"File Location of uploaded unencrypted avatar"}],"attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} +]}},{"type":"rpc","content":{ +"name":"RemoveAvatar", +"header":91, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Removing account's avatar"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"EditMyTimeZone", +"header":144, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Updating user's time zone",{"type":"reference","argument":"tz","category":"full","description":"New Time Zone"}],"attributes":[ +{"type":"string","id":1,"name":"tz"} +]}},{"type":"rpc","content":{ +"name":"EditMyPreferredLanguages", +"header":145, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Changing preffered languages",{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preffered Languages"}],"attributes":[ +{"type":{"type":"list","childType":"string"},"id":1,"name":"preferredLanguages"} +]}}]}, { + "title": "Contacts", + "package": "contacts", + "doc": [ + "Before working with contact list is is useful to import contacts from phone first by calling", + "method ImportContacts#0x07.", + "", + "All phone numbers MUST be preprocessed before import by some library (like libphonenumber)", + "and build international phone number depending on current users phone and/or locale.", + "", + "For loading contact list from server use GetContacts#0x57.", + "If during this call there are some updates about contact list change", + "it is recommended to call it again. Also applications need to sync contacts on application start.", + "", + "For searching for users without adding to contacts list use method FindContacts#0x70.", + "", + "For adding/deleting contacts AddContact#0x72 and DeleteContact#0x59." + ], + "items": [ + { + "type":"struct", + "content": { + "name":"PhoneToImport", +"doc":[ +"Phone for import",{"type":"reference","argument":"phoneNumber","category":"full","description":" phone number for import in international format"},{"type":"reference","argument":"name","category":"full","description":" optional name for contact"}],"attributes":[ +{"type":"int64","id":1,"name":"phoneNumber"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +]}}, { + "type":"struct", + "content": { + "name":"EmailToImport", +"doc":[ +"Email for import",{"type":"reference","argument":"email","category":"full","description":" email for importing"},{"type":"reference","argument":"name","category":"full","description":" optional name for contact"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +]}},{"type":"rpc","content":{ +"name":"ImportContacts", +"header":7, +"response":{"type":"anonymous","header":8, "doc":[ +"Imported contacts",{"type":"reference","argument":"users","category":"compact","description":" Imported users"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number if users are imported"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state if users are imported"},{"type":"reference","argument":"userPeers","category":"full","description":" Imported user peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +]}, +"doc":[ +"Importing phones and emails for building contact list","Maximum amount of items for import per method call equals to 100.",{"type":"reference","argument":"phones","category":"compact","description":"Phones for import"},{"type":"reference","argument":"emails","category":"compact","description":"Emails for import"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"PhoneToImport"}},"id":1,"name":"phones"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EmailToImport"}},"id":2,"name":"emails"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"empty"},{"type":"rpc","content":{ +"name":"GetContacts", +"header":87, +"response":{"type":"anonymous","header":88, "doc":[ +"Current contact list",{"type":"reference","argument":"users","category":"hidden","description":" User list if list is changed"},{"type":"reference","argument":"isNotChanged","category":"full","description":" is list changed"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":"bool","id":2,"name":"isNotChanged"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"userPeers"} +]}, +"doc":[ +"Getting current contact list","SHA256 hash of list of a comma-separated list of contact UIDs in ascending","order may be passed in contactsHash parameter.","If the contact list was not changed, isNotChanged will be true.",{"type":"reference","argument":"contactsHash","category":"full","description":"Hash of saved list in application"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":"string","id":1,"name":"contactsHash"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"RemoveContact", +"header":89, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Removing contact from contact list",{"type":"reference","argument":"uid","category":"full","description":"Contact's UID"},{"type":"reference","argument":"accessHash","category":"danger","description":"Contact's AccessHash"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"AddContact", +"header":114, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Adding contact to contact list",{"type":"reference","argument":"uid","category":"full","description":"Contact's UID"},{"type":"reference","argument":"accessHash","category":"danger","description":"Contact's AccessHash"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"SearchContacts", +"header":112, +"response":{"type":"anonymous","header":113, "doc":[ +"Founded users",{"type":"reference","argument":"users","category":"compact","description":" Founded users"},{"type":"reference","argument":"userPeers","category":"compact","description":" Founded users peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":2,"name":"userPeers"} +]}, +"doc":[ +"Searching contacts by user's query",{"type":"reference","argument":"request","category":"full","description":"Search query"}],"attributes":[ +{"type":"string","id":1,"name":"request"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"empty"},{"type":"update","content":{ +"name":"ContactRegistered", +"header":5, +"doc":[ +"Update about contact registration",{"type":"reference","argument":"uid","category":"full","description":" contact's uid"},{"type":"reference","argument":"isSilent","category":"full","description":" is registration silent. If this value is true then don't show notification about registration"},{"type":"reference","argument":"date","category":"full","description":" date of registration"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"bool","id":2,"name":"isSilent"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +]}},{"type":"update","content":{ +"name":"ContactsAdded", +"header":40, +"doc":[ +"Update about contacts added",{"type":"reference","argument":"uids","category":"compact","description":" added contacts"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"uids"} +]}},{"type":"update","content":{ +"name":"ContactsRemoved", +"header":41, +"doc":[ +"Update about contacts removed",{"type":"reference","argument":"uids","category":"compact","description":" removed contacts"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"uids"} +]}}]}, { + "title": "Privacy", + "package": "privacy", + "items": [ +{"type":"rpc","content":{ +"name":"BlockUser", +"header":2636, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Block User",{"type":"reference","argument":"peer","category":"full","description":"Peer for blocking"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"UnblockUser", +"header":2637, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Unblock User",{"type":"reference","argument":"peer","category":"full","description":"Peer for unblocking"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"LoadBlockedUsers", +"header":2638, +"response":{"type":"anonymous","header":2639, "doc":[ +{"type":"reference","argument":"userPeers","category":"full","description":" Blocked user peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"userPeers"} +]}, +"doc":[ +"Load Blocked Users"],"attributes":[ +]}},{"type":"update","content":{ +"name":"UserBlocked", +"header":2629, +"doc":[ +"Update about User Blocked",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +]}},{"type":"update","content":{ +"name":"UserUnblocked", +"header":2630, +"doc":[ +"Update about User Unblocked",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +]}}]}, { + "title": "Messaging", + "package": "messaging", + "doc": [ + "Actor can work with encrypted and plain messages in one conversation. For both types of messages API", + "contains a bit different methods. Also encrypted and plain messages have different schemes.", + "

    Messages

    ", + "Message entity contains:", + "
      ", + "
    • PeerType - group chat or private
    • ", + "
    • PeerId - group or user id of conversation
    • ", + "
    • RandomId - unique id of message that generated by sender. In Encrypted messages random id is encrypted.
    • ", + "
    • Date - date of message (calculated on server)
    • ", + "
    • Content
    • ", + "
    ", + "

    Message content

    ", + "Message can be one of three basic types of messages: Text Message, File Message and Service message.", + "All messages can contain extensions. For example we can send text message and add markdown extension with", + "formatted text in markdown and clients that support this extension will show markdown, and that clients that", + "not supported extension then show simple text. File messages can have photo, video or voice extensions.", + "Service message can have extensions extensions such as \"user added\", \"group created\", \"avatar changed\", etc.", + "

    Send messages

    ", + "Sending messages looks same for encrypted and plain messages. Client MUST prepare all required data", + "before sending message (for example FastThumb for photo/video/documents) and call required methods.", + "Encrypted messages differs here only by a little different scheme and encryption.", + "

    WRONG_KEYS and incorrect keys

    ", + "For sending encrypted messages client MUST send messages encrypted for all own and receivers keys.", + "If client send encryption with missing, old or incorrect keys it will receive WRONG_KEYS.", + "In WRONG_KEYS you need to deserialize relatedData from RpcError to WrongKeysErrorData", + "and get detailed information about keys. Sometimes there are some broken keys on server and client can't", + "encrypt messages with it than client MUST send empty encrypted key in request elsewhere API return WRONG_KEYS.", + "

    Encrypted messages and New Devices

    ", + "When you send message to someone and when he registered with new device there are no way to receive old encrypted", + "messages on new device and because of this there are a problem about read/delivery statuses.", + "Alice send messages to Bob, but Bob lose his device and buy new iPhone and installed Actor.", + "Alice receive notification about new device and send another message. Bob open chat with Alice and", + "send read status with maximum message read date. Alice will mark all sent messages as read and one that", + "was not delivered. We can use status notifications per message, but in VERY heavy conversations it will be", + "a lot of unnecessary traffic. For resolving this small issue we have different ways of message statuses", + "for encrypted and plain messages. Also it is recomended to mark all undelivered messages on new device update as", + "not devered with warring sign.", + "

    Message Read and Delivery

    ", + "There are two different ways for read and delivery statuses for encrypted and plain messages.", + "For encrypted messages used status change by RandomId and for plain messages used by maximum", + "date of read/delivered message." + ], + "items": [ + { + "type":"struct", + "content": { + "name":"MessageAttributes", +"doc":[ +"Message Attributes",{"type":"reference","argument":"isMentioned","category":"full","description":" Is mentioned. If set overrides built-in value."},{"type":"reference","argument":"isHighlighted","category":"full","description":" Is message highlighted. Default is false."},{"type":"reference","argument":"isNotified","category":"full","description":" Is notified. If set overrides built-in settings."},{"type":"reference","argument":"isOnlyForYou","category":"full","description":" If this message is only for you. Default is false"}],"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"isMentioned"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isHighlighted"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isNotified"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isOnlyForYou"} +]}}, { + "type":"struct", + "content": { + "name":"QuotedMessage", +"doc":[ +"Quoted Message",{"type":"reference","argument":"messageId","category":"full","description":" Message Id if present"},{"type":"reference","argument":"publicGroupId","category":"full","description":" Public Group id if present"},{"type":"reference","argument":"senderUserId","category":"full","description":" Sender of message"},{"type":"reference","argument":"messageDate","category":"full","description":" Date of message"},{"type":"reference","argument":"quotedMessageContent","category":"full","description":" Optional Quoted Message Content. Can be empty if messageId is present and message is in current peer."}],"attributes":[ +{"type":{"type":"opt","childType":{"type":"alias","childType":"randomId"}},"id":1,"name":"messageId"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"groupId"}},"id":2,"name":"publicGroupId"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"senderUserId"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"messageDate"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"Message"}},"id":5,"name":"quotedMessageContent"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"Message","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"TextMessage", +"doc":[ +"Text message",{"type":"reference","argument":"text","category":"danger","description":" the text"},{"type":"reference","argument":"mentions","category":"full","description":" User mentions in message"},{"type":"reference","argument":"ext","category":"full","description":" Optional bytes of extension"}],"trait":{"name":"Message","key":1},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"text"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"mentions"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"TextMessageEx"}},"id":3,"name":"ext"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"TextMessageEx","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"TextExMarkdown", +"doc":[ +"Markdown extension",{"type":"reference","argument":"markdown","category":"full","description":" Markdown text"}],"trait":{"name":"TextMessageEx","key":1},"expandable":"true","attributes":[ +{"type":"string","id":2,"name":"markdown"} +]}}, { + "type":"struct", + "content": { + "name":"TextModernMessage", +"doc":[ +"Modern text message",{"type":"reference","argument":"text","category":"full","description":" optional text of message"},{"type":"reference","argument":"senderNameOverride","category":"full","description":" optional overriding of sender"},{"type":"reference","argument":"senderPhotoOverride","category":"full","description":" optional overriding sender's photo"},{"type":"reference","argument":"style","category":"full","description":" optional paragraph style"},{"type":"reference","argument":"attaches","category":"full","description":" optional Attaches of message"}],"trait":{"name":"TextMessageEx","key":2},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"text"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"senderNameOverride"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":3,"name":"senderPhotoOverride"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ParagraphStyle"}},"id":4,"name":"style"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"TextModernAttach"}},"id":5,"name":"attaches"} +]}}, { + "type":"struct", + "content": { + "name":"ParagraphStyle", +"doc":[ +"Paragraph style",{"type":"reference","argument":"showParagraph","category":"full","description":" Show quote-like paragraph?"},{"type":"reference","argument":"paragraphColor","category":"full","description":" Override paragraph color"},{"type":"reference","argument":"bgColor","category":"full","description":" Override background color"}],"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"showParagraph"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"Color"}},"id":2,"name":"paragraphColor"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"Color"}},"id":3,"name":"bgColor"} +]}}, { + "type":"struct", + "content": { + "name":"TextModernAttach", +"doc":[ +"Attaches to message",{"type":"reference","argument":"title","category":"full","description":" Attach of message"},{"type":"reference","argument":"titleUrl","category":"full","description":" Attach title url"},{"type":"reference","argument":"titleIcon","category":"full","description":" Attach title icon"},{"type":"reference","argument":"text","category":"full","description":" Attach text"},{"type":"reference","argument":"style","category":"full","description":" Attach style"}],"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"title"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"titleUrl"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":3,"name":"titleIcon"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"text"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ParagraphStyle"}},"id":5,"name":"style"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"TextModernField"}},"id":6,"name":"fields"} +]}}, { + "type":"struct", + "content": { + "name":"TextModernField", +"doc":[ +"Modern message fields",{"type":"reference","argument":"title","category":"full","description":" Field title"},{"type":"reference","argument":"value","category":"full","description":" Field value"},{"type":"reference","argument":"isShort","category":"full","description":" Is field can be shown in compact way (default is TRUE)"}],"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"title"} +,{"type":"string","id":2,"name":"value"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isShort"} +]}}, { + "type":"struct", + "content": { + "name":"TextCommand", +"doc":[ +"Text Command Message for bots",{"type":"reference","argument":"command","category":"full","description":" Slash-Command For execution"},{"type":"reference","argument":"args","category":"full","description":" Arguments of slash command"}],"trait":{"name":"TextMessageEx","key":3},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"command"} +,{"type":"string","id":2,"name":"args"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceMessage", +"doc":[ +"Service message",{"type":"reference","argument":"text","category":"full","description":" service message text"},{"type":"reference","argument":"ext","category":"compact","description":" Extension"}],"trait":{"name":"Message","key":2},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"text"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"ServiceEx"}},"id":3,"name":"ext"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"ServiceEx","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserInvited", +"doc":[ +"Service message about adding user to group",{"type":"reference","argument":"invitedUid","category":"full","description":" added user id"}],"trait":{"name":"ServiceEx","key":1},"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"invitedUid"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserJoined", +"doc":[ +"Service message about user join to group"],"trait":{"name":"ServiceEx","key":17},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserKicked", +"doc":[ +"Service message about kicking user from group",{"type":"reference","argument":"kickedUid","category":"full","description":" kicked user id"}],"trait":{"name":"ServiceEx","key":2},"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"kickedUid"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExUserLeft", +"doc":[ +"Service message about user left group"],"trait":{"name":"ServiceEx","key":3},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExGroupCreated", +"doc":[ +"Service message about group creating"],"trait":{"name":"ServiceEx","key":4},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedTitle", +"doc":[ +"Service message about group title change",{"type":"reference","argument":"title","category":"full","description":" New group title"}],"trait":{"name":"ServiceEx","key":5},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"title"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedTopic", +"doc":[ +"Service message on group topic change",{"type":"reference","argument":"topic","category":"full","description":" New group topic"}],"trait":{"name":"ServiceEx","key":18},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"topic"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedAbout", +"doc":[ +"Service message on group about change",{"type":"reference","argument":"about","category":"full","description":" New group about"}],"trait":{"name":"ServiceEx","key":19},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"about"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChangedAvatar", +"doc":[ +"Service message about avatar change",{"type":"reference","argument":"avatar","category":"compact","description":" Updated avatar"}],"trait":{"name":"ServiceEx","key":6},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":1,"name":"avatar"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExContactRegistered", +"doc":[ +"Service message about user registration",{"type":"reference","argument":"uid","category":"full","description":" User Id"}],"trait":{"name":"ServiceEx","key":8},"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExPhoneMissed", +"doc":[ +"Update about missing phone call"],"trait":{"name":"ServiceEx","key":9},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExPhoneCall", +"doc":[ +"Update about phone call",{"type":"reference","argument":"duration","category":"full","description":" Duration of a phone call"}],"trait":{"name":"ServiceEx","key":16},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChatArchived", +"doc":[ +"Message about chat archived"],"trait":{"name":"ServiceEx","key":20},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"ServiceExChatRestored", +"doc":[ +"Message about chat restored"],"trait":{"name":"ServiceEx","key":21},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"DocumentMessage", +"doc":[ +"File message",{"type":"reference","argument":"fileId","category":"full","description":" file id"},{"type":"reference","argument":"accessHash","category":"danger","description":" file access hash"},{"type":"reference","argument":"fileSize","category":"full","description":" file size"},{"type":"reference","argument":"name","category":"full","description":" name of file"},{"type":"reference","argument":"mimeType","category":"full","description":" mimetype of file"},{"type":"reference","argument":"thumb","category":"compact","description":" optional thumb of file. JPEG less that 90x90 with 60-70 quality."},{"type":"reference","argument":"ext","category":"compact","description":" Extension"}],"trait":{"name":"Message","key":3},"expandable":"true","attributes":[ +{"type":"int64","id":1,"name":"fileId"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"int32","id":3,"name":"fileSize"} +,{"type":"string","id":4,"name":"name"} +,{"type":"string","id":5,"name":"mimeType"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"FastThumb"}},"id":6,"name":"thumb"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"DocumentEx"}},"id":8,"name":"ext"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"DocumentEx","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"DocumentExPhoto", +"doc":[ +"File photo extension. Can be set ONLY for JPEG.",{"type":"reference","argument":"w","category":"full","description":" image width"},{"type":"reference","argument":"h","category":"full","description":" image height"}],"trait":{"name":"DocumentEx","key":1},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExVideo", +"doc":[ +"File video extension",{"type":"reference","argument":"w","category":"full","description":" video width"},{"type":"reference","argument":"h","category":"full","description":" video height"},{"type":"reference","argument":"duration","category":"full","description":" video duration"}],"trait":{"name":"DocumentEx","key":2},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"int32","id":3,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExVoice", +"doc":[ +"File voice extension",{"type":"reference","argument":"duration","category":"full","description":" voice duration"}],"trait":{"name":"DocumentEx","key":3},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExAnimation", +"doc":[ +"Animation extension. Can be set ONLY for GIF.",{"type":"reference","argument":"w","category":"full","description":" Animation width"},{"type":"reference","argument":"h","category":"full","description":" Animation height"}],"trait":{"name":"DocumentEx","key":6},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +]}}, { + "type":"struct", + "content": { + "name":"DocumentExAnimationVid", +"doc":[ +"Animation video extension. More compact version of Animation with video codec instead of GIF.","Can be set ONLY for MP4.",{"type":"reference","argument":"w","category":"full","description":" Animation width"},{"type":"reference","argument":"h","category":"full","description":" Animation height"},{"type":"reference","argument":"duration","category":"full","description":" Animation duration"}],"trait":{"name":"DocumentEx","key":7},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"int32","id":3,"name":"duration"} +]}}, { + "type":"struct", + "content": { + "name":"JsonMessage", +"doc":[ +"Custom-data JsonMessage",{"type":"reference","argument":"rawJson","category":"danger","description":" JSON object"}],"trait":{"name":"Message","key":4},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"rawJson"} +]}}, { + "type":"struct", + "content": { + "name":"UnsupportedMessage", +"doc":[ +"Explicit type for unsupported message"],"trait":{"name":"Message","key":5},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"StickerMessage", +"doc":[ +"Sticker message",{"type":"reference","argument":"stickerId","category":"full","description":" Optional Unique ID of sticker"},{"type":"reference","argument":"fastPreview","category":"full","description":" Optional Fast preview of sticker in webp format"},{"type":"reference","argument":"image512","category":"full","description":" Optional 512x512 sticker image in webp format"},{"type":"reference","argument":"image256","category":"full","description":" Optional 256x256 sticker image in webp format"},{"type":"reference","argument":"stickerCollectionId","category":"full","description":" Optional Collection ID"},{"type":"reference","argument":"stickerCollectionAccessHash","category":"full","description":" Optional Collection Access Hash"}],"trait":{"name":"Message","key":6},"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"int32"},"id":1,"name":"stickerId"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"fastPreview"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":3,"name":"image512"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":4,"name":"image256"} +,{"type":{"type":"opt","childType":"int32"},"id":5,"name":"stickerCollectionId"} +,{"type":{"type":"opt","childType":"int64"},"id":6,"name":"stickerCollectionAccessHash"} +]}}, { + "type":"struct", + "content": { + "name":"BinaryMessage", +"doc":[ +"Binary Message. Useful for implementing your own content types",{"type":"reference","argument":"contentTag","category":"full","description":" Content Tag"},{"type":"reference","argument":"msg","category":"compact","description":" Message contents"}],"trait":{"name":"Message","key":7},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"contentTag"} +,{"type":"bytes","id":2,"name":"msg"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptedMessage", +"doc":[ +"Encrypted Message",{"type":"reference","argument":"box","category":"full","description":" Encrypted box"}],"trait":{"name":"Message","key":8},"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"EncryptedBox"},"id":1,"name":"box"} +]}}, { + "type":"struct", + "content": { + "name":"EmptyMessage", +"doc":[ +"Empty Message"],"trait":{"name":"Message","key":9},"expandable":"true","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"DialogShort", +"doc":[ +"Short Dialog from grouped conversation list",{"type":"reference","argument":"peer","category":"full","description":" Peer of conversation"},{"type":"reference","argument":"counter","category":"full","description":" Conversation unread count"},{"type":"reference","argument":"date","category":"full","description":" Conversation top message date"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":"int32","id":2,"name":"counter"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}}, { + "type":"struct", + "content": { + "name":"DialogGroup", +"doc":[ +"Grouped dialog list",{"type":"reference","argument":"title","category":"full","description":" Title of group"},{"type":"reference","argument":"key","category":"full","description":" Key of group"},{"type":"reference","argument":"dialogs","category":"full","description":" Conversations in group"}],"attributes":[ +{"type":"string","id":1,"name":"title"} +,{"type":"string","id":2,"name":"key"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"DialogShort"}},"id":3,"name":"dialogs"} +]}}, { + "type":"struct", + "content": { + "name":"MessageReaction", +"doc":[ +"Reaction to message",{"type":"reference","argument":"users","category":"full","description":" User's reaction"},{"type":"reference","argument":"code","category":"full","description":" Reaction EMOJI code"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":1,"name":"users"} +,{"type":"string","id":2,"name":"code"} +]}}, { + "type":"struct", + "content": { + "name":"MessageOutReference", +"doc":[ +"Message Out Reference",{"type":"reference","argument":"peer","category":"full","description":" Out Peer of message"},{"type":"reference","argument":"rid","category":"full","description":" Message random id"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +]}},{"type":"rpc","content":{ +"name":"SendMessage", +"header":92, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Sending plain message",{"type":"reference","argument":"peer","category":"full","description":"Destination peer for message"},{"type":"reference","argument":"rid","category":"full","description":"Message random id (generated on client side)"},{"type":"reference","argument":"message","category":"full","description":"The message"},{"type":"reference","argument":"isOnlyForUser","category":"full","description":"If message is shown only for specific user"},{"type":"reference","argument":"quotedMessageReference","category":"full","description":"Quoted message if present"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":4,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":5,"name":"isOnlyForUser"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageOutReference"}},"id":6,"name":"quotedMessageReference"} +]}},{"type":"rpc","content":{ +"name":"UpdateMessage", +"header":2658, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Changing Message content",{"type":"reference","argument":"peer","category":"full","description":"Destination Peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"updatedMessage","category":"full","description":"Updated Message content"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":3,"name":"updatedMessage"} +]}},{"type":"rpc","content":{ +"name":"MessageReceived", +"header":55, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Confirmation of plain message receive by device",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"date","category":"full","description":"Maximum date of received messages"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"rpc","content":{ +"name":"MessageRead", +"header":57, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Marking plain messages as read",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"date","category":"full","description":"Maximum date of read messages"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"rpc","content":{ +"name":"DeleteMessage", +"header":98, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Deleting messages",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rids","category":"full","description":"Message random id"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":3,"name":"rids"} +]}},{"type":"rpc","content":{ +"name":"ClearChat", +"header":99, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Clearing of conversation (without removing dialog from dialogs list)",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"DeleteChat", +"header":100, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Deleting of conversation (also leave group for group conversations)",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"ArchiveChat", +"header":2654, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Archiving chat",{"type":"reference","argument":"peer","category":"full","description":"Conversation peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"MessageSetReaction", +"header":210, +"response":{"type":"reference","name":"ReactionsResponse"}, +"doc":[ +"Setting Message reaction",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"code","category":"full","description":"Reaction code"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":"string","id":3,"name":"code"} +]}},{"type":"rpc","content":{ +"name":"MessageRemoveReaction", +"header":220, +"response":{"type":"reference","name":"ReactionsResponse"}, +"doc":[ +"Removing Message reaction",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"rid","category":"full","description":"Message random id"},{"type":"reference","argument":"code","category":"full","description":"Reaction code"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":"string","id":3,"name":"code"} +]}},{"type":"response","content":{ +"name":"ReactionsResponse", +"header":219, +"doc":[ +"Response for reactions change"],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":3,"name":"reactions"} +]}},{"type":"update","content":{ +"name":"Message", +"header":55, +"doc":[ +"Update about plain message",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"senderUid","category":"full","description":" Sender of message"},{"type":"reference","argument":"date","category":"full","description":" date of message"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"message","category":"full","description":" message content"},{"type":"reference","argument":"attributes","category":"full","description":" optional message attributes"},{"type":"reference","argument":"quotedMessage","category":"full","description":" optional quoted message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"senderUid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":6,"name":"attributes"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":7,"name":"quotedMessage"} +]}},{"type":"update","content":{ +"name":"MessageContentChanged", +"header":162, +"doc":[ +"Update about message change",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"message","category":"full","description":" Message content"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"trait","childType":"Message"},"id":3,"name":"message"} +]}},{"type":"update","content":{ +"name":"MessageQuotedChanged", +"header":169, +"doc":[ +"Update about quoted message changed",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"quotedMessage","category":"full","description":" Quoted Message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":3,"name":"quotedMessage"} +]}},{"type":"update","content":{ +"name":"MessageDateChanged", +"header":163, +"doc":[ +"Update about message date changed",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"update","content":{ +"name":"MessageSent", +"header":4, +"doc":[ +"Update about message sent",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Rid of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"update","content":{ +"name":"MessageReceived", +"header":54, +"doc":[ +"Update about message received",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of received message"},{"type":"reference","argument":"receivedDate","category":"full","description":" Date of receive"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"receivedDate"} +]}},{"type":"update","content":{ +"name":"MessageRead", +"header":19, +"doc":[ +"Update about message read",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of read message"},{"type":"reference","argument":"readDate","category":"full","description":" Date of read"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"readDate"} +]}},{"type":"update","content":{ +"name":"MessageReadByMe", +"header":50, +"doc":[ +"Update about message read by me",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"startDate","category":"full","description":" Start date of read message"},{"type":"reference","argument":"unreadCounter","category":"full","description":" Optional unread counter in conversation"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"startDate"} +,{"type":{"type":"opt","childType":"int32"},"id":3,"name":"unreadCounter"} +]}},{"type":"update","content":{ +"name":"MessageDelete", +"header":46, +"doc":[ +"Update about message delete",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rids","category":"full","description":" Deleted messages"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"rids"} +]}},{"type":"update","content":{ +"name":"ChatClear", +"header":47, +"doc":[ +"Update about chat clear",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatDelete", +"header":48, +"doc":[ +"Update about chat delete",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatArchive", +"header":94, +"doc":[ +"Update about chat archive",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatDropCache", +"header":2690, +"doc":[ +"Update about cache drop",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +]}},{"type":"update","content":{ +"name":"ChatGroupsChanged", +"header":1, +"doc":[ +"Update about chat groups changed. Called only when adding, removing and reordering of grouped dialog.",{"type":"reference","argument":"dialogs","category":"compact","description":" New dialgos list"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":1,"name":"dialogs"} +]}},{"type":"update","content":{ +"name":"ReactionsUpdate", +"header":222, +"doc":[ +"Update about reactions change",{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"rid","category":"full","description":" Message random id"},{"type":"reference","argument":"reactions","category":"full","description":" New Reactions"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":3,"name":"reactions"} +]}}, { + "type": "enum", + "content": { + "name": "MessageState", + "values": [ + { + "name": "Sent", + "id": 1 + }, + { + "name": "Received", + "id": 2 + }, + { + "name": "Read", + "id": 3 } - }, - "id": 1, - "name": "users" - }, { - "type": "bool", - "id": 2, - "name": "isNotChanged" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" + ] + } + }, { + "type":"struct", + "content": { + "name":"MessageContainer", +"doc":[ +"Message from history",{"type":"reference","argument":"senderUid","category":"full","description":" Sender of mesasge"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of message"},{"type":"reference","argument":"date","category":"full","description":" Date of message"},{"type":"reference","argument":"message","category":"full","description":" Content of message"},{"type":"reference","argument":"reactions","category":"full","description":" Message reactions"},{"type":"reference","argument":"attribute","category":"full","description":" Optional message attributes"},{"type":"reference","argument":"quotedMessage","category":"full","description":" Optional quoted Message"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"senderUid"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"MessageState"}},"id":6,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageReaction"}},"id":7,"name":"reactions"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":8,"name":"attribute"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"QuotedMessage"}},"id":9,"name":"quotedMessage"} +]}}, { + "type": "enum", + "content": { + "name": "ListLoadMode", + "values": [ + { + "name": "Forward", + "id": 1 + }, + { + "name": "Backward", + "id": 2 + }, + { + "name": "Both", + "id": 3 } - }, - "id": 3, - "name": "userPeers" - }] - }, - "doc": [ - "Getting current contact list", "SHA256 hash of list of a comma-separated list of contact UIDs in ascending", "order may be passed in contactsHash parameter.", "If the contact list was not changed, isNotChanged will be true.", { - "type": "reference", - "argument": "contactsHash", - "category": "full", - "description": "Hash of saved list in application" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "contactsHash" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RemoveContact", - "header": 89, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Removing contact from contact list", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": "Contact's UID" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": "Contact's AccessHash" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "rpc", - "content": { - "name": "AddContact", - "header": 114, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Adding contact to contact list", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": "Contact's UID" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": "Contact's AccessHash" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SearchContacts", - "header": 112, - "response": { - "type": "anonymous", - "header": 113, - "doc": [ - "Founded users", { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Founded users" - }, { - "type": "reference", - "argument": "userPeers", - "category": "compact", - "description": " Founded users peers" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" + ] + } + },{"type":"rpc","content":{ +"name":"LoadHistory", +"header":118, +"response":{"type":"anonymous","header":119, "doc":[ +"Loaded history",{"type":"reference","argument":"history","category":"compact","description":" Messages"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":1,"name":"history"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupPeers"} +]}, +"doc":[ +"Loading history of chat",{"type":"reference","argument":"peer","category":"full","description":"Peer of conversation"},{"type":"reference","argument":"date","category":"full","description":"start date of messages for loading or 0 for loading from start"},{"type":"reference","argument":"loadMode","category":"full","description":"Loading mode: Forward loading, backward or both ways"},{"type":"reference","argument":"limit","category":"full","description":"maximum amount of messages (max is 100)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"ListLoadMode"}},"id":5,"name":"loadMode"} +,{"type":"int32","id":4,"name":"limit"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":6,"name":"optimizations"} +]}}, { + "type":"struct", + "content": { + "name":"Dialog", +"doc":[ +"Conversation from history",{"type":"reference","argument":"peer","category":"full","description":" Peer of conversation"},{"type":"reference","argument":"unreadCount","category":"full","description":" plain messages unread messages count"},{"type":"reference","argument":"sortDate","category":"full","description":" date of conversation for sorting"},{"type":"reference","argument":"senderUid","category":"full","description":" Sender of top message (may be zero)"},{"type":"reference","argument":"rid","category":"full","description":" Random ID of top message (may be zero)"},{"type":"reference","argument":"date","category":"full","description":" Date of top message (can't be zero)"},{"type":"reference","argument":"message","category":"full","description":" Content of message"},{"type":"reference","argument":"firstUnreadDate","category":"full","description":" Date of first unread message"},{"type":"reference","argument":"attributes","category":"full","description":" Optional top message attributes"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":"int32","id":3,"name":"unreadCount"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"sortDate"} +,{"type":{"type":"alias","childType":"userId"},"id":5,"name":"senderUid"} +,{"type":{"type":"alias","childType":"randomId"},"id":6,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":7,"name":"date"} +,{"type":{"type":"trait","childType":"Message"},"id":8,"name":"message"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"MessageState"}},"id":9,"name":"state"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"date"}},"id":10,"name":"firstUnreadDate"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MessageAttributes"}},"id":11,"name":"attributes"} +]}},{"type":"rpc","content":{ +"name":"LoadDialogs", +"header":104, +"response":{"type":"anonymous","header":105, "doc":[ +"Loaded dialogs",{"type":"reference","argument":"groups","category":"compact","description":" Loaded groups"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"dialogs","category":"compact","description":" Loaded dialogs"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Dialog"}},"id":3,"name":"dialogs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":5,"name":"groupPeers"} +]}, +"doc":[ +"Loading conversation history",{"type":"reference","argument":"minDate","category":"full","description":"start date of conversation loading. Use 0 to load latest messages"},{"type":"reference","argument":"limit","category":"full","description":"limit maximum amount of messages (max is 100)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"alias","childType":"date"},"id":1,"name":"minDate"} +,{"type":"int32","id":2,"name":"limit"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LoadArchived", +"header":2651, +"response":{"type":"anonymous","header":2652, "doc":[ +"Archived dialogs",{"type":"reference","argument":"groups","category":"full","description":" Referenced groups"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"dialogs","category":"full","description":" Archived dialogs"},{"type":"reference","argument":"nextOffset","category":"compact","description":" Offset for next bunch"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Dialog"}},"id":3,"name":"dialogs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupPeers"} +,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"nextOffset"} +]}, +"doc":[ +"Loading archived messages",{"type":"reference","argument":"nextOffset","category":"compact","description":"Optional next offset"},{"type":"reference","argument":"limit","category":"full","description":"Maximum number of elements"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"opt","childType":"bytes"},"id":1,"name":"nextOffset"} +,{"type":"int32","id":2,"name":"limit"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LoadGroupedDialogs", +"header":225, +"response":{"type":"anonymous","header":226, "doc":[ +"Loaded grouped dialogs",{"type":"reference","argument":"dialogs","category":"compact","description":" Loaded groups of dialogs"},{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"groups","category":"full","description":" Loaded groups"},{"type":"reference","argument":"showArchived","category":"full","description":" Show archived section"},{"type":"reference","argument":"showInvite","category":"full","description":" Show invite message"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":1,"name":"dialogs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"showArchived"} +,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"showInvite"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":6,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":7,"name":"groupPeers"} +]}, +"doc":[ +"Load all dialogs from grouped list"],"attributes":[ +{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":1,"name":"optimizations"} +]}},{"type":"response","content":{ +"name":"DialogsOrder", +"header":235, +"doc":[ +"Dialogs order response",{"type":"reference","argument":"seq","category":"full","description":" update seq"},{"type":"reference","argument":"state","category":"full","description":" update state"},{"type":"reference","argument":"groups","category":"full","description":" Update groups"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"DialogGroup"}},"id":3,"name":"groups"} +]}},{"type":"rpc","content":{ +"name":"HideDialog", +"header":231, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Hide Dialog from grouped list",{"type":"reference","argument":"peer","category":"full","description":"Dialog peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"ShowDialog", +"header":232, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Show Dialog in grouped list"],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"FavouriteDialog", +"header":224, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Marking dialog as favourite",{"type":"reference","argument":"peer","category":"full","description":"Peer for favouriting"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"UnfavouriteDialog", +"header":227, +"response":{"type":"reference","name":"DialogsOrder"}, +"doc":[ +"Making dialog as unfavourite",{"type":"reference","argument":"peer","category":"full","description":"Peer for favouriting"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"NotifyDialogOpened", +"header":2785, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Notifying about dialog open",{"type":"reference","argument":"peer","category":"full","description":"Peer that was opened"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}}]}, { + "title": "Groups", + "package": "groups", + "items": [ +{"type":"comment","content":"Entities"}, { + "type":"struct", + "content": { + "name":"Member", +"doc":[ +"Member information",{"type":"reference","argument":"uid","category":"full","description":" User id"},{"type":"reference","argument":"inviterUid","category":"full","description":" User inviter id"},{"type":"reference","argument":"date","category":"full","description":" Adding date"},{"type":"reference","argument":"isAdmin","category":"full","description":" is member admin of group"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"inviterUid"} +,{"type":"int64","id":3,"name":"date"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isAdmin"} +]}}, { + "type": "enum", + "content": { + "name": "GroupType", + "values": [ + { + "name": "GROUP", + "id": 1 + }, + { + "name": "CHANNEL", + "id": 2 } - }, - "id": 1, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" + ] + } + }, { + "type": "enum", + "content": { + "name": "GroupPermissions", + "values": [ + { + "name": "SEND_MESSAGE", + "id": 1 + }, + { + "name": "CLEAR", + "id": 2 + }, + { + "name": "LEAVE", + "id": 3 + }, + { + "name": "DELETE", + "id": 4 + }, + { + "name": "JOIN", + "id": 5 + }, + { + "name": "VIEW_INFO", + "id": 6 } - }, - "id": 2, - "name": "userPeers" - }] - }, - "doc": [ - "Searching contacts by user's query", { - "type": "reference", - "argument": "request", - "category": "full", - "description": "Search query" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "request" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - }] - } - }, { - "type": "empty" - }, { - "type": "update", - "content": { - "name": "ContactRegistered", - "header": 5, - "doc": [ - "Update about contact registration", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " contact's uid" - }, { - "type": "reference", - "argument": "isSilent", - "category": "full", - "description": " is registration silent. If this value is true then don't show notification about registration" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " date of registration" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": "bool", - "id": 2, - "name": "isSilent" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }] - } - }, { - "type": "update", - "content": { - "name": "ContactsAdded", - "header": 40, - "doc": [ - "Update about contacts added", { - "type": "reference", - "argument": "uids", - "category": "compact", - "description": " added contacts" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 1, - "name": "uids" - }] - } - }, { - "type": "update", - "content": { - "name": "ContactsRemoved", - "header": 41, - "doc": [ - "Update about contacts removed", { - "type": "reference", - "argument": "uids", - "category": "compact", - "description": " removed contacts" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 1, - "name": "uids" - }] - } - }] - }, { - "title": "Privacy", - "package": "privacy", - "items": [{ - "type": "rpc", - "content": { - "name": "BlockUser", - "header": 2636, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Block User", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for blocking" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnblockUser", - "header": 2637, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Unblock User", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for unblocking" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadBlockedUsers", - "header": 2638, - "response": { - "type": "anonymous", - "header": 2639, - "doc": [{ - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Blocked user peers" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" + ] + } + }, { + "type": "enum", + "content": { + "name": "GroupFullPermissions", + "values": [ + { + "name": "EDIT_INFO", + "id": 1 + }, + { + "name": "VIEW_MEMBERS", + "id": 2 + }, + { + "name": "INVITE_MEMBERS", + "id": 3 + }, + { + "name": "INVITE_VIA_LINK", + "id": 4 + }, + { + "name": "CALL", + "id": 5 + }, + { + "name": "EDIT_ADMIN_SETTINGS", + "id": 6 + }, + { + "name": "VIEW_ADMINS", + "id": 7 + }, + { + "name": "EDIT_ADMINS", + "id": 8 + }, + { + "name": "KICK_INVITED", + "id": 9 + }, + { + "name": "KICK_ANYONE", + "id": 10 + }, + { + "name": "EDIT_FOREIGN", + "id": 11 + }, + { + "name": "DELETE_FOREIGN", + "id": 12 } - }, - "id": 1, - "name": "userPeers" - }] - }, - "doc": [ - "Load Blocked Users" - ], - "attributes": [] - } - }, { - "type": "update", - "content": { - "name": "UserBlocked", - "header": 2629, - "doc": [ - "Update about User Blocked", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }] - } - }, { - "type": "update", - "content": { - "name": "UserUnblocked", - "header": 2630, - "doc": [ - "Update about User Unblocked", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }] - } - }] - }, { - "title": "Messaging", - "package": "messaging", - "doc": [ - "Actor can work with encrypted and plain messages in one conversation. For both types of messages API", - "contains a bit different methods. Also encrypted and plain messages have different schemes.", - "

    Messages

    ", - "Message entity contains:", - "
      ", - "
    • PeerType - group chat or private
    • ", - "
    • PeerId - group or user id of conversation
    • ", - "
    • RandomId - unique id of message that generated by sender. In Encrypted messages random id is encrypted.
    • ", - "
    • Date - date of message (calculated on server)
    • ", - "
    • Content
    • ", - "
    ", - "

    Message content

    ", - "Message can be one of three basic types of messages: Text Message, File Message and Service message.", - "All messages can contain extensions. For example we can send text message and add markdown extension with", - "formatted text in markdown and clients that support this extension will show markdown, and that clients that", - "not supported extension then show simple text. File messages can have photo, video or voice extensions.", - "Service message can have extensions extensions such as \"user added\", \"group created\", \"avatar changed\", etc.", - "

    Send messages

    ", - "Sending messages looks same for encrypted and plain messages. Client MUST prepare all required data", - "before sending message (for example FastThumb for photo/video/documents) and call required methods.", - "Encrypted messages differs here only by a little different scheme and encryption.", - "

    WRONG_KEYS and incorrect keys

    ", - "For sending encrypted messages client MUST send messages encrypted for all own and receivers keys.", - "If client send encryption with missing, old or incorrect keys it will receive WRONG_KEYS.", - "In WRONG_KEYS you need to deserialize relatedData from RpcError to WrongKeysErrorData", - "and get detailed information about keys. Sometimes there are some broken keys on server and client can't", - "encrypt messages with it than client MUST send empty encrypted key in request elsewhere API return WRONG_KEYS.", - "

    Encrypted messages and New Devices

    ", - "When you send message to someone and when he registered with new device there are no way to receive old encrypted", - "messages on new device and because of this there are a problem about read/delivery statuses.", - "Alice send messages to Bob, but Bob lose his device and buy new iPhone and installed Actor.", - "Alice receive notification about new device and send another message. Bob open chat with Alice and", - "send read status with maximum message read date. Alice will mark all sent messages as read and one that", - "was not delivered. We can use status notifications per message, but in VERY heavy conversations it will be", - "a lot of unnecessary traffic. For resolving this small issue we have different ways of message statuses", - "for encrypted and plain messages. Also it is recomended to mark all undelivered messages on new device update as", - "not devered with warring sign.", - "

    Message Read and Delivery

    ", - "There are two different ways for read and delivery statuses for encrypted and plain messages.", - "For encrypted messages used status change by RandomId and for plain messages used by maximum", - "date of read/delivered message." - ], - "items": [{ - "type": "struct", - "content": { - "name": "MessageAttributes", - "doc": [ - "Message Attributes", { - "type": "reference", - "argument": "isMentioned", - "category": "full", - "description": " Is mentioned. If set overrides built-in value." - }, { - "type": "reference", - "argument": "isHighlighted", - "category": "full", - "description": " Is message highlighted. Default is false." - }, { - "type": "reference", - "argument": "isNotified", - "category": "full", - "description": " Is notified. If set overrides built-in settings." - }, { - "type": "reference", - "argument": "isOnlyForYou", - "category": "full", - "description": " If this message is only for you. Default is false" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "isMentioned" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isHighlighted" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isNotified" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "isOnlyForYou" - }] - } - }, { - "type": "struct", - "content": { - "name": "QuotedMessage", - "doc": [ - "Quoted Message", { - "type": "reference", - "argument": "messageId", - "category": "full", - "description": " Message Id if present" - }, { - "type": "reference", - "argument": "publicGroupId", - "category": "full", - "description": " Public Group id if present" - }, { - "type": "reference", - "argument": "senderUserId", - "category": "full", - "description": " Sender of message" - }, { - "type": "reference", - "argument": "messageDate", - "category": "full", - "description": " Date of message" - }, { - "type": "reference", - "argument": "quotedMessageContent", - "category": "full", - "description": " Optional Quoted Message Content. Can be empty if messageId is present and message is in current peer." - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 1, - "name": "messageId" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "groupId" - } - }, - "id": 2, - "name": "publicGroupId" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "senderUserId" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "messageDate" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "Message" - } - }, - "id": 5, - "name": "quotedMessageContent" - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "Message", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "TextMessage", - "doc": [ - "Text message", { - "type": "reference", - "argument": "text", - "category": "danger", - "description": " the text" - }, { - "type": "reference", - "argument": "mentions", - "category": "full", - "description": " User mentions in message" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Optional bytes of extension" - } - ], - "trait": { - "name": "Message", - "key": 1 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "text" - }, { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "mentions" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "TextMessageEx" - } - }, - "id": 3, - "name": "ext" - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "TextMessageEx", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "TextExMarkdown", - "doc": [ - "Markdown extension", { - "type": "reference", - "argument": "markdown", - "category": "full", - "description": " Markdown text" - } - ], - "trait": { - "name": "TextMessageEx", - "key": 1 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 2, - "name": "markdown" - }] - } - }, { - "type": "struct", - "content": { - "name": "TextModernMessage", - "doc": [ - "Modern text message", { - "type": "reference", - "argument": "text", - "category": "full", - "description": " optional text of message" - }, { - "type": "reference", - "argument": "senderNameOverride", - "category": "full", - "description": " optional overriding of sender" - }, { - "type": "reference", - "argument": "senderPhotoOverride", - "category": "full", - "description": " optional overriding sender's photo" - }, { - "type": "reference", - "argument": "style", - "category": "full", - "description": " optional paragraph style" - }, { - "type": "reference", - "argument": "attaches", - "category": "full", - "description": " optional Attaches of message" - } - ], - "trait": { - "name": "TextMessageEx", - "key": 2 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "text" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "senderNameOverride" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 3, - "name": "senderPhotoOverride" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ParagraphStyle" - } - }, - "id": 4, - "name": "style" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "TextModernAttach" - } - }, - "id": 5, - "name": "attaches" - }] - } - }, { - "type": "struct", - "content": { - "name": "ParagraphStyle", - "doc": [ - "Paragraph style", { - "type": "reference", - "argument": "showParagraph", - "category": "full", - "description": " Show quote-like paragraph?" - }, { - "type": "reference", - "argument": "paragraphColor", - "category": "full", - "description": " Override paragraph color" - }, { - "type": "reference", - "argument": "bgColor", - "category": "full", - "description": " Override background color" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "showParagraph" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "Color" - } - }, - "id": 2, - "name": "paragraphColor" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "Color" - } - }, - "id": 3, - "name": "bgColor" - }] - } - }, { - "type": "struct", - "content": { - "name": "TextModernAttach", - "doc": [ - "Attaches to message", { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Attach of message" - }, { - "type": "reference", - "argument": "titleUrl", - "category": "full", - "description": " Attach title url" - }, { - "type": "reference", - "argument": "titleIcon", - "category": "full", - "description": " Attach title icon" - }, { - "type": "reference", - "argument": "text", - "category": "full", - "description": " Attach text" - }, { - "type": "reference", - "argument": "style", - "category": "full", - "description": " Attach style" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "title" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "titleUrl" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 3, - "name": "titleIcon" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "text" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ParagraphStyle" - } - }, - "id": 5, - "name": "style" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "TextModernField" - } - }, - "id": 6, - "name": "fields" - }] - } - }, { - "type": "struct", - "content": { - "name": "TextModernField", - "doc": [ - "Modern message fields", { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Field title" - }, { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Field value" - }, { - "type": "reference", - "argument": "isShort", - "category": "full", - "description": " Is field can be shown in compact way (default is TRUE)" - } - ], - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "title" - }, { - "type": "string", - "id": 2, - "name": "value" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isShort" - }] - } - }, { - "type": "struct", - "content": { - "name": "TextCommand", - "doc": [ - "Text Command Message for bots", { - "type": "reference", - "argument": "command", - "category": "full", - "description": " Slash-Command For execution" - }, { - "type": "reference", - "argument": "args", - "category": "full", - "description": " Arguments of slash command" - } - ], - "trait": { - "name": "TextMessageEx", - "key": 3 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "command" - }, { - "type": "string", - "id": 2, - "name": "args" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceMessage", - "doc": [ - "Service message", { - "type": "reference", - "argument": "text", - "category": "full", - "description": " service message text" - }, { - "type": "reference", - "argument": "ext", - "category": "compact", - "description": " Extension" - } - ], - "trait": { - "name": "Message", - "key": 2 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "text" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "ServiceEx" - } - }, - "id": 3, - "name": "ext" - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "ServiceEx", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExUserInvited", - "doc": [ - "Service message about adding user to group", { - "type": "reference", - "argument": "invitedUid", - "category": "full", - "description": " added user id" - } - ], - "trait": { - "name": "ServiceEx", - "key": 1 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "invitedUid" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExUserJoined", - "doc": [ - "Service message about user join to group" - ], - "trait": { - "name": "ServiceEx", - "key": 17 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExUserKicked", - "doc": [ - "Service message about kicking user from group", { - "type": "reference", - "argument": "kickedUid", - "category": "full", - "description": " kicked user id" - } - ], - "trait": { - "name": "ServiceEx", - "key": 2 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "kickedUid" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExUserLeft", - "doc": [ - "Service message about user left group" - ], - "trait": { - "name": "ServiceEx", - "key": 3 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExGroupCreated", - "doc": [ - "Service message about group creating" - ], - "trait": { - "name": "ServiceEx", - "key": 4 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExChangedTitle", - "doc": [ - "Service message about group title change", { - "type": "reference", - "argument": "title", - "category": "full", - "description": " New group title" - } - ], - "trait": { - "name": "ServiceEx", - "key": 5 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "title" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExChangedTopic", - "doc": [ - "Service message on group topic change", { - "type": "reference", - "argument": "topic", - "category": "full", - "description": " New group topic" - } - ], - "trait": { - "name": "ServiceEx", - "key": 18 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "topic" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExChangedAbout", - "doc": [ - "Service message on group about change", { - "type": "reference", - "argument": "about", - "category": "full", - "description": " New group about" - } - ], - "trait": { - "name": "ServiceEx", - "key": 19 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "about" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExChangedAvatar", - "doc": [ - "Service message about avatar change", { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " Updated avatar" - } - ], - "trait": { - "name": "ServiceEx", - "key": 6 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 1, - "name": "avatar" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExContactRegistered", - "doc": [ - "Service message about user registration", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User Id" - } - ], - "trait": { - "name": "ServiceEx", - "key": 8 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExPhoneMissed", - "doc": [ - "Update about missing phone call" - ], - "trait": { - "name": "ServiceEx", - "key": 9 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExPhoneCall", - "doc": [ - "Update about phone call", { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " Duration of a phone call" - } - ], - "trait": { - "name": "ServiceEx", - "key": 16 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "duration" - }] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExChatArchived", - "doc": [ - "Message about chat archived" - ], - "trait": { - "name": "ServiceEx", - "key": 20 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "ServiceExChatRestored", - "doc": [ - "Message about chat restored" - ], - "trait": { - "name": "ServiceEx", - "key": 21 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "DocumentMessage", - "doc": [ - "File message", { - "type": "reference", - "argument": "fileId", - "category": "full", - "description": " file id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " file access hash" - }, { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " file size" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " name of file" - }, { - "type": "reference", - "argument": "mimeType", - "category": "full", - "description": " mimetype of file" - }, { - "type": "reference", - "argument": "thumb", - "category": "compact", - "description": " optional thumb of file. JPEG less that 90x90 with 60-70 quality." - }, { - "type": "reference", - "argument": "ext", - "category": "compact", - "description": " Extension" - } - ], - "trait": { - "name": "Message", - "key": 3 - }, - "expandable": "true", - "attributes": [{ - "type": "int64", - "id": 1, - "name": "fileId" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": "int32", - "id": 3, - "name": "fileSize" - }, { - "type": "string", - "id": 4, - "name": "name" - }, { - "type": "string", - "id": 5, - "name": "mimeType" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "FastThumb" - } - }, - "id": 6, - "name": "thumb" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "DocumentEx" - } - }, - "id": 8, - "name": "ext" - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "DocumentEx", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "DocumentExPhoto", - "doc": [ - "File photo extension. Can be set ONLY for JPEG.", { - "type": "reference", - "argument": "w", - "category": "full", - "description": " image width" - }, { - "type": "reference", - "argument": "h", - "category": "full", - "description": " image height" - } - ], - "trait": { - "name": "DocumentEx", - "key": 1 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "w" - }, { - "type": "int32", - "id": 2, - "name": "h" - }] - } - }, { - "type": "struct", - "content": { - "name": "DocumentExVideo", - "doc": [ - "File video extension", { - "type": "reference", - "argument": "w", - "category": "full", - "description": " video width" - }, { - "type": "reference", - "argument": "h", - "category": "full", - "description": " video height" - }, { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " video duration" - } - ], - "trait": { - "name": "DocumentEx", - "key": 2 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "w" - }, { - "type": "int32", - "id": 2, - "name": "h" - }, { - "type": "int32", - "id": 3, - "name": "duration" - }] - } - }, { - "type": "struct", - "content": { - "name": "DocumentExVoice", - "doc": [ - "File voice extension", { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " voice duration" - } - ], - "trait": { - "name": "DocumentEx", - "key": 3 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "duration" - }] - } - }, { - "type": "struct", - "content": { - "name": "DocumentExAnimation", - "doc": [ - "Animation extension. Can be set ONLY for GIF.", { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Animation width" - }, { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Animation height" - } - ], - "trait": { - "name": "DocumentEx", - "key": 6 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "w" - }, { - "type": "int32", - "id": 2, - "name": "h" - }] - } - }, { - "type": "struct", - "content": { - "name": "DocumentExAnimationVid", - "doc": [ - "Animation video extension. More compact version of Animation with video codec instead of GIF.", "Can be set ONLY for MP4.", { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Animation width" - }, { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Animation height" - }, { - "type": "reference", - "argument": "duration", - "category": "full", - "description": " Animation duration" - } - ], - "trait": { - "name": "DocumentEx", - "key": 7 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "w" - }, { - "type": "int32", - "id": 2, - "name": "h" - }, { - "type": "int32", - "id": 3, - "name": "duration" - }] - } - }, { - "type": "struct", - "content": { - "name": "JsonMessage", - "doc": [ - "Custom-data JsonMessage", { - "type": "reference", - "argument": "rawJson", - "category": "danger", - "description": " JSON object" - } - ], - "trait": { - "name": "Message", - "key": 4 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "rawJson" - }] - } - }, { - "type": "struct", - "content": { - "name": "UnsupportedMessage", - "doc": [ - "Explicit type for unsupported message" - ], - "trait": { - "name": "Message", - "key": 5 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "StickerMessage", - "doc": [ - "Sticker message", { - "type": "reference", - "argument": "stickerId", - "category": "full", - "description": " Optional Unique ID of sticker" - }, { - "type": "reference", - "argument": "fastPreview", - "category": "full", - "description": " Optional Fast preview of sticker in webp format" - }, { - "type": "reference", - "argument": "image512", - "category": "full", - "description": " Optional 512x512 sticker image in webp format" - }, { - "type": "reference", - "argument": "image256", - "category": "full", - "description": " Optional 256x256 sticker image in webp format" - }, { - "type": "reference", - "argument": "stickerCollectionId", - "category": "full", - "description": " Optional Collection ID" - }, { - "type": "reference", - "argument": "stickerCollectionAccessHash", - "category": "full", - "description": " Optional Collection Access Hash" - } - ], - "trait": { - "name": "Message", - "key": 6 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 1, - "name": "stickerId" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "fastPreview" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 3, - "name": "image512" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 4, - "name": "image256" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 5, - "name": "stickerCollectionId" - }, { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 6, - "name": "stickerCollectionAccessHash" - }] - } - }, { - "type": "struct", - "content": { - "name": "BinaryMessage", - "doc": [ - "Binary Message. Useful for implementing your own content types", { - "type": "reference", - "argument": "contentTag", - "category": "full", - "description": " Content Tag" - }, { - "type": "reference", - "argument": "msg", - "category": "compact", - "description": " Message contents" - } - ], - "trait": { - "name": "Message", - "key": 7 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "contentTag" - }, { - "type": "bytes", - "id": 2, - "name": "msg" - }] - } - }, { - "type": "struct", - "content": { - "name": "EncryptedMessage", - "doc": [ - "Encrypted Message", { - "type": "reference", - "argument": "box", - "category": "full", - "description": " Encrypted box" - } - ], - "trait": { - "name": "Message", - "key": 8 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "struct", - "childType": "EncryptedBox" - }, - "id": 1, - "name": "box" - }] - } - }, { - "type": "struct", - "content": { - "name": "EmptyMessage", - "doc": [ - "Empty Message" - ], - "trait": { - "name": "Message", - "key": 9 - }, - "expandable": "true", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "DialogShort", - "doc": [ - "Short Dialog from grouped conversation list", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer of conversation" - }, { - "type": "reference", - "argument": "counter", - "category": "full", - "description": " Conversation unread count" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Conversation top message date" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": "int32", - "id": 2, - "name": "counter" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - } - }, { - "type": "struct", - "content": { - "name": "DialogGroup", - "doc": [ - "Grouped dialog list", { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Title of group" - }, { - "type": "reference", - "argument": "key", - "category": "full", - "description": " Key of group" - }, { - "type": "reference", - "argument": "dialogs", - "category": "full", - "description": " Conversations in group" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "title" - }, { - "type": "string", - "id": 2, - "name": "key" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogShort" - } - }, - "id": 3, - "name": "dialogs" - }] - } - }, { - "type": "struct", - "content": { - "name": "MessageReaction", - "doc": [ - "Reaction to message", { - "type": "reference", - "argument": "users", - "category": "full", - "description": " User's reaction" - }, { - "type": "reference", - "argument": "code", - "category": "full", - "description": " Reaction EMOJI code" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 1, - "name": "users" - }, { - "type": "string", - "id": 2, - "name": "code" - }] - } - }, { - "type": "struct", - "content": { - "name": "MessageOutReference", - "doc": [ - "Message Out Reference", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Out Peer of message" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Message random id" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SendMessage", - "header": 92, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Sending plain message", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer for message" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id (generated on client side)" - }, { - "type": "reference", - "argument": "message", - "category": "full", - "description": "The message" - }, { - "type": "reference", - "argument": "isOnlyForUser", - "category": "full", - "description": "If message is shown only for specific user" - }, { - "type": "reference", - "argument": "quotedMessageReference", - "category": "full", - "description": "Quoted message if present" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "rid" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 4, - "name": "message" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 5, - "name": "isOnlyForUser" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageOutReference" - } - }, - "id": 6, - "name": "quotedMessageReference" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UpdateMessage", - "header": 2658, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Changing Message content", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination Peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id" - }, { - "type": "reference", - "argument": "updatedMessage", - "category": "full", - "description": "Updated Message content" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 3, - "name": "updatedMessage" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MessageReceived", - "header": 55, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Confirmation of plain message receive by device", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": "Maximum date of received messages" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MessageRead", - "header": 57, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Marking plain messages as read", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": "Maximum date of read messages" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DeleteMessage", - "header": 98, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Deleting messages", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "rids", - "category": "full", - "description": "Message random id" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 3, - "name": "rids" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ClearChat", - "header": 99, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Clearing of conversation (without removing dialog from dialogs list)", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Conversation peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DeleteChat", - "header": 100, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Deleting of conversation (also leave group for group conversations)", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Conversation peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ArchiveChat", - "header": 2654, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Archiving chat", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Conversation peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MessageSetReaction", - "header": 210, - "response": { - "type": "reference", - "name": "ReactionsResponse" - }, - "doc": [ - "Setting Message reaction", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id" - }, { - "type": "reference", - "argument": "code", - "category": "full", - "description": "Reaction code" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": "string", - "id": 3, - "name": "code" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MessageRemoveReaction", - "header": 220, - "response": { - "type": "reference", - "name": "ReactionsResponse" - }, - "doc": [ - "Removing Message reaction", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Message random id" - }, { - "type": "reference", - "argument": "code", - "category": "full", - "description": "Reaction code" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": "string", - "id": 3, - "name": "code" - }] - } - }, { - "type": "response", - "content": { - "name": "ReactionsResponse", - "header": 219, - "doc": [ - "Response for reactions change" - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageReaction" - } - }, - "id": 3, - "name": "reactions" - }] - } - }, { - "type": "update", - "content": { - "name": "Message", - "header": 55, - "doc": [ - "Update about plain message", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "senderUid", - "category": "full", - "description": " Sender of message" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " date of message" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, { - "type": "reference", - "argument": "message", - "category": "full", - "description": " message content" - }, { - "type": "reference", - "argument": "attributes", - "category": "full", - "description": " optional message attributes" - }, { - "type": "reference", - "argument": "quotedMessage", - "category": "full", - "description": " optional quoted message" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "senderUid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 5, - "name": "message" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageAttributes" - } - }, - "id": 6, - "name": "attributes" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "QuotedMessage" - } - }, - "id": 7, - "name": "quotedMessage" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageContentChanged", - "header": 162, - "doc": [ - "Update about message change", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, { - "type": "reference", - "argument": "message", - "category": "full", - "description": " Message content" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 3, - "name": "message" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageQuotedChanged", - "header": 169, - "doc": [ - "Update about quoted message changed", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, { - "type": "reference", - "argument": "quotedMessage", - "category": "full", - "description": " Quoted Message" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "QuotedMessage" - } - }, - "id": 3, - "name": "quotedMessage" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageDateChanged", - "header": 163, - "doc": [ - "Update about message date changed", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of message" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageSent", - "header": 4, - "doc": [ - "Update about message sent", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of message" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of message" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageReceived", - "header": 54, - "doc": [ - "Update about message received", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "startDate", - "category": "full", - "description": " Start date of received message" - }, { - "type": "reference", - "argument": "receivedDate", - "category": "full", - "description": " Date of receive" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "startDate" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "receivedDate" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageRead", - "header": 19, - "doc": [ - "Update about message read", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "startDate", - "category": "full", - "description": " Start date of read message" - }, { - "type": "reference", - "argument": "readDate", - "category": "full", - "description": " Date of read" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "startDate" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "readDate" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageReadByMe", - "header": 50, - "doc": [ - "Update about message read by me", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "startDate", - "category": "full", - "description": " Start date of read message" - }, { - "type": "reference", - "argument": "unreadCounter", - "category": "full", - "description": " Optional unread counter in conversation" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "startDate" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 3, - "name": "unreadCounter" - }] - } - }, { - "type": "update", - "content": { - "name": "MessageDelete", - "header": 46, - "doc": [ - "Update about message delete", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "rids", - "category": "full", - "description": " Deleted messages" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 2, - "name": "rids" - }] - } - }, { - "type": "update", - "content": { - "name": "ChatClear", - "header": 47, - "doc": [ - "Update about chat clear", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "update", - "content": { - "name": "ChatDelete", - "header": 48, - "doc": [ - "Update about chat delete", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "update", - "content": { - "name": "ChatArchive", - "header": 94, - "doc": [ - "Update about chat archive", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "update", - "content": { - "name": "ChatDropCache", - "header": 2690, - "doc": [ - "Update about cache drop", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "update", - "content": { - "name": "ChatGroupsChanged", - "header": 1, - "doc": [ - "Update about chat groups changed. Called only when adding, removing and reordering of grouped dialog.", { - "type": "reference", - "argument": "dialogs", - "category": "compact", - "description": " New dialgos list" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogGroup" - } - }, - "id": 1, - "name": "dialogs" - }] - } - }, { - "type": "update", - "content": { - "name": "ReactionsUpdate", - "header": 222, - "doc": [ - "Update about reactions change", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Message random id" - }, { - "type": "reference", - "argument": "reactions", - "category": "full", - "description": " New Reactions" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageReaction" - } - }, - "id": 3, - "name": "reactions" - }] - } - }, { - "type": "enum", - "content": { - "name": "MessageState", - "values": [{ - "name": "Sent", - "id": 1 - }, { - "name": "Received", - "id": 2 - }, { - "name": "Read", - "id": 3 - }] - } - }, { - "type": "struct", - "content": { - "name": "MessageContainer", - "doc": [ - "Message from history", { - "type": "reference", - "argument": "senderUid", - "category": "full", - "description": " Sender of mesasge" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of message" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of message" - }, { - "type": "reference", - "argument": "message", - "category": "full", - "description": " Content of message" - }, { - "type": "reference", - "argument": "reactions", - "category": "full", - "description": " Message reactions" - }, { - "type": "reference", - "argument": "attribute", - "category": "full", - "description": " Optional message attributes" - }, { - "type": "reference", - "argument": "quotedMessage", - "category": "full", - "description": " Optional quoted Message" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "senderUid" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 5, - "name": "message" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "MessageState" - } - }, - "id": 6, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageReaction" - } - }, - "id": 7, - "name": "reactions" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageAttributes" - } - }, - "id": 8, - "name": "attribute" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "QuotedMessage" - } - }, - "id": 9, - "name": "quotedMessage" - }] - } - }, { - "type": "enum", - "content": { - "name": "ListLoadMode", - "values": [{ - "name": "Forward", - "id": 1 - }, { - "name": "Backward", - "id": 2 - }, { - "name": "Both", - "id": 3 - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadHistory", - "header": 118, - "response": { - "type": "anonymous", - "header": 119, - "doc": [ - "Loaded history", { - "type": "reference", - "argument": "history", - "category": "compact", - "description": " Messages" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageContainer" + ] + } + }, { + "type":"struct", + "content": { + "name":"Group", +"doc":[ +"Group information","","Permissions.","Permissions of this structure is about group messages operation, such as","ability to send messages, clear chat, leave group and so on. This operations","Can be held outside of the Group Info page.","","Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.","If default is TRUE then ONE == FALSE.","Bits:","0 - canSendMessage. Default is FALSE.","1 - canClear. Default is FALSE.","2 - canLeave. Default is FALSE.","3 - canDelete. Default is FALSE.","4 - canJoin. Default is FALSE.","5 - canViewInfo. Default is FALSE.","",{"type":"reference","argument":"id","category":"full","description":" group id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Access hash of group"},{"type":"reference","argument":"title","category":"full","description":" Title of group"},{"type":"reference","argument":"avatar","category":"compact","description":" Avatar of group"},{"type":"reference","argument":"membersCount","category":"full","description":" Number of members"},{"type":"reference","argument":"isHidden","category":"full","description":" Is group hidden (not showing it in recent list). Default is false."},{"type":"reference","argument":"isMember","category":"full","description":" Is current user a member of a group. Default is true."},{"type":"reference","argument":"groupType","category":"full","description":" Group Type. Used only for displaying information. Default is GROUP."},{"type":"reference","argument":"permissions","category":"full","description":" Permissions of group object"},{"type":"reference","argument":"isDeleted","category":"full","description":" Is this group deleted"},{"type":"reference","argument":"ext","category":"full","description":" Group extension Data"},{"type":"reference","argument":"isAdmin","category":"full","description":" [DEPRECATED] Is current user an admin of a group"},{"type":"reference","argument":"theme","category":"hidden","description":" [DEPRECATED] Theme of group"},{"type":"reference","argument":"about","category":"hidden","description":" [DEPRECATED] About of group"},{"type":"reference","argument":"creatorUid","category":"hidden","description":" [DEPRECATED] Group creator"},{"type":"reference","argument":"members","category":"compact","description":" [DEPRECATED] Members of group"},{"type":"reference","argument":"createDate","category":"full","description":" [DEPRECATED] Date of creation"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":4,"name":"avatar"} +,{"type":{"type":"opt","childType":"int32"},"id":24,"name":"membersCount"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isMember"} +,{"type":{"type":"opt","childType":"bool"},"id":20,"name":"isHidden"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"GroupType"}},"id":25,"name":"groupType"} +,{"type":{"type":"opt","childType":"int64"},"id":26,"name":"permissions"} +,{"type":{"type":"opt","childType":"bool"},"id":27,"name":"isDeleted"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":22,"name":"ext"} +,{"type":{"type":"opt","childType":"bool"},"id":16,"name":"isAdmin", "deprecated":"true"} +,{"type":{"type":"alias","childType":"userId"},"id":8,"name":"creatorUid", "deprecated":"true"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":9,"name":"members", "deprecated":"true"} +,{"type":{"type":"alias","childType":"date"},"id":10,"name":"createDate", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":17,"name":"theme", "deprecated":"true"} +,{"type":{"type":"opt","childType":"string"},"id":18,"name":"about", "deprecated":"true"} +]}}, { + "type":"struct", + "content": { + "name":"GroupFull", +"doc":[ +"Goup Full information","Permissions.","Idea of Group Full mermissions is about Group Info pages. This permissions","are usefull only when trying to view and update group settings and not related","to chat messages itself.","Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.","If default is TRUE then ONE == FALSE.","Bits:","0 - canEditInfo. Default is FALSE.","1 - canViewMembers. Default is FALSE.","2 - canInviteMembers. Default is FALSE.","3 - canInviteViaLink. Default is FALSE.","4 - canCall. Default is FALSE.","5 - canEditAdminSettings. Default is FALSE.","6 - canViewAdmins. Default is FALSE.","7 - canEditAdmins. Default is FALSE.","8 - canKickInvited. Default is FALSE.","9 - canKickAnyone. Default is FALSE.","10 - canEditForeign. Default is FALSE.","11 - canDeleteForeign. Default is FALSE.","",{"type":"reference","argument":"id","category":"full","description":" Group Id"},{"type":"reference","argument":"createDate","category":"full","description":" Date created"},{"type":"reference","argument":"ownerUid","category":"full","description":" Optional group owner"},{"type":"reference","argument":"members","category":"full","description":" Group members. Can be empty when isAsyncMembers enabled."},{"type":"reference","argument":"theme","category":"full","description":" Group Theme"},{"type":"reference","argument":"about","category":"full","description":" Group about"},{"type":"reference","argument":"isAsyncMembers","category":"full","description":" Is Members need to be loaded asynchronous. Default is false."},{"type":"reference","argument":"isSharedHistory","category":"full","description":" Is history shared among all users. Default is false."},{"type":"reference","argument":"shortName","category":"full","description":" Group's short name"},{"type":"reference","argument":"permissions","category":"full","description":" Group Permissions"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"id"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"createDate"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":5,"name":"ownerUid"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":12,"name":"members"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"theme"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":7,"name":"ext"} +,{"type":{"type":"opt","childType":"bool"},"id":11,"name":"isAsyncMembers"} +,{"type":{"type":"opt","childType":"bool"},"id":10,"name":"isSharedHistory"} +,{"type":{"type":"opt","childType":"string"},"id":14,"name":"shortName"} +,{"type":{"type":"opt","childType":"int64"},"id":27,"name":"permissions"} +]}},{"type":"rpc","content":{ +"name":"LoadFullGroups", +"header":2782, +"response":{"type":"anonymous","header":2783, "doc":[ +{"type":"reference","argument":"groups","category":"compact","description":" Groups to load"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"GroupFull"}},"id":1,"name":"groups"} +]}, +"doc":[ +"Loading Full Groups",{"type":"reference","argument":"groups","category":"compact","description":"Groups to load"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} +]}},{"type":"rpc","content":{ +"name":"LoadMembers", +"header":2786, +"response":{"type":"anonymous","header":2787, "doc":[ +{"type":"reference","argument":"users","category":"full","description":" Group members"},{"type":"reference","argument":"next","category":"full","description":" Load more reference"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":3,"name":"members"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"next"} +]}, +"doc":[ +"Loading group members",{"type":"reference","argument":"group","category":"full","description":"Group peer"},{"type":"reference","argument":"limit","category":"full","description":"Limit members"},{"type":"reference","argument":"next","category":"full","description":"Load more reference"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"group"} +,{"type":"int32","id":2,"name":"limit"} +,{"type":{"type":"opt","childType":"bytes"},"id":3,"name":"next"} +]}},{"type":"comment","content":"Update"},{"type":"update","content":{ +"name":"GroupTitleChanged", +"header":2609, +"doc":[ +"Update about title changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"title","category":"full","description":" Group Title"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"string","id":2,"name":"title"} +]}},{"type":"update","content":{ +"name":"GroupAvatarChanged", +"header":2610, +"doc":[ +"Update about avatar changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"avatar","category":"full","description":" Group Avatar"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":2,"name":"avatar"} +]}},{"type":"update","content":{ +"name":"GroupTopicChanged", +"header":2616, +"doc":[ +"Update about topic changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"topic","category":"full","description":" Updated topic"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"topic"} +]}},{"type":"update","content":{ +"name":"GroupAboutChanged", +"header":2617, +"doc":[ +"Update about about changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"about","category":"full","description":" Updated about"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} +]}},{"type":"update","content":{ +"name":"GroupExtChanged", +"header":2613, +"doc":[ +"Update about ext changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"ext","category":"full","description":" Updated ext"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} +]}},{"type":"update","content":{ +"name":"GroupFullExtChanged", +"header":2618, +"doc":[ +"Update about full ext changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"ext","category":"full","description":" Updated ext"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"MapValue"}},"id":2,"name":"ext"} +]}},{"type":"update","content":{ +"name":"GroupShortNameChanged", +"header":2628, +"doc":[ +"Group's short name changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"shortName","category":"full","description":" Group short name"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"shortName"} +]}},{"type":"update","content":{ +"name":"GroupOwnerChanged", +"header":2619, +"doc":[ +"Update about owner changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"userId","category":"full","description":" New Owner"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"userId"} +]}},{"type":"update","content":{ +"name":"GroupHistoryShared", +"header":2620, +"doc":[ +"Update about history shared",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"update","content":{ +"name":"GroupDeleted", +"header":2658, +"doc":[ +"Update about group deleted",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"update","content":{ +"name":"GroupPermissionsChanged", +"header":2663, +"doc":[ +"Update about group permissions changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"permissions","category":"full","description":" New Permissions"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int64","id":2,"name":"permissions"} +]}},{"type":"update","content":{ +"name":"GroupFullPermissionsChanged", +"header":2664, +"doc":[ +"Update about Full Group permissions changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"permissions","category":"full","description":" New Permissions"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int64","id":2,"name":"permissions"} +]}},{"type":"comment","content":" "},{"type":"update","content":{ +"name":"GroupMemberChanged", +"header":2612, +"doc":[ +"Update about membership changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"isMember","category":"full","description":" Is current user a member"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"bool","id":2,"name":"isMember"} +]}},{"type":"update","content":{ +"name":"GroupMembersBecameAsync", +"header":2615, +"doc":[ +"Update about members became async",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"update","content":{ +"name":"GroupMembersUpdated", +"header":2614, +"doc":[ +"Update about members updated",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"members","category":"full","description":" Group Members"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":2,"name":"members"} +]}},{"type":"update","content":{ +"name":"GroupMemberDiff", +"header":2623, +"doc":[ +"Update about members changed",{"type":"reference","argument":"removedUsers","category":"full","description":" Removed Users"},{"type":"reference","argument":"addedMembers","category":"full","description":" Added members"},{"type":"reference","argument":"membersCount","category":"full","description":" Current Members count"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"removedUsers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":3,"name":"addedMembers"} +,{"type":"int32","id":4,"name":"membersCount"} +]}},{"type":"update","content":{ +"name":"GroupMembersCountChanged", +"header":2622, +"doc":[ +"Update about members count changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"membersCount","category":"full","description":" Members count"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int32","id":2,"name":"membersCount"} +]}},{"type":"update","content":{ +"name":"GroupMemberAdminChanged", +"header":2627, +"doc":[ +"Update about member admin changed",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"userId","category":"full","description":" User Id"},{"type":"reference","argument":"isAdmin","category":"full","description":" Is Admin flag"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"userId"} +,{"type":"bool","id":3,"name":"isAdmin"} +]}},{"type":"comment","content":"Actions"},{"type":"rpc","content":{ +"name":"CreateGroup", +"header":230, +"response":{"type":"anonymous","header":216, "doc":[ +"Created group",{"type":"reference","argument":"seq","category":"full","description":" Update Seq"},{"type":"reference","argument":"state","category":"compact","description":" Update state"},{"type":"reference","argument":"group","category":"full","description":" Created group"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"userPeers","category":"full","description":" Referenced users"},{"type":"reference","argument":"date","category":"full","description":" Group creation date"}] ,"attributes":[{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} +,{"type":{"type":"struct","childType":"Group"},"id":3,"name":"group"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userPeers"} +]}, +"doc":[ +"Creating group chat",{"type":"reference","argument":"rid","category":"full","description":"Random Id for avoiding double create"},{"type":"reference","argument":"title","category":"full","description":"Group Title"},{"type":"reference","argument":"users","category":"hidden","description":"Members of group"},{"type":"reference","argument":"groupType","category":"full","description":"Group Type"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"rid"} +,{"type":"string","id":2,"name":"title"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"GroupType"}},"id":6,"name":"groupType"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":7,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupTitle", +"header":85, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Changing group title",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"title","category":"full","description":"new group title"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupAvatar", +"header":86, +"response":{"type":"anonymous","header":115, "doc":[ +"Updated group avatar",{"type":"reference","argument":"avatar","category":"compact","description":" Changed avatar"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"},{"type":"reference","argument":"date","category":"full","description":" Avatar change date"}] ,"attributes":[{"type":{"type":"struct","childType":"Avatar"},"id":1,"name":"avatar"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}, +"doc":[ +"Changing group avatar",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"fileLocation","category":"compact","description":"uploaded file for avatar"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"struct","childType":"FileLocation"},"id":3,"name":"fileLocation"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"RemoveGroupAvatar", +"header":101, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Removing group avatar",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupShortName", +"header":2793, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Edit Group Short Name",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"shortName","category":"full","description":"New group's short name"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"shortName"} +]}},{"type":"rpc","content":{ +"name":"EditGroupTopic", +"header":211, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Edit group topic",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random id of operation"},{"type":"reference","argument":"topic","category":"full","description":"New Topic"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"topic"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":4,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"EditGroupAbout", +"header":213, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Edit Group About",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random id of operation"},{"type":"reference","argument":"about","category":"full","description":"New About"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"about"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"InviteUser", +"header":69, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Inviting user to group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"user","category":"full","description":"Users for invitation"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":3,"name":"user"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LeaveGroup", +"header":70, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Leaving group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"LeaveAndDelete", +"header":2721, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Leave group and Delete Chat",{"type":"reference","argument":"groupPeer","category":"full","description":"Group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"KickUser", +"header":71, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Kicking user from group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"user","category":"full","description":"users for removing"},{"type":"reference","argument":"rid","category":"full","description":"Random Id of operation"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":3,"name":"user"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":5,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"JoinGroupByPeer", +"header":2722, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Join group by peer",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"JoinGroupByGroupId", +"header":44561, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Join group by peer without a necessity of invite",{"type":"reference","argument":"groupId","category":"hidden","description":"Groups peer"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +]}},{"type":"comment","content":"Administration"},{"type":"rpc","content":{ +"name":"MakeUserAdmin", +"header":2784, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Make user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} +]}},{"type":"rpc","content":{ +"name":"DismissUserAdmin", +"header":2791, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Dismissing user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} +]}},{"type":"rpc","content":{ +"name":"TransferOwnership", +"header":2789, +"response":{"type":"reference","name":"SeqDate"}, +"doc":[ +"Transfer ownership of group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"newOwner","category":"full","description":"New group's owner"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"newOwner"} +]}}, { + "type":"struct", + "content": { + "name":"AdminSettings", +"doc":[ +"Admin Settings",{"type":"reference","argument":"showAdminsToMembers","category":"full","description":" Show admins in member list"},{"type":"reference","argument":"canMembersInvite","category":"full","description":" Can members of a group invite people"},{"type":"reference","argument":"canMembersEditGroupInfo","category":"full","description":" Can members edit group info"},{"type":"reference","argument":"canAdminsEditGroupInfo","category":"full","description":" Can admins edit group info"},{"type":"reference","argument":"showJoinLeaveMessages","category":"full","description":" Should join and leave messages be visible to members"}],"expandable":"true","attributes":[ +{"type":"bool","id":1,"name":"showAdminsToMembers"} +,{"type":"bool","id":2,"name":"canMembersInvite"} +,{"type":"bool","id":3,"name":"canMembersEditGroupInfo"} +,{"type":"bool","id":4,"name":"canAdminsEditGroupInfo"} +,{"type":"bool","id":5,"name":"showJoinLeaveMessages"} +]}},{"type":"rpc","content":{ +"name":"LoadAdminSettings", +"header":2790, +"response":{"type":"anonymous","header":2794, "doc":[ +"Loaded settings",{"type":"reference","argument":"settings","category":"full","description":" Current group admin settings"}] ,"attributes":[{"type":{"type":"struct","childType":"AdminSettings"},"id":1,"name":"settings"} +]}, +"doc":[ +"Loading administration settings",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"SaveAdminSettings", +"header":2792, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Save administartion settings",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's Peer"},{"type":"reference","argument":"settings","category":"full","description":"Group's settings"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"AdminSettings"},"id":2,"name":"settings"} +]}},{"type":"rpc","content":{ +"name":"DeleteGroup", +"header":2795, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Delete Group",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"ShareHistory", +"header":2796, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Share History",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"comment","content":"Invite"},{"type":"response","content":{ +"name":"InviteUrl", +"header":178, +"doc":[ +"Response for invite url methods"],"attributes":[ +{"type":"string","id":1,"name":"url"} +]}},{"type":"rpc","content":{ +"name":"GetGroupInviteUrl", +"header":177, +"response":{"type":"reference","name":"InviteUrl"}, +"doc":[ +"Building invite url",{"type":"reference","argument":"groupPeer","category":"full","description":"Destination group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"RevokeInviteUrl", +"header":179, +"response":{"type":"reference","name":"InviteUrl"}, +"doc":[ +"Revoking invite urls",{"type":"reference","argument":"groupPeer","category":"full","description":"Destination group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"JoinGroup", +"header":180, +"response":{"type":"anonymous","header":181, "doc":[ +{"type":"reference","argument":"group","category":"hidden","description":" Joined group"},{"type":"reference","argument":"users","category":"hidden","description":" Users from members"},{"type":"reference","argument":"userPeers","category":"hidden","description":" User Peers"},{"type":"reference","argument":"rid","category":"full","description":" Random id"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"hidden","description":" State"},{"type":"reference","argument":"date","category":"full","description":" Date of join"}] ,"attributes":[{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":5,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":7,"name":"userPeers"} +,{"type":{"type":"alias","childType":"randomId"},"id":6,"name":"rid"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}, +"doc":[ +"Join group method",{"type":"reference","argument":"token","category":"full","description":"Url or Token for joining to group"},{"type":"reference","argument":"optimizations","category":"hidden","description":"Enabled Optimizations"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"comment","content":"Obsolete Actions"},{"type":"rpc","content":{ +"name":"CreateGroupObsolete", +"header":65, +"response":{"type":"anonymous","header":66, "doc":[ +"Created group",{"type":"reference","argument":"groupPeer","category":"full","description":" Peer of created group"},{"type":"reference","argument":"seq","category":"full","description":" Sequence number"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state"},{"type":"reference","argument":"users","category":"compact","description":" Members of created group"},{"type":"reference","argument":"date","category":"full","description":" Group creation date"}] ,"attributes":[{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":"int32","id":3,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":4,"name":"state"} +,{"type":{"type":"list","childType":"int32"},"id":5,"name":"users"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} +]}, +"doc":[ +"[OBSOLETE] Creating group chat",{"type":"reference","argument":"rid","category":"full","description":"Random Id for avoiding double create"},{"type":"reference","argument":"title","category":"full","description":"Title of new group"},{"type":"reference","argument":"users","category":"compact","description":"Members of new group"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"rid"} +,{"type":"string","id":2,"name":"title"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} +]}},{"type":"rpc","content":{ +"name":"EnterGroupObsolete", +"header":199, +"response":{"type":"anonymous","header":200, "doc":[ +"Joined group",{"type":"reference","argument":"group","category":"full","description":" Joined group"},{"type":"reference","argument":"users","category":"full","description":" Referenced users"},{"type":"reference","argument":"rid","category":"full","description":" Rid of join message"},{"type":"reference","argument":"seq","category":"full","description":" Seq of Update"},{"type":"reference","argument":"state","category":"full","description":" State of Update"},{"type":"reference","argument":"date","category":"full","description":" Date of update"}] ,"attributes":[{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"rid"} +,{"type":"int32","id":4,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":5,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":6,"name":"date"} +]}, +"doc":[ +"[OBSOLETE] Join random group by peer id",{"type":"reference","argument":"peer","category":"full","description":"Public group peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"MakeUserAdminObsolete", +"header":214, +"response":{"type":"anonymous","header":215, "doc":[ +{"type":"reference","argument":"members","category":"full","description":" new members"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":1,"name":"members"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +]}, +"doc":[ +"[OBSOLETE] Make user admin",{"type":"reference","argument":"groupPeer","category":"full","description":"Group's peer"},{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"GroupOutPeer"},"id":1,"name":"groupPeer"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"userPeer"} +]}},{"type":"comment","content":"Obsolete Updates"},{"type":"update","content":{ +"name":"GroupInviteObsolete", +"header":36, +"doc":[ +"Update about inviting current user to group",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"inviteUid","category":"full","description":" Inviter UID. If equals to current uid than group created by user."},{"type":"reference","argument":"date","category":"full","description":" Date of creating"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":9,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":5,"name":"inviteUid"} +,{"type":{"type":"alias","childType":"date"},"id":8,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupUserInvitedObsolete", +"header":21, +"doc":[ +"Update about inviting user to group",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Added user ID"},{"type":"reference","argument":"inviterUid","category":"full","description":" Inviter user ID"},{"type":"reference","argument":"date","category":"full","description":" Date of adding user to group"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"inviterUid"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupUserLeaveObsolete", +"header":23, +"doc":[ +"Update about leaving user",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" User's ID"},{"type":"reference","argument":"date","category":"full","description":" Date of user leave"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupUserKickObsolete", +"header":24, +"doc":[ +"Update about kicking user",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Kicked user's ID"},{"type":"reference","argument":"kickerUid","category":"full","description":" Kicker user's ID"},{"type":"reference","argument":"date","category":"full","description":" Date of user kick"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"kickerUid"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupMembersUpdateObsolete", +"header":44, +"doc":[ +"Silent group members update",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"members","category":"full","description":" New members list"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Member"}},"id":2,"name":"members"} +]}},{"type":"update","content":{ +"name":"GroupTitleChangedObsolete", +"header":38, +"doc":[ +"Update about group title change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Changer UID"},{"type":"reference","argument":"title","category":"full","description":" New Title of group"},{"type":"reference","argument":"date","category":"full","description":" Date of title change"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupTopicChangedObsolete", +"header":213, +"doc":[ +"Update about group topic change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Changer UID"},{"type":"reference","argument":"topic","category":"full","description":" New topic of group"},{"type":"reference","argument":"date","category":"full","description":" Date of theme change"},{"type":"reference","argument":"rid","category":"full","description":" Randomd Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"uid"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"topic"} +,{"type":{"type":"alias","childType":"date"},"id":5,"name":"date"} +]}},{"type":"update","content":{ +"name":"GroupAboutChangedObsolete", +"header":214, +"doc":[ +"Update about group about change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"about","category":"full","description":" Group about"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"about"} +]}},{"type":"update","content":{ +"name":"GroupAvatarChangedObsolete", +"header":39, +"doc":[ +"Update about group avatar change",{"type":"reference","argument":"groupId","category":"full","description":" Group Id"},{"type":"reference","argument":"uid","category":"full","description":" Avatar changer uid"},{"type":"reference","argument":"avatar","category":"compact","description":" New Avatar. If null then avatar is removed"},{"type":"reference","argument":"date","category":"full","description":" Date of avatar change"},{"type":"reference","argument":"rid","category":"full","description":" Random Id of operation"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"randomId"},"id":5,"name":"rid"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":3,"name":"avatar"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"date"} +]}}]}, { + "title": "Stickers", + "package": "stickers", + "doc": [ + "Stickers support in Actor" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"StickerDescriptor", +"doc":[ +"Descriptor of a Sticker",{"type":"reference","argument":"id","category":"full","description":" Sticker unique id"},{"type":"reference","argument":"emoji","category":"full","description":" Emoji code for sticker"},{"type":"reference","argument":"image128","category":"full","description":" Image of sticker 128x128 in WebP format"},{"type":"reference","argument":"image512","category":"full","description":" Image of sticker 512x512 in WebP format"},{"type":"reference","argument":"image256","category":"full","description":" Image of sticker 256x256 in WebP format"}],"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"emoji"} +,{"type":{"type":"struct","childType":"ImageLocation"},"id":3,"name":"image128"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":4,"name":"image512"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"ImageLocation"}},"id":5,"name":"image256"} +]}}, { + "type":"struct", + "content": { + "name":"StickerCollection", +"doc":[ +"Sticker collection",{"type":"reference","argument":"id","category":"full","description":" Unique id of a collection"},{"type":"reference","argument":"accessHash","category":"full","description":" Access Hash of a collection"},{"type":"reference","argument":"stickers","category":"compact","description":" Sticker list"}],"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"StickerDescriptor"}},"id":3,"name":"stickers"} +]}},{"type":"response","content":{ +"name":"StickersReponse", +"header":240, +"doc":[ +"Stickers response",{"type":"reference","argument":"collections","category":"full","description":" Sticker collections"},{"type":"reference","argument":"seq","category":"full","description":" Seq of update"},{"type":"reference","argument":"state","category":"full","description":" State of update"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} +,{"type":"int32","id":2,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +]}},{"type":"rpc","content":{ +"name":"LoadOwnStickers", +"header":238, +"response":{"type":"anonymous","header":239, "doc":[ +"Own Stickers collections",{"type":"reference","argument":"ownStickers","category":"hidden","description":" Own sticker collections"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"ownStickers"} +]}, +"doc":[ +"Loading own stickers"],"attributes":[ +]}},{"type":"update","content":{ +"name":"OwnStickersChanged", +"header":161, +"doc":[ +"Own Stickers changed",{"type":"reference","argument":"collections","category":"compact","description":" New own sticker collections"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} +]}},{"type":"update","content":{ +"name":"StickerCollectionsChanged", +"header":164, +"doc":[ +"Sticker collection changed",{"type":"reference","argument":"collections","category":"full","description":" Updated sticker collections"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"StickerCollection"}},"id":1,"name":"collections"} +]}},{"type":"rpc","content":{ +"name":"AddStickerCollection", +"header":244, +"response":{"type":"reference","name":"StickersReponse"}, +"doc":[ +"Adding sticker collection",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"RemoveStickerCollection", +"header":245, +"response":{"type":"reference","name":"StickersReponse"}, +"doc":[ +"Removing sticker collection",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"rpc","content":{ +"name":"LoadStickerCollection", +"header":246, +"response":{"type":"anonymous","header":247, "doc":[ +"Loaded collection",{"type":"reference","argument":"collection","category":"full","description":" Collection of stickers"}] ,"attributes":[{"type":{"type":"struct","childType":"StickerCollection"},"id":1,"name":"collection"} +]}, +"doc":[ +"Loading stickers",{"type":"reference","argument":"id","category":"full","description":"Collection id"},{"type":"reference","argument":"accessHash","category":"full","description":"Collection access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}]}, { + "title": "Search", + "package": "search", + "doc": [ + "Searching API" + ], + "items": [ + { + "type": "enum", + "content": { + "name": "SearchPeerType", + "values": [ + { + "name": "Groups", + "id": 1 + }, + { + "name": "Contacts", + "id": 2 + }, + { + "name": "Public", + "id": 3 } - }, - "id": 1, - "name": "history" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" + ] + } + }, { + "type": "enum", + "content": { + "name": "SearchContentType", + "values": [ + { + "name": "Any", + "id": 1 + }, + { + "name": "Text", + "id": 2 + }, + { + "name": "Links", + "id": 3 + }, + { + "name": "Documents", + "id": 4 + }, + { + "name": "Photos", + "id": 5 } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" + ] + } + },{"type":"trait","content":{ +"isContainer":"true","name":"SearchCondition","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"SearchPeerTypeCondition", +"doc":[ +"Search peer type condition",{"type":"reference","argument":"peerType","category":"full","description":" Peer type for searching"}],"trait":{"name":"SearchCondition","key":1},"attributes":[ +{"type":{"type":"enum","childType":"SearchPeerType"},"id":1,"name":"peerType"} +]}}, { + "type":"struct", + "content": { + "name":"SearchPieceText", +"doc":[ +"Search peer name condition",{"type":"reference","argument":"query","category":"full","description":" Search query"}],"trait":{"name":"SearchCondition","key":2},"attributes":[ +{"type":"string","id":1,"name":"query"} +]}}, { + "type":"struct", + "content": { + "name":"SearchAndCondition", +"doc":[ +"Search AND condion",{"type":"reference","argument":"andQuery","category":"full","description":" And Query"}],"trait":{"name":"SearchCondition","key":3},"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":1,"name":"andQuery"} +]}}, { + "type":"struct", + "content": { + "name":"SearchOrCondition", +"doc":[ +"Search OR condition",{"type":"reference","argument":"orQuery","category":"full","description":" Or Query"}],"trait":{"name":"SearchCondition","key":4},"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":2,"name":"orQuery"} +]}}, { + "type":"struct", + "content": { + "name":"SearchPeerCondition", +"doc":[ +"Serch Peer condition",{"type":"reference","argument":"peer","category":"full","description":" Peer condition"}],"trait":{"name":"SearchCondition","key":5},"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +]}}, { + "type":"struct", + "content": { + "name":"SearchPeerContentType", +"doc":[ +"Search content type condition",{"type":"reference","argument":"contentType","category":"full","description":" Content Type"}],"trait":{"name":"SearchCondition","key":6},"attributes":[ +{"type":{"type":"enum","childType":"SearchContentType"},"id":1,"name":"contentType"} +]}}, { + "type":"struct", + "content": { + "name":"SearchSenderIdConfition", +"doc":[ +"Searching sender uid condition",{"type":"reference","argument":"senderId","category":"full","description":" sender UID"}],"trait":{"name":"SearchCondition","key":7},"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"senderId"} +]}}, { + "type":"struct", + "content": { + "name":"PeerSearchResult", +"doc":[ +"Peer search result",{"type":"reference","argument":"peer","category":"full","description":" Peer information"},{"type":"reference","argument":"optMatchString","category":"full","description":" Description"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"optMatchString"} +]}},{"type":"rpc","content":{ +"name":"PeerSearch", +"header":233, +"response":{"type":"anonymous","header":234, "doc":[ +"Found peers",{"type":"reference","argument":"searchResults","category":"full","description":" Search Results"},{"type":"reference","argument":"users","category":"full","description":" Related users"},{"type":"reference","argument":"groups","category":"full","description":" Related groups"},{"type":"reference","argument":"userPeers","category":"full","description":" Related user peers"},{"type":"reference","argument":"groupPeers","category":"full","description":" Related group peers"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"PeerSearchResult"}},"id":1,"name":"searchResults"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":4,"name":"userPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":5,"name":"groupPeers"} +]}, +"doc":[ +"Performing peer search",{"type":"reference","argument":"query","category":"full","description":"Search query. Warring not all combinations can be processed by server. (acts as OR)"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"SearchCondition"}},"id":1,"name":"query"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}}, { + "type":"struct", + "content": { + "name":"MessageSearchResult", +"doc":[ +"Message container",{"type":"reference","argument":"peer","category":"full","description":" Message Peer"},{"type":"reference","argument":"rid","category":"full","description":" Message Random Id"},{"type":"reference","argument":"date","category":"full","description":" Message Date"},{"type":"reference","argument":"senderId","category":"full","description":" Message sender UID"},{"type":"reference","argument":"content","category":"full","description":" Message content"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"rid"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +,{"type":{"type":"alias","childType":"userId"},"id":4,"name":"senderId"} +,{"type":{"type":"trait","childType":"Message"},"id":5,"name":"content"} +]}}, { + "type":"struct", + "content": { + "name":"MessageSearchItem", +"doc":[ +"Message Search result container"],"attributes":[ +{"type":{"type":"struct","childType":"MessageSearchResult"},"id":1,"name":"result"} +]}},{"type":"response","content":{ +"name":"MessageSearchResponse", +"header":218, +"doc":[ +"Search Result",{"type":"reference","argument":"searchResults","category":"full","description":" Search results"},{"type":"reference","argument":"users","category":"full","description":" Search users"},{"type":"reference","argument":"groups","category":"full","description":" Search groups"},{"type":"reference","argument":"loadMoreState","category":"hidden","description":" State for loading more results"},{"type":"reference","argument":"userOutPeers","category":"full","description":" Search user peers"},{"type":"reference","argument":"groupOutPeers","category":"full","description":" Search group peers"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"MessageSearchItem"}},"id":1,"name":"searchResults"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"groups"} +,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"loadMoreState"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":5,"name":"userOutPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":6,"name":"groupOutPeers"} +]}},{"type":"rpc","content":{ +"name":"MessageSearch", +"header":217, +"response":{"type":"reference","name":"MessageSearchResponse"}, +"doc":[ +"Performing message search",{"type":"reference","argument":"query","category":"full","description":"Search query"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":{"type":"trait","childType":"SearchCondition"},"id":1,"name":"query"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"MessageSearchMore", +"header":222, +"response":{"type":"reference","name":"MessageSearchResponse"}, +"doc":[ +"Performing message search paging",{"type":"reference","argument":"loadMoreState","category":"hidden","description":"State for loading more results"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled Optimizations"}],"attributes":[ +{"type":"bytes","id":1,"name":"loadMoreState"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":2,"name":"optimizations"} +]}}]}, { + "title": "Public Groups", + "package": "pubgroups", + "doc": [ + "Public group is easy way to find communities" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"PublicGroup", +"doc":[ +"Public Group description",{"type":"reference","argument":"id","category":"full","description":" Group id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Group Access hash"},{"type":"reference","argument":"title","category":"full","description":" Group title"},{"type":"reference","argument":"avatar","category":"full","description":" Group avatar"},{"type":"reference","argument":"membersCount","category":"full","description":" Members count in group"},{"type":"reference","argument":"friendsCount","category":"full","description":" Friends count int group"},{"type":"reference","argument":"description","category":"full","description":" Description of group"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"title"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"Avatar"}},"id":7,"name":"avatar"} +,{"type":"int32","id":4,"name":"membersCount"} +,{"type":"int32","id":5,"name":"friendsCount"} +,{"type":"string","id":6,"name":"description"} +]}},{"type":"rpc","content":{ +"name":"GetPublicGroups", +"header":201, +"response":{"type":"anonymous","header":202, "doc":[ +"Loaded public groups",{"type":"reference","argument":"groups","category":"full","description":" All available groups"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"PublicGroup"}},"id":1,"name":"groups"} +]}, +"doc":[ +"Getting public groups"],"attributes":[ +]}}]}, { + "title": "Invites", + "package": "invites", + "doc": [ + "Invite mechanizm" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"InviteState", +"doc":[ +"Invite state",{"type":"reference","argument":"email","category":"full","description":" Email of invite"},{"type":"reference","argument":"name","category":"full","description":" Name of invited user"},{"type":"reference","argument":"uid","category":"full","description":" Uid of registered user"},{"type":"reference","argument":"tid","category":"full","description":" Team id of invite"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +,{"type":{"type":"opt","childType":"int32"},"id":3,"name":"uid"} +,{"type":{"type":"opt","childType":"int32"},"id":4,"name":"tid"} +]}},{"type":"response","content":{ +"name":"InviteList", +"header":2564, +"doc":[ +"Intites list",{"type":"reference","argument":"invites","category":"full","description":" Intvites"},{"type":"reference","argument":"relatedUsers","category":"full","description":" Related users in invites"},{"type":"reference","argument":"relatedGroups","category":"full","description":" Related groups in invites"},{"type":"reference","argument":"relatedTeams","category":"full","description":" Related teams in invites"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"InviteState"}},"id":1,"name":"invites"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":2,"name":"relatedUsers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"relatedGroups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":4,"name":"relatedTeams"} +]}},{"type":"rpc","content":{ +"name":"LoadOwnSentInvites", +"header":2563, +"response":{"type":"reference","name":"InviteList"}, +"doc":[ +"Loading current invite states"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"SendInvite", +"header":2565, +"response":{"type":"reference","name":"InviteList"}, +"doc":[ +"Sending an email invite",{"type":"reference","argument":"email","category":"full","description":"Email for invite"},{"type":"reference","argument":"name","category":"full","description":"Optional name for invite"},{"type":"reference","argument":"destTeam","category":"full","description":"Optional team for invite"}],"attributes":[ +{"type":"string","id":1,"name":"email"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"name"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"OutTeam"}},"id":3,"name":"destTeam"} +]}}]}, { + "title": "Teams", + "package": "teams", + "doc": [ + "Teams support for Actor" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Team", +"doc":[ +"Team entity",{"type":"reference","argument":"id","category":"full","description":" Team Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Team Access Hash"},{"type":"reference","argument":"name","category":"full","description":" Team name"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +,{"type":"string","id":3,"name":"name"} +]}}, { + "type":"struct", + "content": { + "name":"OutTeam", +"doc":[ +"Reference to a team",{"type":"reference","argument":"id","category":"full","description":" Team Id"},{"type":"reference","argument":"accessHash","category":"full","description":" Team access hash"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"int64","id":2,"name":"accessHash"} +]}},{"type":"response","content":{ +"name":"TeamsList", +"header":2562, +"doc":[ +"Teams response",{"type":"reference","argument":"teams","category":"hidden","description":" Teams list"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":1,"name":"teams"} +]}},{"type":"rpc","content":{ +"name":"LoadOwnTeams", +"header":2561, +"response":{"type":"reference","name":"TeamsList"}, +"doc":[ +"Loading own teams"],"attributes":[ +]}},{"type":"update","content":{ +"name":"OwnTeamsChanged", +"header":165, +"doc":[ +"Update about own teams changed",{"type":"reference","argument":"ownTeams","category":"full","description":" Updated own teams list"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"Team"}},"id":1,"name":"ownTeams"} +]}},{"type":"rpc","content":{ +"name":"CreateTeam", +"header":2566, +"response":{"type":"anonymous","header":2567, "doc":[ +"Created team response",{"type":"reference","argument":"createdTeam","category":"full","description":" Created Team"}] ,"attributes":[{"type":{"type":"struct","childType":"Team"},"id":1,"name":"createdTeam"} +]}, +"doc":[ +"Creation of a Team",{"type":"reference","argument":"title","category":"full","description":"Title of a team"}],"attributes":[ +{"type":"string","id":1,"name":"title"} +]}},{"type":"rpc","content":{ +"name":"InviteToTeam", +"header":2568, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Inviting people to team",{"type":"reference","argument":"user","category":"full","description":"Dest user"},{"type":"reference","argument":"destTeam","category":"full","description":"Dest team"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"user"} +,{"type":{"type":"struct","childType":"OutTeam"},"id":3,"name":"destTeam"} +]}}]}, { + "title": "Integrations", + "package": "integrations", + "doc": [ + "Package contains methods for providing integration" + ], + "items": [ +{"type":"response","content":{ +"name":"IntegrationToken", +"header":183, +"doc":[ +"Group token response",{"type":"reference","argument":"token","category":"danger","description":" current group token"},{"type":"reference","argument":"url","category":"danger","description":" current group url"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +,{"type":"string","id":2,"name":"url"} +]}},{"type":"rpc","content":{ +"name":"GetIntegrationToken", +"header":182, +"response":{"type":"reference","name":"IntegrationToken"}, +"doc":[ +"Getting current group token",{"type":"reference","argument":"groupPeer","category":"full","description":"Peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"groupPeer"} +]}},{"type":"rpc","content":{ +"name":"RevokeIntegrationToken", +"header":184, +"response":{"type":"reference","name":"IntegrationToken"}, +"doc":[ +"Revoke group token",{"type":"reference","argument":"groupPeer","category":"full","description":"Peer"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"groupPeer"} +]}}]}, { + "title": "Typing and Online", + "package": "weak", + "items": [ + { + "type": "enum", + "content": { + "name": "TypingType", + "values": [ + { + "name": "Text", + "id": 0 } - }, - "id": 4, - "name": "userPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" + ] + } + },{"type":"rpc","content":{ +"name":"Typing", +"header":27, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Sending typing notification",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"typingType","category":"full","description":"typing type."}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} +]}},{"type":"rpc","content":{ +"name":"StopTyping", +"header":30, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Stop typing",{"type":"reference","argument":"peer","category":"full","description":"Destination peer"},{"type":"reference","argument":"typingType","category":"full","description":"typing type"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"enum","childType":"TypingType"},"id":2,"name":"typingType"} +]}}, { + "type": "enum", + "content": { + "name": "DeviceType", + "values": [ + { + "name": "GENERIC", + "id": 1 + }, + { + "name": "PC", + "id": 2 + }, + { + "name": "MOBILE", + "id": 3 + }, + { + "name": "TABLET", + "id": 4 + }, + { + "name": "WATCH", + "id": 5 + }, + { + "name": "MIRROR", + "id": 6 + }, + { + "name": "CAR", + "id": 7 + }, + { + "name": "TABLE", + "id": 8 } - }, - "id": 5, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" + ] + } + },{"type":"rpc","content":{ +"name":"SetOnline", +"header":29, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Sending online state",{"type":"reference","argument":"isOnline","category":"full","description":"is user online"},{"type":"reference","argument":"timeout","category":"full","description":"timeout of online state in milliseconds"},{"type":"reference","argument":"deviceType","category":"full","description":"Optional device type"},{"type":"reference","argument":"deviceCategory","category":"full","description":"Optional device category, for example android or ios"}],"attributes":[ +{"type":"bool","id":1,"name":"isOnline"} +,{"type":{"type":"alias","childType":"msec"},"id":2,"name":"timeout"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":3,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"PauseNotifications", +"header":166, +"doc":[ +"Update about pausing notifications",{"type":"reference","argument":"timeout","category":"full","description":" Timeout for notifications resume"}],"attributes":[ +{"type":{"type":"alias","childType":"sec"},"id":1,"name":"timeout"} +]}},{"type":"update","content":{ +"name":"RestoreNotifications", +"header":167, +"doc":[ +"Update about restoring notifications"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"PauseNotifications", +"header":2641, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Pause notifications",{"type":"reference","argument":"timeout","category":"hidden","description":"Timeout of pause"}],"attributes":[ +{"type":{"type":"alias","childType":"sec"},"id":1,"name":"timeout"} +]}},{"type":"rpc","content":{ +"name":"RestoreNotifications", +"header":2642, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Restoring notifications"],"attributes":[ +]}},{"type":"empty"},{"type":"update","content":{ +"name":"Typing", +"header":6, +"doc":[ +"Update about user's typing",{"type":"reference","argument":"peer","category":"full","description":" Conversation peer"},{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"typingType","category":"full","description":" Type of typing"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} +]}},{"type":"update","content":{ +"name":"TypingStop", +"header":81, +"doc":[ +"Update about user's typing stop",{"type":"reference","argument":"peer","category":"full","description":" Conversation peer"},{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"typingType","category":"hidden","description":" Type of typing"}],"attributes":[ +{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"alias","childType":"userId"},"id":2,"name":"uid"} +,{"type":{"type":"enum","childType":"TypingType"},"id":3,"name":"typingType"} +]}},{"type":"update","content":{ +"name":"UserOnline", +"header":7, +"doc":[ +"Update about user became online",{"type":"reference","argument":"uid","category":"full","description":" User's Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":2,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"UserOffline", +"header":8, +"doc":[ +"Update about user became offline",{"type":"reference","argument":"uid","category":"full","description":" User's id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":2,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"UserLastSeen", +"header":9, +"doc":[ +"Update about user's last seen state",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"date","category":"full","description":" Last seen time"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"date"} +,{"type":{"type":"opt","childType":{"type":"enum","childType":"DeviceType"}},"id":3,"name":"deviceType"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"deviceCategory"} +]}},{"type":"update","content":{ +"name":"GroupOnline", +"header":33, +"doc":[ +"Update about group online change",{"type":"reference","argument":"groupId","category":"full","description":" Group id"},{"type":"reference","argument":"count","category":"full","description":" current online user's count"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int32","id":2,"name":"count"} +]}}]}, { + "title": "Media and Files", + "package": "files", + "items": [ + { + "type":"struct", + "content": { + "name":"FileLocation", +"doc":[ +"Location of file on server",{"type":"reference","argument":"fileId","category":"full","description":" Unique Id of file"},{"type":"reference","argument":"accessHash","category":"danger","description":" Access hash of file"}],"expandable":"true","attributes":[ +{"type":"int64","id":1,"name":"fileId"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}, { + "type":"struct", + "content": { + "name":"ImageLocation", +"doc":[ +"Image location",{"type":"reference","argument":"fileLocation","category":"full","description":" Location of file"},{"type":"reference","argument":"width","category":"full","description":" Width of avatar image"},{"type":"reference","argument":"height","category":"full","description":" Height of avatar image"},{"type":"reference","argument":"fileSize","category":"full","description":" Size of file"}],"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} +,{"type":"int32","id":2,"name":"width"} +,{"type":"int32","id":3,"name":"height"} +,{"type":"int32","id":4,"name":"fileSize"} +]}}, { + "type":"struct", + "content": { + "name":"AvatarImage", +"doc":[ +"Avatar Image",{"type":"reference","argument":"fileLocation","category":"full","description":" Location of file"},{"type":"reference","argument":"width","category":"full","description":" Width of avatar image"},{"type":"reference","argument":"height","category":"full","description":" Height of avatar image"},{"type":"reference","argument":"fileSize","category":"full","description":" Size of file"}],"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"fileLocation"} +,{"type":"int32","id":2,"name":"width"} +,{"type":"int32","id":3,"name":"height"} +,{"type":"int32","id":4,"name":"fileSize"} +]}}, { + "type":"struct", + "content": { + "name":"Avatar", +"doc":[ +"Avatar of User or Group",{"type":"reference","argument":"smallImage","category":"compact","description":" Optional small image of avatar box in 100x100"},{"type":"reference","argument":"largeImage","category":"compact","description":" Optional large image of avatar box in 200x200"},{"type":"reference","argument":"fullImage","category":"compact","description":" Optional full screen image of avatar"}],"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":1,"name":"smallImage"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":2,"name":"largeImage"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"AvatarImage"}},"id":3,"name":"fullImage"} +]}}, { + "type":"struct", + "content": { + "name":"FastThumb", +"doc":[ +"Fast thumb of media messages. Less than 90x90 and compressed by JPEG with low quality",{"type":"reference","argument":"w","category":"full","description":" Width of thumb"},{"type":"reference","argument":"h","category":"full","description":" Height of thump"},{"type":"reference","argument":"thumb","category":"compact","description":" compressed image data"}],"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"bytes","id":3,"name":"thumb"} +]}}, { + "type": "enum", + "content": { + "name": "Colors", + "values": [ + { + "name": "red", + "id": 1 + }, + { + "name": "yellow", + "id": 2 + }, + { + "name": "green", + "id": 3 } - }, - "id": 6, - "name": "groupPeers" - }] - }, - "doc": [ - "Loading history of chat", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer of conversation" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": "start date of messages for loading or 0 for loading from start" - }, { - "type": "reference", - "argument": "loadMode", - "category": "full", - "description": "Loading mode: Forward loading, backward or both ways" - }, { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "maximum amount of messages (max is 100)" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "ListLoadMode" - } - }, - "id": 5, - "name": "loadMode" - }, { - "type": "int32", - "id": 4, - "name": "limit" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 6, - "name": "optimizations" - }] - } - }, { - "type": "struct", - "content": { - "name": "Dialog", - "doc": [ - "Conversation from history", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer of conversation" - }, { - "type": "reference", - "argument": "unreadCount", - "category": "full", - "description": " plain messages unread messages count" - }, { - "type": "reference", - "argument": "sortDate", - "category": "full", - "description": " date of conversation for sorting" - }, { - "type": "reference", - "argument": "senderUid", - "category": "full", - "description": " Sender of top message (may be zero)" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random ID of top message (may be zero)" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of top message (can't be zero)" - }, { - "type": "reference", - "argument": "message", - "category": "full", - "description": " Content of message" - }, { - "type": "reference", - "argument": "firstUnreadDate", - "category": "full", - "description": " Date of first unread message" - }, { - "type": "reference", - "argument": "attributes", - "category": "full", - "description": " Optional top message attributes" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": "int32", - "id": 3, - "name": "unreadCount" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "sortDate" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 5, - "name": "senderUid" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 6, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 7, - "name": "date" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 8, - "name": "message" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "MessageState" - } - }, - "id": 9, - "name": "state" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "date" - } - }, - "id": 10, - "name": "firstUnreadDate" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MessageAttributes" - } - }, - "id": 11, - "name": "attributes" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadDialogs", - "header": 104, - "response": { - "type": "anonymous", - "header": 105, - "doc": [ - "Loaded dialogs", { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Loaded groups" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - }, { - "type": "reference", - "argument": "dialogs", - "category": "compact", - "description": " Loaded dialogs" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" + ] + } + },{"type":"trait","content":{ +"isContainer":"true","name":"Color","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"RgbColor", +"doc":[ +"RGB Color",{"type":"reference","argument":"rgb","category":"full","description":" RGB color value"}],"trait":{"name":"Color","key":1},"expandable":"true","attributes":[ +{"type":"int32","id":1,"name":"rgb"} +]}}, { + "type":"struct", + "content": { + "name":"PredefinedColor", +"doc":[ +"Predefined color",{"type":"reference","argument":"color","category":"hidden","description":" Predefined color value"}],"trait":{"name":"Color","key":2},"expandable":"true","attributes":[ +{"type":{"type":"enum","childType":"Colors"},"id":1,"name":"color"} +]}},{"type":"empty"}, { + "type":"struct", + "content": { + "name":"HTTPHeader", +"doc":[ +"HTTP Header record",{"type":"reference","argument":"key","category":"full","description":" HTTP Header name"},{"type":"reference","argument":"value","category":"full","description":" HTTP Header value"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":"string","id":2,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"FileUrlDescription", +"doc":[ +"File url description",{"type":"reference","argument":"fileId","category":"full","description":" File id of url"},{"type":"reference","argument":"url","category":"full","description":" Url for downloading"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url"},{"type":"reference","argument":"unsignedUrl","category":"hidden","description":" Unsigned URL (used to honor web caches)"},{"type":"reference","argument":"unsignedUrlHeaders","category":"hidden","description":" Headers that is required to download files with unsigned url"}],"attributes":[ +{"type":"int64","id":1,"name":"fileId"} +,{"type":"string","id":2,"name":"url"} +,{"type":{"type":"alias","childType":"sec"},"id":3,"name":"timeout"} +,{"type":{"type":"opt","childType":"string"},"id":4,"name":"unsignedUrl"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"HTTPHeader"}},"id":5,"name":"unsignedUrlHeaders"} +]}},{"type":"rpc","content":{ +"name":"GetFileUrl", +"header":77, +"response":{"type":"anonymous","header":78, "doc":[ +{"type":"reference","argument":"url","category":"full","description":" Url for downloading"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url"},{"type":"reference","argument":"unsignedUrl","category":"full","description":" Unsigned URL (used to honor web caches)"},{"type":"reference","argument":"unsignedUrlHeaders","category":"full","description":" Headers that is required to download files with unsigned url"}] ,"attributes":[{"type":"string","id":1,"name":"url"} +,{"type":{"type":"alias","childType":"sec"},"id":2,"name":"timeout"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"unsignedUrl"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"HTTPHeader"}},"id":4,"name":"unsignedUrlHeaders"} +]}, +"doc":[ +"Requesting file URL for downloading",{"type":"reference","argument":"file","category":"full","description":"file's location"}],"attributes":[ +{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"file"} +]}},{"type":"rpc","content":{ +"name":"GetFileUrls", +"header":2573, +"response":{"type":"anonymous","header":2574, "doc":[ +{"type":"reference","argument":"fileUrls","category":"full","description":" File urls"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"FileUrlDescription"}},"id":1,"name":"fileUrls"} +]}, +"doc":[ +"Requesting multiple fle URL for downloading",{"type":"reference","argument":"files","category":"hidden","description":"File locations to load urls"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"FileLocation"}},"id":1,"name":"files"} +]}},{"type":"rpc","content":{ +"name":"GetFileUrlBuilder", +"header":2579, +"response":{"type":"anonymous","header":2580, "doc":[ +{"type":"reference","argument":"baseUrl","category":"full","description":" Base Url for files"},{"type":"reference","argument":"algo","category":"full","description":" Signature algorithm"},{"type":"reference","argument":"seed","category":"full","description":" Public-visible seed of signature"},{"type":"reference","argument":"signatureSecret","category":"full","description":" Signature Secret"},{"type":"reference","argument":"timeout","category":"full","description":" Timeout of url builder"}] ,"attributes":[{"type":"string","id":1,"name":"baseUrl"} +,{"type":"string","id":2,"name":"algo"} +,{"type":"string","id":5,"name":"seed"} +,{"type":"bytes","id":3,"name":"signatureSecret"} +,{"type":{"type":"alias","childType":"sec"},"id":4,"name":"timeout"} +]}, +"doc":[ +"Get File URL Builder that allows to build file urls from client side",{"type":"reference","argument":"supportedSignatureAlgorithms","category":"hidden","description":"Supported signature algorithms by client"}],"attributes":[ +{"type":{"type":"list","childType":"string"},"id":1,"name":"supportedSignatureAlgorithms"} +]}},{"type":"rpc","content":{ +"name":"GetFileUploadUrl", +"header":97, +"response":{"type":"anonymous","header":121, "doc":[ +{"type":"reference","argument":"url","category":"full","description":" Url for uploading"},{"type":"reference","argument":"uploadKey","category":"compact","description":" Upload key for upload"}] ,"attributes":[{"type":"string","id":1,"name":"url"} +,{"type":"bytes","id":2,"name":"uploadKey"} +]}, +"doc":[ +"Requesting pload url",{"type":"reference","argument":"expectedSize","category":"full","description":"Expected size of uploading file. May be inaccurate. Used for size allocation optimizations."}],"attributes":[ +{"type":"int32","id":1,"name":"expectedSize"} +]}},{"type":"rpc","content":{ +"name":"CommitFileUpload", +"header":122, +"response":{"type":"anonymous","header":138, "doc":[ +{"type":"reference","argument":"uploadedFileLocation","category":"hidden","description":" Result file location"}] ,"attributes":[{"type":{"type":"struct","childType":"FileLocation"},"id":1,"name":"uploadedFileLocation"} +]}, +"doc":[ +"Comminting uploaded file to storage"],"attributes":[ +{"type":"bytes","id":1,"name":"uploadKey"} +,{"type":"string","id":2,"name":"fileName"} +]}},{"type":"rpc","content":{ +"name":"GetFileUploadPartUrl", +"header":142, +"response":{"type":"anonymous","header":141, "doc":[ +{"type":"reference","argument":"url","category":"full","description":" Upload file part url"}] ,"attributes":[{"type":"string","id":1,"name":"url"} +]}, +"doc":[ +"Upload file part",{"type":"reference","argument":"uploadKey","category":"compact","description":"Upload Key from requestFileUploadUrl"}],"attributes":[ +{"type":"int32","id":1,"name":"partNumber"} +,{"type":"int32","id":2,"name":"partSize"} +,{"type":"bytes","id":3,"name":"uploadKey"} +]}}]}, { + "title": "Features", + "package": "features", + "doc": [ + "Enable feature discovery. Currently available features:", + "* \"call\" - private audio calls" + ], + "items": [ +{"type":"rpc","content":{ +"name":"EnableFeature", +"header":2588, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Enabling feature on the device",{"type":"reference","argument":"featureName","category":"full","description":"Feature name"},{"type":"reference","argument":"args","category":"danger","description":"Optional arguments to a feature"}],"attributes":[ +{"type":"string","id":1,"name":"featureName"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"args"} +]}},{"type":"rpc","content":{ +"name":"DisableFeature", +"header":2589, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Disabling feature on the device",{"type":"reference","argument":"featureName","category":"full","description":"Feature name"}],"attributes":[ +{"type":"string","id":1,"name":"featureName"} +]}},{"type":"rpc","content":{ +"name":"CheckFeatureEnabled", +"header":2590, +"response":{"type":"reference","name":"Bool"}, +"doc":[ +"Method for checking if feature is available to user"],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userOutPeer"} +,{"type":"string","id":2,"name":"featureName"} +]}}]}, { + "title": "EventBus", + "package": "eventbus", + "items": [ +{"type":"rpc","content":{ +"name":"CreateNewEventBus", +"header":2665, +"response":{"type":"anonymous","header":2666, "doc":[ +"Created new Event Bus",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Your Device Id"}] ,"attributes":[{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"deviceId"} +]}, +"doc":[ +"Create new Event Bus",{"type":"reference","argument":"timeout","category":"full","description":"Optional timeout of Event Bus"},{"type":"reference","argument":"isOwned","category":"full","description":"Is Event Bus owned by creator"}],"attributes":[ +{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":1,"name":"timeout"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isOwned"} +]}},{"type":"rpc","content":{ +"name":"JoinEventBus", +"header":2668, +"response":{"type":"anonymous","header":2669, "doc":[ +{"type":"reference","argument":"deviceId","category":"full","description":" Your Device Id"},{"type":"reference","argument":"rejoinToken","category":"full","description":" Token that can be used for rejoining event bus with same device id"}] ,"attributes":[{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"deviceId"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"rejoinToken"} +]}, +"doc":[ +"Joining Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"timeout","category":"full","description":"Join timeout"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} +]}},{"type":"rpc","content":{ +"name":"ReJoinEventBus", +"header":2675, +"response":{"type":"anonymous","header":2676, "doc":[ +{"type":"reference","argument":"deviceId","category":"hidden","description":" Your Device Id"}] ,"attributes":[{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"deviceId"} +]}, +"doc":[ +"Rejoining to event bus after session was disposed",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"rejoinToken","category":"full","description":"Rejoin Token"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":"bytes","id":2,"name":"rejoinToken"} +]}},{"type":"rpc","content":{ +"name":"KeepAliveEventBus", +"header":2670, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Keep Alive Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"},{"type":"reference","argument":"timeout","category":"full","description":"Optional timeout for keep alive"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} +]}},{"type":"rpc","content":{ +"name":"DisposeEventBus", +"header":2667, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Dispose Event Bus",{"type":"reference","argument":"id","category":"full","description":"Event Bus Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +]}},{"type":"rpc","content":{ +"name":"PostToEventBus", +"header":2671, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Event Bus Destination",{"type":"reference","argument":"id","category":"full","description":"Bus Id"},{"type":"reference","argument":"destinations","category":"full","description":"If Empty need to broadcase message to everyone"},{"type":"reference","argument":"message","category":"hidden","description":"Message"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"destinations"} +,{"type":"bytes","id":3,"name":"message"} +]}},{"type":"update","content":{ +"name":"EventBusDeviceConnected", +"header":2561, +"doc":[ +"Update about pubsub device connected",{"type":"reference","argument":"id","category":"full","description":" ID of Event Bus"},{"type":"reference","argument":"userId","category":"full","description":" Joined User Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Joined Device Unique Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"userId"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} +]}},{"type":"update","content":{ +"name":"EventBusDeviceDisconnected", +"header":2563, +"doc":[ +"Update about device disconnected",{"type":"reference","argument":"id","category":"full","description":" ID of Event Bus"},{"type":"reference","argument":"userId","category":"full","description":" Joined User Id"},{"type":"reference","argument":"deviceId","category":"full","description":" Disconnected Device unique Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"userId"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} +]}},{"type":"update","content":{ +"name":"EventBusMessage", +"header":2562, +"doc":[ +"Event Bus Message",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"senderId","category":"full","description":" Sender of message"},{"type":"reference","argument":"senderDeviceId","category":"full","description":" Device Id of sender"},{"type":"reference","argument":"message","category":"hidden","description":" Message"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"userId"}},"id":2,"name":"senderId"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"randomId"}},"id":3,"name":"senderDeviceId"} +,{"type":"bytes","id":4,"name":"message"} +]}},{"type":"update","content":{ +"name":"EventBusDisposed", +"header":2564, +"doc":[ +"Event Bus dispose",{"type":"reference","argument":"id","category":"full","description":" Event Bus Id"}],"attributes":[ +{"type":{"type":"alias","childType":"busId"},"id":1,"name":"id"} +]}}]}, { + "title": "Values", + "package": "values", + "doc": [ + "Synced Values" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"SyncedValue", +"doc":[ +"Synced Value container",{"type":"reference","argument":"id","category":"full","description":" Unique Id of a value. Unique in the scope of one named value."},{"type":"reference","argument":"value","category":"full","description":" Optional value"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"id"} +,{"type":{"type":"opt","childType":"bytes"},"id":2,"name":"value"} +]}},{"type":"rpc","content":{ +"name":"LoadSyncedSet", +"header":2679, +"response":{"type":"anonymous","header":2680, "doc":[ +{"type":"reference","argument":"values","category":"full","description":" Current set values"},{"type":"reference","argument":"isStrong","category":"full","description":" Is this value strong and stored in sequence. By default is true."}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":1,"name":"values"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isStrong"} +]}, +"doc":[ +"Loading synced set",{"type":"reference","argument":"setName","category":"hidden","description":"readable name of the set"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +]}},{"type":"update","content":{ +"name":"SynedSetUpdated", +"header":72, +"doc":[ +"Update about synced set update",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"syncedValues","category":"full","description":" Current set values"},{"type":"reference","argument":"isStrong","category":"full","description":" Is this value strong and need to be stored on disk"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":2,"name":"syncedValues"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isStrong"} +]}},{"type":"update","content":{ +"name":"SyncedSetAddedOrUpdated", +"header":73, +"doc":[ +"Update about added or updated values in the synced set",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"addedOrUpdatedValues","category":"hidden","description":" Added or updated values"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"SyncedValue"}},"id":2,"name":"addedOrUpdatedValues"} +]}},{"type":"update","content":{ +"name":"SyncedSetRemoved", +"header":74, +"doc":[ +"Update about removed items from synced set",{"type":"reference","argument":"setName","category":"full","description":" Set Name"},{"type":"reference","argument":"removedItems","category":"full","description":" Removed Items from the set"}],"attributes":[ +{"type":"string","id":1,"name":"setName"} +,{"type":{"type":"list","childType":{"type":"alias","childType":"randomId"}},"id":2,"name":"removedItems"} +]}}]}, { + "title": "WebRTC", + "package": "webrtc", + "doc": [ + "WebRTC package that enables support to audio and video calls" + ], + "items": [ +{"type":"update","content":{ +"name":"IncomingCall", +"header":52, +"doc":[ +"Update about incoming call (Sent every 10 seconds)",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"attemptIndex","category":"full","description":" Optional attempt Index"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"opt","childType":"int32"},"id":2,"name":"attemptIndex"} +]}},{"type":"update","content":{ +"name":"CallHandled", +"header":53, +"doc":[ +"Update about incoming call handled",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"attemptIndex","category":"full","description":" Optional attempt Index"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"opt","childType":"int32"},"id":2,"name":"attemptIndex"} +]}},{"type":"update","content":{ +"name":"CallUpgraded", +"header":56, +"doc":[ +"Update about call moved to other peer",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"groupId","category":"full","description":" Upgraded group id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupId"} +]}},{"type":"rpc","content":{ +"name":"GetCallInfo", +"header":2600, +"response":{"type":"anonymous","header":2606, "doc":[ +{"type":"reference","argument":"peer","category":"full","description":" Destination peer"},{"type":"reference","argument":"groups","category":"compact","description":" Groups"},{"type":"reference","argument":"users","category":"compact","description":" Users"},{"type":"reference","argument":"eventBusId","category":"full","description":" Event Bus Id"},{"type":"reference","argument":"isAudioOnlyCall","category":"full","description":" Is Audio Only Call. Default is true"},{"type":"reference","argument":"isVideoOnlyCall","category":"full","description":" Is Video Only Call. Default is false."},{"type":"reference","argument":"isVideoPreferred","category":"full","description":" Is Video preferred"}] ,"attributes":[{"type":{"type":"struct","childType":"Peer"},"id":1,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":2,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":3,"name":"users"} +,{"type":{"type":"alias","childType":"busId"},"id":4,"name":"eventBusId"} +,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"isAudioOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isVideoOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":7,"name":"isVideoPreferred"} +]}, +"doc":[ +"Getting Call Information",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +]}},{"type":"rpc","content":{ +"name":"DoCall", +"header":2597, +"response":{"type":"anonymous","header":2598, "doc":[ +{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"eventBusId","category":"full","description":" Call Event Bus Id"}] ,"attributes":[{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"alias","childType":"busId"},"id":2,"name":"eventBusId"} +,{"type":{"type":"alias","childType":"randomId"},"id":3,"name":"deviceId"} +]}, +"doc":[ +"Do Call. Right after a call client need to start sending CallInProgress",{"type":"reference","argument":"peer","category":"full","description":"destination peer"},{"type":"reference","argument":"timeout","category":"full","description":"Initial timeout"},{"type":"reference","argument":"isAudioOnlyCall","category":"full","description":"Is Audio only call. Default is true."},{"type":"reference","argument":"isVideoOnlyCall","category":"full","description":"Is Video Only call. Default is false."},{"type":"reference","argument":"isVideoPreferred","category":"full","description":"Is Video preferred"}],"attributes":[ +{"type":{"type":"struct","childType":"OutPeer"},"id":1,"name":"peer"} +,{"type":{"type":"opt","childType":{"type":"alias","childType":"msec"}},"id":2,"name":"timeout"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"isAudioOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"isVideoOnlyCall"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"isVideoPreferred"} +]}},{"type":"rpc","content":{ +"name":"UpgradeCall", +"header":2677, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Method for upgrading a call from private call to group call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"},{"type":"reference","argument":"peer","category":"full","description":"Destination peer for upgrading"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"struct","childType":"GroupOutPeer"},"id":2,"name":"peer"} +]}},{"type":"rpc","content":{ +"name":"DoCallAgain", +"header":2678, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Call again to user",{"type":"reference","argument":"callId","category":"full","description":"Call Id"},{"type":"reference","argument":"user","category":"full","description":"User to call again"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"struct","childType":"UserOutPeer"},"id":2,"name":"user"} +]}},{"type":"rpc","content":{ +"name":"JoinCall", +"header":2683, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Joining Call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +]}},{"type":"rpc","content":{ +"name":"RejectCall", +"header":2684, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Rejecting Call",{"type":"reference","argument":"callId","category":"full","description":"Call Id"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +]}},{"type":"rpc","content":{ +"name":"OptimizeSDP", +"header":2685, +"response":{"type":"anonymous","header":2686, "doc":[ +{"type":"reference","argument":"optimizedSDP","category":"hidden","description":" Optimized version of SDP"}] ,"attributes":[{"type":"string","id":1,"name":"optimizedSDP"} +]}, +"doc":[ +"Optimizing SDP",{"type":"reference","argument":"type","category":"full","description":"Type of SDP (offer or answer)"},{"type":"reference","argument":"sdp","category":"full","description":"SDP value"},{"type":"reference","argument":"ownSettings","category":"full","description":"Own Settings"},{"type":"reference","argument":"theirSettings","category":"full","description":"Their Settings"}],"attributes":[ +{"type":"string","id":1,"name":"type"} +,{"type":"string","id":2,"name":"sdp"} +,{"type":{"type":"struct","childType":"PeerSettings"},"id":3,"name":"ownSettings"} +,{"type":{"type":"struct","childType":"PeerSettings"},"id":4,"name":"theirSettings"} +]}}, { + "type":"struct", + "content": { + "name":"ICEServer", +"doc":[ +"ICE Server description",{"type":"reference","argument":"url","category":"full","description":" Url to server"},{"type":"reference","argument":"username","category":"full","description":" Optional username"},{"type":"reference","argument":"credential","category":"danger","description":" Optional credential"}],"attributes":[ +{"type":"string","id":1,"name":"url"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"username"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"credential"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"WebRTCSignaling","attributes":[ +]}},{"type":"comment","content":"Advertising"}, { + "type":"struct", + "content": { + "name":"AdvertiseSelf", +"doc":[ +"Advertizing self to a master mode",{"type":"reference","argument":"peerSettings","category":"full","description":" Optional peer Settings"}],"trait":{"name":"WebRTCSignaling","key":21},"attributes":[ +{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":1,"name":"peerSettings"} +]}}, { + "type":"struct", + "content": { + "name":"AdvertiseMaster", +"doc":[ +"Sent by master"],"trait":{"name":"WebRTCSignaling","key":26},"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"ICEServer"}},"id":1,"name":"server"} +]}},{"type":"comment","content":"Web RTC signaling"}, { + "type":"struct", + "content": { + "name":"Candidate", +"doc":[ +"Candidate signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of candidate"},{"type":"reference","argument":"index","category":"full","description":" Index of candidate"},{"type":"reference","argument":"id","category":"full","description":" Id of candidate"},{"type":"reference","argument":"sdp","category":"full","description":" SDP of candidate"}],"trait":{"name":"WebRTCSignaling","key":3},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} +,{"type":"int32","id":2,"name":"index"} +,{"type":"string","id":3,"name":"id"} +,{"type":"string","id":4,"name":"sdp"} +]}}, { + "type":"struct", + "content": { + "name":"Offer", +"doc":[ +"Offer signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of offer"},{"type":"reference","argument":"sdp","category":"full","description":" Offer SDP"},{"type":"reference","argument":"ownPeerSettings","category":"full","description":" Optional Own Peer settings"}],"trait":{"name":"WebRTCSignaling","key":4},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} +,{"type":"string","id":2,"name":"sdp"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":3,"name":"ownPeerSettings"} +]}}, { + "type":"struct", + "content": { + "name":"Answer", +"doc":[ +"Answer signal",{"type":"reference","argument":"sessionId","category":"full","description":" Session Id of answer"},{"type":"reference","argument":"sdp","category":"full","description":" Answer SDP"}],"trait":{"name":"WebRTCSignaling","key":5},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"sessionId"} +,{"type":"string","id":2,"name":"sdp"} +]}}, { + "type":"struct", + "content": { + "name":"MediaStreamsUpdated", +"doc":[ +"Update about media stream settings updated. Can be sent before offer/answer.",{"type":"reference","argument":"isAudioEnabled","category":"full","description":" Is Audio Enabled in current connection. True by default."},{"type":"reference","argument":"isVideoEnabled","category":"full","description":" Is Video Enabled in current connection. False by default."}],"trait":{"name":"WebRTCSignaling","key":28},"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"isAudioEnabled"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isVideoEnabled"} +]}},{"type":"comment","content":"Call Controlling events"}, { + "type":"struct", + "content": { + "name":"NeedOffer", +"doc":[ +"Notification from master that offer is required",{"type":"reference","argument":"device","category":"full","description":" Destination Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"},{"type":"reference","argument":"peerSettings","category":"full","description":" Optional peer settings"}],"trait":{"name":"WebRTCSignaling","key":8},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +,{"type":{"type":"opt","childType":{"type":"struct","childType":"PeerSettings"}},"id":3,"name":"peerSettings"} +]}}, { + "type":"struct", + "content": { + "name":"NegotinationSuccessful", +"doc":[ +"Notification about on negotiation is successful",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":24},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"EnableConnection", +"doc":[ +"Notification about enabling connection to peer",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":22},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"OnRenegotiationNeeded", +"doc":[ +"Need renegotiate session. For example when streams are changed.",{"type":"reference","argument":"device","category":"full","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id"}],"trait":{"name":"WebRTCSignaling","key":25},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"CloseSession", +"doc":[ +"Close this session and be ready to",{"type":"reference","argument":"device","category":"hidden","description":" Device Id"},{"type":"reference","argument":"sessionId","category":"full","description":" Session Id for renegotiation"}],"trait":{"name":"WebRTCSignaling","key":6},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +,{"type":{"type":"alias","childType":"randomId"},"id":2,"name":"sessionId"} +]}}, { + "type":"struct", + "content": { + "name":"NeedDisconnect", +"doc":[ +"Notification about requirement about required disconnection from peer",{"type":"reference","argument":"device","category":"hidden","description":" Device Id"}],"trait":{"name":"WebRTCSignaling","key":20},"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"device"} +]}}, { + "type":"struct", + "content": { + "name":"ActiveCall", +"doc":[ +"Active Calls. Used in broadcasting states of current calls.",{"type":"reference","argument":"callId","category":"full","description":" Call Id"},{"type":"reference","argument":"peer","category":"full","description":" Call's peer"},{"type":"reference","argument":"callMembers","category":"full","description":" Call Members"}],"attributes":[ +{"type":"int64","id":1,"name":"callId"} +,{"type":{"type":"struct","childType":"Peer"},"id":2,"name":"peer"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"CallMember"}},"id":3,"name":"callMembers"} +]}}, { + "type": "enum", + "content": { + "name": "CallMemberState", + "values": [ + { + "name": "RINGING", + "id": 1 + }, + { + "name": "RINGING_REACHED", + "id": 4 + }, + { + "name": "CONNECTING", + "id": 2 + }, + { + "name": "CONNECTED", + "id": 3 + }, + { + "name": "ENDED", + "id": 5 } - }, - "id": 1, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" + ] + } + }, { + "type":"struct", + "content": { + "name":"CallMemberStateHolder", +"doc":[ +"Call Member state holder",{"type":"reference","argument":"state","category":"full","description":" State Value"},{"type":"reference","argument":"fallbackIsRinging","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsConnected","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsConnecting","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsRingingReached","category":"full","description":" Fallback flag for future compatibility of state"},{"type":"reference","argument":"fallbackIsEnded","category":"full","description":" Fallback flag for future compatibility of state"}],"attributes":[ +{"type":{"type":"enum","childType":"CallMemberState"},"id":1,"name":"state"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"fallbackIsRinging"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"fallbackIsConnected"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"fallbackIsConnecting"} +,{"type":{"type":"opt","childType":"bool"},"id":5,"name":"fallbackIsRingingReached"} +,{"type":{"type":"opt","childType":"bool"},"id":6,"name":"fallbackIsEnded"} +]}}, { + "type":"struct", + "content": { + "name":"CallMember", +"doc":[ +"Call Member",{"type":"reference","argument":"userId","category":"full","description":" Member User Id"},{"type":"reference","argument":"state","category":"full","description":" State of member"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"userId"} +,{"type":{"type":"struct","childType":"CallMemberStateHolder"},"id":3,"name":"state"} +]}}, { + "type":"struct", + "content": { + "name":"PeerSettings", +"doc":[ +"Peer Settings",{"type":"reference","argument":"is3DESSupported","category":"full","description":" Marking if 3DES supported. Default is false."},{"type":"reference","argument":"isMobile","category":"full","description":" Is Peer a mobile phone. Default is false."},{"type":"reference","argument":"canBeAudioRelay","category":"full","description":" If peer can audio relay. Default is false."},{"type":"reference","argument":"canPreConnect","category":"full","description":" If peer can preconnect before answer"}],"attributes":[ +{"type":{"type":"opt","childType":"bool"},"id":1,"name":"is3DESSupported"} +,{"type":{"type":"opt","childType":"bool"},"id":2,"name":"isMobile"} +,{"type":{"type":"opt","childType":"bool"},"id":3,"name":"canBeAudioRelay"} +,{"type":{"type":"opt","childType":"bool"},"id":4,"name":"canPreConnect"} +]}}]}, { + "title": "Config sync", + "package": "configs", + "doc": [ + "Parameter Syncronization across devices. Can be used for simple sync", + "across devices without rewriting server side code." + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Parameter", +"doc":[ +"Syncing Parameter",{"type":"reference","argument":"key","category":"full","description":" Key of parameter"},{"type":"reference","argument":"value","category":"full","description":" Value of parameter"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":"string","id":2,"name":"value"} +]}},{"type":"rpc","content":{ +"name":"GetParameters", +"header":134, +"response":{"type":"anonymous","header":135, "doc":[ +{"type":"reference","argument":"parameters","category":"full","description":" Current parameters"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Parameter"}},"id":1,"name":"parameters"} +]}, +"doc":[ +"Getting Parameters"],"attributes":[ +]}},{"type":"rpc","content":{ +"name":"EditParameter", +"header":128, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Change parameter value",{"type":"reference","argument":"key","category":"full","description":"Key of parameter"},{"type":"reference","argument":"value","category":"full","description":"Value of parameter"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"value"} +]}},{"type":"update","content":{ +"name":"ParameterChanged", +"header":131, +"doc":[ +"Update about parameter change",{"type":"reference","argument":"key","category":"full","description":" Key of parameter"},{"type":"reference","argument":"value","category":"full","description":" Value of parameter"}],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"value"} +]}}]}, { + "title": "Stats", + "package": "stats", + "doc": [ + "Saving statistics information" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"EventRecord", +"doc":[ +"Record for stored event"],"attributes":[ +{"type":{"type":"alias","childType":"date"},"id":1,"name":"date"} +,{"type":{"type":"trait","childType":"Event"},"id":2,"name":"event"} +]}},{"type":"trait","content":{ +"isContainer":"true","name":"Event","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"UntypedEvent", +"doc":[ +"Untyped event",{"type":"reference","argument":"eventType","category":"full","description":" Event type"},{"type":"reference","argument":"params","category":"full","description":" optional params for event"}],"trait":{"name":"Event","key":1},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"eventType"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":2,"name":"params"} +]}}, { + "type":"struct", + "content": { + "name":"ContentViewChanged", +"doc":[ +"Content view event",{"type":"reference","argument":"contentType","category":"full","description":" unique content id"},{"type":"reference","argument":"visible","category":"full","description":" Is content visible"},{"type":"reference","argument":"params","category":"full","description":" optional params for content view"}],"trait":{"name":"Event","key":2},"expandable":"true","attributes":[ +{"type":"string","id":1,"name":"contentType"} +,{"type":"string","id":2,"name":"contentId"} +,{"type":"bool","id":3,"name":"visible"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":4,"name":"params"} +]}}, { + "type":"struct", + "content": { + "name":"AppVisibleChanged", +"doc":[ +"On App Visible event",{"type":"reference","argument":"visible","category":"full","description":" Is app visible"}],"trait":{"name":"Event","key":4},"expandable":"true","attributes":[ +{"type":"bool","id":1,"name":"visible"} +]}},{"type":"rpc","content":{ +"name":"StoreEvents", +"header":243, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Storing events on server",{"type":"reference","argument":"events","category":"full","description":"Events for storing"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"Event"}},"id":1,"name":"events"} +]}}]}, { + "title": "Raw API", + "package": "raw", + "doc": [ + "Schema-less API that is useful for external integrations" + ], + "items": [ +{"type":"rpc","content":{ +"name":"RawRequest", +"header":2569, +"response":{"type":"anonymous","header":2570, "doc":[ +"Response of a raw request",{"type":"reference","argument":"result","category":"full","description":" Result of request"}] ,"attributes":[{"type":{"type":"trait","childType":"RawValue"},"id":1,"name":"result"} +]}, +"doc":[ +"Making raw request to external service via shema-less RPC request",{"type":"reference","argument":"service","category":"full","description":"Service name for RPC request"},{"type":"reference","argument":"method","category":"full","description":"Method for execution"},{"type":"reference","argument":"params","category":"full","description":"Optional params for the method"}],"attributes":[ +{"type":"string","id":1,"name":"service"} +,{"type":"string","id":2,"name":"method"} +,{"type":{"type":"opt","childType":{"type":"trait","childType":"RawValue"}},"id":3,"name":"params"} +]}}]}, { + "title": "Wallpappers", + "package": "wallpappers", + "doc": [ + "Wallpappers support" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Wallpapper", +"doc":[ +"Wallpapper structure",{"type":"reference","argument":"id","category":"full","description":" Wallpapper id"},{"type":"reference","argument":"w","category":"full","description":" Image width"},{"type":"reference","argument":"h","category":"full","description":" Image height"},{"type":"reference","argument":"fileSize","category":"full","description":" Image file size"},{"type":"reference","argument":"file","category":"full","description":" Image file reference"},{"type":"reference","argument":"thumb","category":"full","description":" Image thumb"}],"attributes":[ +{"type":"int32","id":7,"name":"id"} +,{"type":"int32","id":1,"name":"w"} +,{"type":"int32","id":2,"name":"h"} +,{"type":"int32","id":3,"name":"fileSize"} +,{"type":{"type":"struct","childType":"FileLocation"},"id":5,"name":"file"} +,{"type":{"type":"struct","childType":"FastThumb"},"id":6,"name":"thumb"} +]}},{"type":"rpc","content":{ +"name":"LoadWallpappers", +"header":241, +"response":{"type":"anonymous","header":242, "doc":[ +"Loaded Wallpappers",{"type":"reference","argument":"wallpappers","category":"full","description":" Available wallpapper list"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Wallpapper"}},"id":1,"name":"wallpappers"} +]}, +"doc":[ +"Load available wallpappers",{"type":"reference","argument":"maxWidth","category":"full","description":"Maximum width of wallpapper"},{"type":"reference","argument":"maxHeight","category":"full","description":"Maximum height of wallpapper"}],"attributes":[ +{"type":"int32","id":1,"name":"maxWidth"} +,{"type":"int32","id":2,"name":"maxHeight"} +]}}]}, { + "title": "Push", + "package": "push", + "doc": [ + "Vendor's pushes for receiving push notifications.", + "Push notification contains current sequence number of main sequence." + ], + "items": [ +{"type":"rpc","content":{ +"name":"RegisterGooglePush", +"header":51, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registering push token on server",{"type":"reference","argument":"projectId","category":"hidden","description":"Project Id of token"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ +{"type":"int64","id":1,"name":"projectId"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterGooglePush", +"header":2631, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregistering Google Push",{"type":"reference","argument":"token","category":"danger","description":"Token value"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterApplePush", +"header":76, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registering apple push on server",{"type":"reference","argument":"apnsKey","category":"hidden","description":"apns key id"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ +{"type":"int32","id":1,"name":"apnsKey"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterApplePush", +"header":2632, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregistering Apple Push",{"type":"reference","argument":"token","category":"full","description":"Token"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterApplePushKit", +"header":2576, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registration of a new Apple's PushKit tokens",{"type":"reference","argument":"apnsKey","category":"hidden","description":"APNS key id"},{"type":"reference","argument":"token","category":"danger","description":"token value"}],"attributes":[ +{"type":"int32","id":1,"name":"apnsKey"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterApplePushKit", +"header":2633, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregistering Apple Push Kit token",{"type":"reference","argument":"token","category":"hidden","description":"Token Value"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterApplePushToken", +"header":2593, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Registering Apple Push Token",{"type":"reference","argument":"bundleId","category":"full","description":"Bundle Id of app"},{"type":"reference","argument":"token","category":"full","description":"Push token"}],"attributes":[ +{"type":"string","id":1,"name":"bundleId"} +,{"type":"string","id":2,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"UnregisterApplePushToken", +"header":2634, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregister Apple Push token",{"type":"reference","argument":"token","category":"hidden","description":"Token value"}],"attributes":[ +{"type":"string","id":1,"name":"token"} +]}},{"type":"rpc","content":{ +"name":"RegisterActorPush", +"header":2575, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Register Actor Push endpoint",{"type":"reference","argument":"endpoint","category":"full","description":"Endpoint for push sending"},{"type":"reference","argument":"encryptionKeys","category":"full","description":"Push Encryption keys"}],"attributes":[ +{"type":"string","id":1,"name":"endpoint"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":2,"name":"encryptionKeys"} +]}},{"type":"rpc","content":{ +"name":"UnregisterActorPush", +"header":2635, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Unregister Actor Push endpoint",{"type":"reference","argument":"endpoint","category":"full","description":"Endpoint for unregistering"}],"attributes":[ +{"type":"string","id":1,"name":"endpoint"} +]}}]}, { + "title": "Encryption", + "package": "encryption", + "doc": [ + "Package that include encryption support", + "Key alg types:", + "* curve25519 - https://en.wikipedia.org/wiki/Curve25519", + "* rsa-2048", + "* rsa-4096", + "* aes-128", + "* kuznechik-128", + "", + "Signature alg types:", + "* Ed25519 - used curve25519 conveted to Ed255519 for signing and validataion" + ], + "items": [ +{"type":"comment","content":"Public Keys"}, { + "type":"struct", + "content": { + "name":"EncryptionKeyGroup", +"doc":[ +"Encryption Key Group",{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"identityKey","category":"full","description":" Key that is used as identity and for validation of Key Group changes"},{"type":"reference","argument":"supportedEncryption","category":"full","description":" Supported encryption methods by this key group"},{"type":"reference","argument":"keys","category":"compact","description":" keys of Key Group"},{"type":"reference","argument":"signatures","category":"compact","description":" Signatures of keys"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +,{"type":{"type":"list","childType":"string"},"id":2,"name":"supportedEncryption"} +,{"type":{"type":"struct","childType":"EncryptionKey"},"id":3,"name":"identityKey"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":4,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":5,"name":"signatures"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptionKeySignature", +"doc":[ +"Signed Key. Usually used for public keys.",{"type":"reference","argument":"keyId","category":"full","description":" Key Id used for signature"},{"type":"reference","argument":"signatureAlg","category":"full","description":" Signature algorithm"},{"type":"reference","argument":"signature","category":"full","description":" Signature value"}],"attributes":[ +{"type":"int64","id":1,"name":"keyId"} +,{"type":"string","id":2,"name":"signatureAlg"} +,{"type":"bytes","id":3,"name":"signature"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptionKey", +"doc":[ +"Encryption Key",{"type":"reference","argument":"keyId","category":"full","description":" Key Id"},{"type":"reference","argument":"keyAlg","category":"full","description":" Key Algorithm"},{"type":"reference","argument":"keyMaterial","category":"compact","description":" Public key material. Can be null, but always not null for LoadPublicKey"},{"type":"reference","argument":"keyHash","category":"hidden","description":" If keyMaterial is null, pass keyHash - SHA256 of key"}],"expandable":"true","attributes":[ +{"type":"int64","id":1,"name":"keyId"} +,{"type":"string","id":2,"name":"keyAlg"} +,{"type":{"type":"opt","childType":"bytes"},"id":3,"name":"keyMaterial"} +,{"type":{"type":"opt","childType":"bytes"},"id":4,"name":"keyHash"} +]}},{"type":"response","content":{ +"name":"PublicKeys", +"header":2602, +"doc":[ +"Public Keys response",{"type":"reference","argument":"publicKey","category":"full","description":" Public keys"},{"type":"reference","argument":"signatures","category":"full","description":" Signatures of public keys"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":1,"name":"publicKey"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":2,"name":"signatures"} +]}},{"type":"response","content":{ +"name":"PublicKeyGroups", +"header":2604, +"doc":[ +"Public key groups response"],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeyGroup"}},"id":1,"name":"publicKeyGroups"} +]}},{"type":"rpc","content":{ +"name":"LoadPublicKeyGroups", +"header":2601, +"response":{"type":"reference","name":"PublicKeyGroups"}, +"doc":[ +"Loading Public key groups",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} +]}},{"type":"rpc","content":{ +"name":"LoadPublicKey", +"header":2605, +"response":{"type":"reference","name":"PublicKeys"}, +"doc":[ +"Loading public key explictly",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"},{"type":"reference","argument":"keyGroupId","category":"full","description":"Key group's id"},{"type":"reference","argument":"keyIds","category":"full","description":"Key ids for loading"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} +,{"type":"int32","id":2,"name":"keyGroupId"} +,{"type":{"type":"list","childType":"int64"},"id":3,"name":"keyIds"} +]}},{"type":"rpc","content":{ +"name":"LoadPrePublicKeys", +"header":2603, +"response":{"type":"reference","name":"PublicKeys"}, +"doc":[ +"Loading SOME of ephermal public keys",{"type":"reference","argument":"userPeer","category":"full","description":"User's peer"},{"type":"reference","argument":"keyGroupId","category":"full","description":"User's key group id"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"userPeer"} +,{"type":"int32","id":2,"name":"keyGroupId"} +]}},{"type":"update","content":{ +"name":"PublicKeyGroupChanged", +"header":103, +"doc":[ +"Update about public key group changed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Updated Key Group"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} +]}},{"type":"update","content":{ +"name":"KeysAdded", +"header":112, +"doc":[ +"Update about keys added to Key Group",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"keys","category":"compact","description":" Added keys"},{"type":"reference","argument":"signatures","category":"compact","description":" Signatures of a public key"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":3,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":4,"name":"signatures"} +]}},{"type":"update","content":{ +"name":"KeysRemoved", +"header":113, +"doc":[ +"Update about keys removed from Key Group",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"keyIds","category":"full","description":" Removed keys"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +,{"type":{"type":"list","childType":"int64"},"id":3,"name":"keyIds"} +]}},{"type":"update","content":{ +"name":"PublicKeyGroupAdded", +"header":104, +"doc":[ +"Update about public key group added",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Added Key Group"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} +]}},{"type":"update","content":{ +"name":"PublicKeyGroupRemoved", +"header":105, +"doc":[ +"Update about public key group removed",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Removed Key Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +]}},{"type":"comment","content":"Device Side"},{"type":"rpc","content":{ +"name":"CreateNewKeyGroup", +"header":2609, +"response":{"type":"anonymous","header":2610, "doc":[ +{"type":"reference","argument":"keyGroupId","category":"full","description":" Created Key Group id"}] ,"attributes":[{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}, +"doc":[ +"Creation of a new Key Group",{"type":"reference","argument":"identityKey","category":"full","description":"Identity Key of a new group"},{"type":"reference","argument":"supportedEncryptions","category":"full","description":"Supported encryption methods"},{"type":"reference","argument":"keys","category":"full","description":"keys of current group"},{"type":"reference","argument":"signatures","category":"full","description":"signatures of keys"}],"attributes":[ +{"type":{"type":"struct","childType":"EncryptionKey"},"id":1,"name":"identityKey"} +,{"type":{"type":"list","childType":"string"},"id":2,"name":"supportedEncryptions"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":3,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":4,"name":"signatures"} +]}},{"type":"rpc","content":{ +"name":"DeleteKeyGroup", +"header":2611, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Deletion of a Key Group",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for deletion"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}},{"type":"rpc","content":{ +"name":"DisconnectKeyGroup", +"header":2613, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Disconnect Key Group from device",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for disconnection"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}},{"type":"rpc","content":{ +"name":"ConnectKeyGroup", +"header":2614, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Connectiong Key Group to device",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id for connection"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +]}},{"type":"rpc","content":{ +"name":"UploadPreKey", +"header":2612, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Uploading Ephermal Keys",{"type":"reference","argument":"keyGroupId","category":"full","description":"Key Group Id"},{"type":"reference","argument":"keys","category":"compact","description":"Encryprion keys"},{"type":"reference","argument":"signatures","category":"compact","description":"Key signatures"}],"attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":1,"name":"keyGroupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKey"}},"id":2,"name":"keys"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptionKeySignature"}},"id":3,"name":"signatures"} +]}},{"type":"comment","content":"Encrypted Packages"}, { + "type":"struct", + "content": { + "name":"EncryptedBox", +"doc":[ +"Encrypted package that is encrypted for multiple keys",{"type":"reference","argument":"keys","category":"full","description":" Encrypted encryption keys"},{"type":"reference","argument":"algType","category":"full","description":" Package encryption type"},{"type":"reference","argument":"encPackage","category":"full","description":" Encrypted package"},{"type":"reference","argument":"senderKeyGroupId","category":"full","description":" Sender key group"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"keyGroupId"},"id":4,"name":"senderKeyGroupId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncyptedBoxKey"}},"id":1,"name":"keys"} +,{"type":"string","id":2,"name":"algType"} +,{"type":"bytes","id":3,"name":"encPackage"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"EncryptedBoxSignature"}},"id":5,"name":"signatures"} +]}}, { + "type":"struct", + "content": { + "name":"EncryptedBoxSignature", +"doc":[ +"Signature for encrypted package",{"type":"reference","argument":"algType","category":"full","description":" Alg Type"},{"type":"reference","argument":"signature","category":"full","description":" Signature of encrypted package"}],"attributes":[ +{"type":"string","id":1,"name":"algType"} +,{"type":"bytes","id":2,"name":"signature"} +]}}, { + "type":"struct", + "content": { + "name":"EncyptedBoxKey", +"doc":[ +"Encrypted package encryption key",{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"},{"type":"reference","argument":"algType","category":"full","description":" Key encryption algorithm"},{"type":"reference","argument":"encryptedKey","category":"hidden","description":" Encrypted encryption key"}],"expandable":"true","attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"usersId"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +,{"type":"string","id":3,"name":"algType"} +,{"type":"bytes","id":4,"name":"encryptedKey"} +]}}, { + "type":"struct", + "content": { + "name":"KeyGroupId", +"doc":[ +"References to key groups",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroupId","category":"full","description":" Key Group Id"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"alias","childType":"keyGroupId"},"id":2,"name":"keyGroupId"} +]}}, { + "type":"struct", + "content": { + "name":"KeyGroupHolder", +"doc":[ +"Key Group Holder",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"keyGroup","category":"full","description":" Key Group"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":{"type":"struct","childType":"EncryptionKeyGroup"},"id":2,"name":"keyGroup"} +]}},{"type":"rpc","content":{ +"name":"SendEncryptedPackage", +"header":2657, +"response":{"type":"anonymous","header":2664, "doc":[ +{"type":"reference","argument":"date","category":"full","description":" date"},{"type":"reference","argument":"obsoleteKeyGroups","category":"full","description":" obsolete key group ids"},{"type":"reference","argument":"missedKeyGroups","category":"full","description":" missed key groups"}] ,"attributes":[{"type":{"type":"opt","childType":{"type":"alias","childType":"date"}},"id":1,"name":"date"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupId"}},"id":2,"name":"obsoleteKeyGroups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupHolder"}},"id":3,"name":"missedKeyGroups"} +]}, +"doc":[ +"Sending encrypted package",{"type":"reference","argument":"randomId","category":"hidden","description":"Random id"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"randomId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":2,"name":"destPeers"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"KeyGroupId"}},"id":3,"name":"ignoredKeyGroups"} +,{"type":{"type":"struct","childType":"EncryptedBox"},"id":4,"name":"encryptedBox"} +]}},{"type":"update","content":{ +"name":"EncryptedPackage", +"header":177, +"doc":[ +"Update about encrypted package",{"type":"reference","argument":"randomId","category":"full","description":" Random Id of package"},{"type":"reference","argument":"date","category":"full","description":" Sending date of package"},{"type":"reference","argument":"senderId","category":"full","description":" Sender id of package"},{"type":"reference","argument":"encryptedBox","category":"full","description":" Encrypted box"}],"attributes":[ +{"type":{"type":"alias","childType":"randomId"},"id":1,"name":"randomId"} +,{"type":{"type":"alias","childType":"date"},"id":2,"name":"date"} +,{"type":{"type":"alias","childType":"userId"},"id":3,"name":"senderId"} +,{"type":{"type":"struct","childType":"EncryptedBox"},"id":4,"name":"encryptedBox"} +]}}]}, { + "title": "Storage", + "package": "storage", + "items": [ +{"type":"rpc","content":{ +"name":"UploadSharedBlob", +"header":2660, +"response":{"type":"anonymous","header":2661, "doc":[ +{"type":"reference","argument":"sharedObjectId","category":"full","description":" Id of shared object"}] ,"attributes":[{"type":"int32","id":1,"name":"sharedObjectId"} +]}, +"doc":[ +"Upload shared blob with user",{"type":"reference","argument":"destPeer","category":"full","description":"Destination peer"},{"type":"reference","argument":"bucket","category":"full","description":"Bucked name"},{"type":"reference","argument":"blob","category":"full","description":"Blob data"},{"type":"reference","argument":"randomId","category":"full","description":"Random id for protecting from double upload"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"destPeer"} +,{"type":"string","id":2,"name":"bucket"} +,{"type":"bytes","id":3,"name":"blob"} +,{"type":{"type":"alias","childType":"randomId"},"id":4,"name":"randomId"} +]}},{"type":"rpc","content":{ +"name":"DownloadSharedBlob", +"header":2662, +"response":{"type":"anonymous","header":2663, "doc":[ +{"type":"reference","argument":"blob","category":"full","description":" Blob contents"}] ,"attributes":[{"type":"bytes","id":1,"name":"blob"} +]}, +"doc":[ +"Download shared blob",{"type":"reference","argument":"destPeer","category":"full","description":"Destination peer"},{"type":"reference","argument":"bucket","category":"full","description":"Bucket name"},{"type":"reference","argument":"objectId","category":"full","description":"Object Id"}],"attributes":[ +{"type":{"type":"struct","childType":"UserOutPeer"},"id":1,"name":"destPeer"} +,{"type":"string","id":2,"name":"bucket"} +,{"type":"int32","id":3,"name":"objectId"} +]}}]}, { + "title": "Peers", + "package": "peers", + "doc": [ + "Peer is an identificator of specific conversation." + ], + "items": [ + { + "type": "enum", + "content": { + "name": "PeerType", + "values": [ + { + "name": "Private", + "id": 1 + }, + { + "name": "Group", + "id": 2 + }, + { + "name": "EncryptedPrivate", + "id": 3 } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Dialog" + ] + } + }, { + "type":"struct", + "content": { + "name":"Peer", +"doc":[ +"Peer",{"type":"reference","argument":"type","category":"full","description":" Peer Type"},{"type":"reference","argument":"id","category":"full","description":" Peer Id"}],"attributes":[ +{"type":{"type":"enum","childType":"PeerType"},"id":1,"name":"type"} +,{"type":"int32","id":2,"name":"id"} +]}}, { + "type":"struct", + "content": { + "name":"OutPeer", +"doc":[ +"Out peer with access hash",{"type":"reference","argument":"type","category":"full","description":" Peer Type"},{"type":"reference","argument":"id","category":"full","description":" Peer Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Peer access hash"}],"attributes":[ +{"type":{"type":"enum","childType":"PeerType"},"id":1,"name":"type"} +,{"type":"int32","id":2,"name":"id"} +,{"type":"int64","id":3,"name":"accessHash"} +]}}, { + "type":"struct", + "content": { + "name":"UserOutPeer", +"doc":[ +"User's out peer",{"type":"reference","argument":"uid","category":"full","description":" User's id"},{"type":"reference","argument":"accessHash","category":"danger","description":" User's access hash"}],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"uid"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}, { + "type":"struct", + "content": { + "name":"GroupOutPeer", +"doc":[ +"Group's out peer",{"type":"reference","argument":"groupId","category":"full","description":" Group's Id"},{"type":"reference","argument":"accessHash","category":"danger","description":" Group's access hash"}],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":"int64","id":2,"name":"accessHash"} +]}}]}, { + "title": "Sequence and Updates", + "package": "sequence", + "doc": [ + "Each device has it's own update sequence. At the begining application request initial sequence state by", + "calling GetState. On each application restart or NewSessionCreated application calls GetDifference for receiving", + "updates in update sequence.", + "GetState and GetDifference automatically subscribes session to receiving updates in session.", + "Each update has seq and state. Seq is sequental index of updated and used for detecting of holes in update sequence", + "(because of server failure or session die) on client side.", + "All updates needed to be processed in partucular order according to seq values.", + "In some updates there can be references to users that are not available at client yer. In this case application need", + "to ignore such update and init getting difference." + ], + "items": [ +{"type":"update_box","content":{ +"name":"SeqUpdate", +"header":13, +"doc":[ +"Sequence update",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of update"},{"type":"reference","argument":"state","category":"compact","description":" Sequece state of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":"int32","id":3,"name":"updateHeader"} +,{"type":"bytes","id":4,"name":"update"} +]}},{"type":"update_box","content":{ +"name":"FatSeqUpdate", +"header":73, +"doc":[ +"Fat sequence update with additional data",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of update"},{"type":"reference","argument":"state","category":"compact","description":" Sequence state of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"},{"type":"reference","argument":"users","category":"compact","description":" Users that are referenced in update"},{"type":"reference","argument":"groups","category":"compact","description":" Groups that are referenced in update"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":"int32","id":3,"name":"updateHeader"} +,{"type":"bytes","id":4,"name":"update"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":5,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":6,"name":"groups"} +]}},{"type":"update_box","content":{ +"name":"WeakUpdate", +"header":26, +"doc":[ +"Out of sequence update (for typing and online statuses)",{"type":"reference","argument":"date","category":"full","description":" Date of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"compact","description":" The update"}],"attributes":[ +{"type":"int64","id":1,"name":"date"} +,{"type":"int32","id":2,"name":"updateHeader"} +,{"type":"bytes","id":3,"name":"update"} +]}},{"type":"update_box","content":{ +"name":"WeakFatUpdate", +"header":2673, +"doc":[ +"Fat Weak Update",{"type":"reference","argument":"date","category":"full","description":" Date of update"},{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"full","description":" The update"},{"type":"reference","argument":"users","category":"full","description":" Users that are referenced in update"},{"type":"reference","argument":"groups","category":"full","description":" Groups that are referenced in update"}],"attributes":[ +{"type":"int64","id":1,"name":"date"} +,{"type":"int32","id":2,"name":"updateHeader"} +,{"type":"bytes","id":3,"name":"update"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} +]}},{"type":"update_box","content":{ +"name":"SeqUpdateTooLong", +"header":25, +"doc":[ +"Notification about requiring performing manual GetDifference"],"attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"UpdateContainer", +"doc":[ +"Update container",{"type":"reference","argument":"updateHeader","category":"full","description":" Header of update"},{"type":"reference","argument":"update","category":"compact","description":" The updatre"}],"attributes":[ +{"type":"int32","id":1,"name":"updateHeader"} +,{"type":"bytes","id":2,"name":"update"} +]}},{"type":"update_box","content":{ +"name":"CombinedUpdate", +"header":2625, +"doc":[ +"Combined update",{"type":"reference","argument":"seqStart","category":"full","description":" Sequence number start"},{"type":"reference","argument":"seqEnd","category":"full","description":" Sequence number end"},{"type":"reference","argument":"state","category":"full","description":" Sequence state"},{"type":"reference","argument":"users","category":"compact","description":" Update's users"},{"type":"reference","argument":"groups","category":"compact","description":" Update's groups"},{"type":"reference","argument":"updates","category":"full","description":" Updates (can be empty)"},{"type":"reference","argument":"messages","category":"full","description":" New messages"}],"attributes":[ +{"type":"int32","id":1,"name":"seqStart"} +,{"type":"int32","id":2,"name":"seqEnd"} +,{"type":{"type":"alias","childType":"seq_state"},"id":3,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":4,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":5,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UpdateContainer"}},"id":6,"name":"updates"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":7,"name":"messages"} +]}}, { + "type": "enum", + "content": { + "name": "UpdateOptimization", + "values": [ + { + "name": "NONE", + "id": 1 + }, + { + "name": "STRIP_ENTITIES", + "id": 2 + }, + { + "name": "ENABLE_COMBINED", + "id": 3 + }, + { + "name": "FASTER_MESSAGES", + "id": 4 + }, + { + "name": "STRIP_COUNTERS", + "id": 5 + }, + { + "name": "COMPACT_USERS", + "id": 6 + }, + { + "name": "GROUPS_V2", + "id": 7 } - }, - "id": 3, - "name": "dialogs" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 4, - "name": "userPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 5, - "name": "groupPeers" - }] - }, - "doc": [ - "Loading conversation history", { - "type": "reference", - "argument": "minDate", - "category": "full", - "description": "start date of conversation loading. Use 0 to load latest messages" - }, { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "limit maximum amount of messages (max is 100)" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "date" - }, - "id": 1, - "name": "minDate" - }, { - "type": "int32", - "id": 2, - "name": "limit" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadArchived", - "header": 2651, - "response": { - "type": "anonymous", - "header": 2652, - "doc": [ - "Archived dialogs", { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Referenced groups" - }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Referenced users" - }, { - "type": "reference", - "argument": "dialogs", - "category": "full", - "description": " Archived dialogs" - }, { - "type": "reference", - "argument": "nextOffset", - "category": "compact", - "description": " Offset for next bunch" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 1, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Dialog" - } - }, - "id": 3, - "name": "dialogs" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 5, - "name": "userPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 6, - "name": "groupPeers" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 4, - "name": "nextOffset" - }] - }, - "doc": [ - "Loading archived messages", { - "type": "reference", - "argument": "nextOffset", - "category": "compact", - "description": "Optional next offset" - }, { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "Maximum number of elements" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 1, - "name": "nextOffset" - }, { - "type": "int32", - "id": 2, - "name": "limit" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadGroupedDialogs", - "header": 225, - "response": { - "type": "anonymous", - "header": 226, - "doc": [ - "Loaded grouped dialogs", { - "type": "reference", - "argument": "dialogs", - "category": "compact", - "description": " Loaded groups of dialogs" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - }, { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Loaded groups" - }, { - "type": "reference", - "argument": "showArchived", - "category": "full", - "description": " Show archived section" - }, { - "type": "reference", - "argument": "showInvite", - "category": "full", - "description": " Show invite message" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogGroup" - } - }, - "id": 1, - "name": "dialogs" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "groups" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "showArchived" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 5, - "name": "showInvite" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 6, - "name": "userPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 7, - "name": "groupPeers" - }] - }, - "doc": [ - "Load all dialogs from grouped list" - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 1, - "name": "optimizations" - }] - } - }, { - "type": "response", - "content": { - "name": "DialogsOrder", - "header": 235, - "doc": [ - "Dialogs order response", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " update seq" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " update state" - }, { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Update groups" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "DialogGroup" - } - }, - "id": 3, - "name": "groups" - }] - } - }, { - "type": "rpc", - "content": { - "name": "HideDialog", - "header": 231, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Hide Dialog from grouped list", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Dialog peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ShowDialog", - "header": 232, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Show Dialog in grouped list" - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "FavouriteDialog", - "header": 224, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Marking dialog as favourite", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for favouriting" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnfavouriteDialog", - "header": 227, - "response": { - "type": "reference", - "name": "DialogsOrder" - }, - "doc": [ - "Making dialog as unfavourite", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer for favouriting" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "NotifyDialogOpened", - "header": 2785, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Notifying about dialog open", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Peer that was opened" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }] - }, { - "title": "Groups", - "package": "groups", - "items": [{ - "type": "comment", - "content": "Entities" - }, { - "type": "struct", - "content": { - "name": "Member", - "doc": [ - "Member information", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User id" - }, { - "type": "reference", - "argument": "inviterUid", - "category": "full", - "description": " User inviter id" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Adding date" - }, { - "type": "reference", - "argument": "isAdmin", - "category": "full", - "description": " is member admin of group" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "inviterUid" - }, { - "type": "int64", - "id": 3, - "name": "date" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "isAdmin" - }] - } - }, { - "type": "enum", - "content": { - "name": "GroupType", - "values": [{ - "name": "GROUP", - "id": 1 - }, { - "name": "CHANNEL", - "id": 2 - }] - } - }, { - "type": "enum", - "content": { - "name": "GroupPermissions", - "values": [{ - "name": "SEND_MESSAGE", - "id": 1 - }, { - "name": "CLEAR", - "id": 2 - }, { - "name": "LEAVE", - "id": 3 - }, { - "name": "DELETE", - "id": 4 - }, { - "name": "JOIN", - "id": 5 - }, { - "name": "VIEW_INFO", - "id": 6 - }] - } - }, { - "type": "enum", - "content": { - "name": "GroupFullPermissions", - "values": [{ - "name": "EDIT_INFO", - "id": 1 - }, { - "name": "VIEW_MEMBERS", - "id": 2 - }, { - "name": "INVITE_MEMBERS", - "id": 3 - }, { - "name": "INVITE_VIA_LINK", - "id": 4 - }, { - "name": "CALL", - "id": 5 - }, { - "name": "EDIT_ADMIN_SETTINGS", - "id": 6 - }, { - "name": "VIEW_ADMINS", - "id": 7 - }, { - "name": "EDIT_ADMINS", - "id": 8 - }, { - "name": "KICK_INVITED", - "id": 9 - }, { - "name": "KICK_ANYONE", - "id": 10 - }, { - "name": "EDIT_FOREIGN", - "id": 11 - }, { - "name": "DELETE_FOREIGN", - "id": 12 - }] - } - }, { - "type": "struct", - "content": { - "name": "Group", - "doc": [ - "Group information", "", "Permissions.", "Permissions of this structure is about group messages operation, such as", "ability to send messages, clear chat, leave group and so on. This operations", "Can be held outside of the Group Info page.", "", "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", "If default is TRUE then ONE == FALSE.", "Bits:", "0 - canSendMessage. Default is FALSE.", "1 - canClear. Default is FALSE.", "2 - canLeave. Default is FALSE.", "3 - canDelete. Default is FALSE.", "4 - canJoin. Default is FALSE.", "5 - canViewInfo. Default is FALSE.", "", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " group id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Access hash of group" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Title of group" - }, { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " Avatar of group" - }, { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Number of members" - }, { - "type": "reference", - "argument": "isHidden", - "category": "full", - "description": " Is group hidden (not showing it in recent list). Default is false." - }, { - "type": "reference", - "argument": "isMember", - "category": "full", - "description": " Is current user a member of a group. Default is true." - }, { - "type": "reference", - "argument": "groupType", - "category": "full", - "description": " Group Type. Used only for displaying information. Default is GROUP." - }, { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " Permissions of group object" - }, { - "type": "reference", - "argument": "isDeleted", - "category": "full", - "description": " Is this group deleted" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Group extension Data" - }, { - "type": "reference", - "argument": "isAdmin", - "category": "full", - "description": " [DEPRECATED] Is current user an admin of a group" - }, { - "type": "reference", - "argument": "theme", - "category": "hidden", - "description": " [DEPRECATED] Theme of group" - }, { - "type": "reference", - "argument": "about", - "category": "hidden", - "description": " [DEPRECATED] About of group" - }, { - "type": "reference", - "argument": "creatorUid", - "category": "hidden", - "description": " [DEPRECATED] Group creator" - }, { - "type": "reference", - "argument": "members", - "category": "compact", - "description": " [DEPRECATED] Members of group" - }, { - "type": "reference", - "argument": "createDate", - "category": "full", - "description": " [DEPRECATED] Date of creation" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": "string", - "id": 3, - "name": "title" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 4, - "name": "avatar" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 24, - "name": "membersCount" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "isMember" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 20, - "name": "isHidden" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "GroupType" - } - }, - "id": 25, - "name": "groupType" - }, { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 26, - "name": "permissions" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 27, - "name": "isDeleted" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 22, - "name": "ext" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 16, - "name": "isAdmin", - "deprecated": "true" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 8, - "name": "creatorUid", - "deprecated": "true" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 9, - "name": "members", - "deprecated": "true" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 10, - "name": "createDate", - "deprecated": "true" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 17, - "name": "theme", - "deprecated": "true" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 18, - "name": "about", - "deprecated": "true" - }] - } - }, { - "type": "struct", - "content": { - "name": "GroupFull", - "doc": [ - "Goup Full information", "Permissions.", "Idea of Group Full mermissions is about Group Info pages. This permissions", "are usefull only when trying to view and update group settings and not related", "to chat messages itself.", "Default value is ZERO, Opposide iz ONE. If Default is FALSE then ONE == TRUE.", "If default is TRUE then ONE == FALSE.", "Bits:", "0 - canEditInfo. Default is FALSE.", "1 - canViewMembers. Default is FALSE.", "2 - canInviteMembers. Default is FALSE.", "3 - canInviteViaLink. Default is FALSE.", "4 - canCall. Default is FALSE.", "5 - canEditAdminSettings. Default is FALSE.", "6 - canViewAdmins. Default is FALSE.", "7 - canEditAdmins. Default is FALSE.", "8 - canKickInvited. Default is FALSE.", "9 - canKickAnyone. Default is FALSE.", "10 - canEditForeign. Default is FALSE.", "11 - canDeleteForeign. Default is FALSE.", "", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "createDate", - "category": "full", - "description": " Date created" - }, { - "type": "reference", - "argument": "ownerUid", - "category": "full", - "description": " Optional group owner" - }, { - "type": "reference", - "argument": "members", - "category": "full", - "description": " Group members. Can be empty when isAsyncMembers enabled." - }, { - "type": "reference", - "argument": "theme", - "category": "full", - "description": " Group Theme" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": " Group about" - }, { - "type": "reference", - "argument": "isAsyncMembers", - "category": "full", - "description": " Is Members need to be loaded asynchronous. Default is false." - }, { - "type": "reference", - "argument": "isSharedHistory", - "category": "full", - "description": " Is history shared among all users. Default is false." - }, { - "type": "reference", - "argument": "shortName", - "category": "full", - "description": " Group's short name" - }, { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " Group Permissions" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "createDate" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 5, - "name": "ownerUid" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 12, - "name": "members" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "theme" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "about" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 7, - "name": "ext" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 11, - "name": "isAsyncMembers" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 10, - "name": "isSharedHistory" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 14, - "name": "shortName" - }, { - "type": { - "type": "opt", - "childType": "int64" - }, - "id": 27, - "name": "permissions" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadFullGroups", - "header": 2782, - "response": { - "type": "anonymous", - "header": 2783, - "doc": [{ - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups to load" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupFull" - } - }, - "id": 1, - "name": "groups" - }] - }, - "doc": [ - "Loading Full Groups", { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups to load" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 1, - "name": "groups" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadMembers", - "header": 2786, - "response": { - "type": "anonymous", - "header": 2787, - "doc": [{ - "type": "reference", - "argument": "users", - "category": "full", - "description": " Group members" - }, { - "type": "reference", - "argument": "next", - "category": "full", - "description": " Load more reference" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 3, - "name": "members" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "next" - }] - }, - "doc": [ - "Loading group members", { - "type": "reference", - "argument": "group", - "category": "full", - "description": "Group peer" - }, { - "type": "reference", - "argument": "limit", - "category": "full", - "description": "Limit members" - }, { - "type": "reference", - "argument": "next", - "category": "full", - "description": "Load more reference" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "group" - }, { - "type": "int32", - "id": 2, - "name": "limit" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 3, - "name": "next" - }] - } - }, { - "type": "comment", - "content": "Update" - }, { - "type": "update", - "content": { - "name": "GroupTitleChanged", - "header": 2609, - "doc": [ - "Update about title changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Group Title" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "string", - "id": 2, - "name": "title" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupAvatarChanged", - "header": 2610, - "doc": [ - "Update about avatar changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "avatar", - "category": "full", - "description": " Group Avatar" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 2, - "name": "avatar" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupTopicChanged", - "header": 2616, - "doc": [ - "Update about topic changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "topic", - "category": "full", - "description": " Updated topic" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "topic" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupAboutChanged", - "header": 2617, - "doc": [ - "Update about about changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": " Updated about" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "about" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupExtChanged", - "header": 2613, - "doc": [ - "Update about ext changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Updated ext" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 2, - "name": "ext" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupFullExtChanged", - "header": 2618, - "doc": [ - "Update about full ext changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "ext", - "category": "full", - "description": " Updated ext" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "MapValue" - } - }, - "id": 2, - "name": "ext" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupShortNameChanged", - "header": 2628, - "doc": [ - "Group's short name changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "shortName", - "category": "full", - "description": " Group short name" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "shortName" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupOwnerChanged", - "header": 2619, - "doc": [ - "Update about owner changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " New Owner" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "userId" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupHistoryShared", - "header": 2620, - "doc": [ - "Update about history shared", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupDeleted", - "header": 2658, - "doc": [ - "Update about group deleted", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupPermissionsChanged", - "header": 2663, - "doc": [ - "Update about group permissions changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " New Permissions" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "int64", - "id": 2, - "name": "permissions" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupFullPermissionsChanged", - "header": 2664, - "doc": [ - "Update about Full Group permissions changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "permissions", - "category": "full", - "description": " New Permissions" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "int64", - "id": 2, - "name": "permissions" - }] - } - }, { - "type": "comment", - "content": " " - }, { - "type": "update", - "content": { - "name": "GroupMemberChanged", - "header": 2612, - "doc": [ - "Update about membership changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "isMember", - "category": "full", - "description": " Is current user a member" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "bool", - "id": 2, - "name": "isMember" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupMembersBecameAsync", - "header": 2615, - "doc": [ - "Update about members became async", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupMembersUpdated", - "header": 2614, - "doc": [ - "Update about members updated", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "members", - "category": "full", - "description": " Group Members" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 2, - "name": "members" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupMemberDiff", - "header": 2623, - "doc": [ - "Update about members changed", { - "type": "reference", - "argument": "removedUsers", - "category": "full", - "description": " Removed Users" - }, { - "type": "reference", - "argument": "addedMembers", - "category": "full", - "description": " Added members" - }, { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Current Members count" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "removedUsers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 3, - "name": "addedMembers" - }, { - "type": "int32", - "id": 4, - "name": "membersCount" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupMembersCountChanged", - "header": 2622, - "doc": [ - "Update about members count changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Members count" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "int32", - "id": 2, - "name": "membersCount" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupMemberAdminChanged", - "header": 2627, - "doc": [ - "Update about member admin changed", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " User Id" - }, { - "type": "reference", - "argument": "isAdmin", - "category": "full", - "description": " Is Admin flag" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "userId" - }, { - "type": "bool", - "id": 3, - "name": "isAdmin" - }] - } - }, { - "type": "comment", - "content": "Actions" - }, { - "type": "rpc", - "content": { - "name": "CreateGroup", - "header": 230, - "response": { - "type": "anonymous", - "header": 216, - "doc": [ - "Created group", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Update Seq" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Update state" - }, { - "type": "reference", - "argument": "group", - "category": "full", - "description": " Created group" - }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Referenced users" - }, { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Referenced users" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Group creation date" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "date" - }, { - "type": { - "type": "struct", - "childType": "Group" - }, - "id": 3, - "name": "group" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 4, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 5, - "name": "userPeers" - }] - }, - "doc": [ - "Creating group chat", { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id for avoiding double create" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": "Group Title" - }, { - "type": "reference", - "argument": "users", - "category": "hidden", - "description": "Members of group" - }, { - "type": "reference", - "argument": "groupType", - "category": "full", - "description": "Group Type" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "rid" - }, { - "type": "string", - "id": 2, - "name": "title" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "users" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "GroupType" - } - }, - "id": 6, - "name": "groupType" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 7, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditGroupTitle", - "header": 85, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Changing group title", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": "new group title" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": "string", - "id": 3, - "name": "title" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditGroupAvatar", - "header": 86, - "response": { - "type": "anonymous", - "header": 115, - "doc": [ - "Updated group avatar", { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " Changed avatar" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Avatar change date" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Avatar" - }, - "id": 1, - "name": "avatar" - }, { - "type": "int32", - "id": 2, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - }, - "doc": [ - "Changing group avatar", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "fileLocation", - "category": "compact", - "description": "uploaded file for avatar" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 3, - "name": "fileLocation" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RemoveGroupAvatar", - "header": 101, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Removing group avatar", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditGroupShortName", - "header": 2793, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Edit Group Short Name", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "shortName", - "category": "full", - "description": "New group's short name" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "shortName" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditGroupTopic", - "header": 211, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Edit group topic", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random id of operation" - }, { - "type": "reference", - "argument": "topic", - "category": "full", - "description": "New Topic" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "topic" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 4, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EditGroupAbout", - "header": 213, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Edit Group About", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random id of operation" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": "New About" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "about" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "InviteUser", - "header": 69, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Inviting user to group", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "user", - "category": "full", - "description": "Users for invitation" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 3, - "name": "user" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LeaveGroup", - "header": 70, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Leaving group", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LeaveAndDelete", - "header": 2721, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Leave group and Delete Chat", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "KickUser", - "header": 71, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Kicking user from group", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "user", - "category": "full", - "description": "users for removing" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id of operation" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 3, - "name": "user" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 5, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "JoinGroupByPeer", - "header": 2722, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Join group by peer", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "JoinGroupByGroupId", - "header": 44561, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Join group by peer without a necessity of invite", { - "type": "reference", - "argument": "groupId", - "category": "hidden", - "description": "Groups peer" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }] - } - }, { - "type": "comment", - "content": "Administration" - }, { - "type": "rpc", - "content": { - "name": "MakeUserAdmin", - "header": 2784, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Make user admin", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "userPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DismissUserAdmin", - "header": 2791, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Dismissing user admin", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "userPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "TransferOwnership", - "header": 2789, - "response": { - "type": "reference", - "name": "SeqDate" - }, - "doc": [ - "Transfer ownership of group", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "newOwner", - "category": "full", - "description": "New group's owner" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "newOwner" - }] - } - }, { - "type": "struct", - "content": { - "name": "AdminSettings", - "doc": [ - "Admin Settings", { - "type": "reference", - "argument": "showAdminsToMembers", - "category": "full", - "description": " Show admins in member list" - }, { - "type": "reference", - "argument": "canMembersInvite", - "category": "full", - "description": " Can members of a group invite people" - }, { - "type": "reference", - "argument": "canMembersEditGroupInfo", - "category": "full", - "description": " Can members edit group info" - }, { - "type": "reference", - "argument": "canAdminsEditGroupInfo", - "category": "full", - "description": " Can admins edit group info" - }, { - "type": "reference", - "argument": "showJoinLeaveMessages", - "category": "full", - "description": " Should join and leave messages be visible to members" - } - ], - "expandable": "true", - "attributes": [{ - "type": "bool", - "id": 1, - "name": "showAdminsToMembers" - }, { - "type": "bool", - "id": 2, - "name": "canMembersInvite" - }, { - "type": "bool", - "id": 3, - "name": "canMembersEditGroupInfo" - }, { - "type": "bool", - "id": 4, - "name": "canAdminsEditGroupInfo" - }, { - "type": "bool", - "id": 5, - "name": "showJoinLeaveMessages" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadAdminSettings", - "header": 2790, - "response": { - "type": "anonymous", - "header": 2794, - "doc": [ - "Loaded settings", { - "type": "reference", - "argument": "settings", - "category": "full", - "description": " Current group admin settings" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "AdminSettings" - }, - "id": 1, - "name": "settings" - }] - }, - "doc": [ - "Loading administration settings", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SaveAdminSettings", - "header": 2792, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Save administartion settings", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's Peer" - }, { - "type": "reference", - "argument": "settings", - "category": "full", - "description": "Group's settings" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "struct", - "childType": "AdminSettings" - }, - "id": 2, - "name": "settings" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DeleteGroup", - "header": 2795, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Delete Group", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ShareHistory", - "header": 2796, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Share History", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "comment", - "content": "Invite" - }, { - "type": "response", - "content": { - "name": "InviteUrl", - "header": 178, - "doc": [ - "Response for invite url methods" - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "url" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetGroupInviteUrl", - "header": 177, - "response": { - "type": "reference", - "name": "InviteUrl" - }, - "doc": [ - "Building invite url", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Destination group peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RevokeInviteUrl", - "header": 179, - "response": { - "type": "reference", - "name": "InviteUrl" - }, - "doc": [ - "Revoking invite urls", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Destination group peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "JoinGroup", - "header": 180, - "response": { - "type": "anonymous", - "header": 181, - "doc": [{ - "type": "reference", - "argument": "group", - "category": "hidden", - "description": " Joined group" - }, { - "type": "reference", - "argument": "users", - "category": "hidden", - "description": " Users from members" - }, { - "type": "reference", - "argument": "userPeers", - "category": "hidden", - "description": " User Peers" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random id" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, { - "type": "reference", - "argument": "state", - "category": "hidden", - "description": " State" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of join" - }], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Group" - }, - "id": 1, - "name": "group" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 5, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 7, - "name": "userPeers" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 6, - "name": "rid" - }, { - "type": "int32", - "id": 2, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - }, - "doc": [ - "Join group method", { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Url or Token for joining to group" - }, { - "type": "reference", - "argument": "optimizations", - "category": "hidden", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - }] - } - }, { - "type": "comment", - "content": "Obsolete Actions" - }, { - "type": "rpc", - "content": { - "name": "CreateGroupObsolete", - "header": 65, - "response": { - "type": "anonymous", - "header": 66, - "doc": [ - "Created group", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": " Peer of created group" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Members of created group" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Group creation date" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": "int32", - "id": 3, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 4, - "name": "state" - }, { - "type": { - "type": "list", - "childType": "int32" - }, - "id": 5, - "name": "users" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "date" - }] - }, - "doc": [ - "[OBSOLETE] Creating group chat", { - "type": "reference", - "argument": "rid", - "category": "full", - "description": "Random Id for avoiding double create" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": "Title of new group" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Members of new group" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "rid" - }, { - "type": "string", - "id": 2, - "name": "title" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "users" - }] - } - }, { - "type": "rpc", - "content": { - "name": "EnterGroupObsolete", - "header": 199, - "response": { - "type": "anonymous", - "header": 200, - "doc": [ - "Joined group", { - "type": "reference", - "argument": "group", - "category": "full", - "description": " Joined group" - }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Referenced users" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Rid of join message" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Seq of Update" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of Update" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of update" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Group" - }, - "id": 1, - "name": "group" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "rid" - }, { - "type": "int32", - "id": 4, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 5, - "name": "state" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 6, - "name": "date" - }] - }, - "doc": [ - "[OBSOLETE] Join random group by peer id", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Public group peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MakeUserAdminObsolete", - "header": 214, - "response": { - "type": "anonymous", - "header": 215, - "doc": [{ - "type": "reference", - "argument": "members", - "category": "full", - "description": " new members" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 1, - "name": "members" - }, { - "type": "int32", - "id": 2, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }] - }, - "doc": [ - "[OBSOLETE] Make user admin", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Group's peer" - }, { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 1, - "name": "groupPeer" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "userPeer" - }] - } - }, { - "type": "comment", - "content": "Obsolete Updates" - }, { - "type": "update", - "content": { - "name": "GroupInviteObsolete", - "header": 36, - "doc": [ - "Update about inviting current user to group", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "inviteUid", - "category": "full", - "description": " Inviter UID. If equals to current uid than group created by user." - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of creating" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 9, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 5, - "name": "inviteUid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 8, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupUserInvitedObsolete", - "header": 21, - "doc": [ - "Update about inviting user to group", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Added user ID" - }, { - "type": "reference", - "argument": "inviterUid", - "category": "full", - "description": " Inviter user ID" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of adding user to group" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "inviterUid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupUserLeaveObsolete", - "header": 23, - "doc": [ - "Update about leaving user", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's ID" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of user leave" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupUserKickObsolete", - "header": 24, - "doc": [ - "Update about kicking user", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Kicked user's ID" - }, { - "type": "reference", - "argument": "kickerUid", - "category": "full", - "description": " Kicker user's ID" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of user kick" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "kickerUid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupMembersUpdateObsolete", - "header": 44, - "doc": [ - "Silent group members update", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "members", - "category": "full", - "description": " New members list" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Member" - } - }, - "id": 2, - "name": "members" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupTitleChangedObsolete", - "header": 38, - "doc": [ - "Update about group title change", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Changer UID" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": " New Title of group" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of title change" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": "string", - "id": 3, - "name": "title" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupTopicChangedObsolete", - "header": 213, - "doc": [ - "Update about group topic change", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Changer UID" - }, { - "type": "reference", - "argument": "topic", - "category": "full", - "description": " New topic of group" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of theme change" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Randomd Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "topic" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 5, - "name": "date" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupAboutChangedObsolete", - "header": 214, - "doc": [ - "Update about group about change", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "about", - "category": "full", - "description": " Group about" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "about" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupAvatarChangedObsolete", - "header": 39, - "doc": [ - "Update about group avatar change", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group Id" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Avatar changer uid" - }, { - "type": "reference", - "argument": "avatar", - "category": "compact", - "description": " New Avatar. If null then avatar is removed" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of avatar change" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Random Id of operation" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 5, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 3, - "name": "avatar" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "date" - }] - } - }] - }, { - "title": "Stickers", - "package": "stickers", - "doc": [ - "Stickers support in Actor" - ], - "items": [{ - "type": "struct", - "content": { - "name": "StickerDescriptor", - "doc": [ - "Descriptor of a Sticker", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Sticker unique id" - }, { - "type": "reference", - "argument": "emoji", - "category": "full", - "description": " Emoji code for sticker" - }, { - "type": "reference", - "argument": "image128", - "category": "full", - "description": " Image of sticker 128x128 in WebP format" - }, { - "type": "reference", - "argument": "image512", - "category": "full", - "description": " Image of sticker 512x512 in WebP format" - }, { - "type": "reference", - "argument": "image256", - "category": "full", - "description": " Image of sticker 256x256 in WebP format" - } - ], - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "emoji" - }, { - "type": { - "type": "struct", - "childType": "ImageLocation" - }, - "id": 3, - "name": "image128" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 4, - "name": "image512" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "ImageLocation" - } - }, - "id": 5, - "name": "image256" - }] - } - }, { - "type": "struct", - "content": { - "name": "StickerCollection", - "doc": [ - "Sticker collection", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Unique id of a collection" - }, { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": " Access Hash of a collection" - }, { - "type": "reference", - "argument": "stickers", - "category": "compact", - "description": " Sticker list" - } - ], - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerDescriptor" - } - }, - "id": 3, - "name": "stickers" - }] - } - }, { - "type": "response", - "content": { - "name": "StickersReponse", - "header": 240, - "doc": [ - "Stickers response", { - "type": "reference", - "argument": "collections", - "category": "full", - "description": " Sticker collections" - }, { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Seq of update" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of update" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "collections" - }, { - "type": "int32", - "id": 2, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadOwnStickers", - "header": 238, - "response": { - "type": "anonymous", - "header": 239, - "doc": [ - "Own Stickers collections", { - "type": "reference", - "argument": "ownStickers", - "category": "hidden", - "description": " Own sticker collections" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "ownStickers" - }] - }, - "doc": [ - "Loading own stickers" - ], - "attributes": [] - } - }, { - "type": "update", - "content": { - "name": "OwnStickersChanged", - "header": 161, - "doc": [ - "Own Stickers changed", { - "type": "reference", - "argument": "collections", - "category": "compact", - "description": " New own sticker collections" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "collections" - }] - } - }, { - "type": "update", - "content": { - "name": "StickerCollectionsChanged", - "header": 164, - "doc": [ - "Sticker collection changed", { - "type": "reference", - "argument": "collections", - "category": "full", - "description": " Updated sticker collections" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "StickerCollection" - } - }, - "id": 1, - "name": "collections" - }] - } - }, { - "type": "rpc", - "content": { - "name": "AddStickerCollection", - "header": 244, - "response": { - "type": "reference", - "name": "StickersReponse" - }, - "doc": [ - "Adding sticker collection", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Collection id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": "Collection access hash" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RemoveStickerCollection", - "header": 245, - "response": { - "type": "reference", - "name": "StickersReponse" - }, - "doc": [ - "Removing sticker collection", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Collection id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": "Collection access hash" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadStickerCollection", - "header": 246, - "response": { - "type": "anonymous", - "header": 247, - "doc": [ - "Loaded collection", { - "type": "reference", - "argument": "collection", - "category": "full", - "description": " Collection of stickers" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "StickerCollection" - }, - "id": 1, - "name": "collection" - }] - }, - "doc": [ - "Loading stickers", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Collection id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": "Collection access hash" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }] - }, { - "title": "Search", - "package": "search", - "doc": [ - "Searching API" - ], - "items": [{ - "type": "enum", - "content": { - "name": "SearchPeerType", - "values": [{ - "name": "Groups", - "id": 1 - }, { - "name": "Contacts", - "id": 2 - }, { - "name": "Public", - "id": 3 - }] - } - }, { - "type": "enum", - "content": { - "name": "SearchContentType", - "values": [{ - "name": "Any", - "id": 1 - }, { - "name": "Text", - "id": 2 - }, { - "name": "Links", - "id": 3 - }, { - "name": "Documents", - "id": 4 - }, { - "name": "Photos", - "id": 5 - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "SearchCondition", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "SearchPeerTypeCondition", - "doc": [ - "Search peer type condition", { - "type": "reference", - "argument": "peerType", - "category": "full", - "description": " Peer type for searching" - } - ], - "trait": { - "name": "SearchCondition", - "key": 1 - }, - "attributes": [{ - "type": { - "type": "enum", - "childType": "SearchPeerType" - }, - "id": 1, - "name": "peerType" - }] - } - }, { - "type": "struct", - "content": { - "name": "SearchPieceText", - "doc": [ - "Search peer name condition", { - "type": "reference", - "argument": "query", - "category": "full", - "description": " Search query" - } - ], - "trait": { - "name": "SearchCondition", - "key": 2 - }, - "attributes": [{ - "type": "string", - "id": 1, - "name": "query" - }] - } - }, { - "type": "struct", - "content": { - "name": "SearchAndCondition", - "doc": [ - "Search AND condion", { - "type": "reference", - "argument": "andQuery", - "category": "full", - "description": " And Query" - } - ], - "trait": { - "name": "SearchCondition", - "key": 3 - }, - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "SearchCondition" - } - }, - "id": 1, - "name": "andQuery" - }] - } - }, { - "type": "struct", - "content": { - "name": "SearchOrCondition", - "doc": [ - "Search OR condition", { - "type": "reference", - "argument": "orQuery", - "category": "full", - "description": " Or Query" - } - ], - "trait": { - "name": "SearchCondition", - "key": 4 - }, - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "SearchCondition" - } - }, - "id": 2, - "name": "orQuery" - }] - } - }, { - "type": "struct", - "content": { - "name": "SearchPeerCondition", - "doc": [ - "Serch Peer condition", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer condition" - } - ], - "trait": { - "name": "SearchCondition", - "key": 5 - }, - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }] - } - }, { - "type": "struct", - "content": { - "name": "SearchPeerContentType", - "doc": [ - "Search content type condition", { - "type": "reference", - "argument": "contentType", - "category": "full", - "description": " Content Type" - } - ], - "trait": { - "name": "SearchCondition", - "key": 6 - }, - "attributes": [{ - "type": { - "type": "enum", - "childType": "SearchContentType" - }, - "id": 1, - "name": "contentType" - }] - } - }, { - "type": "struct", - "content": { - "name": "SearchSenderIdConfition", - "doc": [ - "Searching sender uid condition", { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " sender UID" - } - ], - "trait": { - "name": "SearchCondition", - "key": 7 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "senderId" - }] - } - }, { - "type": "struct", - "content": { - "name": "PeerSearchResult", - "doc": [ - "Peer search result", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Peer information" - }, { - "type": "reference", - "argument": "optMatchString", - "category": "full", - "description": " Description" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "optMatchString" - }] - } - }, { - "type": "rpc", - "content": { - "name": "PeerSearch", - "header": 233, - "response": { - "type": "anonymous", - "header": 234, - "doc": [ - "Found peers", { - "type": "reference", - "argument": "searchResults", - "category": "full", - "description": " Search Results" - }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Related users" - }, { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Related groups" - }, { - "type": "reference", - "argument": "userPeers", - "category": "full", - "description": " Related user peers" - }, { - "type": "reference", - "argument": "groupPeers", - "category": "full", - "description": " Related group peers" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "PeerSearchResult" - } - }, - "id": 1, - "name": "searchResults" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 4, - "name": "userPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 5, - "name": "groupPeers" - }] - }, - "doc": [ - "Performing peer search", { - "type": "reference", - "argument": "query", - "category": "full", - "description": "Search query. Warring not all combinations can be processed by server. (acts as OR)" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "SearchCondition" - } - }, - "id": 1, - "name": "query" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - }] - } - }, { - "type": "struct", - "content": { - "name": "MessageSearchResult", - "doc": [ - "Message container", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Message Peer" - }, { - "type": "reference", - "argument": "rid", - "category": "full", - "description": " Message Random Id" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Message Date" - }, { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " Message sender UID" - }, { - "type": "reference", - "argument": "content", - "category": "full", - "description": " Message content" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "rid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 4, - "name": "senderId" - }, { - "type": { - "type": "trait", - "childType": "Message" - }, - "id": 5, - "name": "content" - }] - } - }, { - "type": "struct", - "content": { - "name": "MessageSearchItem", - "doc": [ - "Message Search result container" - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "MessageSearchResult" - }, - "id": 1, - "name": "result" - }] - } - }, { - "type": "response", - "content": { - "name": "MessageSearchResponse", - "header": 218, - "doc": [ - "Search Result", { - "type": "reference", - "argument": "searchResults", - "category": "full", - "description": " Search results" - }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Search users" - }, { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Search groups" - }, { - "type": "reference", - "argument": "loadMoreState", - "category": "hidden", - "description": " State for loading more results" - }, { - "type": "reference", - "argument": "userOutPeers", - "category": "full", - "description": " Search user peers" - }, { - "type": "reference", - "argument": "groupOutPeers", - "category": "full", - "description": " Search group peers" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageSearchItem" - } - }, - "id": 1, - "name": "searchResults" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "groups" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 4, - "name": "loadMoreState" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 5, - "name": "userOutPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 6, - "name": "groupOutPeers" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MessageSearch", - "header": 217, - "response": { - "type": "reference", - "name": "MessageSearchResponse" - }, - "doc": [ - "Performing message search", { - "type": "reference", - "argument": "query", - "category": "full", - "description": "Search query" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": { - "type": "trait", - "childType": "SearchCondition" - }, - "id": 1, - "name": "query" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "MessageSearchMore", - "header": 222, - "response": { - "type": "reference", - "name": "MessageSearchResponse" - }, - "doc": [ - "Performing message search paging", { - "type": "reference", - "argument": "loadMoreState", - "category": "hidden", - "description": "State for loading more results" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled Optimizations" - } - ], - "attributes": [{ - "type": "bytes", - "id": 1, - "name": "loadMoreState" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 2, - "name": "optimizations" - }] - } - }] - }, { - "title": "Public Groups", - "package": "pubgroups", - "doc": [ - "Public group is easy way to find communities" - ], - "items": [{ - "type": "struct", - "content": { - "name": "PublicGroup", - "doc": [ - "Public Group description", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Group id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Group Access hash" - }, { - "type": "reference", - "argument": "title", - "category": "full", - "description": " Group title" - }, { - "type": "reference", - "argument": "avatar", - "category": "full", - "description": " Group avatar" - }, { - "type": "reference", - "argument": "membersCount", - "category": "full", - "description": " Members count in group" - }, { - "type": "reference", - "argument": "friendsCount", - "category": "full", - "description": " Friends count int group" - }, { - "type": "reference", - "argument": "description", - "category": "full", - "description": " Description of group" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": "string", - "id": 3, - "name": "title" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "Avatar" - } - }, - "id": 7, - "name": "avatar" - }, { - "type": "int32", - "id": 4, - "name": "membersCount" - }, { - "type": "int32", - "id": 5, - "name": "friendsCount" - }, { - "type": "string", - "id": 6, - "name": "description" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetPublicGroups", - "header": 201, - "response": { - "type": "anonymous", - "header": 202, - "doc": [ - "Loaded public groups", { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " All available groups" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "PublicGroup" - } - }, - "id": 1, - "name": "groups" - }] - }, - "doc": [ - "Getting public groups" - ], - "attributes": [] - } - }] - }, { - "title": "Invites", - "package": "invites", - "doc": [ - "Invite mechanizm" - ], - "items": [{ - "type": "struct", - "content": { - "name": "InviteState", - "doc": [ - "Invite state", { - "type": "reference", - "argument": "email", - "category": "full", - "description": " Email of invite" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " Name of invited user" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " Uid of registered user" - }, { - "type": "reference", - "argument": "tid", - "category": "full", - "description": " Team id of invite" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "email" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 3, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 4, - "name": "tid" - }] - } - }, { - "type": "response", - "content": { - "name": "InviteList", - "header": 2564, - "doc": [ - "Intites list", { - "type": "reference", - "argument": "invites", - "category": "full", - "description": " Intvites" - }, { - "type": "reference", - "argument": "relatedUsers", - "category": "full", - "description": " Related users in invites" - }, { - "type": "reference", - "argument": "relatedGroups", - "category": "full", - "description": " Related groups in invites" - }, { - "type": "reference", - "argument": "relatedTeams", - "category": "full", - "description": " Related teams in invites" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "InviteState" - } - }, - "id": 1, - "name": "invites" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 2, - "name": "relatedUsers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 3, - "name": "relatedGroups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Team" - } - }, - "id": 4, - "name": "relatedTeams" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadOwnSentInvites", - "header": 2563, - "response": { - "type": "reference", - "name": "InviteList" - }, - "doc": [ - "Loading current invite states" - ], - "attributes": [] - } - }, { - "type": "rpc", - "content": { - "name": "SendInvite", - "header": 2565, - "response": { - "type": "reference", - "name": "InviteList" - }, - "doc": [ - "Sending an email invite", { - "type": "reference", - "argument": "email", - "category": "full", - "description": "Email for invite" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": "Optional name for invite" - }, { - "type": "reference", - "argument": "destTeam", - "category": "full", - "description": "Optional team for invite" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "email" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "name" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "OutTeam" - } - }, - "id": 3, - "name": "destTeam" - }] - } - }] - }, { - "title": "Teams", - "package": "teams", - "doc": [ - "Teams support for Actor" - ], - "items": [{ - "type": "struct", - "content": { - "name": "Team", - "doc": [ - "Team entity", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Team Id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Team Access Hash" - }, { - "type": "reference", - "argument": "name", - "category": "full", - "description": " Team name" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }, { - "type": "string", - "id": 3, - "name": "name" - }] - } - }, { - "type": "struct", - "content": { - "name": "OutTeam", - "doc": [ - "Reference to a team", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Team Id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "full", - "description": " Team access hash" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "response", - "content": { - "name": "TeamsList", - "header": 2562, - "doc": [ - "Teams response", { - "type": "reference", - "argument": "teams", - "category": "hidden", - "description": " Teams list" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Team" - } - }, - "id": 1, - "name": "teams" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadOwnTeams", - "header": 2561, - "response": { - "type": "reference", - "name": "TeamsList" - }, - "doc": [ - "Loading own teams" - ], - "attributes": [] - } - }, { - "type": "update", - "content": { - "name": "OwnTeamsChanged", - "header": 165, - "doc": [ - "Update about own teams changed", { - "type": "reference", - "argument": "ownTeams", - "category": "full", - "description": " Updated own teams list" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Team" - } - }, - "id": 1, - "name": "ownTeams" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CreateTeam", - "header": 2566, - "response": { - "type": "anonymous", - "header": 2567, - "doc": [ - "Created team response", { - "type": "reference", - "argument": "createdTeam", - "category": "full", - "description": " Created Team" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Team" - }, - "id": 1, - "name": "createdTeam" - }] - }, - "doc": [ - "Creation of a Team", { - "type": "reference", - "argument": "title", - "category": "full", - "description": "Title of a team" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "title" - }] - } - }, { - "type": "rpc", - "content": { - "name": "InviteToTeam", - "header": 2568, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Inviting people to team", { - "type": "reference", - "argument": "user", - "category": "full", - "description": "Dest user" - }, { - "type": "reference", - "argument": "destTeam", - "category": "full", - "description": "Dest team" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "user" - }, { - "type": { - "type": "struct", - "childType": "OutTeam" - }, - "id": 3, - "name": "destTeam" - }] - } - }] - }, { - "title": "Integrations", - "package": "integrations", - "doc": [ - "Package contains methods for providing integration" - ], - "items": [{ - "type": "response", - "content": { - "name": "IntegrationToken", - "header": 183, - "doc": [ - "Group token response", { - "type": "reference", - "argument": "token", - "category": "danger", - "description": " current group token" - }, { - "type": "reference", - "argument": "url", - "category": "danger", - "description": " current group url" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }, { - "type": "string", - "id": 2, - "name": "url" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetIntegrationToken", - "header": 182, - "response": { - "type": "reference", - "name": "IntegrationToken" - }, - "doc": [ - "Getting current group token", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RevokeIntegrationToken", - "header": 184, - "response": { - "type": "reference", - "name": "IntegrationToken" - }, - "doc": [ - "Revoke group token", { - "type": "reference", - "argument": "groupPeer", - "category": "full", - "description": "Peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "groupPeer" - }] - } - }] - }, { - "title": "Typing and Online", - "package": "weak", - "items": [{ - "type": "enum", - "content": { - "name": "TypingType", - "values": [{ - "name": "Text", - "id": 0 - }] - } - }, { - "type": "rpc", - "content": { - "name": "Typing", - "header": 27, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Sending typing notification", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "typingType", - "category": "full", - "description": "typing type." - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 3, - "name": "typingType" - }] - } - }, { - "type": "rpc", - "content": { - "name": "StopTyping", - "header": 30, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Stop typing", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "typingType", - "category": "full", - "description": "typing type" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 2, - "name": "typingType" - }] - } - }, { - "type": "enum", - "content": { - "name": "DeviceType", - "values": [{ - "name": "GENERIC", - "id": 1 - }, { - "name": "PC", - "id": 2 - }, { - "name": "MOBILE", - "id": 3 - }, { - "name": "TABLET", - "id": 4 - }, { - "name": "WATCH", - "id": 5 - }, { - "name": "MIRROR", - "id": 6 - }, { - "name": "CAR", - "id": 7 - }, { - "name": "TABLE", - "id": 8 - }] - } - }, { - "type": "rpc", - "content": { - "name": "SetOnline", - "header": 29, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Sending online state", { - "type": "reference", - "argument": "isOnline", - "category": "full", - "description": "is user online" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "timeout of online state in milliseconds" - }, { - "type": "reference", - "argument": "deviceType", - "category": "full", - "description": "Optional device type" - }, { - "type": "reference", - "argument": "deviceCategory", - "category": "full", - "description": "Optional device category, for example android or ios" - } - ], - "attributes": [{ - "type": "bool", - "id": 1, - "name": "isOnline" - }, { - "type": { - "type": "alias", - "childType": "msec" - }, - "id": 2, - "name": "timeout" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 3, - "name": "deviceType" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "deviceCategory" - }] - } - }, { - "type": "update", - "content": { - "name": "PauseNotifications", - "header": 166, - "doc": [ - "Update about pausing notifications", { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout for notifications resume" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 1, - "name": "timeout" - }] - } - }, { - "type": "update", - "content": { - "name": "RestoreNotifications", - "header": 167, - "doc": [ - "Update about restoring notifications" - ], - "attributes": [] - } - }, { - "type": "rpc", - "content": { - "name": "PauseNotifications", - "header": 2641, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Pause notifications", { - "type": "reference", - "argument": "timeout", - "category": "hidden", - "description": "Timeout of pause" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 1, - "name": "timeout" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RestoreNotifications", - "header": 2642, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Restoring notifications" - ], - "attributes": [] - } - }, { - "type": "empty" - }, { - "type": "update", - "content": { - "name": "Typing", - "header": 6, - "doc": [ - "Update about user's typing", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Conversation peer" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "typingType", - "category": "full", - "description": " Type of typing" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 3, - "name": "typingType" - }] - } - }, { - "type": "update", - "content": { - "name": "TypingStop", - "header": 81, - "doc": [ - "Update about user's typing stop", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Conversation peer" - }, { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "typingType", - "category": "hidden", - "description": " Type of typing" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 2, - "name": "uid" - }, { - "type": { - "type": "enum", - "childType": "TypingType" - }, - "id": 3, - "name": "typingType" - }] - } - }, { - "type": "update", - "content": { - "name": "UserOnline", - "header": 7, - "doc": [ - "Update about user became online", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 2, - "name": "deviceType" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "deviceCategory" - }] - } - }, { - "type": "update", - "content": { - "name": "UserOffline", - "header": 8, - "doc": [ - "Update about user became offline", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 2, - "name": "deviceType" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "deviceCategory" - }] - } - }, { - "type": "update", - "content": { - "name": "UserLastSeen", - "header": 9, - "doc": [ - "Update about user's last seen state", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Last seen time" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "date" - }, { - "type": { - "type": "opt", - "childType": { - "type": "enum", - "childType": "DeviceType" - } - }, - "id": 3, - "name": "deviceType" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "deviceCategory" - }] - } - }, { - "type": "update", - "content": { - "name": "GroupOnline", - "header": 33, - "doc": [ - "Update about group online change", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group id" - }, { - "type": "reference", - "argument": "count", - "category": "full", - "description": " current online user's count" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "int32", - "id": 2, - "name": "count" - }] - } - }] - }, { - "title": "Media and Files", - "package": "files", - "items": [{ - "type": "struct", - "content": { - "name": "FileLocation", - "doc": [ - "Location of file on server", { - "type": "reference", - "argument": "fileId", - "category": "full", - "description": " Unique Id of file" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Access hash of file" - } - ], - "expandable": "true", - "attributes": [{ - "type": "int64", - "id": 1, - "name": "fileId" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "struct", - "content": { - "name": "ImageLocation", - "doc": [ - "Image location", { - "type": "reference", - "argument": "fileLocation", - "category": "full", - "description": " Location of file" - }, { - "type": "reference", - "argument": "width", - "category": "full", - "description": " Width of avatar image" - }, { - "type": "reference", - "argument": "height", - "category": "full", - "description": " Height of avatar image" - }, { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " Size of file" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "fileLocation" - }, { - "type": "int32", - "id": 2, - "name": "width" - }, { - "type": "int32", - "id": 3, - "name": "height" - }, { - "type": "int32", - "id": 4, - "name": "fileSize" - }] - } - }, { - "type": "struct", - "content": { - "name": "AvatarImage", - "doc": [ - "Avatar Image", { - "type": "reference", - "argument": "fileLocation", - "category": "full", - "description": " Location of file" - }, { - "type": "reference", - "argument": "width", - "category": "full", - "description": " Width of avatar image" - }, { - "type": "reference", - "argument": "height", - "category": "full", - "description": " Height of avatar image" - }, { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " Size of file" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "fileLocation" - }, { - "type": "int32", - "id": 2, - "name": "width" - }, { - "type": "int32", - "id": 3, - "name": "height" - }, { - "type": "int32", - "id": 4, - "name": "fileSize" - }] - } - }, { - "type": "struct", - "content": { - "name": "Avatar", - "doc": [ - "Avatar of User or Group", { - "type": "reference", - "argument": "smallImage", - "category": "compact", - "description": " Optional small image of avatar box in 100x100" - }, { - "type": "reference", - "argument": "largeImage", - "category": "compact", - "description": " Optional large image of avatar box in 200x200" - }, { - "type": "reference", - "argument": "fullImage", - "category": "compact", - "description": " Optional full screen image of avatar" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "AvatarImage" - } - }, - "id": 1, - "name": "smallImage" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "AvatarImage" - } - }, - "id": 2, - "name": "largeImage" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "AvatarImage" - } - }, - "id": 3, - "name": "fullImage" - }] - } - }, { - "type": "struct", - "content": { - "name": "FastThumb", - "doc": [ - "Fast thumb of media messages. Less than 90x90 and compressed by JPEG with low quality", { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Width of thumb" - }, { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Height of thump" - }, { - "type": "reference", - "argument": "thumb", - "category": "compact", - "description": " compressed image data" - } - ], - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "w" - }, { - "type": "int32", - "id": 2, - "name": "h" - }, { - "type": "bytes", - "id": 3, - "name": "thumb" - }] - } - }, { - "type": "enum", - "content": { - "name": "Colors", - "values": [{ - "name": "red", - "id": 1 - }, { - "name": "yellow", - "id": 2 - }, { - "name": "green", - "id": 3 - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "Color", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "RgbColor", - "doc": [ - "RGB Color", { - "type": "reference", - "argument": "rgb", - "category": "full", - "description": " RGB color value" - } - ], - "trait": { - "name": "Color", - "key": 1 - }, - "expandable": "true", - "attributes": [{ - "type": "int32", - "id": 1, - "name": "rgb" - }] - } - }, { - "type": "struct", - "content": { - "name": "PredefinedColor", - "doc": [ - "Predefined color", { - "type": "reference", - "argument": "color", - "category": "hidden", - "description": " Predefined color value" - } - ], - "trait": { - "name": "Color", - "key": 2 - }, - "expandable": "true", - "attributes": [{ - "type": { - "type": "enum", - "childType": "Colors" - }, - "id": 1, - "name": "color" - }] - } - }, { - "type": "empty" - }, { - "type": "struct", - "content": { - "name": "HTTPHeader", - "doc": [ - "HTTP Header record", { - "type": "reference", - "argument": "key", - "category": "full", - "description": " HTTP Header name" - }, { - "type": "reference", - "argument": "value", - "category": "full", - "description": " HTTP Header value" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "key" - }, { - "type": "string", - "id": 2, - "name": "value" - }] - } - }, { - "type": "struct", - "content": { - "name": "FileUrlDescription", - "doc": [ - "File url description", { - "type": "reference", - "argument": "fileId", - "category": "full", - "description": " File id of url" - }, { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url for downloading" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout of url" - }, { - "type": "reference", - "argument": "unsignedUrl", - "category": "hidden", - "description": " Unsigned URL (used to honor web caches)" - }, { - "type": "reference", - "argument": "unsignedUrlHeaders", - "category": "hidden", - "description": " Headers that is required to download files with unsigned url" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "fileId" - }, { - "type": "string", - "id": 2, - "name": "url" - }, { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 3, - "name": "timeout" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 4, - "name": "unsignedUrl" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "HTTPHeader" - } - }, - "id": 5, - "name": "unsignedUrlHeaders" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetFileUrl", - "header": 77, - "response": { - "type": "anonymous", - "header": 78, - "doc": [{ - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url for downloading" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout of url" - }, { - "type": "reference", - "argument": "unsignedUrl", - "category": "full", - "description": " Unsigned URL (used to honor web caches)" - }, { - "type": "reference", - "argument": "unsignedUrlHeaders", - "category": "full", - "description": " Headers that is required to download files with unsigned url" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "url" - }, { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 2, - "name": "timeout" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "unsignedUrl" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "HTTPHeader" - } - }, - "id": 4, - "name": "unsignedUrlHeaders" - }] - }, - "doc": [ - "Requesting file URL for downloading", { - "type": "reference", - "argument": "file", - "category": "full", - "description": "file's location" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "file" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetFileUrls", - "header": 2573, - "response": { - "type": "anonymous", - "header": 2574, - "doc": [{ - "type": "reference", - "argument": "fileUrls", - "category": "full", - "description": " File urls" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "FileUrlDescription" - } - }, - "id": 1, - "name": "fileUrls" - }] - }, - "doc": [ - "Requesting multiple fle URL for downloading", { - "type": "reference", - "argument": "files", - "category": "hidden", - "description": "File locations to load urls" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "FileLocation" - } - }, - "id": 1, - "name": "files" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetFileUrlBuilder", - "header": 2579, - "response": { - "type": "anonymous", - "header": 2580, - "doc": [{ - "type": "reference", - "argument": "baseUrl", - "category": "full", - "description": " Base Url for files" - }, { - "type": "reference", - "argument": "algo", - "category": "full", - "description": " Signature algorithm" - }, { - "type": "reference", - "argument": "seed", - "category": "full", - "description": " Public-visible seed of signature" - }, { - "type": "reference", - "argument": "signatureSecret", - "category": "full", - "description": " Signature Secret" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": " Timeout of url builder" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "baseUrl" - }, { - "type": "string", - "id": 2, - "name": "algo" - }, { - "type": "string", - "id": 5, - "name": "seed" - }, { - "type": "bytes", - "id": 3, - "name": "signatureSecret" - }, { - "type": { - "type": "alias", - "childType": "sec" - }, - "id": 4, - "name": "timeout" - }] - }, - "doc": [ - "Get File URL Builder that allows to build file urls from client side", { - "type": "reference", - "argument": "supportedSignatureAlgorithms", - "category": "hidden", - "description": "Supported signature algorithms by client" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": "string" - }, - "id": 1, - "name": "supportedSignatureAlgorithms" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetFileUploadUrl", - "header": 97, - "response": { - "type": "anonymous", - "header": 121, - "doc": [{ - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url for uploading" - }, { - "type": "reference", - "argument": "uploadKey", - "category": "compact", - "description": " Upload key for upload" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "url" - }, { - "type": "bytes", - "id": 2, - "name": "uploadKey" - }] - }, - "doc": [ - "Requesting pload url", { - "type": "reference", - "argument": "expectedSize", - "category": "full", - "description": "Expected size of uploading file. May be inaccurate. Used for size allocation optimizations." - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "expectedSize" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CommitFileUpload", - "header": 122, - "response": { - "type": "anonymous", - "header": 138, - "doc": [{ - "type": "reference", - "argument": "uploadedFileLocation", - "category": "hidden", - "description": " Result file location" - }], - "attributes": [{ - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 1, - "name": "uploadedFileLocation" - }] - }, - "doc": [ - "Comminting uploaded file to storage" - ], - "attributes": [{ - "type": "bytes", - "id": 1, - "name": "uploadKey" - }, { - "type": "string", - "id": 2, - "name": "fileName" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetFileUploadPartUrl", - "header": 142, - "response": { - "type": "anonymous", - "header": 141, - "doc": [{ - "type": "reference", - "argument": "url", - "category": "full", - "description": " Upload file part url" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "url" - }] - }, - "doc": [ - "Upload file part", { - "type": "reference", - "argument": "uploadKey", - "category": "compact", - "description": "Upload Key from requestFileUploadUrl" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "partNumber" - }, { - "type": "int32", - "id": 2, - "name": "partSize" - }, { - "type": "bytes", - "id": 3, - "name": "uploadKey" - }] - } - }] - }, { - "title": "Features", - "package": "features", - "doc": [ - "Enable feature discovery. Currently available features:", - "* \"call\" - private audio calls" - ], - "items": [{ - "type": "rpc", - "content": { - "name": "EnableFeature", - "header": 2588, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Enabling feature on the device", { - "type": "reference", - "argument": "featureName", - "category": "full", - "description": "Feature name" - }, { - "type": "reference", - "argument": "args", - "category": "danger", - "description": "Optional arguments to a feature" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "featureName" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "args" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DisableFeature", - "header": 2589, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Disabling feature on the device", { - "type": "reference", - "argument": "featureName", - "category": "full", - "description": "Feature name" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "featureName" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CheckFeatureEnabled", - "header": 2590, - "response": { - "type": "reference", - "name": "Bool" - }, - "doc": [ - "Method for checking if feature is available to user" - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userOutPeer" - }, { - "type": "string", - "id": 2, - "name": "featureName" - }] - } - }] - }, { - "title": "EventBus", - "package": "eventbus", - "items": [{ - "type": "rpc", - "content": { - "name": "CreateNewEventBus", - "header": 2665, - "response": { - "type": "anonymous", - "header": 2666, - "doc": [ - "Created new Event Bus", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Event Bus Id" - }, { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Your Device Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "deviceId" - }] - }, - "doc": [ - "Create new Event Bus", { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Optional timeout of Event Bus" - }, { - "type": "reference", - "argument": "isOwned", - "category": "full", - "description": "Is Event Bus owned by creator" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 1, - "name": "timeout" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isOwned" - }] - } - }, { - "type": "rpc", - "content": { - "name": "JoinEventBus", - "header": 2668, - "response": { - "type": "anonymous", - "header": 2669, - "doc": [{ - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Your Device Id" - }, { - "type": "reference", - "argument": "rejoinToken", - "category": "full", - "description": " Token that can be used for rejoining event bus with same device id" - }], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "deviceId" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "rejoinToken" - }] - }, - "doc": [ - "Joining Event Bus", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Join timeout" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 2, - "name": "timeout" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ReJoinEventBus", - "header": 2675, - "response": { - "type": "anonymous", - "header": 2676, - "doc": [{ - "type": "reference", - "argument": "deviceId", - "category": "hidden", - "description": " Your Device Id" - }], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "deviceId" - }] - }, - "doc": [ - "Rejoining to event bus after session was disposed", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - }, { - "type": "reference", - "argument": "rejoinToken", - "category": "full", - "description": "Rejoin Token" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": "bytes", - "id": 2, - "name": "rejoinToken" - }] - } - }, { - "type": "rpc", - "content": { - "name": "KeepAliveEventBus", - "header": 2670, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Keep Alive Event Bus", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Optional timeout for keep alive" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 2, - "name": "timeout" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DisposeEventBus", - "header": 2667, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Dispose Event Bus", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Event Bus Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }] - } - }, { - "type": "rpc", - "content": { - "name": "PostToEventBus", - "header": 2671, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Event Bus Destination", { - "type": "reference", - "argument": "id", - "category": "full", - "description": "Bus Id" - }, { - "type": "reference", - "argument": "destinations", - "category": "full", - "description": "If Empty need to broadcase message to everyone" - }, { - "type": "reference", - "argument": "message", - "category": "hidden", - "description": "Message" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 2, - "name": "destinations" - }, { - "type": "bytes", - "id": 3, - "name": "message" - }] - } - }, { - "type": "update", - "content": { - "name": "EventBusDeviceConnected", - "header": 2561, - "doc": [ - "Update about pubsub device connected", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " ID of Event Bus" - }, { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " Joined User Id" - }, { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Joined Device Unique Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "userId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "deviceId" - }] - } - }, { - "type": "update", - "content": { - "name": "EventBusDeviceDisconnected", - "header": 2563, - "doc": [ - "Update about device disconnected", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " ID of Event Bus" - }, { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " Joined User Id" - }, { - "type": "reference", - "argument": "deviceId", - "category": "full", - "description": " Disconnected Device unique Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "userId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "deviceId" - }] - } - }, { - "type": "update", - "content": { - "name": "EventBusMessage", - "header": 2562, - "doc": [ - "Event Bus Message", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Event Bus Id" - }, { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " Sender of message" - }, { - "type": "reference", - "argument": "senderDeviceId", - "category": "full", - "description": " Device Id of sender" - }, { - "type": "reference", - "argument": "message", - "category": "hidden", - "description": " Message" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "userId" - } - }, - "id": 2, - "name": "senderId" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 3, - "name": "senderDeviceId" - }, { - "type": "bytes", - "id": 4, - "name": "message" - }] - } - }, { - "type": "update", - "content": { - "name": "EventBusDisposed", - "header": 2564, - "doc": [ - "Event Bus dispose", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Event Bus Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 1, - "name": "id" - }] - } - }] - }, { - "title": "Values", - "package": "values", - "doc": [ - "Synced Values" - ], - "items": [{ - "type": "struct", - "content": { - "name": "SyncedValue", - "doc": [ - "Synced Value container", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Unique Id of a value. Unique in the scope of one named value." - }, { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Optional value" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "id" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 2, - "name": "value" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadSyncedSet", - "header": 2679, - "response": { - "type": "anonymous", - "header": 2680, - "doc": [{ - "type": "reference", - "argument": "values", - "category": "full", - "description": " Current set values" - }, { - "type": "reference", - "argument": "isStrong", - "category": "full", - "description": " Is this value strong and stored in sequence. By default is true." - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "SyncedValue" - } - }, - "id": 1, - "name": "values" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isStrong" - }] - }, - "doc": [ - "Loading synced set", { - "type": "reference", - "argument": "setName", - "category": "hidden", - "description": "readable name of the set" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "setName" - }] - } - }, { - "type": "update", - "content": { - "name": "SynedSetUpdated", - "header": 72, - "doc": [ - "Update about synced set update", { - "type": "reference", - "argument": "setName", - "category": "full", - "description": " Set Name" - }, { - "type": "reference", - "argument": "syncedValues", - "category": "full", - "description": " Current set values" - }, { - "type": "reference", - "argument": "isStrong", - "category": "full", - "description": " Is this value strong and need to be stored on disk" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "setName" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "SyncedValue" - } - }, - "id": 2, - "name": "syncedValues" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isStrong" - }] - } - }, { - "type": "update", - "content": { - "name": "SyncedSetAddedOrUpdated", - "header": 73, - "doc": [ - "Update about added or updated values in the synced set", { - "type": "reference", - "argument": "setName", - "category": "full", - "description": " Set Name" - }, { - "type": "reference", - "argument": "addedOrUpdatedValues", - "category": "hidden", - "description": " Added or updated values" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "setName" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "SyncedValue" - } - }, - "id": 2, - "name": "addedOrUpdatedValues" - }] - } - }, { - "type": "update", - "content": { - "name": "SyncedSetRemoved", - "header": 74, - "doc": [ - "Update about removed items from synced set", { - "type": "reference", - "argument": "setName", - "category": "full", - "description": " Set Name" - }, { - "type": "reference", - "argument": "removedItems", - "category": "full", - "description": " Removed Items from the set" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "setName" - }, { - "type": { - "type": "list", - "childType": { - "type": "alias", - "childType": "randomId" - } - }, - "id": 2, - "name": "removedItems" - }] - } - }] - }, { - "title": "WebRTC", - "package": "webrtc", - "doc": [ - "WebRTC package that enables support to audio and video calls" - ], - "items": [{ - "type": "update", - "content": { - "name": "IncomingCall", - "header": 52, - "doc": [ - "Update about incoming call (Sent every 10 seconds)", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, { - "type": "reference", - "argument": "attemptIndex", - "category": "full", - "description": " Optional attempt Index" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 2, - "name": "attemptIndex" - }] - } - }, { - "type": "update", - "content": { - "name": "CallHandled", - "header": 53, - "doc": [ - "Update about incoming call handled", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, { - "type": "reference", - "argument": "attemptIndex", - "category": "full", - "description": " Optional attempt Index" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 2, - "name": "attemptIndex" - }] - } - }, { - "type": "update", - "content": { - "name": "CallUpgraded", - "header": 56, - "doc": [ - "Update about call moved to other peer", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Upgraded group id" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 2, - "name": "groupId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetCallInfo", - "header": 2600, - "response": { - "type": "anonymous", - "header": 2606, - "doc": [{ - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Destination peer" - }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Users" - }, { - "type": "reference", - "argument": "eventBusId", - "category": "full", - "description": " Event Bus Id" - }, { - "type": "reference", - "argument": "isAudioOnlyCall", - "category": "full", - "description": " Is Audio Only Call. Default is true" - }, { - "type": "reference", - "argument": "isVideoOnlyCall", - "category": "full", - "description": " Is Video Only Call. Default is false." - }, { - "type": "reference", - "argument": "isVideoPreferred", - "category": "full", - "description": " Is Video preferred" - }], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 2, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 3, - "name": "users" - }, { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 4, - "name": "eventBusId" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 5, - "name": "isAudioOnlyCall" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "isVideoOnlyCall" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 7, - "name": "isVideoPreferred" - }] - }, - "doc": [ - "Getting Call Information", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DoCall", - "header": 2597, - "response": { - "type": "anonymous", - "header": 2598, - "doc": [{ - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, { - "type": "reference", - "argument": "eventBusId", - "category": "full", - "description": " Call Event Bus Id" - }], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "alias", - "childType": "busId" - }, - "id": 2, - "name": "eventBusId" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 3, - "name": "deviceId" - }] - }, - "doc": [ - "Do Call. Right after a call client need to start sending CallInProgress", { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "destination peer" - }, { - "type": "reference", - "argument": "timeout", - "category": "full", - "description": "Initial timeout" - }, { - "type": "reference", - "argument": "isAudioOnlyCall", - "category": "full", - "description": "Is Audio only call. Default is true." - }, { - "type": "reference", - "argument": "isVideoOnlyCall", - "category": "full", - "description": "Is Video Only call. Default is false." - }, { - "type": "reference", - "argument": "isVideoPreferred", - "category": "full", - "description": "Is Video preferred" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "OutPeer" - }, - "id": 1, - "name": "peer" - }, { - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "msec" - } - }, - "id": 2, - "name": "timeout" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "isAudioOnlyCall" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "isVideoOnlyCall" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "isVideoPreferred" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UpgradeCall", - "header": 2677, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Method for upgrading a call from private call to group call", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - }, { - "type": "reference", - "argument": "peer", - "category": "full", - "description": "Destination peer for upgrading" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "struct", - "childType": "GroupOutPeer" - }, - "id": 2, - "name": "peer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DoCallAgain", - "header": 2678, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Call again to user", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - }, { - "type": "reference", - "argument": "user", - "category": "full", - "description": "User to call again" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 2, - "name": "user" - }] - } - }, { - "type": "rpc", - "content": { - "name": "JoinCall", - "header": 2683, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Joining Call", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RejectCall", - "header": 2684, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Rejecting Call", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": "Call Id" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "OptimizeSDP", - "header": 2685, - "response": { - "type": "anonymous", - "header": 2686, - "doc": [{ - "type": "reference", - "argument": "optimizedSDP", - "category": "hidden", - "description": " Optimized version of SDP" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "optimizedSDP" - }] - }, - "doc": [ - "Optimizing SDP", { - "type": "reference", - "argument": "type", - "category": "full", - "description": "Type of SDP (offer or answer)" - }, { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": "SDP value" - }, { - "type": "reference", - "argument": "ownSettings", - "category": "full", - "description": "Own Settings" - }, { - "type": "reference", - "argument": "theirSettings", - "category": "full", - "description": "Their Settings" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "type" - }, { - "type": "string", - "id": 2, - "name": "sdp" - }, { - "type": { - "type": "struct", - "childType": "PeerSettings" - }, - "id": 3, - "name": "ownSettings" - }, { - "type": { - "type": "struct", - "childType": "PeerSettings" - }, - "id": 4, - "name": "theirSettings" - }] - } - }, { - "type": "struct", - "content": { - "name": "ICEServer", - "doc": [ - "ICE Server description", { - "type": "reference", - "argument": "url", - "category": "full", - "description": " Url to server" - }, { - "type": "reference", - "argument": "username", - "category": "full", - "description": " Optional username" - }, { - "type": "reference", - "argument": "credential", - "category": "danger", - "description": " Optional credential" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "url" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "username" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "credential" - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "WebRTCSignaling", - "attributes": [] - } - }, { - "type": "comment", - "content": "Advertising" - }, { - "type": "struct", - "content": { - "name": "AdvertiseSelf", - "doc": [ - "Advertizing self to a master mode", { - "type": "reference", - "argument": "peerSettings", - "category": "full", - "description": " Optional peer Settings" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 21 - }, - "attributes": [{ - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "PeerSettings" - } - }, - "id": 1, - "name": "peerSettings" - }] - } - }, { - "type": "struct", - "content": { - "name": "AdvertiseMaster", - "doc": [ - "Sent by master" - ], - "trait": { - "name": "WebRTCSignaling", - "key": 26 - }, - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "ICEServer" - } - }, - "id": 1, - "name": "server" - }] - } - }, { - "type": "comment", - "content": "Web RTC signaling" - }, { - "type": "struct", - "content": { - "name": "Candidate", - "doc": [ - "Candidate signal", { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id of candidate" - }, { - "type": "reference", - "argument": "index", - "category": "full", - "description": " Index of candidate" - }, { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Id of candidate" - }, { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": " SDP of candidate" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 3 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "sessionId" - }, { - "type": "int32", - "id": 2, - "name": "index" - }, { - "type": "string", - "id": 3, - "name": "id" - }, { - "type": "string", - "id": 4, - "name": "sdp" - }] - } - }, { - "type": "struct", - "content": { - "name": "Offer", - "doc": [ - "Offer signal", { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id of offer" - }, { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": " Offer SDP" - }, { - "type": "reference", - "argument": "ownPeerSettings", - "category": "full", - "description": " Optional Own Peer settings" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 4 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "sessionId" - }, { - "type": "string", - "id": 2, - "name": "sdp" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "PeerSettings" - } - }, - "id": 3, - "name": "ownPeerSettings" - }] - } - }, { - "type": "struct", - "content": { - "name": "Answer", - "doc": [ - "Answer signal", { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id of answer" - }, { - "type": "reference", - "argument": "sdp", - "category": "full", - "description": " Answer SDP" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 5 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "sessionId" - }, { - "type": "string", - "id": 2, - "name": "sdp" - }] - } - }, { - "type": "struct", - "content": { - "name": "MediaStreamsUpdated", - "doc": [ - "Update about media stream settings updated. Can be sent before offer/answer.", { - "type": "reference", - "argument": "isAudioEnabled", - "category": "full", - "description": " Is Audio Enabled in current connection. True by default." - }, { - "type": "reference", - "argument": "isVideoEnabled", - "category": "full", - "description": " Is Video Enabled in current connection. False by default." - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 28 - }, - "attributes": [{ - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "isAudioEnabled" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isVideoEnabled" - }] - } - }, { - "type": "comment", - "content": "Call Controlling events" - }, { - "type": "struct", - "content": { - "name": "NeedOffer", - "doc": [ - "Notification from master that offer is required", { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Destination Device Id" - }, { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - }, { - "type": "reference", - "argument": "peerSettings", - "category": "full", - "description": " Optional peer settings" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 8 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - }, { - "type": { - "type": "opt", - "childType": { - "type": "struct", - "childType": "PeerSettings" - } - }, - "id": 3, - "name": "peerSettings" - }] - } - }, { - "type": "struct", - "content": { - "name": "NegotinationSuccessful", - "doc": [ - "Notification about on negotiation is successful", { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Device Id" - }, { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 24 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - }] - } - }, { - "type": "struct", - "content": { - "name": "EnableConnection", - "doc": [ - "Notification about enabling connection to peer", { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Device Id" - }, { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 22 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - }] - } - }, { - "type": "struct", - "content": { - "name": "OnRenegotiationNeeded", - "doc": [ - "Need renegotiate session. For example when streams are changed.", { - "type": "reference", - "argument": "device", - "category": "full", - "description": " Device Id" - }, { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 25 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - }] - } - }, { - "type": "struct", - "content": { - "name": "CloseSession", - "doc": [ - "Close this session and be ready to", { - "type": "reference", - "argument": "device", - "category": "hidden", - "description": " Device Id" - }, { - "type": "reference", - "argument": "sessionId", - "category": "full", - "description": " Session Id for renegotiation" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 6 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 2, - "name": "sessionId" - }] - } - }, { - "type": "struct", - "content": { - "name": "NeedDisconnect", - "doc": [ - "Notification about requirement about required disconnection from peer", { - "type": "reference", - "argument": "device", - "category": "hidden", - "description": " Device Id" - } - ], - "trait": { - "name": "WebRTCSignaling", - "key": 20 - }, - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "device" - }] - } - }, { - "type": "struct", - "content": { - "name": "ActiveCall", - "doc": [ - "Active Calls. Used in broadcasting states of current calls.", { - "type": "reference", - "argument": "callId", - "category": "full", - "description": " Call Id" - }, { - "type": "reference", - "argument": "peer", - "category": "full", - "description": " Call's peer" - }, { - "type": "reference", - "argument": "callMembers", - "category": "full", - "description": " Call Members" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "callId" - }, { - "type": { - "type": "struct", - "childType": "Peer" - }, - "id": 2, - "name": "peer" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "CallMember" - } - }, - "id": 3, - "name": "callMembers" - }] - } - }, { - "type": "enum", - "content": { - "name": "CallMemberState", - "values": [{ - "name": "RINGING", - "id": 1 - }, { - "name": "RINGING_REACHED", - "id": 4 - }, { - "name": "CONNECTING", - "id": 2 - }, { - "name": "CONNECTED", - "id": 3 - }, { - "name": "ENDED", - "id": 5 - }] - } - }, { - "type": "struct", - "content": { - "name": "CallMemberStateHolder", - "doc": [ - "Call Member state holder", { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State Value" - }, { - "type": "reference", - "argument": "fallbackIsRinging", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, { - "type": "reference", - "argument": "fallbackIsConnected", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, { - "type": "reference", - "argument": "fallbackIsConnecting", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, { - "type": "reference", - "argument": "fallbackIsRingingReached", - "category": "full", - "description": " Fallback flag for future compatibility of state" - }, { - "type": "reference", - "argument": "fallbackIsEnded", - "category": "full", - "description": " Fallback flag for future compatibility of state" - } - ], - "attributes": [{ - "type": { - "type": "enum", - "childType": "CallMemberState" - }, - "id": 1, - "name": "state" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "fallbackIsRinging" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "fallbackIsConnected" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "fallbackIsConnecting" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 5, - "name": "fallbackIsRingingReached" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 6, - "name": "fallbackIsEnded" - }] - } - }, { - "type": "struct", - "content": { - "name": "CallMember", - "doc": [ - "Call Member", { - "type": "reference", - "argument": "userId", - "category": "full", - "description": " Member User Id" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of member" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "userId" - }, { - "type": { - "type": "struct", - "childType": "CallMemberStateHolder" - }, - "id": 3, - "name": "state" - }] - } - }, { - "type": "struct", - "content": { - "name": "PeerSettings", - "doc": [ - "Peer Settings", { - "type": "reference", - "argument": "is3DESSupported", - "category": "full", - "description": " Marking if 3DES supported. Default is false." - }, { - "type": "reference", - "argument": "isMobile", - "category": "full", - "description": " Is Peer a mobile phone. Default is false." - }, { - "type": "reference", - "argument": "canBeAudioRelay", - "category": "full", - "description": " If peer can audio relay. Default is false." - }, { - "type": "reference", - "argument": "canPreConnect", - "category": "full", - "description": " If peer can preconnect before answer" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 1, - "name": "is3DESSupported" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 2, - "name": "isMobile" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 3, - "name": "canBeAudioRelay" - }, { - "type": { - "type": "opt", - "childType": "bool" - }, - "id": 4, - "name": "canPreConnect" - }] - } - }] - }, { - "title": "Config sync", - "package": "configs", - "doc": [ - "Parameter Syncronization across devices. Can be used for simple sync", - "across devices without rewriting server side code." - ], - "items": [{ - "type": "struct", - "content": { - "name": "Parameter", - "doc": [ - "Syncing Parameter", { - "type": "reference", - "argument": "key", - "category": "full", - "description": " Key of parameter" - }, { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Value of parameter" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "key" - }, { - "type": "string", - "id": 2, - "name": "value" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetParameters", - "header": 134, - "response": { - "type": "anonymous", - "header": 135, - "doc": [{ - "type": "reference", - "argument": "parameters", - "category": "full", - "description": " Current parameters" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Parameter" - } - }, - "id": 1, - "name": "parameters" - }] - }, - "doc": [ - "Getting Parameters" - ], - "attributes": [] - } - }, { - "type": "rpc", - "content": { - "name": "EditParameter", - "header": 128, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Change parameter value", { - "type": "reference", - "argument": "key", - "category": "full", - "description": "Key of parameter" - }, { - "type": "reference", - "argument": "value", - "category": "full", - "description": "Value of parameter" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "key" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "value" - }] - } - }, { - "type": "update", - "content": { - "name": "ParameterChanged", - "header": 131, - "doc": [ - "Update about parameter change", { - "type": "reference", - "argument": "key", - "category": "full", - "description": " Key of parameter" - }, { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Value of parameter" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "key" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "value" - }] - } - }] - }, { - "title": "Stats", - "package": "stats", - "doc": [ - "Saving statistics information" - ], - "items": [{ - "type": "struct", - "content": { - "name": "EventRecord", - "doc": [ - "Record for stored event" - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "date" - }, - "id": 1, - "name": "date" - }, { - "type": { - "type": "trait", - "childType": "Event" - }, - "id": 2, - "name": "event" - }] - } - }, { - "type": "trait", - "content": { - "isContainer": "true", - "name": "Event", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "UntypedEvent", - "doc": [ - "Untyped event", { - "type": "reference", - "argument": "eventType", - "category": "full", - "description": " Event type" - }, { - "type": "reference", - "argument": "params", - "category": "full", - "description": " optional params for event" - } - ], - "trait": { - "name": "Event", - "key": 1 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "eventType" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 2, - "name": "params" - }] - } - }, { - "type": "struct", - "content": { - "name": "ContentViewChanged", - "doc": [ - "Content view event", { - "type": "reference", - "argument": "contentType", - "category": "full", - "description": " unique content id" - }, { - "type": "reference", - "argument": "visible", - "category": "full", - "description": " Is content visible" - }, { - "type": "reference", - "argument": "params", - "category": "full", - "description": " optional params for content view" - } - ], - "trait": { - "name": "Event", - "key": 2 - }, - "expandable": "true", - "attributes": [{ - "type": "string", - "id": 1, - "name": "contentType" - }, { - "type": "string", - "id": 2, - "name": "contentId" - }, { - "type": "bool", - "id": 3, - "name": "visible" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 4, - "name": "params" - }] - } - }, { - "type": "struct", - "content": { - "name": "AppVisibleChanged", - "doc": [ - "On App Visible event", { - "type": "reference", - "argument": "visible", - "category": "full", - "description": " Is app visible" - } - ], - "trait": { - "name": "Event", - "key": 4 - }, - "expandable": "true", - "attributes": [{ - "type": "bool", - "id": 1, - "name": "visible" - }] - } - }, { - "type": "rpc", - "content": { - "name": "StoreEvents", - "header": 243, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Storing events on server", { - "type": "reference", - "argument": "events", - "category": "full", - "description": "Events for storing" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "Event" - } - }, - "id": 1, - "name": "events" - }] - } - }] - }, { - "title": "Raw API", - "package": "raw", - "doc": [ - "Schema-less API that is useful for external integrations" - ], - "items": [{ - "type": "rpc", - "content": { - "name": "RawRequest", - "header": 2569, - "response": { - "type": "anonymous", - "header": 2570, - "doc": [ - "Response of a raw request", { - "type": "reference", - "argument": "result", - "category": "full", - "description": " Result of request" - } - ], - "attributes": [{ - "type": { - "type": "trait", - "childType": "RawValue" - }, - "id": 1, - "name": "result" - }] - }, - "doc": [ - "Making raw request to external service via shema-less RPC request", { - "type": "reference", - "argument": "service", - "category": "full", - "description": "Service name for RPC request" - }, { - "type": "reference", - "argument": "method", - "category": "full", - "description": "Method for execution" - }, { - "type": "reference", - "argument": "params", - "category": "full", - "description": "Optional params for the method" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "service" - }, { - "type": "string", - "id": 2, - "name": "method" - }, { - "type": { - "type": "opt", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 3, - "name": "params" - }] - } - }] - }, { - "title": "Wallpappers", - "package": "wallpappers", - "doc": [ - "Wallpappers support" - ], - "items": [{ - "type": "struct", - "content": { - "name": "Wallpapper", - "doc": [ - "Wallpapper structure", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Wallpapper id" - }, { - "type": "reference", - "argument": "w", - "category": "full", - "description": " Image width" - }, { - "type": "reference", - "argument": "h", - "category": "full", - "description": " Image height" - }, { - "type": "reference", - "argument": "fileSize", - "category": "full", - "description": " Image file size" - }, { - "type": "reference", - "argument": "file", - "category": "full", - "description": " Image file reference" - }, { - "type": "reference", - "argument": "thumb", - "category": "full", - "description": " Image thumb" - } - ], - "attributes": [{ - "type": "int32", - "id": 7, - "name": "id" - }, { - "type": "int32", - "id": 1, - "name": "w" - }, { - "type": "int32", - "id": 2, - "name": "h" - }, { - "type": "int32", - "id": 3, - "name": "fileSize" - }, { - "type": { - "type": "struct", - "childType": "FileLocation" - }, - "id": 5, - "name": "file" - }, { - "type": { - "type": "struct", - "childType": "FastThumb" - }, - "id": 6, - "name": "thumb" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadWallpappers", - "header": 241, - "response": { - "type": "anonymous", - "header": 242, - "doc": [ - "Loaded Wallpappers", { - "type": "reference", - "argument": "wallpappers", - "category": "full", - "description": " Available wallpapper list" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Wallpapper" - } - }, - "id": 1, - "name": "wallpappers" - }] - }, - "doc": [ - "Load available wallpappers", { - "type": "reference", - "argument": "maxWidth", - "category": "full", - "description": "Maximum width of wallpapper" - }, { - "type": "reference", - "argument": "maxHeight", - "category": "full", - "description": "Maximum height of wallpapper" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "maxWidth" - }, { - "type": "int32", - "id": 2, - "name": "maxHeight" - }] - } - }] - }, { - "title": "Push", - "package": "push", - "doc": [ - "Vendor's pushes for receiving push notifications.", - "Push notification contains current sequence number of main sequence." - ], - "items": [{ - "type": "rpc", - "content": { - "name": "RegisterGooglePush", - "header": 51, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registering push token on server", { - "type": "reference", - "argument": "projectId", - "category": "hidden", - "description": "Project Id of token" - }, { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "token value" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "projectId" - }, { - "type": "string", - "id": 2, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnregisterGooglePush", - "header": 2631, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregistering Google Push", { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "Token value" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RegisterApplePush", - "header": 76, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registering apple push on server", { - "type": "reference", - "argument": "apnsKey", - "category": "hidden", - "description": "apns key id" - }, { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "token value" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "apnsKey" - }, { - "type": "string", - "id": 2, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnregisterApplePush", - "header": 2632, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregistering Apple Push", { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Token" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RegisterApplePushKit", - "header": 2576, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registration of a new Apple's PushKit tokens", { - "type": "reference", - "argument": "apnsKey", - "category": "hidden", - "description": "APNS key id" - }, { - "type": "reference", - "argument": "token", - "category": "danger", - "description": "token value" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "apnsKey" - }, { - "type": "string", - "id": 2, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnregisterApplePushKit", - "header": 2633, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregistering Apple Push Kit token", { - "type": "reference", - "argument": "token", - "category": "hidden", - "description": "Token Value" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RegisterApplePushToken", - "header": 2593, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Registering Apple Push Token", { - "type": "reference", - "argument": "bundleId", - "category": "full", - "description": "Bundle Id of app" - }, { - "type": "reference", - "argument": "token", - "category": "full", - "description": "Push token" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "bundleId" - }, { - "type": "string", - "id": 2, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnregisterApplePushToken", - "header": 2634, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregister Apple Push token", { - "type": "reference", - "argument": "token", - "category": "hidden", - "description": "Token value" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "token" - }] - } - }, { - "type": "rpc", - "content": { - "name": "RegisterActorPush", - "header": 2575, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Register Actor Push endpoint", { - "type": "reference", - "argument": "endpoint", - "category": "full", - "description": "Endpoint for push sending" - }, { - "type": "reference", - "argument": "encryptionKeys", - "category": "full", - "description": "Push Encryption keys" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "endpoint" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 2, - "name": "encryptionKeys" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UnregisterActorPush", - "header": 2635, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Unregister Actor Push endpoint", { - "type": "reference", - "argument": "endpoint", - "category": "full", - "description": "Endpoint for unregistering" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "endpoint" - }] - } - }] - }, { - "title": "Encryption", - "package": "encryption", - "doc": [ - "Package that include encryption support", - "Key alg types:", - "* curve25519 - https://en.wikipedia.org/wiki/Curve25519", - "* rsa-2048", - "* rsa-4096", - "* aes-128", - "* kuznechik-128", - "", - "Signature alg types:", - "* Ed25519 - used curve25519 conveted to Ed255519 for signing and validataion" - ], - "items": [{ - "type": "comment", - "content": "Public Keys" - }, { - "type": "struct", - "content": { - "name": "EncryptionKeyGroup", - "doc": [ - "Encryption Key Group", { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, { - "type": "reference", - "argument": "identityKey", - "category": "full", - "description": " Key that is used as identity and for validation of Key Group changes" - }, { - "type": "reference", - "argument": "supportedEncryption", - "category": "full", - "description": " Supported encryption methods by this key group" - }, { - "type": "reference", - "argument": "keys", - "category": "compact", - "description": " keys of Key Group" - }, { - "type": "reference", - "argument": "signatures", - "category": "compact", - "description": " Signatures of keys" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 2, - "name": "supportedEncryption" - }, { - "type": { - "type": "struct", - "childType": "EncryptionKey" - }, - "id": 3, - "name": "identityKey" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 4, - "name": "keys" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 5, - "name": "signatures" - }] - } - }, { - "type": "struct", - "content": { - "name": "EncryptionKeySignature", - "doc": [ - "Signed Key. Usually used for public keys.", { - "type": "reference", - "argument": "keyId", - "category": "full", - "description": " Key Id used for signature" - }, { - "type": "reference", - "argument": "signatureAlg", - "category": "full", - "description": " Signature algorithm" - }, { - "type": "reference", - "argument": "signature", - "category": "full", - "description": " Signature value" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "keyId" - }, { - "type": "string", - "id": 2, - "name": "signatureAlg" - }, { - "type": "bytes", - "id": 3, - "name": "signature" - }] - } - }, { - "type": "struct", - "content": { - "name": "EncryptionKey", - "doc": [ - "Encryption Key", { - "type": "reference", - "argument": "keyId", - "category": "full", - "description": " Key Id" - }, { - "type": "reference", - "argument": "keyAlg", - "category": "full", - "description": " Key Algorithm" - }, { - "type": "reference", - "argument": "keyMaterial", - "category": "compact", - "description": " Public key material. Can be null, but always not null for LoadPublicKey" - }, { - "type": "reference", - "argument": "keyHash", - "category": "hidden", - "description": " If keyMaterial is null, pass keyHash - SHA256 of key" - } - ], - "expandable": "true", - "attributes": [{ - "type": "int64", - "id": 1, - "name": "keyId" - }, { - "type": "string", - "id": 2, - "name": "keyAlg" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 3, - "name": "keyMaterial" - }, { - "type": { - "type": "opt", - "childType": "bytes" - }, - "id": 4, - "name": "keyHash" - }] - } - }, { - "type": "response", - "content": { - "name": "PublicKeys", - "header": 2602, - "doc": [ - "Public Keys response", { - "type": "reference", - "argument": "publicKey", - "category": "full", - "description": " Public keys" - }, { - "type": "reference", - "argument": "signatures", - "category": "full", - "description": " Signatures of public keys" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 1, - "name": "publicKey" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 2, - "name": "signatures" - }] - } - }, { - "type": "response", - "content": { - "name": "PublicKeyGroups", - "header": 2604, - "doc": [ - "Public key groups response" - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeyGroup" - } - }, - "id": 1, - "name": "publicKeyGroups" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadPublicKeyGroups", - "header": 2601, - "response": { - "type": "reference", - "name": "PublicKeyGroups" - }, - "doc": [ - "Loading Public key groups", { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userPeer" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadPublicKey", - "header": 2605, - "response": { - "type": "reference", - "name": "PublicKeys" - }, - "doc": [ - "Loading public key explictly", { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - }, { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key group's id" - }, { - "type": "reference", - "argument": "keyIds", - "category": "full", - "description": "Key ids for loading" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userPeer" - }, { - "type": "int32", - "id": 2, - "name": "keyGroupId" - }, { - "type": { - "type": "list", - "childType": "int64" - }, - "id": 3, - "name": "keyIds" - }] - } - }, { - "type": "rpc", - "content": { - "name": "LoadPrePublicKeys", - "header": 2603, - "response": { - "type": "reference", - "name": "PublicKeys" - }, - "doc": [ - "Loading SOME of ephermal public keys", { - "type": "reference", - "argument": "userPeer", - "category": "full", - "description": "User's peer" - }, { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "User's key group id" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "userPeer" - }, { - "type": "int32", - "id": 2, - "name": "keyGroupId" - }] - } - }, { - "type": "update", - "content": { - "name": "PublicKeyGroupChanged", - "header": 103, - "doc": [ - "Update about public key group changed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroup", - "category": "full", - "description": " Updated Key Group" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "struct", - "childType": "EncryptionKeyGroup" - }, - "id": 2, - "name": "keyGroup" - }] - } - }, { - "type": "update", - "content": { - "name": "KeysAdded", - "header": 112, - "doc": [ - "Update about keys added to Key Group", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, { - "type": "reference", - "argument": "keys", - "category": "compact", - "description": " Added keys" - }, { - "type": "reference", - "argument": "signatures", - "category": "compact", - "description": " Signatures of a public key" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 3, - "name": "keys" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 4, - "name": "signatures" - }] - } - }, { - "type": "update", - "content": { - "name": "KeysRemoved", - "header": 113, - "doc": [ - "Update about keys removed from Key Group", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, { - "type": "reference", - "argument": "keyIds", - "category": "full", - "description": " Removed keys" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }, { - "type": { - "type": "list", - "childType": "int64" - }, - "id": 3, - "name": "keyIds" - }] - } - }, { - "type": "update", - "content": { - "name": "PublicKeyGroupAdded", - "header": 104, - "doc": [ - "Update about public key group added", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroup", - "category": "full", - "description": " Added Key Group" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "struct", - "childType": "EncryptionKeyGroup" - }, - "id": 2, - "name": "keyGroup" - }] - } - }, { - "type": "update", - "content": { - "name": "PublicKeyGroupRemoved", - "header": 105, - "doc": [ - "Update about public key group removed", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Removed Key Group Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }] - } - }, { - "type": "comment", - "content": "Device Side" - }, { - "type": "rpc", - "content": { - "name": "CreateNewKeyGroup", - "header": 2609, - "response": { - "type": "anonymous", - "header": 2610, - "doc": [{ - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Created Key Group id" - }], - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }] - }, - "doc": [ - "Creation of a new Key Group", { - "type": "reference", - "argument": "identityKey", - "category": "full", - "description": "Identity Key of a new group" - }, { - "type": "reference", - "argument": "supportedEncryptions", - "category": "full", - "description": "Supported encryption methods" - }, { - "type": "reference", - "argument": "keys", - "category": "full", - "description": "keys of current group" - }, { - "type": "reference", - "argument": "signatures", - "category": "full", - "description": "signatures of keys" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "EncryptionKey" - }, - "id": 1, - "name": "identityKey" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 2, - "name": "supportedEncryptions" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 3, - "name": "keys" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 4, - "name": "signatures" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DeleteKeyGroup", - "header": 2611, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Deletion of a Key Group", { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id for deletion" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DisconnectKeyGroup", - "header": 2613, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Disconnect Key Group from device", { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id for disconnection" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "ConnectKeyGroup", - "header": 2614, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Connectiong Key Group to device", { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id for connection" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "UploadPreKey", - "header": 2612, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Uploading Ephermal Keys", { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": "Key Group Id" - }, { - "type": "reference", - "argument": "keys", - "category": "compact", - "description": "Encryprion keys" - }, { - "type": "reference", - "argument": "signatures", - "category": "compact", - "description": "Key signatures" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 1, - "name": "keyGroupId" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKey" - } - }, - "id": 2, - "name": "keys" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptionKeySignature" - } - }, - "id": 3, - "name": "signatures" - }] - } - }, { - "type": "comment", - "content": "Encrypted Packages" - }, { - "type": "struct", - "content": { - "name": "EncryptedBox", - "doc": [ - "Encrypted package that is encrypted for multiple keys", { - "type": "reference", - "argument": "keys", - "category": "full", - "description": " Encrypted encryption keys" - }, { - "type": "reference", - "argument": "algType", - "category": "full", - "description": " Package encryption type" - }, { - "type": "reference", - "argument": "encPackage", - "category": "full", - "description": " Encrypted package" - }, { - "type": "reference", - "argument": "senderKeyGroupId", - "category": "full", - "description": " Sender key group" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 4, - "name": "senderKeyGroupId" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncyptedBoxKey" - } - }, - "id": 1, - "name": "keys" - }, { - "type": "string", - "id": 2, - "name": "algType" - }, { - "type": "bytes", - "id": 3, - "name": "encPackage" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "EncryptedBoxSignature" - } - }, - "id": 5, - "name": "signatures" - }] - } - }, { - "type": "struct", - "content": { - "name": "EncryptedBoxSignature", - "doc": [ - "Signature for encrypted package", { - "type": "reference", - "argument": "algType", - "category": "full", - "description": " Alg Type" - }, { - "type": "reference", - "argument": "signature", - "category": "full", - "description": " Signature of encrypted package" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "algType" - }, { - "type": "bytes", - "id": 2, - "name": "signature" - }] - } - }, { - "type": "struct", - "content": { - "name": "EncyptedBoxKey", - "doc": [ - "Encrypted package encryption key", { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - }, { - "type": "reference", - "argument": "algType", - "category": "full", - "description": " Key encryption algorithm" - }, { - "type": "reference", - "argument": "encryptedKey", - "category": "hidden", - "description": " Encrypted encryption key" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "usersId" - }, { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }, { - "type": "string", - "id": 3, - "name": "algType" - }, { - "type": "bytes", - "id": 4, - "name": "encryptedKey" - }] - } - }, { - "type": "struct", - "content": { - "name": "KeyGroupId", - "doc": [ - "References to key groups", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroupId", - "category": "full", - "description": " Key Group Id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "alias", - "childType": "keyGroupId" - }, - "id": 2, - "name": "keyGroupId" - }] - } - }, { - "type": "struct", - "content": { - "name": "KeyGroupHolder", - "doc": [ - "Key Group Holder", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "keyGroup", - "category": "full", - "description": " Key Group" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": { - "type": "struct", - "childType": "EncryptionKeyGroup" - }, - "id": 2, - "name": "keyGroup" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SendEncryptedPackage", - "header": 2657, - "response": { - "type": "anonymous", - "header": 2664, - "doc": [{ - "type": "reference", - "argument": "date", - "category": "full", - "description": " date" - }, { - "type": "reference", - "argument": "obsoleteKeyGroups", - "category": "full", - "description": " obsolete key group ids" - }, { - "type": "reference", - "argument": "missedKeyGroups", - "category": "full", - "description": " missed key groups" - }], - "attributes": [{ - "type": { - "type": "opt", - "childType": { - "type": "alias", - "childType": "date" - } - }, - "id": 1, - "name": "date" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "KeyGroupId" - } - }, - "id": 2, - "name": "obsoleteKeyGroups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "KeyGroupHolder" - } - }, - "id": 3, - "name": "missedKeyGroups" - }] - }, - "doc": [ - "Sending encrypted package", { - "type": "reference", - "argument": "randomId", - "category": "hidden", - "description": "Random id" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "randomId" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 2, - "name": "destPeers" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "KeyGroupId" - } - }, - "id": 3, - "name": "ignoredKeyGroups" - }, { - "type": { - "type": "struct", - "childType": "EncryptedBox" - }, - "id": 4, - "name": "encryptedBox" - }] - } - }, { - "type": "update", - "content": { - "name": "EncryptedPackage", - "header": 177, - "doc": [ - "Update about encrypted package", { - "type": "reference", - "argument": "randomId", - "category": "full", - "description": " Random Id of package" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Sending date of package" - }, { - "type": "reference", - "argument": "senderId", - "category": "full", - "description": " Sender id of package" - }, { - "type": "reference", - "argument": "encryptedBox", - "category": "full", - "description": " Encrypted box" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 1, - "name": "randomId" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 2, - "name": "date" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 3, - "name": "senderId" - }, { - "type": { - "type": "struct", - "childType": "EncryptedBox" - }, - "id": 4, - "name": "encryptedBox" - }] - } - }] - }, { - "title": "Storage", - "package": "storage", - "items": [{ - "type": "rpc", - "content": { - "name": "UploadSharedBlob", - "header": 2660, - "response": { - "type": "anonymous", - "header": 2661, - "doc": [{ - "type": "reference", - "argument": "sharedObjectId", - "category": "full", - "description": " Id of shared object" - }], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "sharedObjectId" - }] - }, - "doc": [ - "Upload shared blob with user", { - "type": "reference", - "argument": "destPeer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "bucket", - "category": "full", - "description": "Bucked name" - }, { - "type": "reference", - "argument": "blob", - "category": "full", - "description": "Blob data" - }, { - "type": "reference", - "argument": "randomId", - "category": "full", - "description": "Random id for protecting from double upload" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "destPeer" - }, { - "type": "string", - "id": 2, - "name": "bucket" - }, { - "type": "bytes", - "id": 3, - "name": "blob" - }, { - "type": { - "type": "alias", - "childType": "randomId" - }, - "id": 4, - "name": "randomId" - }] - } - }, { - "type": "rpc", - "content": { - "name": "DownloadSharedBlob", - "header": 2662, - "response": { - "type": "anonymous", - "header": 2663, - "doc": [{ - "type": "reference", - "argument": "blob", - "category": "full", - "description": " Blob contents" - }], - "attributes": [{ - "type": "bytes", - "id": 1, - "name": "blob" - }] - }, - "doc": [ - "Download shared blob", { - "type": "reference", - "argument": "destPeer", - "category": "full", - "description": "Destination peer" - }, { - "type": "reference", - "argument": "bucket", - "category": "full", - "description": "Bucket name" - }, { - "type": "reference", - "argument": "objectId", - "category": "full", - "description": "Object Id" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "UserOutPeer" - }, - "id": 1, - "name": "destPeer" - }, { - "type": "string", - "id": 2, - "name": "bucket" - }, { - "type": "int32", - "id": 3, - "name": "objectId" - }] - } - }] - }, { - "title": "Peers", - "package": "peers", - "doc": [ - "Peer is an identificator of specific conversation." - ], - "items": [{ - "type": "enum", - "content": { - "name": "PeerType", - "values": [{ - "name": "Private", - "id": 1 - }, { - "name": "Group", - "id": 2 - }, { - "name": "EncryptedPrivate", - "id": 3 - }] - } - }, { - "type": "struct", - "content": { - "name": "Peer", - "doc": [ - "Peer", { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Peer Type" - }, { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Peer Id" - } - ], - "attributes": [{ - "type": { - "type": "enum", - "childType": "PeerType" - }, - "id": 1, - "name": "type" - }, { - "type": "int32", - "id": 2, - "name": "id" - }] - } - }, { - "type": "struct", - "content": { - "name": "OutPeer", - "doc": [ - "Out peer with access hash", { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Peer Type" - }, { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Peer Id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Peer access hash" - } - ], - "attributes": [{ - "type": { - "type": "enum", - "childType": "PeerType" - }, - "id": 1, - "name": "type" - }, { - "type": "int32", - "id": 2, - "name": "id" - }, { - "type": "int64", - "id": 3, - "name": "accessHash" - }] - } - }, { - "type": "struct", - "content": { - "name": "UserOutPeer", - "doc": [ - "User's out peer", { - "type": "reference", - "argument": "uid", - "category": "full", - "description": " User's id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " User's access hash" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 1, - "name": "uid" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }, { - "type": "struct", - "content": { - "name": "GroupOutPeer", - "doc": [ - "Group's out peer", { - "type": "reference", - "argument": "groupId", - "category": "full", - "description": " Group's Id" - }, { - "type": "reference", - "argument": "accessHash", - "category": "danger", - "description": " Group's access hash" - } - ], - "attributes": [{ - "type": { - "type": "alias", - "childType": "groupId" - }, - "id": 1, - "name": "groupId" - }, { - "type": "int64", - "id": 2, - "name": "accessHash" - }] - } - }] - }, { - "title": "Sequence and Updates", - "package": "sequence", - "doc": [ - "Each device has it's own update sequence. At the begining application request initial sequence state by", - "calling GetState. On each application restart or NewSessionCreated application calls GetDifference for receiving", - "updates in update sequence.", - "GetState and GetDifference automatically subscribes session to receiving updates in session.", - "Each update has seq and state. Seq is sequental index of updated and used for detecting of holes in update sequence", - "(because of server failure or session die) on client side.", - "All updates needed to be processed in partucular order according to seq values.", - "In some updates there can be references to users that are not available at client yer. In this case application need", - "to ignore such update and init getting difference." - ], - "items": [{ - "type": "update_box", - "content": { - "name": "SeqUpdate", - "header": 13, - "doc": [ - "Sequence update", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of update" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequece state of update" - }, { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " header of update" - }, { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The update" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": "int32", - "id": 3, - "name": "updateHeader" - }, { - "type": "bytes", - "id": 4, - "name": "update" - }] - } - }, { - "type": "update_box", - "content": { - "name": "FatSeqUpdate", - "header": 73, - "doc": [ - "Fat sequence update with additional data", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of update" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": " Sequence state of update" - }, { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " header of update" - }, { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The update" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Users that are referenced in update" - }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups that are referenced in update" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": "int32", - "id": 3, - "name": "updateHeader" - }, { - "type": "bytes", - "id": 4, - "name": "update" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 5, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 6, - "name": "groups" - }] - } - }, { - "type": "update_box", - "content": { - "name": "WeakUpdate", - "header": 26, - "doc": [ - "Out of sequence update (for typing and online statuses)", { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of update" - }, { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " Header of update" - }, { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The update" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "date" - }, { - "type": "int32", - "id": 2, - "name": "updateHeader" - }, { - "type": "bytes", - "id": 3, - "name": "update" - }] - } - }, { - "type": "update_box", - "content": { - "name": "WeakFatUpdate", - "header": 2673, - "doc": [ - "Fat Weak Update", { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of update" - }, { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " Header of update" - }, { - "type": "reference", - "argument": "update", - "category": "full", - "description": " The update" - }, { - "type": "reference", - "argument": "users", - "category": "full", - "description": " Users that are referenced in update" - }, { - "type": "reference", - "argument": "groups", - "category": "full", - "description": " Groups that are referenced in update" - } - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "date" - }, { - "type": "int32", - "id": 2, - "name": "updateHeader" - }, { - "type": "bytes", - "id": 3, - "name": "update" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 4, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 5, - "name": "groups" - }] - } - }, { - "type": "update_box", - "content": { - "name": "SeqUpdateTooLong", - "header": 25, - "doc": [ - "Notification about requiring performing manual GetDifference" - ], - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "UpdateContainer", - "doc": [ - "Update container", { - "type": "reference", - "argument": "updateHeader", - "category": "full", - "description": " Header of update" - }, { - "type": "reference", - "argument": "update", - "category": "compact", - "description": " The updatre" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "updateHeader" - }, { - "type": "bytes", - "id": 2, - "name": "update" - }] - } - }, { - "type": "update_box", - "content": { - "name": "CombinedUpdate", - "header": 2625, - "doc": [ - "Combined update", { - "type": "reference", - "argument": "seqStart", - "category": "full", - "description": " Sequence number start" - }, { - "type": "reference", - "argument": "seqEnd", - "category": "full", - "description": " Sequence number end" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " Sequence state" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Update's users" - }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Update's groups" - }, { - "type": "reference", - "argument": "updates", - "category": "full", - "description": " Updates (can be empty)" - }, { - "type": "reference", - "argument": "messages", - "category": "full", - "description": " New messages" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seqStart" - }, { - "type": "int32", - "id": 2, - "name": "seqEnd" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 3, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 4, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 5, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UpdateContainer" - } - }, - "id": 6, - "name": "updates" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageContainer" - } - }, - "id": 7, - "name": "messages" - }] - } - }, { - "type": "enum", - "content": { - "name": "UpdateOptimization", - "values": [{ - "name": "NONE", - "id": 1 - }, { - "name": "STRIP_ENTITIES", - "id": 2 - }, { - "name": "ENABLE_COMBINED", - "id": 3 - }, { - "name": "FASTER_MESSAGES", - "id": 4 - }, { - "name": "STRIP_COUNTERS", - "id": 5 - }, { - "name": "COMPACT_USERS", - "id": 6 - }, { - "name": "GROUPS_V2", - "id": 7 - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetState", - "header": 9, - "response": { - "type": "reference", - "name": "Seq" - }, - "doc": [ - "Get main sequence state", { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 1, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetDifference", - "header": 11, - "response": { - "type": "anonymous", - "header": 12, - "doc": [{ - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Seq of LAST update in updates" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " State of LAST update in updates" - }, { - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Users referenced in updates" - }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Groups referenced in updates" - }, { - "type": "reference", - "argument": "updates", - "category": "compact", - "description": " Updates" - }, { - "type": "reference", - "argument": "needMore", - "category": "full", - "description": " Need to perform other difference" - }, { - "type": "reference", - "argument": "usersRefs", - "category": "full", - "description": " Direct references of users" - }, { - "type": "reference", - "argument": "groupsRefs", - "category": "full", - "description": " Direct References of groups" - }], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 3, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 6, - "name": "groups" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UpdateContainer" - } - }, - "id": 4, - "name": "updates" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MessageContainer" - } - }, - "id": 7, - "name": "messages" - }, { - "type": "bool", - "id": 5, - "name": "needMore" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 8, - "name": "usersRefs" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 9, - "name": "groupsRefs" - }] - }, - "doc": [ - "Getting difference of sequence", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": "Sequence number" - }, { - "type": "reference", - "argument": "state", - "category": "compact", - "description": "Sequence state" - }, { - "type": "reference", - "argument": "optimizations", - "category": "full", - "description": "Enabled optimizations" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": { - "type": "list", - "childType": { - "type": "enum", - "childType": "UpdateOptimization" - } - }, - "id": 3, - "name": "optimizations" - }] - } - }, { - "type": "rpc", - "content": { - "name": "GetReferencedEntitites", - "header": 2628, - "response": { - "type": "anonymous", - "header": 2629, - "doc": [{ - "type": "reference", - "argument": "users", - "category": "compact", - "description": " Loaded users" - }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": " Loaded groups" - }], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "User" - } - }, - "id": 1, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "Group" - } - }, - "id": 2, - "name": "groups" - }] - }, - "doc": [ - "Loading referenced entities", { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Users to load" - }, { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups to load. Also returns all members of a group." - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - }, { - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 2, - "name": "groups" - }] - } - }, { - "type": "update", - "content": { - "name": "RawUpdate", - "header": 80, - "doc": [ - "Custom Raw Update", { - "type": "reference", - "argument": "type", - "category": "full", - "description": " Type of content" - }, { - "type": "reference", - "argument": "bytes", - "category": "full", - "description": " Raw data" - } - ], - "attributes": [{ - "type": { - "type": "opt", - "childType": "string" - }, - "id": 1, - "name": "type" - }, { - "type": "bytes", - "id": 2, - "name": "bytes" - }] - } - }, { - "type": "update", - "content": { - "name": "EmptyUpdate", - "header": 85, - "doc": [ - "Empty update" - ], - "attributes": [] - } - }, { - "type": "empty" - }, { - "type": "rpc", - "content": { - "name": "SubscribeToOnline", - "header": 32, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Subscribing for users online", { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Users for subscription" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SubscribeFromOnline", - "header": 33, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Removing subscription for users online", { - "type": "reference", - "argument": "users", - "category": "compact", - "description": "Users of subscriptions" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "UserOutPeer" - } - }, - "id": 1, - "name": "users" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SubscribeToGroupOnline", - "header": 74, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Subscribing for groups online", { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups for subscription" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 1, - "name": "groups" - }] - } - }, { - "type": "rpc", - "content": { - "name": "SubscribeFromGroupOnline", - "header": 75, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Removing subscription for groups online", { - "type": "reference", - "argument": "groups", - "category": "compact", - "description": "Groups of subscriptions" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "GroupOutPeer" - } - }, - "id": 1, - "name": "groups" - }] - } - }] - }, { - "title": "Counters", - "package": "counters", - "doc": [ - "Application Counters, used to display various counters in application" - ], - "items": [{ - "type": "struct", - "content": { - "name": "AppCounters", - "doc": [ - "Application counters", { - "type": "reference", - "argument": "globalCounter", - "category": "full", - "description": " Global unread counter" - } - ], - "expandable": "true", - "attributes": [{ - "type": { - "type": "opt", - "childType": "int32" - }, - "id": 1, - "name": "globalCounter" - }] - } - }, { - "type": "update", - "content": { - "name": "CountersChanged", - "header": 215, - "doc": [ - "Update about counters changed", { - "type": "reference", - "argument": "counters", - "category": "full", - "description": " Current Application counters" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "AppCounters" - }, - "id": 1, - "name": "counters" - }] - } - }] - }, { - "title": "Miscellaneous", - "package": "misc", - "items": [{ - "type": "response", - "content": { - "name": "Void", - "header": 50, - "doc": [ - "Empty response" - ], - "attributes": [] - } - }, { - "type": "response", - "content": { - "name": "Seq", - "header": 72, - "doc": [ - "Sequence response. Methods that return this value must process response in particular order", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of response" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " Sequence state of response" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }] - } - }, { - "type": "response", - "content": { - "name": "SeqDate", - "header": 102, - "doc": [ - "Sequence response with date. Methods that return this value must process response in particular order", { - "type": "reference", - "argument": "seq", - "category": "full", - "description": " Sequence number of response" - }, { - "type": "reference", - "argument": "state", - "category": "full", - "description": " Sequence state of response" - }, { - "type": "reference", - "argument": "date", - "category": "full", - "description": " Date of response" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "seq" - }, { - "type": { - "type": "alias", - "childType": "seq_state" - }, - "id": 2, - "name": "state" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 3, - "name": "date" - }] - } - }, { - "type": "response", - "content": { - "name": "Bool", - "header": 209, - "doc": [ - "Boolean response", { - "type": "reference", - "argument": "value", - "category": "full", - "description": " Response value" - } - ], - "attributes": [{ - "type": "bool", - "id": 1, - "name": "value" - }] - } - }, { - "type": "struct", - "content": { - "name": "Config", - "doc": [ - "Configuration of system", { - "type": "reference", - "argument": "maxGroupSize", - "category": "full", - "description": " Current maximum group size" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "maxGroupSize" - }] - } - }, { - "type": "struct", - "content": { - "name": "Extension", - "doc": [ - "Extention", { - "type": "reference", - "argument": "id", - "category": "full", - "description": " Extension id" - }, { - "type": "reference", - "argument": "data", - "category": "full", - "description": " Extension data" - } - ], - "attributes": [{ - "type": "int32", - "id": 1, - "name": "id" - }, { - "type": "bytes", - "id": 2, - "name": "data" - }] - } - }, { - "type": "update", - "content": { - "name": "Config", - "header": 42, - "doc": [ - "Update about config change", { - "type": "reference", - "argument": "config", - "category": "full", - "description": " new config" - } - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Config" - }, - "id": 1, - "name": "config" - }] - } - }] - }, { - "title": "Device Info", - "package": "device", - "doc": [ - "Submiting various information about device for providing better experience.", - "For example, getting timezone or preffered languages" - ], - "items": [{ - "type": "rpc", - "content": { - "name": "NotifyAboutDeviceInfo", - "header": 229, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Notifying about device information", { - "type": "reference", - "argument": "preferredLanguages", - "category": "full", - "description": "Preferred languages" - }, { - "type": "reference", - "argument": "timeZone", - "category": "full", - "description": "Device Time Zone" - } - ], - "attributes": [{ - "type": { - "type": "list", - "childType": "string" - }, - "id": 1, - "name": "preferredLanguages" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 2, - "name": "timeZone" - }] - } - }] - }, { - "title": "Webactions", - "package": "webactions", - "doc": [ - "Web actions allow clients to visit some predefined web pages,", - "perform actions, and pass result on action completion" - ], - "items": [{ - "type": "rpc", - "content": { - "name": "InitWebaction", - "header": 116, - "response": { - "type": "anonymous", - "header": 117, - "doc": [{ - "type": "reference", - "argument": "uri", - "category": "full", - "description": " Web action uri" - }, { - "type": "reference", - "argument": "regexp", - "category": "full", - "description": " Regular expression. Required to match completion of web action" - }, { - "type": "reference", - "argument": "actionHash", - "category": "danger", - "description": " Identifier of current web action. Required to complete it" - }], - "attributes": [{ - "type": "string", - "id": 1, - "name": "uri" - }, { - "type": "string", - "id": 2, - "name": "regexp" - }, { - "type": "string", - "id": 3, - "name": "actionHash" - }] - }, - "doc": [ - "Initialize start of web action", { - "type": "reference", - "argument": "actionName", - "category": "full", - "description": "Name of web action" - }, { - "type": "reference", - "argument": "params", - "category": "full", - "description": "Additional params required to make action's uri" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "actionName" - }, { - "type": { - "type": "struct", - "childType": "MapValue" - }, - "id": 2, - "name": "params" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CompleteWebaction", - "header": 123, - "response": { - "type": "anonymous", - "header": 124, - "doc": [{ - "type": "reference", - "argument": "result", - "category": "full", - "description": " Reslut of web action completion" - }], - "attributes": [{ - "type": { - "type": "struct", - "childType": "MapValue" - }, - "id": 1, - "name": "result" - }] - }, - "doc": [ - "Complete started web action", { - "type": "reference", - "argument": "actionHash", - "category": "danger", - "description": "Identifier of given web action" - }, { - "type": "reference", - "argument": "completeUri", - "category": "full", - "description": "Final uri of web action" - } - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "actionHash" - }, { - "type": "string", - "id": 2, - "name": "completeUri" - }] - } - }] - }, { - "title": "Collections", - "package": "collections", - "doc": [ - "Flexible raw collections without structure" - ], - "items": [{ - "type": "trait", - "content": { - "isContainer": "true", - "name": "RawValue", - "attributes": [] - } - }, { - "type": "struct", - "content": { - "name": "StringValue", - "doc": [ - "Text value" - ], - "trait": { - "name": "RawValue", - "key": 1 - }, - "attributes": [{ - "type": "string", - "id": 1, - "name": "text" - }] - } - }, { - "type": "struct", - "content": { - "name": "Int32Value", - "doc": [ - "Int32 value" - ], - "trait": { - "name": "RawValue", - "key": 2 - }, - "attributes": [{ - "type": "int32", - "id": 1, - "name": "value" - }] - } - }, { - "type": "struct", - "content": { - "name": "Int64Value", - "doc": [ - "Int64 value" - ], - "trait": { - "name": "RawValue", - "key": 3 - }, - "attributes": [{ - "type": "int64", - "id": 1, - "name": "value" - }] - } - }, { - "type": "struct", - "content": { - "name": "DoubleValue", - "doc": [ - "Double value" - ], - "trait": { - "name": "RawValue", - "key": 4 - }, - "attributes": [{ - "type": "double", - "id": 1, - "name": "value" - }] - } - }, { - "type": "struct", - "content": { - "name": "ArrayValue", - "doc": [ - "Array value" - ], - "trait": { - "name": "RawValue", - "key": 5 - }, - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "trait", - "childType": "RawValue" - } - }, - "id": 1, - "name": "array" - }] - } - }, { - "type": "struct", - "content": { - "name": "MapValueItem", - "doc": [ - "Item of Map" - ], - "attributes": [{ - "type": "string", - "id": 1, - "name": "key" - }, { - "type": { - "type": "trait", - "childType": "RawValue" - }, - "id": 2, - "name": "value" - }] - } - }, { - "type": "struct", - "content": { - "name": "MapValue", - "doc": [ - "Map Value" - ], - "trait": { - "name": "RawValue", - "key": 6 - }, - "attributes": [{ - "type": { - "type": "list", - "childType": { - "type": "struct", - "childType": "MapValueItem" - } - }, - "id": 1, - "name": "items" - }] - } - }] - }, { - "title": "Surveys", - "package": "surveys", - "doc": [ - "Surveys implementation for messages" - ], - "items": [{ - "type": "struct", - "content": { - "name": "Survey", - "doc": [ - "Main Survey Struct" - ], - "attributes": [{ - "type": "int64", - "id": 1, - "name": "id" - }, { - "type": "string", - "id": 2, - "name": "titulo" - }, { - "type": { - "type": "opt", - "childType": "string" - }, - "id": 3, - "name": "uf" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 4, - "name": "creationTime" - }, { - "type": { - "type": "alias", - "childType": "date" - }, - "id": 5, - "name": "endTime" - }, { - "type": { - "type": "alias", - "childType": "userId" - }, - "id": 6, - "name": "ownerId" - }, { - "type": { - "type": "list", - "childType": "string" - }, - "id": 7, - "name": "answers" - }] - } - }, { - "type": "rpc", - "content": { - "name": "CreateSurvey", - "header": 139, - "response": { - "type": "reference", - "name": "Void" - }, - "doc": [ - "Criar uma nova enquete" - ], - "attributes": [{ - "type": { - "type": "struct", - "childType": "Survey" - }, - "id": 1, - "name": "survey" - }] - } - }] - }] -} \ No newline at end of file + ] + } + },{"type":"rpc","content":{ +"name":"GetState", +"header":9, +"response":{"type":"reference","name":"Seq"}, +"doc":[ +"Get main sequence state",{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":1,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"GetDifference", +"header":11, +"response":{"type":"anonymous","header":12, "doc":[ +{"type":"reference","argument":"seq","category":"full","description":" Seq of LAST update in updates"},{"type":"reference","argument":"state","category":"full","description":" State of LAST update in updates"},{"type":"reference","argument":"users","category":"compact","description":" Users referenced in updates"},{"type":"reference","argument":"groups","category":"compact","description":" Groups referenced in updates"},{"type":"reference","argument":"updates","category":"compact","description":" Updates"},{"type":"reference","argument":"needMore","category":"full","description":" Need to perform other difference"},{"type":"reference","argument":"usersRefs","category":"full","description":" Direct references of users"},{"type":"reference","argument":"groupsRefs","category":"full","description":" Direct References of groups"}] ,"attributes":[{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":3,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":6,"name":"groups"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UpdateContainer"}},"id":4,"name":"updates"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"MessageContainer"}},"id":7,"name":"messages"} +,{"type":"bool","id":5,"name":"needMore"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":8,"name":"usersRefs"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":9,"name":"groupsRefs"} +]}, +"doc":[ +"Getting difference of sequence",{"type":"reference","argument":"seq","category":"full","description":"Sequence number"},{"type":"reference","argument":"state","category":"compact","description":"Sequence state"},{"type":"reference","argument":"optimizations","category":"full","description":"Enabled optimizations"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"list","childType":{"type":"enum","childType":"UpdateOptimization"}},"id":3,"name":"optimizations"} +]}},{"type":"rpc","content":{ +"name":"GetReferencedEntitites", +"header":2628, +"response":{"type":"anonymous","header":2629, "doc":[ +{"type":"reference","argument":"users","category":"compact","description":" Loaded users"},{"type":"reference","argument":"groups","category":"compact","description":" Loaded groups"}] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"User"}},"id":1,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":2,"name":"groups"} +]}, +"doc":[ +"Loading referenced entities",{"type":"reference","argument":"users","category":"compact","description":"Users to load"},{"type":"reference","argument":"groups","category":"compact","description":"Groups to load. Also returns all members of a group."}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":2,"name":"groups"} +]}},{"type":"update","content":{ +"name":"RawUpdate", +"header":80, +"doc":[ +"Custom Raw Update",{"type":"reference","argument":"type","category":"full","description":" Type of content"},{"type":"reference","argument":"bytes","category":"full","description":" Raw data"}],"attributes":[ +{"type":{"type":"opt","childType":"string"},"id":1,"name":"type"} +,{"type":"bytes","id":2,"name":"bytes"} +]}},{"type":"update","content":{ +"name":"EmptyUpdate", +"header":85, +"doc":[ +"Empty update"],"attributes":[ +]}},{"type":"empty"},{"type":"rpc","content":{ +"name":"SubscribeToOnline", +"header":32, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Subscribing for users online",{"type":"reference","argument":"users","category":"compact","description":"Users for subscription"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +]}},{"type":"rpc","content":{ +"name":"SubscribeFromOnline", +"header":33, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Removing subscription for users online",{"type":"reference","argument":"users","category":"compact","description":"Users of subscriptions"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"UserOutPeer"}},"id":1,"name":"users"} +]}},{"type":"rpc","content":{ +"name":"SubscribeToGroupOnline", +"header":74, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Subscribing for groups online",{"type":"reference","argument":"groups","category":"compact","description":"Groups for subscription"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} +]}},{"type":"rpc","content":{ +"name":"SubscribeFromGroupOnline", +"header":75, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Removing subscription for groups online",{"type":"reference","argument":"groups","category":"compact","description":"Groups of subscriptions"}],"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"GroupOutPeer"}},"id":1,"name":"groups"} +]}}]}, { + "title": "Counters", + "package": "counters", + "doc": [ + "Application Counters, used to display various counters in application" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"AppCounters", +"doc":[ +"Application counters",{"type":"reference","argument":"globalCounter","category":"full","description":" Global unread counter"}],"expandable":"true","attributes":[ +{"type":{"type":"opt","childType":"int32"},"id":1,"name":"globalCounter"} +]}},{"type":"update","content":{ +"name":"CountersChanged", +"header":215, +"doc":[ +"Update about counters changed",{"type":"reference","argument":"counters","category":"full","description":" Current Application counters"}],"attributes":[ +{"type":{"type":"struct","childType":"AppCounters"},"id":1,"name":"counters"} +]}}]}, { + "title": "Miscellaneous", + "package": "misc", + "items": [ +{"type":"response","content":{ +"name":"Void", +"header":50, +"doc":[ +"Empty response"],"attributes":[ +]}},{"type":"response","content":{ +"name":"Seq", +"header":72, +"doc":[ +"Sequence response. Methods that return this value must process response in particular order",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of response"},{"type":"reference","argument":"state","category":"full","description":" Sequence state of response"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +]}},{"type":"response","content":{ +"name":"SeqDate", +"header":102, +"doc":[ +"Sequence response with date. Methods that return this value must process response in particular order",{"type":"reference","argument":"seq","category":"full","description":" Sequence number of response"},{"type":"reference","argument":"state","category":"full","description":" Sequence state of response"},{"type":"reference","argument":"date","category":"full","description":" Date of response"}],"attributes":[ +{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"alias","childType":"date"},"id":3,"name":"date"} +]}},{"type":"response","content":{ +"name":"Bool", +"header":209, +"doc":[ +"Boolean response",{"type":"reference","argument":"value","category":"full","description":" Response value"}],"attributes":[ +{"type":"bool","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"Config", +"doc":[ +"Configuration of system",{"type":"reference","argument":"maxGroupSize","category":"full","description":" Current maximum group size"}],"attributes":[ +{"type":"int32","id":1,"name":"maxGroupSize"} +]}}, { + "type":"struct", + "content": { + "name":"Extension", +"doc":[ +"Extention",{"type":"reference","argument":"id","category":"full","description":" Extension id"},{"type":"reference","argument":"data","category":"full","description":" Extension data"}],"attributes":[ +{"type":"int32","id":1,"name":"id"} +,{"type":"bytes","id":2,"name":"data"} +]}},{"type":"update","content":{ +"name":"Config", +"header":42, +"doc":[ +"Update about config change",{"type":"reference","argument":"config","category":"full","description":" new config"}],"attributes":[ +{"type":{"type":"struct","childType":"Config"},"id":1,"name":"config"} +]}}]}, { + "title": "Device Info", + "package": "device", + "doc": [ + "Submiting various information about device for providing better experience.", + "For example, getting timezone or preffered languages" + ], + "items": [ +{"type":"rpc","content":{ +"name":"NotifyAboutDeviceInfo", +"header":229, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Notifying about device information",{"type":"reference","argument":"preferredLanguages","category":"full","description":"Preferred languages"},{"type":"reference","argument":"timeZone","category":"full","description":"Device Time Zone"}],"attributes":[ +{"type":{"type":"list","childType":"string"},"id":1,"name":"preferredLanguages"} +,{"type":{"type":"opt","childType":"string"},"id":2,"name":"timeZone"} +]}}]}, { + "title": "Webactions", + "package": "webactions", + "doc": [ + "Web actions allow clients to visit some predefined web pages,", + "perform actions, and pass result on action completion" + ], + "items": [ +{"type":"rpc","content":{ +"name":"InitWebaction", +"header":116, +"response":{"type":"anonymous","header":117, "doc":[ +{"type":"reference","argument":"uri","category":"full","description":" Web action uri"},{"type":"reference","argument":"regexp","category":"full","description":" Regular expression. Required to match completion of web action"},{"type":"reference","argument":"actionHash","category":"danger","description":" Identifier of current web action. Required to complete it"}] ,"attributes":[{"type":"string","id":1,"name":"uri"} +,{"type":"string","id":2,"name":"regexp"} +,{"type":"string","id":3,"name":"actionHash"} +]}, +"doc":[ +"Initialize start of web action",{"type":"reference","argument":"actionName","category":"full","description":"Name of web action"},{"type":"reference","argument":"params","category":"full","description":"Additional params required to make action's uri"}],"attributes":[ +{"type":"string","id":1,"name":"actionName"} +,{"type":{"type":"struct","childType":"MapValue"},"id":2,"name":"params"} +]}},{"type":"rpc","content":{ +"name":"CompleteWebaction", +"header":123, +"response":{"type":"anonymous","header":124, "doc":[ +{"type":"reference","argument":"result","category":"full","description":" Reslut of web action completion"}] ,"attributes":[{"type":{"type":"struct","childType":"MapValue"},"id":1,"name":"result"} +]}, +"doc":[ +"Complete started web action",{"type":"reference","argument":"actionHash","category":"danger","description":"Identifier of given web action"},{"type":"reference","argument":"completeUri","category":"full","description":"Final uri of web action"}],"attributes":[ +{"type":"string","id":1,"name":"actionHash"} +,{"type":"string","id":2,"name":"completeUri"} +]}}]}, { + "title": "Collections", + "package": "collections", + "doc": [ + "Flexible raw collections without structure" + ], + "items": [ +{"type":"trait","content":{ +"isContainer":"true","name":"RawValue","attributes":[ +]}}, { + "type":"struct", + "content": { + "name":"StringValue", +"doc":[ +"Text value"],"trait":{"name":"RawValue","key":1},"attributes":[ +{"type":"string","id":1,"name":"text"} +]}}, { + "type":"struct", + "content": { + "name":"Int32Value", +"doc":[ +"Int32 value"],"trait":{"name":"RawValue","key":2},"attributes":[ +{"type":"int32","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"Int64Value", +"doc":[ +"Int64 value"],"trait":{"name":"RawValue","key":3},"attributes":[ +{"type":"int64","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"DoubleValue", +"doc":[ +"Double value"],"trait":{"name":"RawValue","key":4},"attributes":[ +{"type":"double","id":1,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"ArrayValue", +"doc":[ +"Array value"],"trait":{"name":"RawValue","key":5},"attributes":[ +{"type":{"type":"list","childType":{"type":"trait","childType":"RawValue"}},"id":1,"name":"array"} +]}}, { + "type":"struct", + "content": { + "name":"MapValueItem", +"doc":[ +"Item of Map"],"attributes":[ +{"type":"string","id":1,"name":"key"} +,{"type":{"type":"trait","childType":"RawValue"},"id":2,"name":"value"} +]}}, { + "type":"struct", + "content": { + "name":"MapValue", +"doc":[ +"Map Value"],"trait":{"name":"RawValue","key":6},"attributes":[ +{"type":{"type":"list","childType":{"type":"struct","childType":"MapValueItem"}},"id":1,"name":"items"} +]}}]}, { + "title": "Surveys", + "package": "surveys", + "doc": [ + "Surveys implementation for messages" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"Survey", +"doc":[ +"Main Survey Struct"],"attributes":[ +{"type":"int64","id":1,"name":"id"} +,{"type":"string","id":2,"name":"title"} +,{"type":{"type":"opt","childType":"string"},"id":3,"name":"description"} +,{"type":{"type":"alias","childType":"date"},"id":4,"name":"creationTime"} +,{"type":{"type":"alias","childType":"date"},"id":5,"name":"endTime"} +,{"type":{"type":"alias","childType":"userId"},"id":6,"name":"userId"} +]}}, { + "type":"struct", + "content": { + "name":"SurveyAnswer", +"doc":[ +"Main Survey Answer"],"attributes":[ +{"type":"int64","id":1,"name":"id"} +,{"type":"string","id":2,"name":"title"} +]}}, { + "type":"struct", + "content": { + "name":"UserSurveyAnswer", +"doc":[ +"Main UserSurveyAnser"],"attributes":[ +{"type":{"type":"alias","childType":"userId"},"id":1,"name":"userId"} +,{"type":"int64","id":2,"name":"answerId"} +]}},{"type":"rpc","content":{ +"name":"CreateSurvey", +"header":139, +"response":{"type":"reference","name":"Void"}, +"doc":[ +"Criar uma nova enquete"],"attributes":[ +{"type":{"type":"struct","childType":"Survey"},"id":1,"name":"survey"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"SurveyAnswer"}},"id":2,"name":"answers"} +]}}]}, { + "title": "GroupsPre", + "package": "groupspre", + "doc": [ + "Api para grupos pre-definidos" + ], + "items": [ + { + "type":"struct", + "content": { + "name":"GroupPre", +"doc":[ +"Main GroupPre Struct"],"expandable":"true","attributes":[ +{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} +,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupFatherId"} +,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"childrens"} +]}},{"type":"rpc","content":{ +"name":"LoadGroupsPre", +"header":18, +"response":{"type":"anonymous","header":20, "doc":[ +"fasdfasdfas"] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} +]}, +"doc":[ +"Main LoadGroups"],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupFatherId"} +]}},{"type":"rpc","content":{ +"name":"CreateGroupPre", +"header":19, +"response":{"type":"anonymous","header":21, "doc":[ +"fasdfasdfa"] ,"attributes":[{"type":"int32","id":1,"name":"seq"} +,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} +,{"type":{"type":"struct","childType":"GroupPre"},"id":3,"name":"groupPre"} +]}, +"doc":[ +"fasdfasdfa"],"attributes":[ +{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} +,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupFatherId"} +]}}]}]} \ No newline at end of file diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groupspre/GroupsPreServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groupspre/GroupsPreServiceImpl.scala new file mode 100644 index 0000000000..da66fd1d1f --- /dev/null +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groupspre/GroupsPreServiceImpl.scala @@ -0,0 +1,28 @@ +package im.actor.server.api.rpc.service.groupspre + +import akka.actor.ActorSystem +import akka.http.scaladsl.util.FastFuture +import im.actor.api.rpc._ +import im.actor.api.rpc.groupspre.{GroupspreService, ResponseCreateGroupPre, ResponseLoadGroupsPre} +import im.actor.api.rpc.misc.ResponseVoid +import im.actor.api.rpc.surveys.{ApiSurvey, ApiSurveyAnswer, SurveysService} + +import scala.concurrent.{ExecutionContext, Future} + +/** + * Created by 98379720172 on 16/11/16. + */ +final class GroupsPreServiceImpl()(implicit actorSystem: ActorSystem) extends GroupspreService { + + override implicit val ec: ExecutionContext = actorSystem.dispatcher + + /** Main LoadGroups */ + override protected def doHandleLoadGroupsPre(groupFatherId: Int, clientData: ClientData): Future[HandlerResult[ResponseLoadGroupsPre]] = { + FastFuture.successful(Ok(ResponseVoid)) + } + + /** fasdfasdfa */ + override protected def doHandleCreateGroupPre(groupId: Int, groupFatherId: Int, clientData: ClientData): Future[HandlerResult[ResponseCreateGroupPre]] = { + FastFuture.successful(Ok(ResponseVoid)) + } +} diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala index 3b39a33a8f..f751af8c55 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala @@ -10,29 +10,28 @@ import im.actor.api.rpc.PeerHelpers._ import im.actor.api.rpc._ import im.actor.api.rpc.files.ApiFileLocation import im.actor.api.rpc.groups._ -import im.actor.api.rpc.misc.{ ResponseSeq, ResponseSeqDate, ResponseVoid } -import im.actor.api.rpc.peers.{ ApiGroupOutPeer, ApiUserOutPeer } +import im.actor.api.rpc.misc.{ResponseSeq, ResponseSeqDate, ResponseVoid} +import im.actor.api.rpc.peers.{ApiGroupOutPeer, ApiUserOutPeer} import im.actor.api.rpc.sequence.ApiUpdateOptimization -import im.actor.api.rpc.surveys.{ ApiSurvey, SurveysService } +import im.actor.api.rpc.surveys.{ApiSurvey, ApiSurveyAnswer, SurveysService} import im.actor.api.rpc.users.ApiUser import im.actor.concurrent.FutureExt import im.actor.server.acl.ACLUtils import im.actor.server.db.DbExtension import im.actor.server.dialog.DialogExtension -import im.actor.server.file.{ FileErrors, ImageUtils } +import im.actor.server.file.{FileErrors, ImageUtils} import im.actor.server.group._ import im.actor.server.model.GroupInviteToken import im.actor.server.names.GlobalNamesStorageKeyValueStorage -import im.actor.server.persist.{ GroupInviteTokenRepo, GroupUserRepo } +import im.actor.server.persist.{GroupInviteTokenRepo, GroupUserRepo} import im.actor.server.presences.GroupPresenceExtension -import im.actor.server.sequence.{ SeqState, SeqStateDate, SeqUpdatesExtension } import im.actor.server.user.UserExtension import im.actor.util.ThreadLocalSecureRandom -import im.actor.util.misc.{ IdUtils, StringUtils } +import im.actor.util.misc.{IdUtils, StringUtils} import slick.dbio.DBIO import slick.driver.PostgresDriver.api._ -import scala.concurrent.{ ExecutionContext, Future } +import scala.concurrent.{ExecutionContext, Future} /** * Created by 98379720172 on 16/11/16. */ @@ -41,7 +40,8 @@ final class SurveyServiceImpl()(implicit actorSystem: ActorSystem) extends Surve override implicit val ec: ExecutionContext = actorSystem.dispatcher /** Criar uma nova enquete */ - override protected def doHandleCreateSurvey(survey: ApiSurvey, clientData: ClientData): Future[HandlerResult[ResponseVoid]] = { + /** Criar uma nova enquete */ + override protected def doHandleCreateSurvey(survey: ApiSurvey, answers: IndexedSeq[ApiSurveyAnswer], clientData: ClientData): Future[HandlerResult[ResponseVoid]] = { FastFuture.successful(Ok(ResponseVoid)) } } From 23bfcc64f5424d228cb3ba417dad43e0ac9e0595 Mon Sep 17 00:00:00 2001 From: diego Date: Tue, 31 Jan 2017 21:54:58 -0200 Subject: [PATCH 230/253] Revert "alteracoes" This reverts commit a10bd2538dfcc64d151feddbe35306bfd534138c. --- .../models/im/actor/api/scheme.mps | 50 +++---------------- 1 file changed, 7 insertions(+), 43 deletions(-) diff --git a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps index 8b90c3a517..417db3f790 100644 --- a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps +++ b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps @@ -18638,54 +18638,18 @@ - - - - - - - - - - - - - - - - - - + + - - - - - + + + - - - - - - - - - - - - - - + + - - - - - - From 32764232ad0b835d2412a924e6e834e75b22d931 Mon Sep 17 00:00:00 2001 From: diego Date: Tue, 31 Jan 2017 22:42:44 -0200 Subject: [PATCH 231/253] alteracoes no apontameno do repositorio --- actor-sdk/sdk-core-android/android-google-maps/build.gradle | 6 +++++- actor-sdk/sdk-core-android/android-google-push/build.gradle | 6 +++++- actor-sdk/sdk-core-android/android-sdk/build.gradle | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-google-maps/build.gradle b/actor-sdk/sdk-core-android/android-google-maps/build.gradle index b72a2743e8..23a4d19555 100644 --- a/actor-sdk/sdk-core-android/android-google-maps/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-maps/build.gradle @@ -141,7 +141,11 @@ project.afterEvaluate { mavenDeployer { // beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } - repository(url: "http://64.137.170.2:8081/content/repositories/snapshots/") { +// repository(url: "http://64.137.170.2:8081/content/repositories/snapshots/") { +// authentication(userName: ossrhUsername, password: ossrhPassword) +// } + + repository(url: "http://localhost:8081/nexus/content/repositories/snapshots/") { authentication(userName: ossrhUsername, password: ossrhPassword) } diff --git a/actor-sdk/sdk-core-android/android-google-push/build.gradle b/actor-sdk/sdk-core-android/android-google-push/build.gradle index 96fe3de475..d8869a1832 100644 --- a/actor-sdk/sdk-core-android/android-google-push/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-push/build.gradle @@ -138,7 +138,11 @@ project.afterEvaluate { mavenDeployer { // beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } - repository(url: "http://64.137.170.2:8081/content/repositories/snapshots/") { +// repository(url: "http://64.137.170.2:8081/content/repositories/snapshots/") { +// authentication(userName: ossrhUsername, password: ossrhPassword) +// } + + repository(url: "http://localhost:8081/nexus/content/repositories/snapshots/") { authentication(userName: ossrhUsername, password: ossrhPassword) } diff --git a/actor-sdk/sdk-core-android/android-sdk/build.gradle b/actor-sdk/sdk-core-android/android-sdk/build.gradle index 1ac97a2b84..4e1c0d84ce 100644 --- a/actor-sdk/sdk-core-android/android-sdk/build.gradle +++ b/actor-sdk/sdk-core-android/android-sdk/build.gradle @@ -190,7 +190,11 @@ project.afterEvaluate { mavenDeployer { // beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } - repository(url: "http://64.137.170.2:8081/content/repositories/snapshots/") { +// repository(url: "http://64.137.170.2:8081/content/repositories/snapshots/") { +// authentication(userName: ossrhUsername, password: ossrhPassword) +// } + + repository(url: "http://localhost:8081/nexus/content/repositories/snapshots/") { authentication(userName: ossrhUsername, password: ossrhPassword) } From de8e568b3437483909e415927010702eff69306e Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 1 Feb 2017 08:11:08 -0200 Subject: [PATCH 232/253] servicos de grupos pre --- .../server/grouppre/GroupPreProcessor.scala | 39 +++++++++++++++++++ .../grouppre/GroupPreProcessorRegion.scala | 8 ++++ .../actor/server/grouppre/GroupPreState.scala | 21 ++++++++++ .../groupspre/GroupsPreServiceImpl.scala | 26 ++++++------- .../service/survey/SurveyServiceImpl.scala | 14 +++---- 5 files changed, 88 insertions(+), 20 deletions(-) create mode 100644 actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessor.scala create mode 100644 actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessorRegion.scala create mode 100644 actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreState.scala diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessor.scala new file mode 100644 index 0000000000..870cb19533 --- /dev/null +++ b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessor.scala @@ -0,0 +1,39 @@ +package im.actor.server.grouppre + +import java.time.Instant + +import akka.actor.Props +import im.actor.serialization.ActorSerializer +import im.actor.server.cqrs.TaggedEvent + + +trait GroupEvent extends TaggedEvent { + val ts: Instant + + override def tags: Set[String] = Set("grouppre") +} + +case object StopProcessor + +object GroupPreProcessor { + def register(): Unit = + ActorSerializer.register( +// 30001 → classOf[GroupCommands.Create], +// +// 31001 → classOf[GroupQueries.GetIntegrationToken], +// +// 32005 → classOf[GroupEvents.Created] + + ) + + def persistenceIdFor(groupId: Int): String = s"Grouppre-${groupId}" + + private[grouppre] def props: Props = Props(classOf[GroupPreProcessor]) +} + +/** + * Created by 98379720172 on 31/01/17. + */ +private[grouppre] final class GroupPreProcessor { + +} diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessorRegion.scala b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessorRegion.scala new file mode 100644 index 0000000000..7d447a63b1 --- /dev/null +++ b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessorRegion.scala @@ -0,0 +1,8 @@ +package im.actor.server.grouppre + +/** + * Created by 98379720172 on 31/01/17. + */ +class GroupPreProcessorRegion { + +} diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreState.scala new file mode 100644 index 0000000000..63fbeec18f --- /dev/null +++ b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreState.scala @@ -0,0 +1,21 @@ +package im.actor.server.grouppre + +import java.time.Instant + +import akka.persistence.SnapshotMetadata +import im.actor.server.cqrs.{Event, ProcessorState} + +/** + * Created by 98379720172 on 31/01/17. + */ +private[grouppre] final case class GroupPreState( + groupId:Int, + groupFatherId:Int, + createdAt:Option[Instant], + creatorUserId: Int +) extends ProcessorState[GroupPreState]{ + + override def updated(e: Event): GroupPreState = ??? + + override def withSnapshot(metadata: SnapshotMetadata, snapshot: Any): GroupPreState = ??? +} diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groupspre/GroupsPreServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groupspre/GroupsPreServiceImpl.scala index da66fd1d1f..aa1c696afe 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groupspre/GroupsPreServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groupspre/GroupsPreServiceImpl.scala @@ -3,26 +3,26 @@ package im.actor.server.api.rpc.service.groupspre import akka.actor.ActorSystem import akka.http.scaladsl.util.FastFuture import im.actor.api.rpc._ -import im.actor.api.rpc.groupspre.{GroupspreService, ResponseCreateGroupPre, ResponseLoadGroupsPre} +import im.actor.api.rpc.groupspre.{ GroupspreService, ResponseCreateGroupPre, ResponseLoadGroupsPre } import im.actor.api.rpc.misc.ResponseVoid -import im.actor.api.rpc.surveys.{ApiSurvey, ApiSurveyAnswer, SurveysService} +import im.actor.api.rpc.surveys.{ ApiSurvey, ApiSurveyAnswer, SurveysService } -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.{ ExecutionContext, Future } /** * Created by 98379720172 on 16/11/16. */ -final class GroupsPreServiceImpl()(implicit actorSystem: ActorSystem) extends GroupspreService { +final abstract class GroupsPreServiceImpl()(implicit actorSystem: ActorSystem) extends GroupspreService { override implicit val ec: ExecutionContext = actorSystem.dispatcher - /** Main LoadGroups */ - override protected def doHandleLoadGroupsPre(groupFatherId: Int, clientData: ClientData): Future[HandlerResult[ResponseLoadGroupsPre]] = { - FastFuture.successful(Ok(ResponseVoid)) - } - - /** fasdfasdfa */ - override protected def doHandleCreateGroupPre(groupId: Int, groupFatherId: Int, clientData: ClientData): Future[HandlerResult[ResponseCreateGroupPre]] = { - FastFuture.successful(Ok(ResponseVoid)) - } + // /** Main LoadGroups */ + // override protected def doHandleLoadGroupsPre(groupFatherId: Int, clientData: ClientData): Future[HandlerResult[ResponseLoadGroupsPre]] = { + // FastFuture.successful(Ok(ResponseVoid)) + // } + // + // /** fasdfasdfa */ + // override protected def doHandleCreateGroupPre(groupId: Int, groupFatherId: Int, clientData: ClientData): Future[HandlerResult[ResponseCreateGroupPre]] = { + // FastFuture.successful(Ok(ResponseVoid)) + // } } diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala index f751af8c55..043ba8202a 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala @@ -10,28 +10,28 @@ import im.actor.api.rpc.PeerHelpers._ import im.actor.api.rpc._ import im.actor.api.rpc.files.ApiFileLocation import im.actor.api.rpc.groups._ -import im.actor.api.rpc.misc.{ResponseSeq, ResponseSeqDate, ResponseVoid} -import im.actor.api.rpc.peers.{ApiGroupOutPeer, ApiUserOutPeer} +import im.actor.api.rpc.misc.{ ResponseSeq, ResponseSeqDate, ResponseVoid } +import im.actor.api.rpc.peers.{ ApiGroupOutPeer, ApiUserOutPeer } import im.actor.api.rpc.sequence.ApiUpdateOptimization -import im.actor.api.rpc.surveys.{ApiSurvey, ApiSurveyAnswer, SurveysService} +import im.actor.api.rpc.surveys.{ ApiSurvey, ApiSurveyAnswer, SurveysService } import im.actor.api.rpc.users.ApiUser import im.actor.concurrent.FutureExt import im.actor.server.acl.ACLUtils import im.actor.server.db.DbExtension import im.actor.server.dialog.DialogExtension -import im.actor.server.file.{FileErrors, ImageUtils} +import im.actor.server.file.{ FileErrors, ImageUtils } import im.actor.server.group._ import im.actor.server.model.GroupInviteToken import im.actor.server.names.GlobalNamesStorageKeyValueStorage -import im.actor.server.persist.{GroupInviteTokenRepo, GroupUserRepo} +import im.actor.server.persist.{ GroupInviteTokenRepo, GroupUserRepo } import im.actor.server.presences.GroupPresenceExtension import im.actor.server.user.UserExtension import im.actor.util.ThreadLocalSecureRandom -import im.actor.util.misc.{IdUtils, StringUtils} +import im.actor.util.misc.{ IdUtils, StringUtils } import slick.dbio.DBIO import slick.driver.PostgresDriver.api._ -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.{ ExecutionContext, Future } /** * Created by 98379720172 on 16/11/16. */ From dd2ff8342ab88f74cd964ab91ca8e672dc996505 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 1 Feb 2017 12:45:21 -0200 Subject: [PATCH 233/253] alteracoes3.0 --- actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../ActorApp.xcodeproj/project.pbxproj | 11 ++-- .../sdk-core-ios/ActorApp/AppDelegate.swift | 4 +- .../ActorApp/Supporting Files/Info.plist | 2 +- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../ActorSDK/Sources/ActorSDK.swift | 47 +++++++++++++++--- .../Sources/SwiftExtensions/Strings.swift | 2 +- 8 files changed, 52 insertions(+), 16 deletions(-) diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index 42cd6ef534061b1957b93370d88970e58e337fc8..47b48ba26d4b668388aee7f6d5466e225176536a 100644 GIT binary patch delta 1021 zcmb`EUr19?9LLXBP4A7H-p$=P&D_k~OvjvU>85CsmX?Z@%T@|Hx4XEhTe&~>hZ4#D zkUdDZdP-EPmx8jU^<+Us4?#pEl-i3AJwy=nqERoM?e-P~LHFTY&hLB9@BH|DM!HA3 zr@yJ?UgLY zktL0zp^N7uA#tDB=Lt(uvECCFLtVT&Dv5)wN5fJu5Na0(LiAryYbA+~y_=qun_pO5 zYIoMu&1di`HK!4@^80+_&?w^yc>2Y8HLuFhWeb8k(jy&&>VH3l2#OrkfB3+d-XA(BEyoYgx=+H_FGiPD>5bNrd0>7`8aW;nc zu@(FKJUwEc(yp9yFnkkxAgYY76sx#uMg=qL_6Ga=#XvZeD9aB7T}pgr`L$pkVtEjT zY#>JBAhpCr{3J+*$z?J@X2=|QLSB(~WQi=3FJy(Rk{{$J2w140fdDP^FkmAJV1*Nv zs6qqwU@zL>!a?-F3lV@os}HNr%*piTCNt*1}RQ)%k Mt+AA%vj5!j7nouOQvd(} delta 877 zcma))T}V@59LC>A*E)wC^~~+)=B7L1SFYvPmO4V4P0NpoR7!%Po9zfg-PFxKG_zWz9A zf27m>VpOn~S2=B>z05gj6DORGGMnhISJHRlLAt3k(sf-+vaW@r8+mTpt*@r@yoS2+ z^}<4Gra8C3TIz7tx?^d)HeII|IJ&8_PW3ZvLNFKwp>wP+Ffta1oagfxCYH`?)3_W# zWcd}Q+wY4=ts#G)KOp%Nj*uhdGfY=pcaKW)uE<=GP|Wf^rac@Omy{AVu7u^oZ2LeU zxbw7}vopM(?HKg+wMm0Yxk|2@;ak{KXQa_^AQV)@LtG7`g^lez9U2;vf|0NyyM!YQ zzsmH)n|plWNZYU!l>5i$qHBU}D$i9$5{o4a$tD$~o_L6tjFJg5O=ielvP_un5W^V3 zSzN+pTtO5!P;e8sa2vC@hsSt=r&z=rtl}fq5W^>IU<==|P3JOt)yEo}GMfL5OGruG zi6|peEGVX*`D{9sUqw}hI-jP{!pV8CF@rJ7WG%E<_#`>1_@Sg!c9LcEif4Cl7JiRR zS#hhK9LKBV7!<;Cr%0zRK|afIuyS)5*|s zQG^4i!eP{*9t}8(HXO%Ew4*~t=7kS^7)W3X;T*!xPv*| x#{)dVJQlEw6}-Spyu$0H4&#b?Nh4bKQjflI=Y#);m^#kIoV}#lSHAn(e*qMi&`SUS diff --git a/actor-sdk/sdk-core-ios/.DS_Store b/actor-sdk/sdk-core-ios/.DS_Store index 3b066cfb1dfdf20209bd02d39b6d04977f78981e..d52beba4b934efe7dc72626b20980dfaa81457d1 100644 GIT binary patch delta 62 zcmZoEXero`smRpkGC5n(n0ej5_Q?wsO_|pg@c?P9$qkykn+24(*_qcC{+%qRY03(u Q85kyS(9qc2pxMF)0OMm8yZ`_I delta 62 zcmZoEXero`smRpAGdWw)n7N0wfAT^_Q|1ykPav%|xj~b6vw#veJ97`0@MJknQ&u3& Pz%Y4(hQ{Uw%@#fYZ_^TE diff --git a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj index f0d1613488..9d3e3a0d4d 100644 --- a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj @@ -73,6 +73,7 @@ 9B2EEB8CEF2E94D58EA09D9D /* Pods-ActorApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActorApp.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ActorApp/Pods-ActorApp.debug.xcconfig"; sourceTree = ""; }; A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ActorApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DE8D1D9859D2C4D4C7EC7AD74BB65F0E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "Supporting Files/Info.plist"; sourceTree = ""; }; + F105D04D1E37F58600C722F6 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; F153992A1DF83A0900C67C7D /* AppCocoaHttpRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppCocoaHttpRuntime.swift; sourceTree = ""; }; F175DF8A1E168C8F005BCF1A /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/InfoPlist.strings"; sourceTree = ""; }; F76A77E9428111C798E69B43EA06A281 /* ActorApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = ActorApp.entitlements; path = "Supporting Files/ActorApp.entitlements"; sourceTree = ""; }; @@ -125,6 +126,7 @@ 86C48777C0FD262E78F8BEC9253C9914 /* Frameworks */ = { isa = PBXGroup; children = ( + F105D04D1E37F58600C722F6 /* NotificationCenter.framework */, 06E7B24E1C109C4B0090660C /* MapKit.framework */, 06CE898D1BD841D0005A5530 /* SystemConfiguration.framework */, 06230F031BC7FF2F00A4807B /* ActorSDK.xcodeproj */, @@ -216,6 +218,7 @@ CreatedOnToolsVersion = 6.4; DevelopmentTeam = HA23Y6A5LW; LastSwiftMigration = 0800; + ProvisioningStyle = Manual; SystemCapabilities = { com.apple.Maps.iOS = { enabled = 1; @@ -468,7 +471,8 @@ OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = br.com.diegosilva.xlotomessenger; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE = "4d265c46-c4c1-42b1-aa2e-c579059d20f5"; + PROVISIONING_PROFILE_SPECIFIER = "Xloto Mensageiro Desenvolver"; SDK_PATH = "../actor-sdk"; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -528,7 +532,7 @@ CLANG_MODULES_AUTOLINK = YES; CODE_SIGN_ENTITLEMENTS = "ActorApp/Supporting Files/ActorApp.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; DEVELOPMENT_TEAM = HA23Y6A5LW; EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; ENABLE_BITCODE = NO; @@ -547,7 +551,8 @@ OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = br.com.diegosilva.xlotomessenger; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE = "2560348b-ab8a-41f9-a59c-f918ba3a1600"; + PROVISIONING_PROFILE_SPECIFIER = "Xloto Mensageiro Distribuição"; SDK_PATH = "../actor-sdk"; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; diff --git a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift index 4fb78467ed..17b42ca907 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorApp/AppDelegate.swift @@ -60,9 +60,9 @@ open class AppDelegate : ActorApplicationDelegate { // ActorSDK.sharedActor().autoJoinGroups = ["canalxloto"] - ActorSDK.sharedActor().endpoints = ["tcp://api-mtproto.im.xloto.com.br:9070"] +// ActorSDK.sharedActor().endpoints = ["tcp://api-mtproto.im.xloto.com.br:9070"] - //ActorSDK.sharedActor().endpoints = ["tcp://192.168.1.3:9070"] + ActorSDK.sharedActor().endpoints = ["tcp://192.168.1.3:9070"] // ActorSDK.sharedActor().endpoints = ["tcp://api-mtproto.actor.diegosilva.com.br:9070"] diff --git a/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist b/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist index 2763e95b72..babc65603c 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist +++ b/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist @@ -34,7 +34,7 @@ CFBundleVersion - 1 + 4 Fabric APIKey diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index f6293d2c79..32b281d74e 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.32" + s.version = "3.0.457.33" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift index f91a10c236..6172fe1253 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift @@ -8,8 +8,9 @@ import PushKit import SafariServices import DZNWebViewController import ReachabilitySwift +import UserNotifications -@objc open class ActorSDK: NSObject, PKPushRegistryDelegate { +@objc open class ActorSDK: NSObject, PKPushRegistryDelegate, UNUserNotificationCenterDelegate { // // Shared instance @@ -355,9 +356,7 @@ import ReachabilitySwift } func didLoggedIn() { - // Push registration - if autoPushMode == .afterLogin { requestPush() } @@ -422,10 +421,21 @@ import ReachabilitySwift } fileprivate func requestPush() { - let types: UIUserNotificationType = [.alert, .badge, .sound] - let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: types, categories: nil) - UIApplication.shared.registerUserNotificationSettings(settings) - UIApplication.shared.registerForRemoteNotifications() + if #available(iOS 10.0, *){ + UNUserNotificationCenter.current().delegate = self + UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert], completionHandler: {(granted, error) in + if (granted){ + UIApplication.shared.registerForRemoteNotifications() + }else{ + print("Acesso ao permitido para notificacoes") + } + }) + }else{ + let types: UIUserNotificationType = [.alert, .badge, .sound] + let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: types, categories: nil) + UIApplication.shared.registerUserNotificationSettings(settings) + UIApplication.shared.registerForRemoteNotifications() + } } fileprivate func requestPushKit() { @@ -830,7 +840,7 @@ import ReachabilitySwift }) // Wait for 40 secs before app shutdown - DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default).asyncAfter(deadline: DispatchTime.now() + Double(Int64(40.0 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)) { () -> Void in + DispatchQueue.global(qos: DispatchQoS.QoSClass.default).asyncAfter(deadline: DispatchTime.now() + Double(Int64(40.0 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)) { () -> Void in application.endBackgroundTask(completitionTask) completitionTask = UIBackgroundTaskInvalid } @@ -867,6 +877,7 @@ import ReachabilitySwift open func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { // Nothing? + print("recebeu") } open func application(_ application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { @@ -877,6 +888,25 @@ import ReachabilitySwift // Handling background fetch events // + @available(iOS 10.0, *) + public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { + //print("User Info = ", notification.request.content.userInfo) + completionHandler([.alert, .badge, .sound]) + + } + + @available(iOS 10.0, *) + public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { + //print("User Info = ", response.notification.request.content.userInfo) + + if !messenger.isLoggedIn() { + completionHandler(UIBackgroundFetchResult.noData) + return + } + + self.completionHandler = completionHandler + } + open func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { if !messenger.isLoggedIn() { @@ -907,6 +937,7 @@ import ReachabilitySwift return true } + } public enum AAAutoPush { diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Strings.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Strings.swift index 4a6d3fece4..f2d2cf6dbe 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Strings.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/SwiftExtensions/Strings.swift @@ -140,7 +140,7 @@ public extension String { var containsEmoji: Bool { for scalar in unicodeScalars { - print(scalar.value) + // print(scalar.value) switch scalar.value { case 0x1F600...0x1F64F, // Emoticons From 1d68a83926cb3bb5adf2d0ef91b19c99681f19eb Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Sun, 12 Feb 2017 10:53:16 -0200 Subject: [PATCH 234/253] alteracoes --- actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../ActorApp.xcodeproj/project.pbxproj | 43 +++++++++++------- .../xcshareddata/xcschemes/ActorApp.xcscheme | 6 +-- .../Supporting Files/ActorApp.entitlements | 4 ++ .../ActorApp/Supporting Files/Info.plist | 2 + .../ActorSDK.xcodeproj/project.pbxproj | 17 +++++-- .../xcshareddata/xcschemes/ActorSDK.xcscheme | 11 ++++- .../Sources/ActorApplicationDelegate.swift | 4 ++ .../Providers/CocoaNetworkRuntime.swift | 5 +- .../Providers/iOSNotificationProvider.swift | 2 + .../ActorSDK/Sources/ActorSDK.swift | 39 ++++++++++++---- actor-sdk/sdk-core/core/.DS_Store | Bin 8196 -> 8196 bytes .../im/actor/core/xloto/api/ApiGroupPre.java | 0 .../core/xloto/api/parser/UpdatesParser.java | 25 ---------- 15 files changed, 96 insertions(+), 62 deletions(-) delete mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/ApiGroupPre.java delete mode 100644 actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/parser/UpdatesParser.java diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index 47b48ba26d4b668388aee7f6d5466e225176536a..940a6a96a4f0f6b44a49a04f81863bd9a6ce63fd 100644 GIT binary patch delta 81 zcmZokXi3=cQE0NZLMw-*siBU7iK*%2T4CAAR~1wyKNgnUd|lX>XEL|K5>6v?6QHz_ cu^C8u^Hqfew#gA9d6O53CvIlZFl2{u094Z&lK=n! delta 93 zcmZokXi3=cQD}0uS__Aj3v9XSV rg>kKpLbaix0Z^%hnZ@KTVbje&6>QihM~UQ4UM!xpnMK2p9mW9wYLy)) diff --git a/actor-sdk/sdk-core-ios/.DS_Store b/actor-sdk/sdk-core-ios/.DS_Store index d52beba4b934efe7dc72626b20980dfaa81457d1..106fbc2501259346c72dfdabe6b543635d031465 100644 GIT binary patch delta 47 zcmZoEXero`smRpXJ~>;_nE4o|#pH#Grp(7UW&mle$qkyk%nT10CQr~1*{rT~R}=uA Cw-9^) delta 47 zcmZoEXero`smRpkGC5n(n0ej5_Q?wsO_|pg@c?P9$qkyk%nTP8CQr~1*{rT~R}=uU Cvk?~n diff --git a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj index 9d3e3a0d4d..ac76c89132 100644 --- a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 34279C7FB8E40393FEAC939F6474BE2E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 148837AEB986AFDE519BEBD3686AB073 /* main.m */; }; A88F4C381ED2B98E99A68937 /* Pods_ActorApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */; }; DFE814D1E12D2647AF2DBA3F76405F06 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A521812020DAAAA325065ADC32B7DEB /* AppDelegate.swift */; }; + F135688C1E4DEA8200D4BA2F /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F135688B1E4DEA8200D4BA2F /* PushKit.framework */; }; F153992B1DF83A0900C67C7D /* AppCocoaHttpRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = F153992A1DF83A0900C67C7D /* AppCocoaHttpRuntime.swift */; }; F45B35E37C8CB7140417EA87AAFEFDA2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 13C57576F07AC8694C15B51DFDFDC4C6 /* InfoPlist.strings */; }; /* End PBXBuildFile section */ @@ -74,6 +75,7 @@ A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ActorApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DE8D1D9859D2C4D4C7EC7AD74BB65F0E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "Supporting Files/Info.plist"; sourceTree = ""; }; F105D04D1E37F58600C722F6 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; + F135688B1E4DEA8200D4BA2F /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; }; F153992A1DF83A0900C67C7D /* AppCocoaHttpRuntime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppCocoaHttpRuntime.swift; sourceTree = ""; }; F175DF8A1E168C8F005BCF1A /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/InfoPlist.strings"; sourceTree = ""; }; F76A77E9428111C798E69B43EA06A281 /* ActorApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = ActorApp.entitlements; path = "Supporting Files/ActorApp.entitlements"; sourceTree = ""; }; @@ -84,6 +86,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + F135688C1E4DEA8200D4BA2F /* PushKit.framework in Frameworks */, 06CE898E1BD841D0005A5530 /* SystemConfiguration.framework in Frameworks */, 06E7B24F1C109C4B0090660C /* MapKit.framework in Frameworks */, 06230F091BC7FF3500A4807B /* ActorSDK.framework in Frameworks */, @@ -126,6 +129,7 @@ 86C48777C0FD262E78F8BEC9253C9914 /* Frameworks */ = { isa = PBXGroup; children = ( + F135688B1E4DEA8200D4BA2F /* PushKit.framework */, F105D04D1E37F58600C722F6 /* NotificationCenter.framework */, 06E7B24E1C109C4B0090660C /* MapKit.framework */, 06CE898D1BD841D0005A5530 /* SystemConfiguration.framework */, @@ -211,7 +215,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0730; + LastUpgradeCheck = 0820; ORGANIZATIONNAME = "Actor LLC"; TargetAttributes = { EA6B7348F8364542DDD264F741AAAA19 = { @@ -226,6 +230,9 @@ com.apple.Push = { enabled = 1; }; + com.apple.SafariKeychain = { + enabled = 1; + }; com.apple.iCloud = { enabled = 1; }; @@ -442,18 +449,17 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9B2EEB8CEF2E94D58EA09D9D /* Pods-ActorApp.debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_MODULES_AUTOLINK = YES; CODE_SIGN_ENTITLEMENTS = "ActorApp/Supporting Files/ActorApp.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_IDENTITY = "iPhone Developer: Eric Alves Nascimento (V243ZCY9W5)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Eric Alves Nascimento (V243ZCY9W5)"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = HA23Y6A5LW; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; ENABLE_BITCODE = NO; FABRIC_BUILD_SECRET = ""; FRAMEWORK_SEARCH_PATHS = ( @@ -464,15 +470,15 @@ GCC_OPTIMIZATION_LEVEL = 0; INFOPLIST_FILE = "ActorApp/Supporting Files/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - J2OBJC_VERSION = 0.9.8.2.1; + J2OBJC_VERSION = 1.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = br.com.diegosilva.xlotomessenger; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "4d265c46-c4c1-42b1-aa2e-c579059d20f5"; - PROVISIONING_PROFILE_SPECIFIER = "Xloto Mensageiro Desenvolver"; + PROVISIONING_PROFILE = "1d259fb8-c16c-4d75-83c4-f2645bc3b931"; + PROVISIONING_PROFILE_SPECIFIER = "xloto desenvolvimento"; SDK_PATH = "../actor-sdk"; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -485,6 +491,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -494,8 +501,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -524,17 +533,16 @@ isa = XCBuildConfiguration; baseConfigurationReference = 404790AFDFFBD618E6175093 /* Pods-ActorApp.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_MODULES_AUTOLINK = YES; CODE_SIGN_ENTITLEMENTS = "ActorApp/Supporting Files/ActorApp.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_IDENTITY = "iPhone Distribution: Eric Alves Nascimento (HA23Y6A5LW)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Eric Alves Nascimento (HA23Y6A5LW)"; DEVELOPMENT_TEAM = HA23Y6A5LW; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; ENABLE_BITCODE = NO; FABRIC_BUILD_SECRET = ""; FRAMEWORK_SEARCH_PATHS = ( @@ -545,17 +553,17 @@ GCC_OPTIMIZATION_LEVEL = 0; INFOPLIST_FILE = "ActorApp/Supporting Files/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - J2OBJC_VERSION = 0.9.8.2.1; + J2OBJC_VERSION = 1.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = br.com.diegosilva.xlotomessenger; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "2560348b-ab8a-41f9-a59c-f918ba3a1600"; - PROVISIONING_PROFILE_SPECIFIER = "Xloto Mensageiro Distribuição"; + PROVISIONING_PROFILE = "a33aacff-7974-42a3-b66d-ddc7c940bc87"; + PROVISIONING_PROFILE_SPECIFIER = provision_xloto_distribution; SDK_PATH = "../actor-sdk"; SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 3.0; USER_HEADER_SEARCH_PATHS = ""; }; @@ -565,6 +573,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -574,8 +583,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; diff --git a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/xcshareddata/xcschemes/ActorApp.xcscheme b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/xcshareddata/xcschemes/ActorApp.xcscheme index 253f3eb8a4..fc1957e7fd 100644 --- a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/xcshareddata/xcschemes/ActorApp.xcscheme +++ b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/xcshareddata/xcschemes/ActorApp.xcscheme @@ -1,6 +1,6 @@ aps-environment development + com.apple.developer.associated-domains + + applinks:xloto.com.br + com.apple.developer.icloud-container-identifiers iCloud.$(CFBundleIdentifier) diff --git a/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist b/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist index babc65603c..4c34dc67d4 100644 --- a/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist +++ b/actor-sdk/sdk-core-ios/ActorApp/Supporting Files/Info.plist @@ -111,5 +111,7 @@ UIViewControllerBasedStatusBarAppearance + + diff --git a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj index bf1733dc8f..37aefb158a 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj @@ -1930,13 +1930,14 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0700; + LastUpgradeCheck = 0820; ORGANIZATIONNAME = "Steve Kite"; TargetAttributes = { 066A50D11BC4AE63000E606E = { CreatedOnToolsVersion = 7.0; DevelopmentTeam = HA23Y6A5LW; LastSwiftMigration = 0800; + ProvisioningStyle = Manual; }; }; }; @@ -2330,6 +2331,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -2339,8 +2341,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -2377,6 +2381,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -2386,8 +2391,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -2418,17 +2425,17 @@ isa = XCBuildConfiguration; baseConfigurationReference = E30822B631D108159E8B306B /* Pods-ActorSDK.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = HA23Y6A5LW; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -2476,16 +2483,16 @@ isa = XCBuildConfiguration; baseConfigurationReference = F076508E3899D309954904A3 /* Pods-ActorSDK.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = HA23Y6A5LW; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/xcshareddata/xcschemes/ActorSDK.xcscheme b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/xcshareddata/xcschemes/ActorSDK.xcscheme index 73694fba15..6e24b9e408 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/xcshareddata/xcschemes/ActorSDK.xcscheme +++ b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/xcshareddata/xcschemes/ActorSDK.xcscheme @@ -1,6 +1,6 @@ + + + + diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift index a3cf144e30..e49e0e364a 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift @@ -38,6 +38,7 @@ open class ActorApplicationDelegate: ActorSDKDelegateDefault, UIApplicationDeleg } open func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { + NSLog("ActorApplicationDelegate Receive notification 1...") ActorSDK.sharedActor().application(application, didReceiveRemoteNotification: userInfo) } @@ -51,10 +52,13 @@ open class ActorApplicationDelegate: ActorSDKDelegateDefault, UIApplicationDeleg } open func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { + NSLog("ActorApplicationDelegate Receive notification 2...") ActorSDK.sharedActor().application(application, didReceiveRemoteNotification: userInfo, fetchCompletionHandler: completionHandler) + } open func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { + NSLog("ActorApplicationDelegate Receive notification 3...") ActorSDK.sharedActor().application(application, performFetchWithCompletionHandler: completionHandler) } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/CocoaNetworkRuntime.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/CocoaNetworkRuntime.swift index 4d9351270e..2816e5ee22 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/CocoaNetworkRuntime.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/CocoaNetworkRuntime.swift @@ -85,7 +85,7 @@ class CocoaTcpConnection: ARAsyncConnection, GCDAsyncSocketDelegate { let size = data.readUInt32(5) gcdSocket?.readData(toLength: UInt(size + 4), withTimeout: -1, tag: READ_BODY) } else if (tag == READ_BODY) { - // NSLog("\(TAG) Body received") + NSLog("\(TAG) Body received") var package = Data() package.append(self.header!) package.append(data) @@ -100,8 +100,9 @@ class CocoaTcpConnection: ARAsyncConnection, GCDAsyncSocketDelegate { } override func doClose() { + NSLog("\(TAG) Will try to close connection...") if (gcdSocket != nil) { - // NSLog("\(TAG) Closing...") + NSLog("\(TAG) Closing connection...") gcdSocket?.disconnect() gcdSocket = nil } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/iOSNotificationProvider.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/iOSNotificationProvider.swift index 02bd872278..e956c0bd0f 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/iOSNotificationProvider.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorCore/Providers/iOSNotificationProvider.swift @@ -45,10 +45,12 @@ import AudioToolbox.AudioServices func onNotification(with messenger: ACMessenger!, withTopNotifications topNotifications: JavaUtilListProtocol!, withMessagesCount messagesCount: jint, withConversationsCount conversationsCount: jint) { // Not Supported + print("onNotification") } func onUpdateNotification(with messenger: ACMessenger!, withTopNotifications topNotifications: JavaUtilListProtocol!, withMessagesCount messagesCount: jint, withConversationsCount conversationsCount: jint) { // Not Supported + print("onUpdateNotification") } func hideAllNotifications() { diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift index 6172fe1253..9a83573963 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift @@ -405,6 +405,7 @@ import UserNotifications } if apiPushId != nil { + NSLog("Fazendo o registro no push pushRegisterToken") messenger.registerApplePush(withApnsId: jint(apiPushId!), withToken: token) } } @@ -415,6 +416,7 @@ import UserNotifications } if apiPushId != nil { + NSLog("Fazendo o registro no pushkit pushRegisterKitToken") messenger.registerApplePushKit(withApnsId: jint(apiPushId!), withToken: token) } @@ -439,6 +441,7 @@ import UserNotifications } fileprivate func requestPushKit() { + NSLog("Requisitando o pushKit requestPushKit") let voipRegistry = PKPushRegistry(queue: DispatchQueue.main) voipRegistry.delegate = self voipRegistry.desiredPushTypes = Set([PKPushType.voIP]) @@ -446,19 +449,26 @@ import UserNotifications @objc open func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, forType type: PKPushType) { if (type == PKPushType.voIP) { - let token = credentials.token.map { String(format: "%02.2hhx", $0) }.joined() - let tokenString = "\(token)".replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "") - pushRegisterKitToken(tokenString) + // let token = credentials.token.map { String(format: "%02.2hhx", $0) }.joined() + // let tokenString = "\(token)".replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "") + + let tokenString = credentials.token.map { String(format: "%02.2hhx", $0) }.joined() + //ActorSDK.sharedActor().pushRegisterToken(tokenString.replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "")) + let tokenStringFinal = tokenString.replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "") + NSLog("Vai registrar o voip para o token: \(tokenStringFinal)") + pushRegisterKitToken(tokenStringFinal) } } @objc open func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenForType type: PKPushType) { + NSLog("Invalidando o push token para voip didInvalidatePushTokenForType") if (type == PKPushType.voIP) { } } @objc open func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, forType type: PKPushType) { + NSLog("Recebendo pushKit notification didReceiveIncomingPushWith") if (type == PKPushType.voIP) { let aps = payload.dictionaryPayload["aps"] as! [NSString: AnyObject] if let callId = aps["callId"] as? String { @@ -866,39 +876,48 @@ import UserNotifications // open func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { - + NSLog("Recebendo notificacao normal didReceiveRemoteNotification") if !messenger.isLoggedIn() { completionHandler(UIBackgroundFetchResult.noData) return } +// if let seq = userInfo["seq"] as! jint?{ +// if let userId = userInfo["seq"] as! jlong?{ +// print(seq) +// print(userId) +// +// +// ActorSDK.shared.messenger.onPushReceived(withSeq: seq, withAuthId: userId) +// } +// } + + self.completionHandler = completionHandler + } open func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { // Nothing? - print("recebeu") + NSLog("Recebendo notificacao normal 2 didReceiveRemoteNotification") } open func application(_ application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { + NSLog("Vai requisitar o pushkit didRegisterUserNotificationSettings") requestPushKit() } // // Handling background fetch events // - @available(iOS 10.0, *) public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { - //print("User Info = ", notification.request.content.userInfo) completionHandler([.alert, .badge, .sound]) } @available(iOS 10.0, *) public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { - //print("User Info = ", response.notification.request.content.userInfo) - if !messenger.isLoggedIn() { completionHandler(UIBackgroundFetchResult.noData) return @@ -908,7 +927,7 @@ import UserNotifications } open func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { - + NSLog("Perform with fetch performFetchWithCompletionHandler") if !messenger.isLoggedIn() { completionHandler(UIBackgroundFetchResult.noData) return diff --git a/actor-sdk/sdk-core/core/.DS_Store b/actor-sdk/sdk-core/core/.DS_Store index e70c7d1b8befb4fd95ffbe61aa400395f3dcbe12..0215a3edba4561416fdab96d377cb26de87aaaf6 100644 GIT binary patch delta 98 zcmZp1XmOa}&&akhU^hP_+h!ht7&ZlNhGd3(h9ZVk23>|?h75*8FgqosI5{UNKR<_Y RV_`kxW_F20VpP^J0szj88G--+ delta 32 mcmZp1XmOa}&&awlU^hP_>t-H-7`BZi^BFg@OC$mra~J`snhG!g diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/ApiGroupPre.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/ApiGroupPre.java deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/parser/UpdatesParser.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/parser/UpdatesParser.java deleted file mode 100644 index 067326529d..0000000000 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/xloto/api/parser/UpdatesParser.java +++ /dev/null @@ -1,25 +0,0 @@ -package im.actor.core.xloto.api.parser; -/* - * Generated by the Actor API Scheme generator. DO NOT EDIT! - */ - -import im.actor.runtime.bser.*; -import im.actor.runtime.collections.*; -import static im.actor.runtime.bser.Utils.*; -import im.actor.core.network.parser.*; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.NotNull; -import com.google.j2objc.annotations.ObjectiveCName; -import java.io.IOException; -import java.util.List; -import java.util.ArrayList; -import im.actor.core.xloto.api.updates.*; - -public class UpdatesParser extends BaseParser { - @Override - public Update read(int type, byte[] payload) throws IOException { - switch(type) { - } - throw new IOException(); - } -} From 2cf5c9bed71bd3e1461a022c9092052bafd283bc Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 12 Feb 2017 20:27:06 -0200 Subject: [PATCH 235/253] alteracoes --- .../sdk-core-android/android-google-maps/build.gradle | 10 +++++----- .../sdk-core-android/android-google-push/build.gradle | 10 +++++----- actor-sdk/sdk-core-android/android-sdk/build.gradle | 10 +++++----- actor-server/conf/server.conf | 9 ++++++++- actor-server/project/Dependencies.scala | 2 +- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-google-maps/build.gradle b/actor-sdk/sdk-core-android/android-google-maps/build.gradle index 23a4d19555..42604103d0 100644 --- a/actor-sdk/sdk-core-android/android-google-maps/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-maps/build.gradle @@ -141,14 +141,14 @@ project.afterEvaluate { mavenDeployer { // beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } -// repository(url: "http://64.137.170.2:8081/content/repositories/snapshots/") { -// authentication(userName: ossrhUsername, password: ossrhPassword) -// } - - repository(url: "http://localhost:8081/nexus/content/repositories/snapshots/") { + repository(url: "http://104.233.107.117:8081/nexus/content/repositories/snapshots/") { authentication(userName: ossrhUsername, password: ossrhPassword) } +// repository(url: "http://localhost:8081/nexus/content/repositories/snapshots/") { +// authentication(userName: ossrhUsername, password: ossrhPassword) +// } + pom.project { name 'Actor SDK for Android Google Extension' packaging 'aar' diff --git a/actor-sdk/sdk-core-android/android-google-push/build.gradle b/actor-sdk/sdk-core-android/android-google-push/build.gradle index d8869a1832..fa045126b7 100644 --- a/actor-sdk/sdk-core-android/android-google-push/build.gradle +++ b/actor-sdk/sdk-core-android/android-google-push/build.gradle @@ -138,14 +138,14 @@ project.afterEvaluate { mavenDeployer { // beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } -// repository(url: "http://64.137.170.2:8081/content/repositories/snapshots/") { -// authentication(userName: ossrhUsername, password: ossrhPassword) -// } - - repository(url: "http://localhost:8081/nexus/content/repositories/snapshots/") { + repository(url: "http://104.233.107.117:8081/nexus/content/repositories/snapshots/") { authentication(userName: ossrhUsername, password: ossrhPassword) } +// repository(url: "http://localhost:8081/nexus/content/repositories/snapshots/") { +// authentication(userName: ossrhUsername, password: ossrhPassword) +// } + pom.project { name 'Actor SDK for Android Google Extension' packaging 'aar' diff --git a/actor-sdk/sdk-core-android/android-sdk/build.gradle b/actor-sdk/sdk-core-android/android-sdk/build.gradle index 4e1c0d84ce..ad64945767 100644 --- a/actor-sdk/sdk-core-android/android-sdk/build.gradle +++ b/actor-sdk/sdk-core-android/android-sdk/build.gradle @@ -190,14 +190,14 @@ project.afterEvaluate { mavenDeployer { // beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } -// repository(url: "http://64.137.170.2:8081/content/repositories/snapshots/") { -// authentication(userName: ossrhUsername, password: ossrhPassword) -// } - - repository(url: "http://localhost:8081/nexus/content/repositories/snapshots/") { + repository(url: "http://104.233.107.117:8081/nexus/content/repositories/snapshots/") { authentication(userName: ossrhUsername, password: ossrhPassword) } +// repository(url: "http://localhost:8081/nexus/content/repositories/snapshots/") { +// authentication(userName: ossrhUsername, password: ossrhPassword) +// } + pom.project { name 'Actor SDK for Android' packaging 'aar' diff --git a/actor-server/conf/server.conf b/actor-server/conf/server.conf index f77371a157..91362ffbbc 100644 --- a/actor-server/conf/server.conf +++ b/actor-server/conf/server.conf @@ -281,6 +281,13 @@ services { password: "xlotoapns123" sandbox: true voip: false + },{ + key: 868547 + bundleId: "br.com.diegosilva.xlotomessenger" + path: "/home/diego/Dropbox/actor/apple/production/voip_services.p12" + password: "xlotoapns123" + sandbox: true + voip: true }] } } @@ -296,7 +303,7 @@ services { akka { loggers = ["akka.event.slf4j.Slf4jLogger"] - loglevel = "DEBUG" + loglevel = "WARNING" } debug-mode = true \ No newline at end of file diff --git a/actor-server/project/Dependencies.scala b/actor-server/project/Dependencies.scala index 40aec16633..e55862a5a0 100644 --- a/actor-server/project/Dependencies.scala +++ b/actor-server/project/Dependencies.scala @@ -94,7 +94,7 @@ object Dependencies { val tyrex = "tyrex" % "tyrex" % "1.0.1" - val pushy = "com.relayrides" % "pushy" % "0.8.2" + val pushy = "com.relayrides" % "pushy" % "0.9.2" val logbackClassic = "ch.qos.logback" % "logback-classic" % "1.1.2" val scalaLogging = "com.typesafe.scala-logging" %% "scala-logging" % "3.1.0" From b06b3a3079b3fc13e2e66b37eb01af5cf22d596c Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 12 Feb 2017 22:36:21 -0200 Subject: [PATCH 236/253] alteracoes --- .../server/grouppre/GroupPreProcessor.scala | 17 +++++++---------- .../grouppre/GroupPreProcessorRegion.scala | 4 ++-- .../actor/server/grouppre/GroupPreState.scala | 14 +++++++------- .../server/push/apple/ApplePushExtension.scala | 6 +----- .../server/push/apple/ApplePushProvider.scala | 18 ++++++++++++++++++ 5 files changed, 35 insertions(+), 24 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessor.scala index 870cb19533..569f77889f 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessor.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessor.scala @@ -6,7 +6,6 @@ import akka.actor.Props import im.actor.serialization.ActorSerializer import im.actor.server.cqrs.TaggedEvent - trait GroupEvent extends TaggedEvent { val ts: Instant @@ -17,13 +16,11 @@ case object StopProcessor object GroupPreProcessor { def register(): Unit = - ActorSerializer.register( -// 30001 → classOf[GroupCommands.Create], -// -// 31001 → classOf[GroupQueries.GetIntegrationToken], -// -// 32005 → classOf[GroupEvents.Created] - + ActorSerializer.register( // 30001 → classOf[GroupCommands.Create], + // + // 31001 → classOf[GroupQueries.GetIntegrationToken], + // + // 32005 → classOf[GroupEvents.Created] ) def persistenceIdFor(groupId: Int): String = s"Grouppre-${groupId}" @@ -32,8 +29,8 @@ object GroupPreProcessor { } /** - * Created by 98379720172 on 31/01/17. - */ + * Created by 98379720172 on 31/01/17. + */ private[grouppre] final class GroupPreProcessor { } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessorRegion.scala b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessorRegion.scala index 7d447a63b1..7481aab517 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessorRegion.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessorRegion.scala @@ -1,8 +1,8 @@ package im.actor.server.grouppre /** - * Created by 98379720172 on 31/01/17. - */ + * Created by 98379720172 on 31/01/17. + */ class GroupPreProcessorRegion { } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreState.scala index 63fbeec18f..3bf2af679e 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreState.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreState.scala @@ -3,17 +3,17 @@ package im.actor.server.grouppre import java.time.Instant import akka.persistence.SnapshotMetadata -import im.actor.server.cqrs.{Event, ProcessorState} +import im.actor.server.cqrs.{ Event, ProcessorState } /** - * Created by 98379720172 on 31/01/17. - */ + * Created by 98379720172 on 31/01/17. + */ private[grouppre] final case class GroupPreState( - groupId:Int, - groupFatherId:Int, - createdAt:Option[Instant], + groupId: Int, + groupFatherId: Int, + createdAt: Option[Instant], creatorUserId: Int -) extends ProcessorState[GroupPreState]{ +) extends ProcessorState[GroupPreState] { override def updated(e: Event): GroupPreState = ??? diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala index 658c46209a..faf254a6bf 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala @@ -69,13 +69,9 @@ final class ApplePushExtension(system: ActorSystem) extends Extension with AnyRe val connectFuture: Future[Client] = Future { blocking { - // val client = new ApnsClient[SimpleApnsPushNotification](new File(cert.path), cert.password) - // client.connect(host).get(20, TimeUnit.SECONDS) - // log.debug("Established client connection for cert: {}, is voip: {}", certKey, cert.isVoip) - // client - val client = new ApnsClientBuilder().setClientCredentials(new File(cert.path), cert.password).build() client.connect(host).get(20, TimeUnit.SECONDS) + log.debug("Established client connection for cert: {}, is voip: {}", certKey, cert.isVoip) client } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala index 7a947802a8..8309d6655c 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala @@ -9,6 +9,8 @@ import im.actor.server.model.push.ApplePushCredentials import im.actor.server.push.PushProvider import im.actor.server.sequence.PushData +import scala.concurrent.Future + final class ApplePushProvider(userId: Int)(implicit system: ActorSystem) extends PushProvider with APNSSend { import system.dispatcher @@ -31,6 +33,7 @@ final class ApplePushProvider(userId: Int)(implicit system: ActorSystem) extends log.debug("Delivering invisible(seq:{}) to bundleId: {}", seq, creds.bundleId) sendNotification(payload = seqOnly(seq), creds, userId) } + deliverVoip(seq, creds) } } @@ -66,9 +69,24 @@ final class ApplePushProvider(userId: Int)(implicit system: ActorSystem) extends } else { sendNotification(payload = seqOnly(seq), creds, userId) } + deliverVoip(seq, creds) } } + def deliverVoip( + seq: Int, + creds: ApplePushCredentials + ): Unit = { + val id = extractCredsId(creds) + for { + clientFu ← applePushExt.voipClient(id) + payload = seqOnly(seq) + _ = clientFu map { implicit c ⇒ + sendNotification(payload, creds, userId) + } + } yield () + } + private def seqOnly(seq: Int): String = new ApnsPayloadBuilder() .addCustomProperty("seq", seq) From e3b23bf1de9a0c683fb4a63aff0157699345bb7b Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Mon, 13 Feb 2017 10:54:41 -0200 Subject: [PATCH 237/253] voip-notifications --- .../server/push/apple/ApplePushProvider.scala | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala index 8309d6655c..9963b4f8ce 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala @@ -33,7 +33,7 @@ final class ApplePushProvider(userId: Int)(implicit system: ActorSystem) extends log.debug("Delivering invisible(seq:{}) to bundleId: {}", seq, creds.bundleId) sendNotification(payload = seqOnly(seq), creds, userId) } - deliverVoip(seq, creds) + deliverVoip(seq, creds.authId) } } @@ -69,21 +69,21 @@ final class ApplePushProvider(userId: Int)(implicit system: ActorSystem) extends } else { sendNotification(payload = seqOnly(seq), creds, userId) } - deliverVoip(seq, creds) + deliverVoip(seq, creds.authId) } } def deliverVoip( seq: Int, - creds: ApplePushCredentials + authId: Long ): Unit = { - val id = extractCredsId(creds) for { - clientFu ← applePushExt.voipClient(id) + (userId, credsList) <- applePushExt.fetchVoipCreds(Set(authId)) map (userId → _) + creds ← credsList + credsId = extractCredsId(creds) + clientFu ← applePushExt.voipClient(credsId) payload = seqOnly(seq) - _ = clientFu map { implicit c ⇒ - sendNotification(payload, creds, userId) - } + _ = clientFu foreach { implicit c ⇒ sendNotification(payload, creds, userId) } } yield () } From 065aa6e5a9c0adeb4e4eaaba9ff610159c8376f3 Mon Sep 17 00:00:00 2001 From: diego Date: Mon, 13 Feb 2017 23:26:54 -0200 Subject: [PATCH 238/253] fix apple pushkit --- actor-sdk/sdk-api/actor.json | 80 ----------- .../models/im/actor/api/scheme.mps | 124 ------------------ .../im/actor/core/api/parser/RpcParser.java | 5 - .../actor-core/src/main/actor-api/actor.json | 80 ----------- .../server/grouppre/GroupPreProcessor.scala | 36 ----- .../grouppre/GroupPreProcessorRegion.scala | 8 -- .../actor/server/grouppre/GroupPreState.scala | 21 --- .../im/actor/server/push/apple/APNSSend.scala | 26 ++-- .../push/apple/ApplePushExtension.scala | 1 - .../server/push/apple/ApplePushProvider.scala | 22 ++-- .../groupspre/GroupsPreServiceImpl.scala | 28 ---- .../service/survey/SurveyServiceImpl.scala | 47 ------- actor-server/conf/server.conf | 1 - actor-server/version.sbt | 2 +- 14 files changed, 32 insertions(+), 449 deletions(-) delete mode 100644 actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessor.scala delete mode 100644 actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessorRegion.scala delete mode 100644 actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreState.scala delete mode 100644 actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groupspre/GroupsPreServiceImpl.scala delete mode 100644 actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala diff --git a/actor-sdk/sdk-api/actor.json b/actor-sdk/sdk-api/actor.json index f9184686d1..5cb24ac55d 100644 --- a/actor-sdk/sdk-api/actor.json +++ b/actor-sdk/sdk-api/actor.json @@ -4239,84 +4239,4 @@ "doc":[ "Map Value"],"trait":{"name":"RawValue","key":6},"attributes":[ {"type":{"type":"list","childType":{"type":"struct","childType":"MapValueItem"}},"id":1,"name":"items"} -]}}]}, { - "title": "Surveys", - "package": "surveys", - "doc": [ - "Surveys implementation for messages" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"Survey", -"doc":[ -"Main Survey Struct"],"attributes":[ -{"type":"int64","id":1,"name":"id"} -,{"type":"string","id":2,"name":"title"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"description"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"creationTime"} -,{"type":{"type":"alias","childType":"date"},"id":5,"name":"endTime"} -,{"type":{"type":"alias","childType":"userId"},"id":6,"name":"userId"} -]}}, { - "type":"struct", - "content": { - "name":"SurveyAnswer", -"doc":[ -"Main Survey Answer"],"attributes":[ -{"type":"int64","id":1,"name":"id"} -,{"type":"string","id":2,"name":"title"} -]}}, { - "type":"struct", - "content": { - "name":"UserSurveyAnswer", -"doc":[ -"Main UserSurveyAnser"],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"userId"} -,{"type":"int64","id":2,"name":"answerId"} -]}},{"type":"rpc","content":{ -"name":"CreateSurvey", -"header":139, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Criar uma nova enquete"],"attributes":[ -{"type":{"type":"struct","childType":"Survey"},"id":1,"name":"survey"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"SurveyAnswer"}},"id":2,"name":"answers"} -]}}]}, { - "title": "GroupsPre", - "package": "groupspre", - "doc": [ - "Api para grupos pre-definidos" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"GroupPre", -"doc":[ -"Main GroupPre Struct"],"expandable":"true","attributes":[ -{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} -,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupFatherId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"childrens"} -]}},{"type":"rpc","content":{ -"name":"LoadGroupsPre", -"header":18, -"response":{"type":"anonymous","header":20, "doc":[ -"fasdfasdfas"] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} -]}, -"doc":[ -"Main LoadGroups"],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupFatherId"} -]}},{"type":"rpc","content":{ -"name":"CreateGroupPre", -"header":19, -"response":{"type":"anonymous","header":21, "doc":[ -"fasdfasdfa"] ,"attributes":[{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"struct","childType":"GroupPre"},"id":3,"name":"groupPre"} -]}, -"doc":[ -"fasdfasdfa"],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupFatherId"} ]}}]}]} \ No newline at end of file diff --git a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps index 417db3f790..77cb2877ac 100644 --- a/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps +++ b/actor-sdk/sdk-api/api-language/solutions/im.actor.api/models/im/actor/api/scheme.mps @@ -18521,136 +18521,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java index 9c94c1fb26..1d6da1efb8 100644 --- a/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java +++ b/actor-sdk/sdk-core/core/core-shared/src/main/java/im/actor/core/api/parser/RpcParser.java @@ -183,9 +183,6 @@ public RpcScope read(int type, byte[] payload) throws IOException { case 229: return RequestNotifyAboutDeviceInfo.fromBytes(payload); case 116: return RequestInitWebaction.fromBytes(payload); case 123: return RequestCompleteWebaction.fromBytes(payload); - case 139: return RequestCreateSurvey.fromBytes(payload); - case 18: return RequestLoadGroupsPre.fromBytes(payload); - case 19: return RequestCreateGroupPre.fromBytes(payload); case 193: return ResponseStartPhoneAuth.fromBytes(payload); case 186: return ResponseStartEmailAuth.fromBytes(payload); case 2572: return ResponseStartUsernameAuth.fromBytes(payload); @@ -255,8 +252,6 @@ public RpcScope read(int type, byte[] payload) throws IOException { case 209: return ResponseBool.fromBytes(payload); case 117: return ResponseInitWebaction.fromBytes(payload); case 124: return ResponseCompleteWebaction.fromBytes(payload); - case 20: return ResponseLoadGroupsPre.fromBytes(payload); - case 21: return ResponseCreateGroupPre.fromBytes(payload); case 13: return SeqUpdate.fromBytes(payload); case 73: return FatSeqUpdate.fromBytes(payload); case 26: return WeakUpdate.fromBytes(payload); diff --git a/actor-server/actor-core/src/main/actor-api/actor.json b/actor-server/actor-core/src/main/actor-api/actor.json index f9184686d1..5cb24ac55d 100644 --- a/actor-server/actor-core/src/main/actor-api/actor.json +++ b/actor-server/actor-core/src/main/actor-api/actor.json @@ -4239,84 +4239,4 @@ "doc":[ "Map Value"],"trait":{"name":"RawValue","key":6},"attributes":[ {"type":{"type":"list","childType":{"type":"struct","childType":"MapValueItem"}},"id":1,"name":"items"} -]}}]}, { - "title": "Surveys", - "package": "surveys", - "doc": [ - "Surveys implementation for messages" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"Survey", -"doc":[ -"Main Survey Struct"],"attributes":[ -{"type":"int64","id":1,"name":"id"} -,{"type":"string","id":2,"name":"title"} -,{"type":{"type":"opt","childType":"string"},"id":3,"name":"description"} -,{"type":{"type":"alias","childType":"date"},"id":4,"name":"creationTime"} -,{"type":{"type":"alias","childType":"date"},"id":5,"name":"endTime"} -,{"type":{"type":"alias","childType":"userId"},"id":6,"name":"userId"} -]}}, { - "type":"struct", - "content": { - "name":"SurveyAnswer", -"doc":[ -"Main Survey Answer"],"attributes":[ -{"type":"int64","id":1,"name":"id"} -,{"type":"string","id":2,"name":"title"} -]}}, { - "type":"struct", - "content": { - "name":"UserSurveyAnswer", -"doc":[ -"Main UserSurveyAnser"],"attributes":[ -{"type":{"type":"alias","childType":"userId"},"id":1,"name":"userId"} -,{"type":"int64","id":2,"name":"answerId"} -]}},{"type":"rpc","content":{ -"name":"CreateSurvey", -"header":139, -"response":{"type":"reference","name":"Void"}, -"doc":[ -"Criar uma nova enquete"],"attributes":[ -{"type":{"type":"struct","childType":"Survey"},"id":1,"name":"survey"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"SurveyAnswer"}},"id":2,"name":"answers"} -]}}]}, { - "title": "GroupsPre", - "package": "groupspre", - "doc": [ - "Api para grupos pre-definidos" - ], - "items": [ - { - "type":"struct", - "content": { - "name":"GroupPre", -"doc":[ -"Main GroupPre Struct"],"expandable":"true","attributes":[ -{"type":{"type":"struct","childType":"Group"},"id":1,"name":"group"} -,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupFatherId"} -,{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":3,"name":"childrens"} -]}},{"type":"rpc","content":{ -"name":"LoadGroupsPre", -"header":18, -"response":{"type":"anonymous","header":20, "doc":[ -"fasdfasdfas"] ,"attributes":[{"type":{"type":"list","childType":{"type":"struct","childType":"Group"}},"id":1,"name":"groups"} -]}, -"doc":[ -"Main LoadGroups"],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupFatherId"} -]}},{"type":"rpc","content":{ -"name":"CreateGroupPre", -"header":19, -"response":{"type":"anonymous","header":21, "doc":[ -"fasdfasdfa"] ,"attributes":[{"type":"int32","id":1,"name":"seq"} -,{"type":{"type":"alias","childType":"seq_state"},"id":2,"name":"state"} -,{"type":{"type":"struct","childType":"GroupPre"},"id":3,"name":"groupPre"} -]}, -"doc":[ -"fasdfasdfa"],"attributes":[ -{"type":{"type":"alias","childType":"groupId"},"id":1,"name":"groupId"} -,{"type":{"type":"alias","childType":"groupId"},"id":2,"name":"groupFatherId"} ]}}]}]} \ No newline at end of file diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessor.scala b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessor.scala deleted file mode 100644 index 569f77889f..0000000000 --- a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessor.scala +++ /dev/null @@ -1,36 +0,0 @@ -package im.actor.server.grouppre - -import java.time.Instant - -import akka.actor.Props -import im.actor.serialization.ActorSerializer -import im.actor.server.cqrs.TaggedEvent - -trait GroupEvent extends TaggedEvent { - val ts: Instant - - override def tags: Set[String] = Set("grouppre") -} - -case object StopProcessor - -object GroupPreProcessor { - def register(): Unit = - ActorSerializer.register( // 30001 → classOf[GroupCommands.Create], - // - // 31001 → classOf[GroupQueries.GetIntegrationToken], - // - // 32005 → classOf[GroupEvents.Created] - ) - - def persistenceIdFor(groupId: Int): String = s"Grouppre-${groupId}" - - private[grouppre] def props: Props = Props(classOf[GroupPreProcessor]) -} - -/** - * Created by 98379720172 on 31/01/17. - */ -private[grouppre] final class GroupPreProcessor { - -} diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessorRegion.scala b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessorRegion.scala deleted file mode 100644 index 7481aab517..0000000000 --- a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreProcessorRegion.scala +++ /dev/null @@ -1,8 +0,0 @@ -package im.actor.server.grouppre - -/** - * Created by 98379720172 on 31/01/17. - */ -class GroupPreProcessorRegion { - -} diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreState.scala b/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreState.scala deleted file mode 100644 index 3bf2af679e..0000000000 --- a/actor-server/actor-core/src/main/scala/im/actor/server/grouppre/GroupPreState.scala +++ /dev/null @@ -1,21 +0,0 @@ -package im.actor.server.grouppre - -import java.time.Instant - -import akka.persistence.SnapshotMetadata -import im.actor.server.cqrs.{ Event, ProcessorState } - -/** - * Created by 98379720172 on 31/01/17. - */ -private[grouppre] final case class GroupPreState( - groupId: Int, - groupFatherId: Int, - createdAt: Option[Instant], - creatorUserId: Int -) extends ProcessorState[GroupPreState] { - - override def updated(e: Event): GroupPreState = ??? - - override def withSnapshot(metadata: SnapshotMetadata, snapshot: Any): GroupPreState = ??? -} diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala index 825b83fbe3..ebb8661619 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala @@ -18,15 +18,25 @@ trait APNSSend { // when topic is null, it will be taken from APNs certificate // http://relayrides.github.io/pushy/apidocs/0.6/com/relayrides/pushy/apns/ApnsPushNotification.html#getTopic-- val token = BitVector(creds.token.toByteArray).toHex - val topic: String = (creds.apnsKey, creds.bundleId) match { - case (_, Some(bundleId)) ⇒ bundleId.value - case (Some(key), _) ⇒ ApplePushExtension(system).apnsBundleId.get(key.value).orNull - case _ ⇒ - system.log.warning("Wrong creds format on sending notification. Creds: {}", creds) - null + + // val topic: String = (creds.apnsKey, creds.bundleId) match { + // case (_, Some(bundleId)) ⇒ bundleId.value + // case (Some(key), _) ⇒ ApplePushExtension(system).apnsBundleId.get(key.value).orNull + // case _ ⇒ + // system.log.warning("Wrong creds format on sending notification. Creds: {}", creds) + // null + // } + + val topic: String = creds.bundleId match { + case Some(bundleId) ⇒ bundleId.value + case _ ⇒ null } - system.log.debug(s"Sending APNS, token: {}, key: {}, isVoip: {}, topic: {}, payload: $payload", token, creds.apnsKey, creds.isVoip, topic) - val notification = new SimpleApnsPushNotification(TokenUtil.sanitizeTokenString(token), topic, payload) + + val sanitizedToken = TokenUtil.sanitizeTokenString(token) + system.log.debug(s"Sending APNS, token: {}, key: {}, isVoip: {}, topic: {}, payload: $payload", sanitizedToken, creds.apnsKey, creds.isVoip, topic) + + val notification = new SimpleApnsPushNotification(sanitizedToken, null, payload) + val listener = listeners.getOrElseUpdate(token, new PushFutureListener(userId, creds, extractCredsId(creds))(system)) client.sendNotification(notification).addListener(listener) } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala index faf254a6bf..3d76322e1f 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala @@ -6,7 +6,6 @@ import java.util.concurrent.{ ExecutionException, TimeUnit, TimeoutException } import akka.actor.{ ActorSystem, ExtendedActorSystem, Extension, ExtensionId, ExtensionIdProvider } import akka.event.Logging import com.relayrides.pushy.apns.{ ApnsClient, ApnsClientBuilder } -import com.relayrides.pushy.apns.util.SimpleApnsPushNotification import im.actor.server.db.DbExtension import im.actor.server.model.push.ApplePushCredentials import im.actor.server.persist.push.ApplePushCredentialsRepo diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala index 9963b4f8ce..0db09ae566 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala @@ -74,17 +74,21 @@ final class ApplePushProvider(userId: Int)(implicit system: ActorSystem) extends } def deliverVoip( - seq: Int, + seq: Int, authId: Long ): Unit = { - for { - (userId, credsList) <- applePushExt.fetchVoipCreds(Set(authId)) map (userId → _) - creds ← credsList - credsId = extractCredsId(creds) - clientFu ← applePushExt.voipClient(credsId) - payload = seqOnly(seq) - _ = clientFu foreach { implicit c ⇒ sendNotification(payload, creds, userId) } - } yield () + applePushExt.fetchVoipCreds(Seq(authId).toSet).map(userId → _).map { + case (userId, credsList) ⇒ { + for { + creds ← credsList + credsId = extractCredsId(creds) + clientFu ← applePushExt.voipClient(credsId) + payload = seqOnly(seq) + _ = clientFu foreach { implicit c ⇒ sendNotification(payload, creds, userId) } + } yield () + } + } + } private def seqOnly(seq: Int): String = diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groupspre/GroupsPreServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groupspre/GroupsPreServiceImpl.scala deleted file mode 100644 index aa1c696afe..0000000000 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/groupspre/GroupsPreServiceImpl.scala +++ /dev/null @@ -1,28 +0,0 @@ -package im.actor.server.api.rpc.service.groupspre - -import akka.actor.ActorSystem -import akka.http.scaladsl.util.FastFuture -import im.actor.api.rpc._ -import im.actor.api.rpc.groupspre.{ GroupspreService, ResponseCreateGroupPre, ResponseLoadGroupsPre } -import im.actor.api.rpc.misc.ResponseVoid -import im.actor.api.rpc.surveys.{ ApiSurvey, ApiSurveyAnswer, SurveysService } - -import scala.concurrent.{ ExecutionContext, Future } - -/** - * Created by 98379720172 on 16/11/16. - */ -final abstract class GroupsPreServiceImpl()(implicit actorSystem: ActorSystem) extends GroupspreService { - - override implicit val ec: ExecutionContext = actorSystem.dispatcher - - // /** Main LoadGroups */ - // override protected def doHandleLoadGroupsPre(groupFatherId: Int, clientData: ClientData): Future[HandlerResult[ResponseLoadGroupsPre]] = { - // FastFuture.successful(Ok(ResponseVoid)) - // } - // - // /** fasdfasdfa */ - // override protected def doHandleCreateGroupPre(groupId: Int, groupFatherId: Int, clientData: ClientData): Future[HandlerResult[ResponseCreateGroupPre]] = { - // FastFuture.successful(Ok(ResponseVoid)) - // } -} diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala deleted file mode 100644 index 043ba8202a..0000000000 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/survey/SurveyServiceImpl.scala +++ /dev/null @@ -1,47 +0,0 @@ -package im.actor.server.api.rpc.service.survey - -import java.time.Instant - -import akka.actor.ActorSystem -import akka.http.scaladsl.util.FastFuture -import cats.data.Xor -import com.github.ghik.silencer.silent -import im.actor.api.rpc.PeerHelpers._ -import im.actor.api.rpc._ -import im.actor.api.rpc.files.ApiFileLocation -import im.actor.api.rpc.groups._ -import im.actor.api.rpc.misc.{ ResponseSeq, ResponseSeqDate, ResponseVoid } -import im.actor.api.rpc.peers.{ ApiGroupOutPeer, ApiUserOutPeer } -import im.actor.api.rpc.sequence.ApiUpdateOptimization -import im.actor.api.rpc.surveys.{ ApiSurvey, ApiSurveyAnswer, SurveysService } -import im.actor.api.rpc.users.ApiUser -import im.actor.concurrent.FutureExt -import im.actor.server.acl.ACLUtils -import im.actor.server.db.DbExtension -import im.actor.server.dialog.DialogExtension -import im.actor.server.file.{ FileErrors, ImageUtils } -import im.actor.server.group._ -import im.actor.server.model.GroupInviteToken -import im.actor.server.names.GlobalNamesStorageKeyValueStorage -import im.actor.server.persist.{ GroupInviteTokenRepo, GroupUserRepo } -import im.actor.server.presences.GroupPresenceExtension -import im.actor.server.user.UserExtension -import im.actor.util.ThreadLocalSecureRandom -import im.actor.util.misc.{ IdUtils, StringUtils } -import slick.dbio.DBIO -import slick.driver.PostgresDriver.api._ - -import scala.concurrent.{ ExecutionContext, Future } -/** - * Created by 98379720172 on 16/11/16. - */ -final class SurveyServiceImpl()(implicit actorSystem: ActorSystem) extends SurveysService { - - override implicit val ec: ExecutionContext = actorSystem.dispatcher - - /** Criar uma nova enquete */ - /** Criar uma nova enquete */ - override protected def doHandleCreateSurvey(survey: ApiSurvey, answers: IndexedSeq[ApiSurveyAnswer], clientData: ClientData): Future[HandlerResult[ResponseVoid]] = { - FastFuture.successful(Ok(ResponseVoid)) - } -} diff --git a/actor-server/conf/server.conf b/actor-server/conf/server.conf index 91362ffbbc..29b346ea44 100644 --- a/actor-server/conf/server.conf +++ b/actor-server/conf/server.conf @@ -283,7 +283,6 @@ services { voip: false },{ key: 868547 - bundleId: "br.com.diegosilva.xlotomessenger" path: "/home/diego/Dropbox/actor/apple/production/voip_services.p12" password: "xlotoapns123" sandbox: true diff --git a/actor-server/version.sbt b/actor-server/version.sbt index b72462a285..957420dc56 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.18-SNAPSHOT" +version in ThisBuild := "3.0.20-SNAPSHOT" From c309cf72d64d90fd4bbf1b333f03e17926638141 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Mon, 13 Feb 2017 23:53:58 -0200 Subject: [PATCH 239/253] alteracoes --- actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../xcshareddata/xcschemes/ActorApp.xcscheme | 4 ++-- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../Sources/ActorApplicationDelegate.swift | 2 +- .../ActorSDK/Sources/ActorSDK.swift | 22 ++---------------- 6 files changed, 6 insertions(+), 24 deletions(-) diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index 940a6a96a4f0f6b44a49a04f81863bd9a6ce63fd..97a256161d4cf71663d830418aa8df2e9a0f8bc4 100644 GIT binary patch delta 686 zcmb8rO-R#m9LMqR+jRZ^Z0gUp)~1d*R;JP8TucwymiC}iqAUokIm-?bX%A3g<%$Lo z=IKviPp6113x%1{19XTYB0A(k>);`Rju~}{F8$jSI)(jCpC2DShwm#HPsT@%*|qAL z(DJgifuPZAA2g=?b;ce?)Viy4Uw2naXU~2`>ZQX+A|jdR4_C|vS2pPW@ak+5O*|5i zdTEll9FddKF9R|pqcSEB<+;3(w0xA$@>QngyZn%!V=ZYk(XevN5FJXI)yahZ9Xb?IAZmv?bcmp%MqPT?c8fgJ@ACb9`S3Y>Uwy58ts_aB z5)M_aatA{pqsMkvZPwf4oelb#n9)}5H*|Y+X^Un}>ap(n6J2_|Gtm?~nJ}j(5|GSG zkK4;hRb>}X#FzVIhlr{niYyVYR7*q}r9Nq)ACuq$&Ad(Px*zQ zV#Q7g4qUidhKB%QYFNiM_OO=*8rjET+KJJ@ak{8FMK`DE;Q|-AL_Y>M8003y+#}5> zk9oo?-ZIG)(|qI$-<>oS5(Cl`73xzozwfBOvzW7A&&wIO=qWR?88rxTDDS0l%4FN ziDve5fP<#+QFM-Fl#?0cUe0ok^CtBGSGdYGt}|pp-{LlRxbI|yhZ*xR#(BnbUhtAP bOz^Cv54YVo+Zq?DE< cGca5^22>}fY03(u85kyS(9qc2pxMF)0Ij4Kr~m)} delta 75 zcmZoEXero`rO4PmIa|?$iPK{8LPawsju}8oYjT4o?`8p|Yivw@&nGKrYVo+Zq?DE< dGca6PTljafoTe!&kY-?*yg@@_bAx6J9{|m>8W;co diff --git a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/xcshareddata/xcschemes/ActorApp.xcscheme b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/xcshareddata/xcschemes/ActorApp.xcscheme index fc1957e7fd..7b0b2e091e 100644 --- a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/xcshareddata/xcschemes/ActorApp.xcscheme +++ b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/xcshareddata/xcschemes/ActorApp.xcscheme @@ -43,8 +43,8 @@ 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift index e49e0e364a..f6f22ed1b5 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorApplicationDelegate.swift @@ -48,13 +48,13 @@ open class ActorApplicationDelegate: ActorSDKDelegateDefault, UIApplicationDeleg open func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() + NSLog("Registrando o servico de notificacoes para o token \(tokenString)") ActorSDK.sharedActor().pushRegisterToken(tokenString.replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "")) } open func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { NSLog("ActorApplicationDelegate Receive notification 2...") ActorSDK.sharedActor().application(application, didReceiveRemoteNotification: userInfo, fetchCompletionHandler: completionHandler) - } open func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { diff --git a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift index 9a83573963..4508b0571c 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift +++ b/actor-sdk/sdk-core-ios/ActorSDK/Sources/ActorSDK.swift @@ -449,14 +449,9 @@ import UserNotifications @objc open func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, forType type: PKPushType) { if (type == PKPushType.voIP) { - // let token = credentials.token.map { String(format: "%02.2hhx", $0) }.joined() - // let tokenString = "\(token)".replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "") - let tokenString = credentials.token.map { String(format: "%02.2hhx", $0) }.joined() - //ActorSDK.sharedActor().pushRegisterToken(tokenString.replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "")) - let tokenStringFinal = tokenString.replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "") - NSLog("Vai registrar o voip para o token: \(tokenStringFinal)") - pushRegisterKitToken(tokenStringFinal) + NSLog("Vai registrar o voip para o token: \(tokenString)") + pushRegisterKitToken(tokenString.replace(" ", dest: "").replace("<", dest: "").replace(">", dest: "")) } } @@ -881,20 +876,7 @@ import UserNotifications completionHandler(UIBackgroundFetchResult.noData) return } - -// if let seq = userInfo["seq"] as! jint?{ -// if let userId = userInfo["seq"] as! jlong?{ -// print(seq) -// print(userId) -// -// -// ActorSDK.shared.messenger.onPushReceived(withSeq: seq, withAuthId: userId) -// } -// } - - self.completionHandler = completionHandler - } open func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { From 87522a627a41ac030e7315322189e94575ed6381 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 14 Feb 2017 16:05:27 -0200 Subject: [PATCH 240/253] alteracoes --- .../im/actor/server/push/apple/APNSSend.scala | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala index ebb8661619..a000567885 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala @@ -15,18 +15,19 @@ trait APNSSend { private val listeners = TrieMap.empty[String, PushFutureListener] protected def sendNotification(payload: String, creds: ApplePushCredentials, userId: Int)(implicit client: ApplePushExtension#Client, system: ActorSystem): NFuture[PushNotificationResponse[SimpleApnsPushNotification]] = { - // when topic is null, it will be taken from APNs certificate - // http://relayrides.github.io/pushy/apidocs/0.6/com/relayrides/pushy/apns/ApnsPushNotification.html#getTopic-- + val token = BitVector(creds.token.toByteArray).toHex - // val topic: String = (creds.apnsKey, creds.bundleId) match { - // case (_, Some(bundleId)) ⇒ bundleId.value - // case (Some(key), _) ⇒ ApplePushExtension(system).apnsBundleId.get(key.value).orNull - // case _ ⇒ - // system.log.warning("Wrong creds format on sending notification. Creds: {}", creds) - // null - // } + // val topic: String = (creds.apnsKey, creds.bundleId) match { + // case (_, Some(bundleId)) ⇒ bundleId.value + // case (Some(key), _) ⇒ ApplePushExtension(system).apnsBundleId.get(key.value).orNull + // case _ ⇒ + // system.log.warning("Wrong creds format on sending notification. Creds: {}", creds) + // null + // } + // when topic is null, it will be taken from APNs certificate + // http://relayrides.github.io/pushy/apidocs/0.6/com/relayrides/pushy/apns/ApnsPushNotification.html#getTopic-- val topic: String = creds.bundleId match { case Some(bundleId) ⇒ bundleId.value case _ ⇒ null From c6fff0eaaca397709956cc01338848d7e676ed28 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 14 Feb 2017 16:48:10 -0200 Subject: [PATCH 241/253] alteracoes --- .../im/actor/server/push/apple/APNSSend.scala | 29 +++++++------------ .../push/apple/ApplePushExtension.scala | 2 +- .../rpc/service/push/PushServiceImpl.scala | 10 ++++--- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala index a000567885..7270479628 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala @@ -1,11 +1,11 @@ package im.actor.server.push.apple import akka.actor.ActorSystem -import com.google.protobuf.wrappers.{ Int32Value, StringValue } +import com.google.protobuf.wrappers.{Int32Value, StringValue} import com.relayrides.pushy.apns.PushNotificationResponse -import com.relayrides.pushy.apns.util.{ SimpleApnsPushNotification, TokenUtil } +import com.relayrides.pushy.apns.util.{SimpleApnsPushNotification, TokenUtil} import im.actor.server.model.push.ApplePushCredentials -import io.netty.util.concurrent.{ Future ⇒ NFuture } +import io.netty.util.concurrent.{Future ⇒ NFuture} import scodec.bits.BitVector import scala.collection.concurrent.TrieMap @@ -18,19 +18,12 @@ trait APNSSend { val token = BitVector(creds.token.toByteArray).toHex - // val topic: String = (creds.apnsKey, creds.bundleId) match { - // case (_, Some(bundleId)) ⇒ bundleId.value - // case (Some(key), _) ⇒ ApplePushExtension(system).apnsBundleId.get(key.value).orNull - // case _ ⇒ - // system.log.warning("Wrong creds format on sending notification. Creds: {}", creds) - // null - // } - - // when topic is null, it will be taken from APNs certificate - // http://relayrides.github.io/pushy/apidocs/0.6/com/relayrides/pushy/apns/ApnsPushNotification.html#getTopic-- - val topic: String = creds.bundleId match { - case Some(bundleId) ⇒ bundleId.value - case _ ⇒ null + val topic: String = (creds.apnsKey, creds.bundleId) match { + case (_, Some(bundleId)) ⇒ bundleId.value + case (Some(key), _) ⇒ if (creds.isVoip) null else ApplePushExtension(system).apnsBundleId.get(key.value).orNull + case _ ⇒ + system.log.warning("Wrong creds format on sending notification. Creds: {}", creds) + null } val sanitizedToken = TokenUtil.sanitizeTokenString(token) @@ -43,9 +36,9 @@ trait APNSSend { } protected def extractCredsId(creds: ApplePushCredentials): String = (creds.apnsKey, creds.bundleId) match { - case (Some(Int32Value(key)), _) ⇒ key.toString + case (Some(Int32Value(key)), _) ⇒ key.toString case (_, Some(StringValue(bundleId))) ⇒ bundleId - case _ ⇒ throw new RuntimeException("Wrong credentials format") + case _ ⇒ throw new RuntimeException("Wrong credentials format") } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala index 3d76322e1f..1162e664a4 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala @@ -43,7 +43,7 @@ final class ApplePushExtension(system: ActorSystem) extends Extension with AnyRe // to be included in apple push notification. We provide apns key -> bundle id // mapping for them. val apnsBundleId: Map[Int, String] = (config.certs collect { - case ApnsCert(Some(key), Some(bundleId), _, _, _, _) ⇒ key → bundleId + case ApnsCert(Some(key), Some(bundleId), _, _, _, isVoip) ⇒ key → bundleId }).toMap private val (clients, voipClients): (TrieMap[String, Future[Client]], TrieMap[String, Future[Client]]) = { diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/push/PushServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/push/PushServiceImpl.scala index 6d31c2007b..628183c8ca 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/push/PushServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/push/PushServiceImpl.scala @@ -3,19 +3,20 @@ package im.actor.server.api.rpc.service.push import akka.actor.ActorSystem import akka.http.scaladsl.util.FastFuture import com.google.protobuf.ByteString -import com.google.protobuf.wrappers.{ Int32Value, StringValue } +import com.google.protobuf.wrappers.{Int32Value, StringValue} import im.actor.api.rpc._ import im.actor.api.rpc.encryption.ApiEncryptionKey import im.actor.api.rpc.misc.ResponseVoid import im.actor.api.rpc.push.PushService import im.actor.server.db.DbExtension -import im.actor.server.model.push.{ ActorPushCredentials, ApplePushCredentials, FirebasePushCredentials, GCMPushCredentials } -import im.actor.server.persist.push.{ ActorPushCredentialsRepo, ApplePushCredentialsRepo, FirebasePushCredentialsKV, GooglePushCredentialsRepo } +import im.actor.server.model.push.{ActorPushCredentials, ApplePushCredentials, FirebasePushCredentials, GCMPushCredentials} +import im.actor.server.persist.push.{ActorPushCredentialsRepo, ApplePushCredentialsRepo, FirebasePushCredentialsKV, GooglePushCredentialsRepo} +import im.actor.server.push.apple.ApplePushExtension import im.actor.server.sequence.SeqUpdatesExtension import scodec.bits.BitVector import slick.driver.PostgresDriver.api._ -import scala.concurrent.{ ExecutionContext, Future } +import scala.concurrent.{ExecutionContext, Future} object PushRpcErrors { val WrongToken = RpcError(400, "WRONG_TOKEN", "Wrong APNS Token", false, None) @@ -64,6 +65,7 @@ final class PushServiceImpl( token = ByteString.copyFrom(tokenBytes), isVoip = false ) + val action: DBIO[HandlerResult[ResponseVoid]] = for { _ ← ApplePushCredentialsRepo.deleteByToken(tokenBytes) _ ← ApplePushCredentialsRepo.createOrUpdate(creds) From 73192fb00ebd13587088753c59433e886b99fccf Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 14 Feb 2017 21:29:45 -0200 Subject: [PATCH 242/253] alteracoes --- actor-sdk/.DS_Store | Bin 12292 -> 12292 bytes actor-sdk/sdk-core-ios/.DS_Store | Bin 14340 -> 14340 bytes .../ActorApp.xcodeproj/project.pbxproj | 2 -- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../ActorSDK.xcodeproj/project.pbxproj | 6 +++--- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/actor-sdk/.DS_Store b/actor-sdk/.DS_Store index 97a256161d4cf71663d830418aa8df2e9a0f8bc4..1daca1451820ac7181fb3f30ea32c05021a1af8e 100644 GIT binary patch delta 63 zcmZokXi3=cQD}0uS__AVsx48t!X;>v?9;u5X}vI E0H@s$N&o-= diff --git a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj index ac76c89132..cc077491a7 100644 --- a/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorApp.xcodeproj/project.pbxproj @@ -17,7 +17,6 @@ 34279C7FB8E40393FEAC939F6474BE2E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 148837AEB986AFDE519BEBD3686AB073 /* main.m */; }; A88F4C381ED2B98E99A68937 /* Pods_ActorApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A275ED497CA570AD01FB66A7 /* Pods_ActorApp.framework */; }; DFE814D1E12D2647AF2DBA3F76405F06 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A521812020DAAAA325065ADC32B7DEB /* AppDelegate.swift */; }; - F135688C1E4DEA8200D4BA2F /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F135688B1E4DEA8200D4BA2F /* PushKit.framework */; }; F153992B1DF83A0900C67C7D /* AppCocoaHttpRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = F153992A1DF83A0900C67C7D /* AppCocoaHttpRuntime.swift */; }; F45B35E37C8CB7140417EA87AAFEFDA2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 13C57576F07AC8694C15B51DFDFDC4C6 /* InfoPlist.strings */; }; /* End PBXBuildFile section */ @@ -86,7 +85,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F135688C1E4DEA8200D4BA2F /* PushKit.framework in Frameworks */, 06CE898E1BD841D0005A5530 /* SystemConfiguration.framework in Frameworks */, 06E7B24F1C109C4B0090660C /* MapKit.framework in Frameworks */, 06230F091BC7FF3500A4807B /* ActorSDK.framework in Frameworks */, diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index b8d38bfcf0..020da5ec86 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.34" + s.version = "3.0.457.35" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj index 37aefb158a..5d2b5d8436 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj +++ b/actor-sdk/sdk-core-ios/ActorSDK.xcodeproj/project.pbxproj @@ -1937,7 +1937,7 @@ CreatedOnToolsVersion = 7.0; DevelopmentTeam = HA23Y6A5LW; LastSwiftMigration = 0800; - ProvisioningStyle = Manual; + ProvisioningStyle = Automatic; }; }; }; @@ -2429,7 +2429,7 @@ CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = HA23Y6A5LW; @@ -2487,7 +2487,7 @@ CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = HA23Y6A5LW; DYLIB_COMPATIBILITY_VERSION = 1; From 3dcd5b7e0c0c2c4709683bb7d4ccf8da28683aa7 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 14 Feb 2017 21:55:29 -0200 Subject: [PATCH 243/253] alteracoes --- actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec | 2 +- .../main/scala/im/actor/server/push/apple/APNSSend.scala | 2 +- .../im/actor/server/push/apple/ApplePushExtension.scala | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec index 020da5ec86..b3ee63d0ff 100644 --- a/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec +++ b/actor-sdk/sdk-core-ios/ActorSDK-iOS.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "ActorSDK-iOS" - s.version = "3.0.457.35" + s.version = "3.0.457.36" s.summary = "Actor SDK for intergration Actor Messaging Lotericas to your apps" s.homepage = "https://actor.im/" s.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala index 7270479628..012e3b893f 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala @@ -20,7 +20,7 @@ trait APNSSend { val topic: String = (creds.apnsKey, creds.bundleId) match { case (_, Some(bundleId)) ⇒ bundleId.value - case (Some(key), _) ⇒ if (creds.isVoip) null else ApplePushExtension(system).apnsBundleId.get(key.value).orNull + case (Some(key), _) ⇒ ApplePushExtension(system).apnsBundleId(creds.isVoip).get(key.value).orNull case _ ⇒ system.log.warning("Wrong creds format on sending notification. Creds: {}", creds) null diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala index 1162e664a4..cc52a7fe0e 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala @@ -42,8 +42,12 @@ final class ApplePushExtension(system: ActorSystem) extends Extension with AnyRe // there are some apple push keys, that require topic(bundleId) // to be included in apple push notification. We provide apns key -> bundle id // mapping for them. - val apnsBundleId: Map[Int, String] = (config.certs collect { - case ApnsCert(Some(key), Some(bundleId), _, _, _, isVoip) ⇒ key → bundleId +// val apnsBundleId: Map[Int, String] = (config.certs collect { +// case ApnsCert(Some(key), Some(bundleId), _, _, _, isVoip) ⇒ key → bundleId +// }).toMap + + def apnsBundleId(isVoip:Boolean): Map[Int, String] = (config.certs filter(_.isVoip == isVoip) collect { + case ApnsCert(Some(key), Some(bundleId), _, _, _, _) ⇒ key → bundleId }).toMap private val (clients, voipClients): (TrieMap[String, Future[Client]], TrieMap[String, Future[Client]]) = { From ca3bc6d30fae2302370c6b9b8041538260e8b689 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Wed, 15 Feb 2017 13:08:39 -0200 Subject: [PATCH 244/253] apns --- .../scala/im/actor/server/push/apple/APNSSend.scala | 12 ++++++------ .../actor/server/push/apple/ApplePushExtension.scala | 10 +++++----- .../api/rpc/service/push/PushServiceImpl.scala | 8 ++++---- actor-server/version.sbt | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala index 012e3b893f..aa6428772c 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala @@ -1,11 +1,11 @@ package im.actor.server.push.apple import akka.actor.ActorSystem -import com.google.protobuf.wrappers.{Int32Value, StringValue} +import com.google.protobuf.wrappers.{ Int32Value, StringValue } import com.relayrides.pushy.apns.PushNotificationResponse -import com.relayrides.pushy.apns.util.{SimpleApnsPushNotification, TokenUtil} +import com.relayrides.pushy.apns.util.{ SimpleApnsPushNotification, TokenUtil } import im.actor.server.model.push.ApplePushCredentials -import io.netty.util.concurrent.{Future ⇒ NFuture} +import io.netty.util.concurrent.{ Future ⇒ NFuture } import scodec.bits.BitVector import scala.collection.concurrent.TrieMap @@ -20,7 +20,7 @@ trait APNSSend { val topic: String = (creds.apnsKey, creds.bundleId) match { case (_, Some(bundleId)) ⇒ bundleId.value - case (Some(key), _) ⇒ ApplePushExtension(system).apnsBundleId(creds.isVoip).get(key.value).orNull + case (Some(key), _) ⇒ ApplePushExtension(system).apnsBundleId(creds.isVoip).get(key.value).orNull case _ ⇒ system.log.warning("Wrong creds format on sending notification. Creds: {}", creds) null @@ -36,9 +36,9 @@ trait APNSSend { } protected def extractCredsId(creds: ApplePushCredentials): String = (creds.apnsKey, creds.bundleId) match { - case (Some(Int32Value(key)), _) ⇒ key.toString + case (Some(Int32Value(key)), _) ⇒ key.toString case (_, Some(StringValue(bundleId))) ⇒ bundleId - case _ ⇒ throw new RuntimeException("Wrong credentials format") + case _ ⇒ throw new RuntimeException("Wrong credentials format") } } diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala index cc52a7fe0e..23750830b1 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala @@ -42,12 +42,12 @@ final class ApplePushExtension(system: ActorSystem) extends Extension with AnyRe // there are some apple push keys, that require topic(bundleId) // to be included in apple push notification. We provide apns key -> bundle id // mapping for them. -// val apnsBundleId: Map[Int, String] = (config.certs collect { -// case ApnsCert(Some(key), Some(bundleId), _, _, _, isVoip) ⇒ key → bundleId -// }).toMap + // val apnsBundleId: Map[Int, String] = (config.certs collect { + // case ApnsCert(Some(key), Some(bundleId), _, _, _, isVoip) ⇒ key → bundleId + // }).toMap - def apnsBundleId(isVoip:Boolean): Map[Int, String] = (config.certs filter(_.isVoip == isVoip) collect { - case ApnsCert(Some(key), Some(bundleId), _, _, _, _) ⇒ key → bundleId + def apnsBundleId(isVoip: Boolean): Map[Int, String] = (config.certs filter (_.isVoip == isVoip) collect { + case ApnsCert(Some(key), Some(bundleId), _, _, _, _) ⇒ key → bundleId }).toMap private val (clients, voipClients): (TrieMap[String, Future[Client]], TrieMap[String, Future[Client]]) = { diff --git a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/push/PushServiceImpl.scala b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/push/PushServiceImpl.scala index 628183c8ca..47a1f78a68 100644 --- a/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/push/PushServiceImpl.scala +++ b/actor-server/actor-rpc-api/src/main/scala/im/actor/server/api/rpc/service/push/PushServiceImpl.scala @@ -3,20 +3,20 @@ package im.actor.server.api.rpc.service.push import akka.actor.ActorSystem import akka.http.scaladsl.util.FastFuture import com.google.protobuf.ByteString -import com.google.protobuf.wrappers.{Int32Value, StringValue} +import com.google.protobuf.wrappers.{ Int32Value, StringValue } import im.actor.api.rpc._ import im.actor.api.rpc.encryption.ApiEncryptionKey import im.actor.api.rpc.misc.ResponseVoid import im.actor.api.rpc.push.PushService import im.actor.server.db.DbExtension -import im.actor.server.model.push.{ActorPushCredentials, ApplePushCredentials, FirebasePushCredentials, GCMPushCredentials} -import im.actor.server.persist.push.{ActorPushCredentialsRepo, ApplePushCredentialsRepo, FirebasePushCredentialsKV, GooglePushCredentialsRepo} +import im.actor.server.model.push.{ ActorPushCredentials, ApplePushCredentials, FirebasePushCredentials, GCMPushCredentials } +import im.actor.server.persist.push.{ ActorPushCredentialsRepo, ApplePushCredentialsRepo, FirebasePushCredentialsKV, GooglePushCredentialsRepo } import im.actor.server.push.apple.ApplePushExtension import im.actor.server.sequence.SeqUpdatesExtension import scodec.bits.BitVector import slick.driver.PostgresDriver.api._ -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.{ ExecutionContext, Future } object PushRpcErrors { val WrongToken = RpcError(400, "WRONG_TOKEN", "Wrong APNS Token", false, None) diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 957420dc56..31ae852eb4 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.20-SNAPSHOT" +version in ThisBuild := "3.0.21-SNAPSHOT" From 25d2445518359568e55670942da3acecbb9d7d0e Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Fri, 17 Feb 2017 15:18:35 -0200 Subject: [PATCH 245/253] alteracoes --- .../im/actor/server/push/apple/ApplePushExtension.scala | 8 ++++---- .../im/actor/server/push/apple/ApplePushProvider.scala | 2 +- actor-server/version.sbt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala index 23750830b1..2eda1c457c 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushExtension.scala @@ -42,12 +42,12 @@ final class ApplePushExtension(system: ActorSystem) extends Extension with AnyRe // there are some apple push keys, that require topic(bundleId) // to be included in apple push notification. We provide apns key -> bundle id // mapping for them. - // val apnsBundleId: Map[Int, String] = (config.certs collect { - // case ApnsCert(Some(key), Some(bundleId), _, _, _, isVoip) ⇒ key → bundleId - // }).toMap + // val apnsBundleId: Map[Int, String] = (config.certs collect { + // case ApnsCert(Some(key), Some(bundleId), _, _, _, _) ⇒ key → bundleId + // }).toMap def apnsBundleId(isVoip: Boolean): Map[Int, String] = (config.certs filter (_.isVoip == isVoip) collect { - case ApnsCert(Some(key), Some(bundleId), _, _, _, _) ⇒ key → bundleId + case ApnsCert(Some(key), bundleId, _, _, _, _) ⇒ key → bundleId.getOrElse(null) }).toMap private val (clients, voipClients): (TrieMap[String, Future[Client]], TrieMap[String, Future[Client]]) = { diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala index 0db09ae566..ab4ed88ab9 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/ApplePushProvider.scala @@ -83,7 +83,7 @@ final class ApplePushProvider(userId: Int)(implicit system: ActorSystem) extends creds ← credsList credsId = extractCredsId(creds) clientFu ← applePushExt.voipClient(credsId) - payload = seqOnly(seq) + payload = new ApnsPayloadBuilder().buildWithDefaultMaximumLength() _ = clientFu foreach { implicit c ⇒ sendNotification(payload, creds, userId) } } yield () } diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 31ae852eb4..abf1812bbc 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.21-SNAPSHOT" +version in ThisBuild := "3.0.23-SNAPSHOT" From 7c27afede2097c2b23104f9ac600edab8e3829bd Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 19 Feb 2017 15:18:47 -0300 Subject: [PATCH 246/253] alteracoes --- actor-server/project/Packaging.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/project/Packaging.scala b/actor-server/project/Packaging.scala index 0a517732bf..36d42a958d 100644 --- a/actor-server/project/Packaging.scala +++ b/actor-server/project/Packaging.scala @@ -22,7 +22,7 @@ private[actor] trait Packaging { daemonUser in Linux := "actor", daemonGroup in Linux := (daemonUser in Linux).value, - bashScriptExtraDefines += """addJava "-Dlogback.configurationFile=${app_home}/../conf/logback.xml"""", + //bashScriptExtraDefines += """addJava "-Dlogback.configurationFile=${app_home}/../conf/logback.xml"""", bashScriptExtraDefines += """addJava -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${app_home}/../logs/dump-`date`.hprof""", linuxPackageMappings += { From 5df56a83e0100f128233ab8c08e6c91da8c4f9eb Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 19 Feb 2017 22:10:16 -0300 Subject: [PATCH 247/253] alteracoes --- .../im/actor/server/push/apple/PushFutureListener.scala | 3 +++ actor-server/conf/server.conf | 6 ++++-- actor-server/sbt_debug | 2 +- actor-server/version.sbt | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/PushFutureListener.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/PushFutureListener.scala index 58e89e02cc..0514d8317c 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/PushFutureListener.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/PushFutureListener.scala @@ -21,6 +21,9 @@ final class PushFutureListener(userId: Int, creds: ApplePushCredentials, credsId private val tokenString = BitVector(tokenBytes).toHex def operationComplete(future: Future[PushNotificationResponse[SimpleApnsPushNotification]]): Unit = { + + log.debug("APNS send event has completed") + Try(future.get()) match { case Success(response) ⇒ log.debug( diff --git a/actor-server/conf/server.conf b/actor-server/conf/server.conf index 29b346ea44..9a25445c15 100644 --- a/actor-server/conf/server.conf +++ b/actor-server/conf/server.conf @@ -278,6 +278,7 @@ services { key: 868547 bundleId: "br.com.diegosilva.xlotomessenger" path: "/home/diego/Dropbox/actor/apple/development/aps_development.p12" + #path: "/home/diego/Dropbox/actor/apple/production/apns_producao.p12" password: "xlotoapns123" sandbox: true voip: false @@ -302,7 +303,8 @@ services { akka { loggers = ["akka.event.slf4j.Slf4jLogger"] - loglevel = "WARNING" + event-handlers = ["akka.event.slf4j.Slf4jLogger"] + #loglevel = "WARNING" } -debug-mode = true \ No newline at end of file +#debug-mode = true \ No newline at end of file diff --git a/actor-server/sbt_debug b/actor-server/sbt_debug index 29cfda6de6..55e4e29fd0 100755 --- a/actor-server/sbt_debug +++ b/actor-server/sbt_debug @@ -1,3 +1,3 @@ #!/bin/bash -SBT_OPTS="-Xms512M -Xmx2048M -Xss1M -XX:+CMSClassUnloadingEnabled -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" +SBT_OPTS="-Xms512M -Xmx2048M -Xss1M -XX:+CMSClassUnloadingEnabled -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Dlogback.configurationFile=/home/diego/data/conf/logback.xml" java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@" diff --git a/actor-server/version.sbt b/actor-server/version.sbt index abf1812bbc..67f425d294 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.23-SNAPSHOT" +version in ThisBuild := "3.0.25-SNAPSHOT" From 6087be397f94568ca3e91d16173182d589d48f9a Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Mon, 20 Feb 2017 13:51:22 -0300 Subject: [PATCH 248/253] alteracoes --- .../main/scala/im/actor/server/push/apple/APNSSend.scala | 8 +++++++- actor-server/version.sbt | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala index aa6428772c..4e01ffbe21 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala @@ -1,6 +1,7 @@ package im.actor.server.push.apple import akka.actor.ActorSystem +import akka.event.Logging import com.google.protobuf.wrappers.{ Int32Value, StringValue } import com.relayrides.pushy.apns.PushNotificationResponse import com.relayrides.pushy.apns.util.{ SimpleApnsPushNotification, TokenUtil } @@ -18,9 +19,14 @@ trait APNSSend { val token = BitVector(creds.token.toByteArray).toHex + system.log.debug("Searching topic for Creds: {}", creds) + + val isVoip = if (creds.isVoip) creds.isVoip else false + system.log.debug("Is Voip: {}", isVoip) + val topic: String = (creds.apnsKey, creds.bundleId) match { case (_, Some(bundleId)) ⇒ bundleId.value - case (Some(key), _) ⇒ ApplePushExtension(system).apnsBundleId(creds.isVoip).get(key.value).orNull + case (Some(key), _) ⇒ ApplePushExtension(system).apnsBundleId(isVoip).get(key.value).orNull case _ ⇒ system.log.warning("Wrong creds format on sending notification. Creds: {}", creds) null diff --git a/actor-server/version.sbt b/actor-server/version.sbt index 67f425d294..fd69707ee4 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.25-SNAPSHOT" +version in ThisBuild := "3.0.27-SNAPSHOT" From baa5849fa82571fbf039713de4bc717095a64fa2 Mon Sep 17 00:00:00 2001 From: diego Date: Mon, 20 Feb 2017 18:21:58 -0300 Subject: [PATCH 249/253] alteracoes --- .../src/main/scala/im/actor/server/push/apple/APNSSend.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala index 4e01ffbe21..544909d010 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala @@ -35,7 +35,7 @@ trait APNSSend { val sanitizedToken = TokenUtil.sanitizeTokenString(token) system.log.debug(s"Sending APNS, token: {}, key: {}, isVoip: {}, topic: {}, payload: $payload", sanitizedToken, creds.apnsKey, creds.isVoip, topic) - val notification = new SimpleApnsPushNotification(sanitizedToken, null, payload) + val notification = new SimpleApnsPushNotification(sanitizedToken, topic, payload) val listener = listeners.getOrElseUpdate(token, new PushFutureListener(userId, creds, extractCredsId(creds))(system)) client.sendNotification(notification).addListener(listener) From 96a271808dd46484605a3961e21aa2a1df12b8e4 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 21 Feb 2017 07:56:19 -0300 Subject: [PATCH 250/253] alteracoes --- .../im/actor/server/push/apple/APNSSend.scala | 15 ++++++++------- .../server/push/apple/PushFutureListener.scala | 17 ++++++++++------- actor-server/version.sbt | 2 +- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala index 4e01ffbe21..c1027ce067 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/APNSSend.scala @@ -17,23 +17,24 @@ trait APNSSend { protected def sendNotification(payload: String, creds: ApplePushCredentials, userId: Int)(implicit client: ApplePushExtension#Client, system: ActorSystem): NFuture[PushNotificationResponse[SimpleApnsPushNotification]] = { + val log = Logging(system, getClass) val token = BitVector(creds.token.toByteArray).toHex - system.log.debug("Searching topic for Creds: {}", creds) - - val isVoip = if (creds.isVoip) creds.isVoip else false - system.log.debug("Is Voip: {}", isVoip) + log.debug( + s"Searching topic for ApnsKey: {}, BundleId: {}, AuthId: {}, IsVoip: {}, token: $token", + creds.apnsKey, creds.bundleId, creds.authId, creds.isVoip + ) val topic: String = (creds.apnsKey, creds.bundleId) match { case (_, Some(bundleId)) ⇒ bundleId.value - case (Some(key), _) ⇒ ApplePushExtension(system).apnsBundleId(isVoip).get(key.value).orNull + case (Some(key), _) ⇒ ApplePushExtension(system).apnsBundleId(creds.isVoip).get(key.value).orNull case _ ⇒ - system.log.warning("Wrong creds format on sending notification. Creds: {}", creds) + log.warning("Wrong creds format on sending notification. Creds: {}", creds) null } val sanitizedToken = TokenUtil.sanitizeTokenString(token) - system.log.debug(s"Sending APNS, token: {}, key: {}, isVoip: {}, topic: {}, payload: $payload", sanitizedToken, creds.apnsKey, creds.isVoip, topic) + log.debug(s"Sending APNS, token: {}, key: {}, isVoip: {}, topic: {}, payload: $payload", sanitizedToken, creds.apnsKey, creds.isVoip, topic) val notification = new SimpleApnsPushNotification(sanitizedToken, null, payload) diff --git a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/PushFutureListener.scala b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/PushFutureListener.scala index 0514d8317c..4bf9be5212 100644 --- a/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/PushFutureListener.scala +++ b/actor-server/actor-core/src/main/scala/im/actor/server/push/apple/PushFutureListener.scala @@ -22,18 +22,21 @@ final class PushFutureListener(userId: Int, creds: ApplePushCredentials, credsId def operationComplete(future: Future[PushNotificationResponse[SimpleApnsPushNotification]]): Unit = { - log.debug("APNS send event has completed") + log.debug( + "APNS send event has completed user: {}, token: {}, cert id: {}, isVoip: {}", + userId, tokenString, credsId, creds.isVoip + ) Try(future.get()) match { case Success(response) ⇒ log.debug( - "APNS send complete, user: {}, token: {}, cert id: {}", - userId, tokenString, credsId + "APNS send complete, user: {}, token: {}, cert id: {}, isVoip: {}", + userId, tokenString, credsId, creds.isVoip ) if (response.isAccepted) { log.debug( - "Successfully delivered APNS notification to user: {}, token: {}, cert id: {}", - userId, tokenString, credsId + "Successfully delivered APNS notification to user: {}, token: {}, cert id: {}, isVoip: {}", + userId, tokenString, credsId, creds.isVoip ) } else { log.warning( @@ -46,8 +49,8 @@ final class PushFutureListener(userId: Int, creds: ApplePushCredentials, credsId } } case Failure(e) ⇒ - log.error(e, "Failed to send APNS notification for user: {}, token: {}, cert id: {}", - userId, tokenString, credsId) + log.error(e, "Failed to send APNS notification for user: {}, token: {}, cert id: {}, isVoip: {}", + userId, tokenString, credsId, creds.isVoip) } } diff --git a/actor-server/version.sbt b/actor-server/version.sbt index fd69707ee4..fc53dff6a4 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.27-SNAPSHOT" +version in ThisBuild := "3.0.29-SNAPSHOT" From 4cdb47fb30f88f3c81d0626ecb1d89f6bdf70d57 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Tue, 21 Feb 2017 08:27:27 -0300 Subject: [PATCH 251/253] alteracoes --- actor-server/version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actor-server/version.sbt b/actor-server/version.sbt index fc53dff6a4..189cd0c10e 100644 --- a/actor-server/version.sbt +++ b/actor-server/version.sbt @@ -1 +1 @@ -version in ThisBuild := "3.0.29-SNAPSHOT" +version in ThisBuild := "3.0.30-SNAPSHOT" From 0979d16bfd0998b54f8347042a22004d1e4bd340 Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 23 Feb 2017 09:41:39 -0300 Subject: [PATCH 252/253] uncoment lines --- .../im/actor/sdk/controllers/dialogs/view/DialogView.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java index 465eb285ef..e1ed06ab8f 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java @@ -237,10 +237,10 @@ public void bind(Dialog dialog) { } else if (dialog.getPeer().getPeerType() == PeerType.GROUP) { bindedGid = dialog.getPeer().getPeerId(); isPrivateTyping = false; -// groupTypingListener = (val, Value) -> { -// // TODO: Implement Group Typing -// }; -// messenger().getGroupTyping(bindedGid).subscribe(groupTypingListener); + groupTypingListener = (val, Value) -> { + + }; + messenger().getGroupTyping(bindedGid).subscribe(groupTypingListener); } else { isPrivateTyping = false; } From 06121d7c0a62e9828fe4d426d252ce56eb53cf6c Mon Sep 17 00:00:00 2001 From: Diego Silva Date: Thu, 23 Feb 2017 11:09:50 -0300 Subject: [PATCH 253/253] group typing --- .../src/main/java/im/actor/Application.java | 4 +- .../controllers/dialogs/view/DialogView.java | 49 ++++++------------- 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java index c2e51d49f2..653c8e961f 100644 --- a/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java +++ b/actor-sdk/sdk-core-android/android-app/src/main/java/im/actor/Application.java @@ -87,8 +87,8 @@ public void onConfigureActorSDK() { "canalxloto" }); - ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.3:9070"}); -// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); +// ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://192.168.1.3:9070"}); + ActorSDK.sharedActor().setEndpoints(new String[]{"tcp://api-mtproto.im.xloto.com.br:9070"}); ActorSDK.sharedActor().setAuthType(AuthActivity.AUTH_TYPE_PHONE); ActorSDK.sharedActor().setStickersEnabled(false); diff --git a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java index e1ed06ab8f..3669f45b62 100644 --- a/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java +++ b/actor-sdk/sdk-core-android/android-sdk/src/main/java/im/actor/sdk/controllers/dialogs/view/DialogView.java @@ -12,7 +12,6 @@ import android.text.Layout; import android.text.Spannable; import android.text.SpannableStringBuilder; -import android.text.StaticLayout; import android.text.TextPaint; import android.text.style.ForegroundColorSpan; import android.util.AttributeSet; @@ -48,6 +47,7 @@ import im.actor.sdk.view.emoji.keyboard.emoji.Emoji; import static im.actor.sdk.util.ActorSDKMessenger.messenger; +import static im.actor.sdk.util.ActorSDKMessenger.users; public class DialogView extends ListItemBackgroundView { @@ -80,7 +80,7 @@ public class DialogView extends ListItemBackgroundView privateTypingListener; private ValueChangedListener groupTypingListener; - private boolean isPrivateTyping; + private boolean isTyping; public DialogView(Context context) { super(context); @@ -176,9 +176,7 @@ protected void onDraw(Canvas canvas) { // // Content // - - // TODO: Implement Group Typing - if (isPrivateTyping) { + if (isTyping) { canvas.drawText(typingText, Screen.dp(72), Screen.dp(54), textActivePaint); } else { if (layout.getTextLayout() != null) { @@ -225,24 +223,28 @@ public void bind(Dialog dialog) { if (dialog.getPeer().getPeerType() == PeerType.PRIVATE) { bindedUid = dialog.getPeer().getPeerId(); - ValueModel typingModel = messenger().getTyping(bindedUid); - privateTypingListener = (val, Value) -> { - isPrivateTyping = val; + typingText = messenger().getFormatter().formatTyping(); + isTyping = val; invalidate(); }; typingModel.subscribe(privateTypingListener, false); - isPrivateTyping = typingModel.get(); + isTyping = typingModel.get(); } else if (dialog.getPeer().getPeerType() == PeerType.GROUP) { bindedGid = dialog.getPeer().getPeerId(); - isPrivateTyping = false; groupTypingListener = (val, Value) -> { - + isTyping = val.length > 0; + if (val.length == 1) { + typingText = messenger().getFormatter().formatTyping(users().get(val[0]).getName().get()); + } else if(val.length > 1) { + typingText = messenger().getFormatter().formatTyping(val.length); + } + invalidate(); }; messenger().getGroupTyping(bindedGid).subscribe(groupTypingListener); } else { - isPrivateTyping = false; + isTyping = false; } } @@ -278,7 +280,7 @@ public DialogLayout buildLayout(Dialog arg, int width, int height) { avatarBorder.setStrokeWidth(1); avatarTextColor = createTextPaint(Fonts.regular(), 20, Color.WHITE); avatarTextColor.setTextAlign(Paint.Align.CENTER); - typingText = messenger().getFormatter().formatTyping(); + stateSent = new TintDrawable(context.getResources().getDrawable(R.drawable.msg_check_1), style.getDialogsStateSentColor()); @@ -440,25 +442,6 @@ public void layoutReady(DialogLayout res) { } } -// private CharSequence handleEmoji(CharSequence... args) { -// StringBuilder builder = new StringBuilder(); -// for (CharSequence seq : args) { -//// if (SmileProcessor.containsEmoji(seq)) { -//// if (emoji().isLoaded()) { -//// builder.append(emoji().processEmojiCompatMutable(seq, SmileProcessor.CONFIGURATION_BUBBLES)); -//// } else { -//// builder.append(seq); -//// } -//// builder.append(Emoji.replaceEmoji(seq, textPaint.getFontMetricsInt(), Screen.dp(20), true)); -//// } else { -//// builder.append(seq); -//// } -// -// builder.append(Emoji.replaceEmoji(seq, textPaint.getFontMetricsInt(), Screen.dp(20), true)); -// } -// return builder; -// } - private CharSequence buildShortName(String name) { if (name == null) { name = "?"; @@ -489,7 +472,7 @@ public void unbind() { if (privateTypingListener != null) { messenger().getTyping(bindedUid).unsubscribe(privateTypingListener); - isPrivateTyping = false; + isTyping = false; privateTypingListener = null; }

    1(B99$@{4lP936AFUG4m25F{Tg(G%i!8Cko1 zcpC*hbK5yS?4`9a&XQPe`~GJi-lt$!T+azZWaJ}goM)7oAJKns@_xuTO&-Z>{E>sQ<|9vQM{!1_K08jVb^6IC9{f*QqjzgA$S2kN_ zCIfpGuVi&UGnAw*6Sp$5)V-mT>9(t(nF?~YgDgks^?{4Y_ae7tvXo)6*6)@sEF+e>hUq|tZX zr)$-d9Qf;DnIKWYIodrz^R6?B`H5`K49tHiQUA4iA=ayyvUx{+ezegDh6l5oA@6Nduj^EOj zx1lN6E72qQ_mHNcU%}LyCAa>bKVZD`JVS`ft7!)ZWT}&+b(tNV7|34J&E3?floe6;}f=j zq{*wth;3|oK#3V*1vML+91aP1{`g6fNh|5u2gZUa=J z1PeU>WQz#u-`OIZzEbOdj4<`$|6>t;Vvnan)O##DQ@>vc0Xjsms4ED%Blg1w0P(q< z8QD~Mk3){6ksUKPot~DYq2n3KJLjn@#H;r?op6q}%s%D1Rm@rLWx!H4X5=yV0`ckc>| z74^*PhOt|g?NqUlFNxkfr((T<*f%x2e?`~ms%Gu_$OLd+F)Ldd_#zM(L35(&%{C9QOn@e2Hga_0==b*cq+Hp z&mDB;=7dIMKdqZKR);4T$U8R`c9fcTS=cJ4`G~fBqH03!168mOjPv>rR;$yY@vFQUOrS-^As4aXBPUMH(=T&uB3 z#q~!zZsS|8jD7uFo2WlNVNybUd!{#G<=1n;|0$LIIju*~vKj5>WVSRUwXT@-7Y(EY z$haJGQ(o?}&3YwwxsU;FiV2cUDwY_`t~j#o`TdRNmVhBPmDn}W_ZoZIm@JSZXmW9g z9~+dc6GPMDlP@g|*)BRk!_sF-ft>wrSw< zLIgT;cFXKMMBe;F?4{E3d#k0ln`89}H7yx4)5Wu_A)RLH-okzxZUjiv*2XG%VcgL% zMEU5ZypzRHGTe-;wO`@Gn9sOAkjb zr(eGhw7uA*d^JzoyhRMX16vwmjn_Yr44$uoH?6i7xYJpEI8Be*GORyaVA4azW}XwI z7OKoRfK9#K7LaW$2vdtOK8%K=;Nb2(j0K(C2L9I@;ydQr^v&IMJ9rE%ku=q#flHX$ z=-n?D;Q-0>S1*apdXZqo0K~skx>SJCY$ocx!ZJTZf1LQKUd#$oG(XR!^FC+A`pH?{lgMrApRW+? z5Bfd=n|cEF+?GJ_5acsK*m<9@Ke{5XN)9)_AOooE*tyR#Ig%7hs;=5CHL;zW)1R>P z4EexmzNZuM$2(Zv1>9w(NxqFGNjd^?T2XOV;$FFgwqBUt(ZwF*GZCUUuUb8PIB1Id z-X&56BWA58%UR&nQbq5|3u{aL^2FDt5Ewoo-=Ct|3W{p$pFvGu;0gAs{K_^pX^!lA$kl{D&;(CTm*m`ROOlf#SMY zdCS7vmF=V>{x5b7#+BAf1>NVW9K>bizqsrx$i%}R4m@(%-_D`5SI)H^C_p9>eNUK+JwQEVgWsW<|j{{0jqE{U?LDYLPR12yY`VSZfZNIE-VfK9Ym=pMqgBuK8rv-0mO2Xg>8AvZ1%{ zF06mE@qzOo?wv;f4dMTVm$v~l#AJ*8h!CX9AcgxkU0!~7UTDa@i_yMH^s@hoc#Zij>;BXscLcvm*(e+T!1ra0@EIP^aZF(|?}te^8* zjs9*tKpM>cxs`Zn|MpQF9)Ld_oc{Uh24$l@$X))M^}!){Y?O>5*QH{+mrQ?U@Gj}I zo#G#8TNFvi1!1nUyA{;&}~o?u~o6VD3wkRE_pH{1L4=||`D)yv@r z{!{09zW5iLt!^Ogz@O{>U7TF28wC50WR@&wK~|F=XQ3!roAArOyKIZ0%|!W6djIT% z`4LI$SEg5mR=^M|qIkD;y4IXfSFz~&5hAtd|Bb|3Wb&jV`aCF?dWMQFE1o@~Af7#r2(EBl{xk6F31549 zd`X&v)jd+fN*jvLf@50h`r?HacNp9aXrXF%=eTf4STP@Cwg z=t4ga#?M-ff7HicRr;$#IopPQNsD{c9nFM+K3uQsYwh{20B!fo&unXsUJdL)yK zIv13LD zNNqj-e&^SCpFKQqoUR)d=2~;3Wm_LFL$_mtQ~Z@mpn)v3Xj3^r6zh$mm~psPR=t`T zOk4jUq0F+>Ag=`b0m|``v;qFNIC1KJ>ez0lQghPsU~|rOLDm(gv9Rz44eb^p@4To; z-E`p^oLQZI(Nn(p7pbbIC)KEJq;c8d0o6cBAyjX&xyPkPMHSn~qSTu?ev~#+lJ*%| zub&V&sVBO#NmbLj5OIr*^=@1#5t5uAIYo`$<9-Nhf5S)yu%bodXP+bB0gFy{b($6z z17w&<`6=u+8{ zB68m3ladC)3Sgcf8d=kBHNHoGosL@u?$79gD7!y|TYgs|V}0}a(xbeZ?Rc?2wEH)J z(5>ekW_;UDUU@MCjh2R%l7p+4#C;nJU=!!#uljh~Tvr+B(aK$m&(=?rtn19L1BAfE zk2EG*!r2$1lD}*H;20dl%6ch@JR0*xRcS$ai{UnJjj_m`AogIi)YiPn-lzfg*$Ua{5e*qSjZ|P<#i(8RY8!Kbla7-WkfkxN{aUvf->jV#+=@ov! zbSndcRhO5+-_c7>jdkL1HZ1Qn(+X?<-t%?ER^yP_;Ux*I$;W)Cw-Sc}yfoQ3s>$MS z@#OdzAp`egVxThv7sN2Zjr(_rxp&^Kv*KoRLw7$8$u*{W1oBQeDx+!@5Z1q!NO$TnFZp~{u<+9gzO^9Zlo{|xybP+S!Wh>P#mSOfZ3L(wFy$u> z2S2i#(A$xvesfvTd(NgBG>2Ot&n>>j0cotx4OQx^uRk4n-eFPF1Vh>A=6LAx1aQ0S zG0&nP+UtNfDU{^k*>N)fcHFzKx}=IXNTbzux%@9|k_hm*M#1uqSa+`(mL2(wChdCH zF9NXR1B!CP!(mN$yJYoOXK;RaO6Q6HnP*_p*uU~DlvRl`XdlQ#&=FQ@WDc_Svrf|D z+ioGSwvlOKcl=x))oBmgTjmO{d)wAtdRI0(+<>>Vv*CC+_q33{u#O%lcN`4Zykg`1 zUBp3>3(qP-Or%j=m*q?l4lLxe_bw!LdpH5)ZY3KC?qxI{s{F!KQW7uFB$Wv@zm#pftRG8dt z+nxbk6Rg~o9JW2@eJ+)UVXIr+6Z0Kz)HGPP;y`#9jDGdeAOg+|@X-Q!G+ zV%wv=K@qqCMR|1v!_Q^-Q6h}mPLpgS@sSdtGs7cMvZFWI=>YaMoc<9l8J8E95q~ct zll@|Rb5pDp>+~CMo>@&?bK4w&gWtVV}CD;hx?)(M3| zmcN;{uftXG{D)-Gv@X=~PZM*SPYnqWRlcPDVxoa%nipHpi0-Ag$eqaQ(R^V$Fd9vI~Hj68>$ISWX5+HHdaUpQu^aF@9|S3?a9aGoJ5op?Fb{x0cD9*P6G`2KfM3&AJws!!!zg7L1c!ng}LB zRNtbR3J7Qp1n|>A->zR0P`jT_u1;8vFUwY)u0TXN&AO(2d*1XlSBQ#2Ay+U4Je--O z*xZt4LLVHg^`x=5#LNX+8r1@CR$1*t9cgr|nQsfgwg<|9n;!RX-QTIDxvIQ8CJXfi z48;V9h`$^VRORU|0LZR)jW+XH#|Oj`Unat5E6FU44%oE|9owLN=jXiT;FnfTTr7@n zMJEfZa%eQCsr4anBNuB98QtCNvonpcHU^R@r4gocojF$kuU^n~W@!eVRef+D&ova( zmlfdvl;-d)WYg*Zqc&)9ZSc&4Zfyd7eXw4wPW}pb zxVxgboCke^l*pq9eI!eh{}jn@UMxTyRe|KgnAci#(2X+S!@2ln z!cmnEA%>8}^#O24+2KPMIAOVAxjHk9J#cIv^&7~)V2qMWVV!p)X02j(JrGF~rdN;` z6}8&t=#MAYE^}d(#cY@2F>D*=3#F>JT_Js;>JlA3TulOFl;OqLqmV;a7{`;ei!<=7d=f)&PcGk~?)uHUq*!^@e$grSxT&5inGf{}!`of`N*$4wllw@D{#=~#82 zJig1Z+{y7Ru=FwThZydtj>s<$Jrq%Op<6*o%z4zVE{Cj=49T>rv1muH9@kd~subDj zbupq$m`3g2mtcI+iE(daiyMZ1I@DvF`(u1EbIn)L{kc4yOZst)5SGn)v1Z^PS2=Pg zW=j6GBe?)ejvx$!sJ&1ZQJO6!s!j!mvCS()L3}ZSkuDxk(SCr}b4vWdqHIdF0hXBi z=-<9MfVMfn=xQ(c+P%5e=e<6vIg&KKbOXYxX&zaHCLqe6&9D9(hP~0uacC0c;C3Be z63FrWfTFh0#zG^xcyp!BfQ{J{sL5&(2o^V{%f;Yq$uNjAVSpo{!tRfIf@WlCZPFBh zjvvYim=vTvD!I0JS%xIr7g?c8*Yau%MxEZ!p_~P9riqevtL5YpMCWT^iyWeji^zSA zxgr@!UI&s;W4fNe-bC>j(s0a#US-k2N&n z8s3HH&onXgsbDdsgrwOJvSIcD(eF7MTkaBWy@Gnr-&V-r8l<3TRyS|v*qfT_;1Fz_ zoXDjzNtKY{ILj4A+*XHSBiL?{GRm&#Z*uKch3~d-4|@jnEak35&nd|t02i5CD!-<7 z&@nabThQ|rH+XS459_HzQ5Bu&Snloc(<}Qks#cT;8F!qq-%T#aj;ubi?*E=Hu>5CT z0984Y{U6>fti56m|LZ}&#yso58&zdvNTh3Sa^Kgla?saElzd_2WeiF+XF_j2&a&B9*Md~Rur37(i#F%}HFz+mKJbpSzZ z?ih^lKROiF|LRaO4ujbnEwCDEaw)Pu4iUZ;pRf&`woe_>+SWI#3VumOD5)?Ra2_-M zy~A^@NqFA+J0=hsK;;C3ghujY`pmK$o$a@sD^j0CRj8nz=QmLWNmeuzV7QBuHX9eT zpL4Jgr&7`czq-{wGB4~x4Q>9rT{_X7v0?;Frj7_?7W`Yq_J>oV-1%0fCf;+F+koe`XX z@Fgy?5p9}wASsCJa0TR{=^k^B!xUuRSpDj(LA6nH!BMgyYN~h$hHa_#Xx`KiKAD2= ze_ueda~;}DD+Jl2i8U2ecGALW+r`5*)VaB)QB(mJDkyP<0|pM`BI!=Y;!3v}?XbH= z`s1~G)u%+X)fLB|V4t#vTC7UkNPX!L!xsbD3 zGH5yV?(uT`!Lp!!gb{OD>&hgEoXNy2CP0~at`jx-Mm-}W5>*%aZIiQp?;OZ9afS0| z%ho{nl7QNR@LGq@S&ZUD2-VDw?VnXh4QA#CmFv)-;p-y2-kctIA0u}OwEBugK6>Iv zR?pQ(tTiQ&xi5DKbiK82^2o|ZlGv?A05i^Bc3(yh<;^oH3uTX0c~A64L;=pYB*6_l zHG&EIBVchywdH5+lW~ab-U8FKU67lm={!|EIX|8Yu;pHK*K4C5;2wl4a!DAtn}SOW zmX9lD$M?N+!o~wsk3xn?<07>O1~?{bBKcX37il|)BFEHXNQIHjruvu%VyV-h>)&Mp zz-zz^KzmMYqBK;KZ$^B8^=(a*!Xaiw!bvG+7%^T+B&NbD#`Ute6}oO_O`~W(EpFBX zIfxbic|{&FSD`QDp5Zby|0{1^qvOOSFswnMH*JIzA1TYFj?woQ*C_;>hVX>jLOE#n z=X4;ejRa=zFV&D#rs@&h)UPTcjxb|%4{P1z3nVB~#RHfHKeIV1P{Bb+uw-`b7{%x` z{p2{#l7=|`X=Dkqpoy%ef45=XtS*;oar6dTgD}hvEJIpziNdP-nU%<3WaA@H_I1R4 zE80Qm(3z(k+Rz$t%#cjT-mF9{@#M;>I|yDhufGKPH@$Yh|A>Wfm-l~Ay?<^#{IbM_ zzgc4R-}gtLo78HfXRS)X`VJQt8q;3OfVM}t82@O+ey(5J*WqSV^`?ZvQF*hGtMn49 z7qdd~R+Tunx9L(K_R34+fK9BlrI=OMrD8)Ue2!L#XI1ehLblj}u6qst)IwPP>uv}L z5PyyIm%9!#kkZ%Ice#`o3H3)j4Zq=G{e10+t0W~j zBID#lrQV+EfrxIIS?Q({Lde+}1%8a(=8Si|-zBx(D(GpdM<8h2vZeHuEHi6YQvTp;Xy^VJx3fFkK8sDex$} zmex6q5$M>z+XBx)CYho;)6$^DEtyu61sI8UofVAx{aAh1nAo?8GA}BQ-G0ys^X+(? z2dyj-3CSchnwAHSo}SWq4GTv4`PnM@Fm8Cl810`FKIkS`UUw4|~~=1mT2=EL?zlu6$k9?R%~!OdFyg@W~IaMW78~L@9~2`>;w)(>Xq$ zx4I~1h)l0}&brl~-(=Oqu^kn{Wc0T}A|I-57u#rZLdp z^d5DF#XykX>)Mp-EPnH2n5e0e5FCWVQm!pR2%@%@gNItQ{9&`u)Y%Z|;r>a4&Auf_ zky#%RYq}EBrI{1%z)+p5{&3ljZ5HV#04_3yAFLWFn{f1r!?r0k5oTY|`HTdd?w#k_ z;WKJ&L6{6BIJWn&ta(At&%#2^{c5E1?%F-zLAXNVq%QqEZ^hb+@5&bLSM)AE>DI+T z%4&=A@mAGbxx9jRrG=Eh|Cn!RX(6a27;^9-fbg~QjO2PFdgQ42iB^5u2GKWeWQ`DP z=U%WGMxlAUlut62G=u1en54^xqMlOgccc+mj?C6uPM{m^h{b7#$#4Qeq4IRse*o0$ zqRdt(Cj64=i78MHP*5%Oke};?%&@iqbAHK~ciV1jVr9MY74M^xysX*P&<@dn`$G|X zh-3s&jb?pgMkULh-s&%!TVAa{an|ssB-SDjvt{K2&ypd8tY+Uv))>Y7n3GcHu0Ket zniugZL}V6In%kD*UrWDMtut*Ze+6HTl)nkF?1{b?c1e}jiR^L45N948sQD+f8{-DQ z1l#wUjogCod%qEPvaAABOUy%D8o6jlT|<5xXscU9v}?uokQd=cVZ z2}>c^o1dL^_MyCVfF$sFO*ThHG?k9UKSf6h%5%Dm3#g4(UwJ>1{D#Hp=8g9v=#*p< z$2IBO>hN#%i`uGR5Qt$)#9$67sBL)cX?F#iDi@EEy*}$MbXl011z=-CzJC$>>}9U? z=d@&r-Mk)R+T4mVh9m8kbr1Eoh3{A51Tq8QKrLV1YxR-@0#PqJN1VG2w>8nu2qMAn z3tweEOA-76bqRN-w*}uT`PNHB<+s(#yL#ij5PH@bVNc}UX9vuEZf;0&r~_N8CN@wV zbbqT{ez(07+K9FquvG2g!C2=J=F4sY6>cg`g_lJwHUq))cf5~vQlVPDh*JmHruxut7L#)wciXe^pQc!kK z(1us!Oe;u&t;Da+Rx6y1ZHme`{zhEkbN=<94+QdT(I>o(#Nw8M(-mCCvH##ng0?s&{959)+06iO<605ps0b;%9pGgmgzN5 zZB2E3bA5e0OyZ)l5R#`0T7myjKPcl1SljCJW3rroqS*(!rE<)YhQcA3LWAc9rJPT! z1Xb+7+3=M>l=276$>dHuQIj?l7JH(WP%B@Imyk{+eIbDSz<7G*9*yEmGmTlMptuIh zbDb;+;>2Pe2EQV0@yfdj9sWc3UJcNKilnM_LQJo*A=(`TeZK&|YIv%~4H@r-d7_WQ z_5Bc4GOGee1~Oo#1Rr;_mFCh3P^?t(n5>$9;vDi$jWnR52- z9C((w{5)uYW4o+P7E6JSdAY60eqDVUU~eTC31N!IB=E>ahtKE)0*4FUe&BhFGu{Dn z-PP&E4`!rr-9}qPz&pX9CKtM!TA*o3q?+8%DkND~IajluopA<2oTrU23F7 zM~TVT$6ktB$Gg2rlJc|%uIXM~=+s&2p)Re0QJGt8vv4x-_K^C6RZkE=O^jGhu5wcp zDmF->=k@s`esKBJ*b=Z56wC2E*ZS5Tcu9$i^^oLmKByA48w ziIOzHHB}?CT7!iQr6Qj?ldXU{H@8?*HE=owIJw5Gd;nzlkK?YefC*bVj`0pGw}!HW z55;cs$~#16Riz6CfNQ}9G3WIBlqI59MwzTs zg(AhY4%lo1iyGLeJ_(bT(Qt`UtC=-QIb`fAIxEe|-OR(g#P{w$u&GUX?6!1TpaFRqpWB16fK(BpI_JyV`p{m z_WKY`7*s|Yj`CHfVTeh$2M@RvQ7wf#OwmIum?tTt-N5>#%IKt`EOKq$TNx=;wJLEE z7EN!6-euO}eou|!F$!Nky78~6!6A`i?dtH6m>yq}VZsVDJkxgkMmIZeJy)4a6CCyf z5z2<`Ml_T-7v34An_52&z4h-l5IIvZU)x1pc5{wiI4VlSw{#cRV{y{EL6U=>&EZcW8VG z;sYf;%a)I2*M$<&CDv9KpO)XlzQN3hgPF<6b!H5_GhCyM^3PCP$BcG@J*O(PPqjJpW-;50OiUF#nx)Ptk{@SbkE$F|f?U8c?)pIM^a zK)(5VbGd@vBoE2n^iGfl@0topjP^}fm%eo(ZSPh3jhRT*H zPhhfmd6&|3XWm&vpxz1^$mq75(!6(Q3*?c^dsZ`7{K6J<+8(|S47saV?rm`Eg;{N# zNoZ2dCC1s9w&ZY=;L7FobbD?oYRfn7z0hR(<8BFlmYTVe=>vH9I>ZgbI1zlo1aY^+ zU^Djti~{RCZ$qKxZNoz*`5`dEj5s*9m*$>W?f2ylNIh*Dla~>?!cxCkZ;IOUk#ED{ zy!I()j$Y)&R%?F7Gp1ip8C~vK&`**rjcqoxvTt<9c{dnXjU|iEkp1|Ilvu7{Go2Td4wyg&GXM99N8$d9Qs>FW zA1$FN$Pz05(E*fM`C04qJZca~NnfL|ch1^14483gchCounSN^Uz7MCARmI{wZOW|g zag(f-$%XIBG$#-|Q&-G%*5~r~3|*(|Jsp5^=EcY!BzMoz>Rlesgc3nH{-W$^A)0Iehq?F9u6y7jb5+0Y8@?aH7{1J zaLV72<-g3g#R zAUM~&UYXyuOE34fKIMjmwVNj--i@BQ2fZOBH~w8H%V0S#aLZBswys6gjO|i9WxQ^F z;h;9k%z5Al{VSz20UpQ7)zBD)Upn`Nn&J+(;(D~pA_O?rtI=H?f) znwz$ZAxaX3N5U0k^5V^^=)86_4u!$VM{I(=GNILVmVAmMpy1Uc!0RZk=L+HFljyk&>Zp^nX zv`mt#Be50*X$z{=n727fxwukzz3?gR_Ly!TfUOh1oJ;%3!rOX(QYE?8AL; zKfI{gXPmz7YOg2W3!*DTYrhfFXboPpW1s{E`OY!Z4Ci#Z2X^!gU^`ngZNCIqI-4?tzt zebQ>@u<|>b?>uY-a;+BD~gPMZ^9;(bx8XDNbZ=XmNUKlB%_DDr$$9lGsTY?hTV z9tth3t#?_Vs*hG`PGWcLp7&S~Qh*73PsLkyUc0v+@T!?-{kG6(?dlpRY2G>3BG_Y( zJq|$m3>Yt5*s`1U;aBHw-{Vb(E94jX6udT&afus=+iQcaKPbLPr+2EgEm-T|QJmH5 zQPnZ;H;lGa#CCbP3rkwI0v_(<_o_A$-^|RVZdrXHY}S@Ilv|SA4SGr#FT8y{9BQK8 zEFB=e1or3Luw57Xm#$we!62wsO*CU$3Cl=H?D#7WKz-$DSF(-MT#!7h*x1I}jc8PP z=SX^+_3E1&9>$9bS-Set#<`-cT~#D%f5w7q`@pv8l%}hkptZ@xjppW%LK>AAVx!DN zvNM|eXKFkrWJIEzZ}z1G%mA1N07OLlCx7;)lT()n#kG6SwW;lIQ~PLQm`ol3kr|r@ z03J1xNhB=cI4Q2Pb#?--(xT}4RoW&$c}rmE>2f4OxoeA-`R0#Jk|rI{a|2!}92E5h z-ZPd*Z2eGn{!cej`Hbe5vC18HSozD1luil_V+%I_tJ@tU?d~`=? zEt{d6S`s9tSp}V%6+@2FwU~JNyK5iG*N=}b-a%WZ;_`hVbnxr9%QUFfONVvgy0oa^ z{$>i-ccfYmL7;ak9rnVTsV0LwmW)0;)72=?y8EN<|0c^rmyqttSbt|u*{t#_DgC6tH>4g zp1NYZLHsA7y!`QuLf6_FpGqBL*QE9o5@}kX;>Sro4kUEdidfsE*Tz1#3BJ|LxHVb~ zd!e}5S?sgR12)=NKv7*{oW7tZ-S*9{6XoiH!6#H6(cGx?(Gl>059Pt><6Ozr>CGMD z#@p9vaUN7HzEpHUZlg$qw6L>i*bsFrhHYPJ{M_2K*N7C=>N!jmH;-G~bT}$q-$Qmz zC7DWRCwkXrYZPT;;)Rd+*Aps2QJ*yB{;I>S zi?*(?pRlbKepk?=U-+wD{&1hEj1r8V*Ghqr*PTxR{r}SaQNDW%KI=|tb#A?C8ck^L zOrjS0!DR54WrArw$#7sTdR3jI=OUEIH?_B|o-RX}Q`X9DJjo?Zo@FNev z7#kO@od3F8MiHf!o^Deg9%FOopg<%URN9AP0AE(UoGi55H?v^#@MzEtam-|i_Rywi z^=^w5{5OqqYv=aIZjgjIccTNaR-_m&HK)g*&!W#ZamItDmt#^YGJ5QmB4An8*j- zP-*ms@O|~q_Fulv*A2dpDYLwVW%sK?9d}A`q?EsQFc5#QGDvqN=}0+ao9ts?-xk># zTGeekcZSp8*bg*v~iRFa^7hR{}JL*0isH+?^BId=~67b9L#e1cm2+*wYQy5(d$b-AXk zA$3Cwk`fbRNjZV|^G@*fixFgF7BFt>AN7junQb!A-d%7e%X^WIPCu8hie~ve6zJzI z&>Ca+D@`AMyS~~A;_@M6)xws7kR>m#gHd+j_rO9VNjK|M!$kGTkaJR_1IAteM$x_p z@+vAKR{MP|#!79iAiJ%|(x(1f30k}{Np6?dlb`7iohYl$4T~EI2T(UPFV9|&Z^7_a zwZc~)q%Rh|MulCv#hMDd-ps+TVAve-Gu;Z<a58oVbU8xyqeo zk@yfaia1`6i;IKEbdX~Snt9@0ou=OjzS*5amMVDh{&&q#q&dUlGr80at9X^Yc4W{mDxRx0^S#>@VL@KSK0$R365ATLMTX>?+tcI9C+?T3C6ld+ zVmFnKp*VoI>4+5Tqqr39 zPs2jz^&n_1{OomQdesc1j0HUjuf^KG91|_xuSm-bnP?A{>S=2ztSLLKMt5w!E?;m+ zQ4dx1fQX9r**CHA7Hf&G#0#(RC@`q8HM6UlA9bA}W2}S_Bf?>RW-`rlLOmIuH5p4; z3oD%mqnFai8ZxI8Ju8N4@^T%$R}wD`9&94ODp0j&a;(F#dVCUD^CteAJa5eDx*#d{ zzZSIWe=TSkA0G#kPEa^!&&$BGQQq#XzrjzVAr^n5)lqd~RU++NmAHx{QmXQf=9BnQ zq#5>f-;fSPZj-XX6e7LbmF;0peLP02s;SWqCFUnxlr)oiGnzvshRk#EtP+CgX(Eg7 zWbbM)ON`^mK$J~KbKs3oodbHn!2Vmsl(q#vC9-|*h^B>09zm_&c;T9=+Waz<+fn+Bmn?$ILVZutUMm`}e_h@C)9T|02?Ru% zl!828(g-%^pX3Q=XO28qDF$_NwW2L^I=B%vtcvIHU@BVK`5n{AtOL22nhL|xTkMu- zJ&GIf^NuMMFcQ}enK5aToj4xdn>8?h1HXkTCJfh=mH2zD3yz^Lx>3g+QyeL>#-}kf zsp}nJ3Dliva9uxGHygmFy^WUYnVpnEr>v;T@4|1;@(?|cuG2qU97;HygV*Jz)hrdq7>$d3) z<-(RR%VT(18+^o=ld^FH+~Sb+pX%v>-(7QwUn8Yx5D9Z#-5w(JqxPn z4?u*$my4{qt37|=!l4~nSBXW;t2)S3Pw+Vx!jI=G;H>BOdq=)M*Q>4cp5=Aq$#Bs~ z`E`^4TI^5egq+t5VCj@>VJ}r%Ppb2- zvH*NI6W7}AjYHJru*75L@$6WktxkE>G=3z2^3ee zXg{!q1O(UdN)mEh+XIXJEcm@#{_x%KC)KxdZ zSiF;-(+i&Bqm^AudKS}LyfaZzEXHa*E^_hsDi45Ia#W2ln@?Bk7uOdq4gC3N>z{eb z=soPB7F^;kkT^>=%B^^fb}YUt@<*NEc#k#aq!m|F8%MX48~~wyd11V{ zJX%aGRn5*qz%p)dIyQ7r9h4kck70ww`3H@UlN%BE`P>?U{E|K7m3Zo-2RbDWfRirM zPZ8m7xHZUg^O3RKocvAT0U6)drK>u^%wC?Q-6snWDB+p`Sanc=HXj{W8JL#XBPZ}t z;w?1KH#0I*jXoZ-yU66Mc;=1c=nmB?-TRW+rTr*S^>A%8kfM4{?rDim^vs1MWg4T= z^|MuRa;xG+pG$+)tp-?k-`6nUZA*{+xB>X|ZfD>Y1b}=CNV#e)!&|-QuJ*%Pfw1XX z)14WBW1V`o#WVqjeg#_su-)b0y+n8^pBv(@=nu$!6U_y1I9Yol4rixjTk~WAc)r(? zSyALj1{pVE-HD}NO>AxrXx(0_ksg3l$D!>@I%(u=^UR!k5-qMw9XM(qEHn#cQSgt9 za&f_Flp!Xvz(`@+5!3P+;@Eqku^!AY`-2HoR+Jyk-P(!9R_$vj-X3)dMddGrG?^+-QZ&Fs6FaZDELAz+^- zt}c8XKt2ns{sbdq0IP0g?p7KOVg3!oGJ&Q0XKQpv9pE#%nirwF_FUzthEEHz}-q`jw&w4p;3d1oJ-ruv(AO z&G|Dl|n+ECbM(OU9j!lEo-6h=}zR$*U&j0*=@Au9Z^9?i1xCfuTo^@aAy4JdD zQ6S{Qgf5z-V-Z~($W{T9s(7jiFK8hJ*}($f{*3Ot*K)!toRX#T<)WJsX9a_G1mh#3 zA#79EvEAu~XVfg_I<-#(*CT5?&IhCYGHxW=YmQLiGq`h_3rfv?%usMNlbQ@k$u8C6-xGw{*>-U{W^SwC>dlh==fmFmQ_U3 zHn@;Z^Jr(=#9(wbU}uMw8>&Y{*JF0b^iOv9bm7X^Gk$8cZ_w##`mZ7XG8;}Il_S{u z(t2LRaKV`v@GQ{}Yx7r}A3!&mqE~Gs5W6c-YGpN~^|FJKGDGQD?jx_H;3ZBXIJ zJU7Mds#D&M&IT6FFEI2s=La05>P$_o#hY5~{{}H`qGdRwd4sm;>k7I9WVAvrxhDxY zPs7FL;MD$9N4OUc@R}o6VJ&jfdEq(yJD&T*s1sLG2X3NJI-z>4ybei^&Wb#)+6TAn zo7sV%=#YLXH{+^xrziLDE&l1PP8g8(_MUyL~vn#+{S5gglCJ&zcOmv+&usKi|xXj zBhp3|Rpjd}ft|Go7K^N=sI9#M{XG%R#9V?9d#e!$MqkJDVb+47JiJdA#!KJ;@3 zs}~;j>Mw9Vr!grZ^ji4um%`*RQ`;n-D%9EsL1yFpccL|A>{W4a-+|lrI?pR;I4s!Q z-pnklP}BWbhlHm-IZ%!>jtX!OlTkU=JLR4ajg4sB$;yuMx6^Q4k#5BzC$cjq^huTeNamWSZRhAftU1 z6CGVxKxy8vZVU6I4WT|W-c0FvRCc^13W+%i2OB5MtHEen7{jK_6D12(d^M#$JFqiy zkY#=ms`wWJqA%y)x!$vKej7lIqCrX@+L&9?)%n1GwPgI_s)B6NX|(z}sLKqi7S3(? z8;5T@JC*?$}ty44G2D-<9CP zC2C?n`wilc>&#x{4Goq);!lLlW__yg&UTS+neSv3?ygXVJ{11N{d?X_-TnVIa`<9c&oIQ#i`dbiP$fW-as&t8==xwXR(z=XeT^ zQ}Uv3(>}j=urdpfXtKqU=IPq&l=5n2XUTnQT;HARMNmcRnIvbi)AKV_yWsQmv&YE& zi>{ICj@WKQFzfn)IPJ#sv=#2N^pjf=?|%f+%^fHPDKAFl)S;qAWqmXuEhO`gJItlG zTUJ$CeP(&LRP%+Rs%AzVxmfi`>N!n%a3QBb%!JzliQv~4DiwUZCOzK zcQvV?y!F!5_dO)|pX-fCbzEC5*nb#1R#xD$X^GObJ^RdFJ`!R(VG(T1u%FjPK5zZp z#M4nSc)o(Id%q;klV0Vi*^-=g@Uo&!AlqrWyqn{W!*~ENSq?wdp)qy^foky1Um8r* zifHYo&p&y*klZ^>N>JCPKe2w z&{rR3wzpumZX)I$)errV;zxDlRZT1|5leSM!lx@47+rajN9U7qdlM(C(H4Rs!z?82 ziz^%9zd_XUV8`APhy_ihP|8oIXoV(&eK4CAt74t1(%LviX&D(qwvRwu!<*^Cc}9Xx z@2hqcKE;z%t>7OdIP(>q6g|Ucj>l7_rb^^D5Qux3UsYbWIKn{E1lGOuHwXMuU)`0S z7YnMNJ+VhxVn3)FX27c1wW?d?emuBXat9|C*ocH46KJw(zCk4)w?ogPR<4Jf=i2Yt z)E}n!X*x}qF%7M^s&az7Z*#da^Y`iT4Dn_%93uk?0-7&fPSy-gay|GOT-cW8+OG%f zD0tv+ci~aaBkD37g$Np-=fI^F&b+;gn>zEMc#2zeg3%gGz;9WxgLc#DaAa6LClRA5 zA)D0ogEHxas6R^l993<0J!GMhNxqVHle2%fE}!eU@%hhRcLY_lll-9>MOZpZt8z`5 zpDoQrJnyp%i^i@LcowfZRA(Bst>*mjC%aHWoF*{!5Yfaq5K5)6hxsJbWl=efJT#lE z1vTv!ouwo%ogzhZVA0sV(pB&78*=YN$72>rjM@$mHZ^XgW<=VHnmQfVWQw24;BhH| zzA7r-=60pvNMiO=P0qx{n5DXn4FY0jv+f+vjU`??IY31Civ-FeEt%IYv3;Sbf>F|Lv>Gp{a=q*89VYkl;p7BpcaP{8$C~AgROFYD=Ps zQQ{>`kz;u_vld#eUdn5czWqI$1MbFxCw7a9%TAnRR2$jpL$7fzc7I?U#3hmS{MsVfVE>2AX2Z_dfCznWcsSS_oaw{ckXX3b;E;d{=99w?2 zakCgg67=TjI-PONb*0v~idux|z^hpZB6~c60|u(R{C*1<=Q8K^@!+0N_%ZvX4mt2Q^Ogyz&_@q}tp$;K z5=el3jO&^ZNZL&YRWKZ5;&{P0sTzlJLQQZZ&hwX%;ETP&pq@O;wBkS@v zXqFpIY8&mq=r;)X(^l9BFS(Q9DSsPc%SNXaW9!>OyzFSkBvRsUszNeTI8L-iy66)3 zHdbZT69~~M%L@}G^ArMNZwPt|AC5)}^5yAgP$eY_!P~x@Qwq#f&F~wkMlZKd z(c3?+N;|&LGUGz5xL2V+3F_o3a_!wOVlPL2l1D^m^adfNtjIwBc4;3UmwPF@Ip-K^ zVprDX(xZjg&a3nf43ONb*hJ|Q-`Lq%1-q)nH`JQZw6!L^7CD4SXQAB;R#WM8;W5- z8`xv|inqT(f5!Nd-E%eBV98sm?Gm{L(q+p~B-8IZ*@e;SXW#amo`$GtD9Wi6HvZi$ zV>hwBTyrF&XHe*n2e;A0jG3Aj?P{u7lGyQE5CxfaOG!|`p=Y(0%A7~^W*c!Kak2pvjdJp7O%&iE{s`E^BU|?*>TNv z#2l?ALsiH#4axbuc=W{nMuE1cNd@GU!DSM=>=Rr-cc z*V|x7H;kI&8sdnTd75=P0!Xsb>;zTI*nKq-2gd1qTHWLFRstelx6Sggl)~3CR>B=6 z{Y1nMIifMNO3P_6QQqXO(KpoU>o9kmA0V=e-HBv~fgXC?(af7(FNTwGJvhI;zSRxN zqegq8W|eJVyB=^=&GbthI; zVBcqFhZ>5gDopMU%(9Gu(7=`a3s}R$1S+yv9~s>v-3dUpGn^1hE#>!q@j_owz0NL| zVOpK*j}O(ypLtPGk0jl^1@YR#Ff9udUnJnO&dtiZa<>zl zhRFG@y<10Gf}6iY99;8(;GAucwRd{y1IY;|1J6RFFGjV!LoITE6MJzXKE+KZbH_mt_2 zvZ{3m?>QKxP|xV8(>TB6*g3!bqUFK?*LuldIbB7T9?i>U+m3waY_~+WcJ#xv`iGr` z6;_rE?5z&bNOghUAS3(N9|W326%MWm93x;G=TyhcIBS{bWcHd%Zi}U+Y@9T4s==aC zO2Ih(r2bh%vlC~N@o(wBTY{(hUD_ss29NdNY6UjceJ+vRra`N12uAo}B$NoIE2SVd zE0<$`jbv=y3=jdh&TOQwkKe7?7H0EcC3i#@QZ}a0?gd95%kow@>r&y)soTGdn!_RS z)p6x+h=f#cw5xNqd&K|~rCs6TG;u+XJ|ud^rGvGtPj7pQJm9$^;D?0?zZu2gQuJ!=T@n2fK^~Dt)MsZC ziu_^e-H=@$4&!c7)y}~eOul~mKPAO)Q@UoUO2p74LxJPi27U$BlCd`1fm{nbjr+sL z2W7_WgZI+E5Nt_(M?#{)F(n-a;L~kdO1vSDh6Y%y(2rdWUW=Wr?fkKmM=i236*wFe z5+d;`tAlsy>3WK-Axh322qjUxl;bW3_a+agwAPkIMUD>hp}YK+dM}LWKnLG9OR+Rq zDf#2?3HYC2Iks7N=0696m@VX`Z~g9)UvT!Aoe3oJPf_R-%s;scCU*&{)7`=9~hMIzkU`-1W0;T%o#TTx0X>k-PvZ|0V= z56*wGNqgb)0!ZF;*3v%B;+k2p;?6sABav0kkgFZ^&mLMg2AcM3Z6z|=5>a)@i<&N* zb;chFMZ+eOWyTmkvxSch6Mj$b7PU!yFa{aT)S7V&Ss%pS{esRoWoeRpNUN&JkbzHe z+I6j4=yA4S2wvqV&~m;cI|5fY*(x!p3CCnb9#+~2RL{i*QpY<+biFcvL86aD=A&BO zuEj52tNp6=f710^o6!#=K$?a9uQcnjOW{sA#I0X?`4S;QsOz0(mb|0D6CZ+86T_bv z-xc(L6N}{mQ|P(s!=!bG#Gd3ewTsM8Av+~n;ei<9WvZj>;~Zn0b7bazydX{j(PwLm?{+?vU&)|4MbhBl{w2=bWSAOYc0&+=R+h3GdZ?LG^- z#0wm;$QnR;F?=z2lhj%sgFd?k%OnxPuFjG`NcXd6(CL25cI{GiPNJ>0*|?DH*RrF` zx%O+u@WkjOn%=_@izKZr{AXISPy0D}-myuqxFxAOA{_Y6a&!+G$Li0Z$GaR$cQ&Bf z&_I*ozp9rMPb6pARiSH9x^!V*D5Z3Ad0@%61~MK;jBN7+O5Pc9Q%s3Hd)8_iGOPTP zVS4~;*oK5JZZ~-6CB|>iQvvFC;!YV)c90PQR+QO9XXH${PcKqXNNH%K)^pf>dae-g zILy>CWAIxHkM?~a`}KE7G)b}HI3v%5_G}rAnGL{45fqB`2X&fX&Zg=VN>_n%h1&BQX8tHPL8M@&;_ z>&~?)ALHUCrCW*UB>1IdRM07GdaK5~hkIOoI(EPVZw|5=zEjLMq$vc7(%=)-wWN)V?9tbbD5Kee#`CA$Y5HS0%7J>L+Wrz9&+!k=!Y#^(yv zf$c9EUh+usMAVCXzWE%gG(B-Faj)G9?{wYsT@c%nrxrVMyxzqG5WAswKCDCP#??Is z3OUB;^C*M6R`ay}zXsq}pBK=JCtNfA`UPek3UekCPi|y%Yu`#bG27Bi6IglZ5Y(Dj zgY}<-q=I_>DU(p=uB1P;P%l9x`!6ZvP+OsyzY02Cc==H_`8h7l>eTFeB{!d~I5))E zOncH<>ci0zORIV1_RxsZ_rF2itcN#Qlykwv0?b+{H{S~d)#V{C6WSA!-Ox&-uF)q5 zFMq|?P5yeZCW$bGEV72<6rNRP!n~^+j{2>tbO{G>bVVDEp)j?bpf&v|sx5`Ejc}>( z!eh9oS*$Q^pW^?M-*lLtpbhK80c{ON-ch?6{`gYdS8<@^S=ei4#wIdUargQ*W*U5~ zV32wfGCQ?4N??C2a4g>1i*cRyi31QBB+iwtW=P~{zb@k=yMKkZJV#}Vd zCo%qqwAELFOYT~(RXcrmju7pHZ5FfBUZ&N$?kT4*Pdv{dvb!Huvm!)^UGqhS7<>G~ zoi%%VEDW}YJBCqTzh8c|p{p^ZajJs}wO<#NLVln6t4)m~YJi}6X6&U4>F{P_1!tI` zZjuADh)t_CG3PS~>J8qB;WL%GXemlmu?DiQ%!ai|hQNiFmEmd@+A=ciRBCGYYR>G7 z+P#-N9BgLRG_*;HTPY-5wO8>k3b~Hn?1ulatq$(|#J#eAKqI`PEgsc-RE`?j+;FZu zuHRH2p`_%Z5JYcCVkNZn9b(EgheT6dhgu=|5hRYP9txZkqWZ|*?Reoh5a8XKQ@k57 z+up;_!lPLoa#ikO2ELEkcgpB4<*wfO6|iXAd}*^d?V-5*>@KI-Z$EdQXN&qJfzu|W zWzEn*<>sxdlknGoRnrjHWyK!MgSq6x_&L-R5-cjK6L__Ez8}!d7pJt2aSFoi`wTx- z_?fSzRynRsVQX212EF`M(L3xt9BCn{le99alwBXBJG*5SCf78iW zMU>je`inWvJ6^URSx`p*vzxe0Ho0pJ7;)~&(^fvpcUg6GXqSH#{N(SNvH>Ig|7E1! zxJQ(;;SQoO9W&vkc+ML}Ao{|ykOrM>1*8TW1i2p$$+m3EN0Xm~y%MM(&f!VLy6ejH zFJLx~n^`v)o~h!JF3V1RQ~#`i&(1Uh`{j#udN1Kq^9#(H5c{Rn$b7}Q82HTl zU0^wxz80TUSsW=c@9&lkvCG& zOY455Lkbd_%tSGJDFL}*$V_2Z^q>RHW$N>!z6fj(+#z?FKCxaM({&&67t#h+oBGEI zy!+=jUpAQb=q?4QbA7K}7IRBtmZsm{7T6yo09UI;DV zDXx+X4uNTmbCQElQi7s_!pd=?o1-uhOoJu11=li$BcXZg1Yul;ye@O)M$B6VyLK9z zm}O3ByO-fQQq1cUiP6%+(RNg3n9|be;)#4d2#Z!a9o+5Kny1mY$O86yOLmVFC^w4d zDE*q#Z>Oy~J?z=r1FS7I51^A#*Z?SfR}D60V2>rS1C5DG>QDw$*);}_-bfHe1xE`6 z5l9gXBsME`D+ZM@(?{i`OUA1Xr3KO4^tDB=2RKTX3J&SesXMImv^^qi7Sdod{O0}h z{XSoJ2!tsQm=OSosjfV&c+UTB-Pjj>e!6ZRTI>+dcVGm?GhgAjVc2Q)VHb5nNaa;x zBQ1VWBaRwoF-J`_WH7S2pnadedZMflIG*Q3{T?FxI<3~F1y1(ufh-3e^j683ARJq^ zzN#NV-iY3helP#G-=Q-m52@~AC-E29wZyhdsiEcib18VY(0N?(g@}AgBsSa3$atmP zucJx6KSSwRL(6+y8WQOImloFM5AetUpvyQL@W| z^)iz|dLU`7YXJEgX&Iwww%O0hV7_jPh7reUy}f01HGb^R%pc(M$^Y^>+JQbo*8sj7 zvM{`osWcq5;uqw|kD{cA9m3D4DyVa}T;@w-B^(@Ij`+R8c*;|2woV(*bCIA{}Cxh4VSwSrWBa#XFzstM6|6^Yu^0-m}7H{e}VU+LP-N zV^V<&Y~(cQh4N30Ryly`yhtsv2lAVpk>bF{@Hdhm!B)%F7~ufZR7H_NXoJ zHvWfNaB4HMTeAjrlomUjs;r4mqvBBo91NC#jVG;dY#ab$QEyyUJYtWDrSyKhQVszg zKTy)0x^6py;nLIjR%xp(httJB_Ml5=+#xoIG#(giWw~Klw#O?0>9Hhe{tPzT*W00@ zX~}7(0S|kzZ&KEB#0SibRwB}#(soaRA#e1f2z__D&GLDBKGVpv$Uz8{UxFMWN4Sfe z#ui16mf@ym@zb8Sa)SiFu(t*YsEug2WxNIP(==oDh#Bu1rB;z72k>=_o7n!U*)W4bFniW%=-WGIKUQD zQdU2Hc`qShKWVK+w2mZT_jCQ^@L5k6y{52;6>f+NWt>q`ox)i-owIP3>b6~kO& zCtoAqM;N7^5=_+8;QNM*_{5DUtxsDA*ww3Ns?)MTh`dQYe*B8wk6O_`)O0KqTrc|C zXC37Z!X`q&QFa>LUBaPSqbCEbO`v`vLi>J|ZgVb9Ra@DlhznUu!2|vK2jxLYN8HI5 zBs_1~7Ct|nQE%s|7L`(8??(=-YgBdRUt^O4-8mL|c!&$ivP{A^xg?@lk(6?)^X$6t zJBzEzn4{*BTq~^VuViaJ6g!9!NO-ar#IsSr+_Ci1pbk^#24KlvV87ZfC7rJ#mFq5+ zE}(B(okZ4_%6Rr0)V5*|x*Zzm^&h36pNonG$kO}P7uQJ_cC#2@tLPKz>O`1}HIpY! zn_c&vz8`L0n?pGoJ49QZ!H^28e7_AMr$gCc#A*tmFX%WyH_do9g}BisK}G>2y^a6% z)LPx_hWzF~PbK)*Q`I7^nJE!~RfytaM&Z}t?Y%a&^21CWBfpN5`P0Mmc3+_Xw4LcJ z&~tbAN@_xd)C=`v2P2*3o;`7sjOR+{Tpu1QM$=qVpcNIYdjla<9Lek1)Qpc<%%#R% z9!WY8?tiq2JpY~sTyg${1sm@g$05okkq@}}V-@@=G$IRDi{0Hc(bB=u zljSi=?9RFnHS3?v8E+}Suqn_6?Qxg05~3HsO>WoDT?f9nInXNe-vpgI-%NYY3uFhh zds0^aksV|=Q#O#l6U8D`ubpidrOOuCzuS$R-iz5g(u%7|j-}_3xHFdALz_EOe)cx8 zF1m}GNS(kgZ_IFys3jZ%zj2L|+ zYGG#6r#O|odu{=?Gt9|{HXqj-7?ry}j!ZLfQOf$}Ru8Ay_O;6Uc+_6^{s#S+ zx=Cz}3iQwb?%3qvWSLyz1D0oXcMKjRu{XYAm>W4bF4{O-Tsxy|3(6K$UxkA-w%=vZ zBJ(rT`Qf-c>wl{y8Uf8({=-ULyCbGwrF@U#UEcODE;nm|X{ukRx6&Ls81uxv4^1Z> z=WpVn;NoIXj)CRpVl%K)T7Dmz>Jlw7ImHjmIkKFydD1_-t45j}zk}S&ZHXK{eaK~5 z*Z0tXbz5Hw>};_o?F2V!Hbb(a*O?;-4aE(A8PFH~bZ>-y;vL4`s;-o1L|Vb4_z zxAd6edHqXe)1m8YSvx}4(yo}Za-dtgDp){qJXSinGGK1)&YzG!TOG4FW_bDS&}1{E zd&<Cu5$R&x7@AjkEJLgkwwZRMCRrF*s05_F$gR2cq^vC!=6Sg? zvbooQJesnUiM}m=3e%-nkHB?k=)Uh9?ZRGZei+oEgkVZ+Rvx?no)mud?Vr(Yk@ zz2)Vv#cw|AM;0&()5J8N91+|pf$h7J6b>m}J#8Pqz53tZuAR`kW28`fA;Fv$+2puSx@(*5 z-Otm#im+$lu50cF<}jbe(twq)h{S}o{87Ca=MS07Y&ILd$3W6%BWOXTQQ1ZyQg|Hn z$1BPnkOt8gEO7m5e_5%72z*7M#*&vM@8<0N{FE)FMpJ25ZgC{lRPD8BUf6Y9_rbTz zk6)89kw*4oDQ@f`djI<6r-OmfMSYHXF?#2lU9_9@F1-T`=WM-Bg52|%P#HfnrON=fy@?t5i}W{5N@M`2}g zNEFO?*1HQ8jl}A;&LC;oiMDZLQ+xIC)IQ)oLV@UIdP3Qt@1*@FC?85Fld|d>7)`_M z(UrbCI(z4D_}Aw_!UrOrI0P{yb<|C?qXuuUQ36GQE~V)ImzrS9TU=r{u`NRZ9!pzG zafExrRj8OddT>;84v$rG#*bZDHGTP0Xn7DV1bKaI9FGf@o%_Gp^Qk%6z>r$M{!>a#HOloE~vdMPmWOvz3 zf%|kI_xc%cpf(e+T}l2iDqY-Aw`Y~A_nW`owr&3#zTnVsm#P(? zTxC~U@{&>q8TYTPuHSO?hQp*6wNSO)7D2)#G5eR;2J9Ru#4q`-fu`Qbs9npVDIHF9O4;tbi31Kgd{BMxP?T=q&)91pscT25mvqxrQ zmkY^_K)ZyKJ9~}m(4M?5za%7@7$paq)lruhTrp&nzd_y|^igbH?wcFyug%nfz}EwE z`?mY`;6@g22NiuE&ZsrVPqf-^7(1yDyTKng*XRk29YkLb+`1peiaJ^9V=Y)62hoRr zlM6|=3;*(kLpOy`fQTj4m9)(I@Hq9o<<(Tsgnhho5N*wDlTALM7+Y9K$t&i78G{!x zQHo2!tZ|XcVSN+Y4|#)A7ut0*BF5k`a7NSZ(&_82V@{V(Q$;&tm1%Y?Lj&>1KdPrv zfy*l6x!H1>^Ib{U*a8gJ1-y{N$@*ht-Xo{qNiht&p(qw6tEydvWbA8R63i4I9{SlS z)IVd|A25$*eNFndI>$YIETsD57P=(a<@h^4E%P-IR(YBT>gsS=0jv+uNl|`w>hQe}I$&MmOVlTd6=*FnBFje}Fm;l?+ zYaxqE?KbUSuJgmLr9;k3DxB+%G>`N>%qdSCIBq7U1?H}pu2_ZgLr&zj8cz+))FT?R z`e=os#5k^Pr)n@gq|_NIy)EN4DN2@vR& z_Tb@7X8TCwr4Y+@39XRvG3+CgwbB*qXevGzqWk1g2t(q+N+uz#+}v@2x8DW&6pY@5K4@|62Un}}EY-~|Y@U}|YmSh( z2eU~I05^T9$RKK>--4@jN`|V8N5%K_eHuyBHIbDSrEaPywpM^CzOaUIvGi9oqGnLy^POR

  • }FTv!27OD+{U?52)n89&VV1u9u`@!A|0G_>MY%mgU zDQ0w&Bi!s-t_1E;TsOzR+O}c*zy!FowJsBHMOptn63#_$y=cBh2( zwuFcd!Y~Z@Px-HC3FKm8mnUE}co`623@DXwAcyZv;3gsw zV=yj!sF=Z<;Ai2gKx>3}zPmX!hxADea6^~@FfYIsDxXs)*bN=t+0FCFi@0&ZPhyEo zGwg~HmwXnyL<#+N)>7U&I7UDTCzEmLF0V2#nVOi4RnK)CEByNqqanoj76wDi#Q;F> z6(pgo55=`|UOFqA@lFst}97}k|*XF4S)VkwOr z++m{)XY_3_PTdCl_tUq5ey1^xNjQ;#9`wQo?_dx$j!tU4~Bo@sv{@na6+o5oX|HiZ*u$w;L1`QevnfxoSZn%2BQXRlW0e~ zCSnO|BxYHLAzwm!lEEA@EgVLDAC9sazSlb^lA|q#TCELwf7%KH3(TMmd(XzZ+JqMa zF-vNBKnlgf`h&CAKET^J1>&UGFXZ-6g(YZ-HMk9dgfl;}4Y>ZNv>|>WiA^3JgH8oUr}=I)M|!8mS*)F+9(M z`kHCPHBq7#%t@vHD*y>+ zu8$LnDjh6oIR9twj9S}5a1XB49lm=qqpy| zx6w~Gom}HUf-MO$mR7%51RQaQ=>E3uB+EspTh=#z=dwRHwf)Wt5Mn^NV%t3n3xZgj zW83RJ3ko2i4cCcnK%%llH=z3F#L))akMh7CX(EI;$}cZ3ugaJa^ic5Aa_Ln8EnXW> zcOI{b4#Uljqw4YUtqiv01*tB}s0(ZHtyW)j0K3LgwF#X*>slLCFr-c9a3Wh;4yxnfO2=9R|8I@GQqYQ6)VWS`d zwOBb81tf!p#exDvNQ3@^Ht2FXEvF+9h3EuM4jy+Zl;gPmd*NyK3fRsgCrjQwUo{DyI!czQcY6K`IwZ2*&lg zxc4l*jGbr{oi{qR(8FLM&HVhH=l`BY(j;!VxEeK`OF2S#)^3T>JdL75?KMeoz1@L^ zogX1IlmxwEAIcM&J4BKDjD@wjmLsw;afD;ZSuc%jC4`#5Jc0ke+sfJ>2v7MLg`DRJJ@@2$9t}Pk?ze z8?e%iY6vv}69Y2Cp)-cV6*uS&`WdE{m3OJGh4FNXlF)Rnl4PS7h3jU0Rt16mC&DSO zGKz4p3xSN=Gz=|AJPjvvaof$>Sa!O%Dnd;#9h^&HcLsf1io`Qrhb}~fle0#)6HdWU zREO={i%Q;v$pgv(MXAG%d_o*YI}?80@Ify_s4j|K2{csVBYp8$=d!Bj3R$?gBb;=s zDj?K^^)c>3VpzB(Y}HynOt&mCFpta^q+U2BO+|Tg8C@Ho98wD#ut!Ch?o4>M;X|+S zl3-~44MJ0qT5k}=?gT1svO>8}!^tc;vK+TvOuPyRHG!F3*uxm!mtugiE#;qCJY9Ws z55R=Wb47^;CI3`2wpU#7W-pR@h{Lv0)_C|Cft4o2n?AIO0R5GOGEtC~_hEMel{s5@ zatc6WXvx!mSD={?S_Oofz+g|>%d;V`3{$zLjd_G}5B`w1vE=bSjW!iaL)Z0Yb8oMy zgS7`y6w4N&hJ8vA_L}7gXbQp_U>NPwU3@TfG9U~pCeQ%d0!&T;>=q5PLv1{P=D;|= zJ)tHr%ofW?J3*HsqLAa%#KFoY{0TIgwAUq%deeg^9K!k*XNSy$} zqI?uzC(wUR1OOlbY@Vp2AY-^r$D-3RqhT}Xi#Hv&ORIg~o=_8*X`#841$ysz&}sHA z&d!hbb20;Wb#43*wIF0#pd7xz3pJ6-@;;f|k|2r*iIR{M5;zh_)IJhWkq7`w3Bi3( z%7@^u0kr=^`a1K%}eZF);WO~`G>I+wnG*8lU&_k)X$k-rYt z!X#8y>pMRQf-Oa%AhLoT1c5&zK@<^^WJA@YDFFDz1lG?8;DS#+NEg5fU_)wT1WoM& zwn`EtEXf5K#eEW7y&6T3q&{qY4U}8JmQnn)RvRka&~>gKUk1Ma*OznOAN#7zU@U)m zVjpip&QSbGLQ@zrDwV-KoHSyEC|OEatC|R;$qhmfs0r`a1XMK=s8$mK2$&h8)o7+5 zP!z#vL{Z58(g)z*yh6b8Km_uE2tFcI-vb)gjgkYWTAs^|A1CmV1g;{q{x<@zj-c-k z23qg@?EGT%<(JEmKc>u3eV}Q*cmfbl*T1>HlEqrq+O$-zZe~|AxcCee&k$nNBo=Er zVMtq2xdzQn;#UX(62{{!wZ0KyJO)(;m>Fvy8fwA{2{N^06y(GGO`#89H!B|io0B<7 zSgmfLg^Iwmp2kZls-ZPl?t#xIpUV;UKJO_ApGp!M`wAbd->i}ZtD8&UWeME0Oa_<@K0&aEnJ zo2mlsZQ({$*I&-PoZmg?+-te)&Lf}jG|eN2@;#fM5r~Y6Y|2(aMdPji#4&hP8us#~ zl=Yx3<&^wkrB5=y4(AKGCEU-+c&dQ$sq_D^wfaPo^Z9%j3QR&@?+>KBEK4UR{0Yb~ zR=CO(PO#jE^Lx2mZZBVwpbM~!LI$5Xfei*H-xviHa2pDk0b1`%CTODws6hu&M^~_( zhte?4%)?6q1+=;m;jRHN1|7%6aU+2*?u^AEy%*xb^~PnWP&c&p)x~TW`gzz;;ih~2 z-OURKpyO}uD~31v7oXp|$SAJ#KOZz!=nRFd6-pf+8Y$SC=6nIZW`?6k;rntvt&!1T z$3B$}_iO8GOTDoH*4hOysy{p@2QwcEo=_+n^%U}YYK=zz@Q=g&9BzdCow-Dr<$ZhSG-hf=z>EnfFqr`YLmPn3LHgsMFGrF0G4Hzl(EKkl3L*ZN-hLH zV=8~S)~ab_TPNrt0l2UyQOL+-viEI&B+D%ky`6~3RzTB!#E%0x@{;9D-`b3+D5$z?^tc`fK@hRzth`m zcX>fjwL)Wkt!;QVGCNd@e9F>>-a7jbI`-HasuZp?+8iqjEAGbj_FGm8$bsx`badDn z8>bM2z3RD3m=N_ zK$!co=1Ac28!wK`%#AdBF(Ptex2;U;TO5E?$5c7PobuoxuXsG6=)Ud`EQ83!{r;RH zq3q-{Tt@0PjLI^f%8}pXas@?E_Hz55bcs)STth<+0%AN_Qw5lC5)AKkU4M%&*~iyv zPUH?r;4nAw`z!V9mb>->upwimz{^YVmX=%|TT*)1D{X8kms+CH!U+cn3meMkLC4}# z`8*igVE^XsNL@F_b0f{7Z}+lA26I;sFOQ>RcYXJGIYIWGi0jU%*Xw;Uu(kQ7*Fqr@ zd(-Pe$AS7$SEa&NLv=j_M#tK$RX$bs)$-5142=5W;R=PeckY{xBEV>WU3_=TB7=Fi z{@X1AqrKkYzEz>n-+$9FJw4rj`}y>9D+Q!mw+7MCam6usyFwwihcD=8DDjX-2_FQg^re0-1B7h@8NLwr6cn6#AL>~%ie13Bi?=EP6C2QaNkG07Z@Hvk7%-#U2I3-r zkYB{34GJVNY%^Aoa21W=zUcB z)7YD~yh+#SCcStQv0-zC;aI{u>PmW(1L*yxT;b=)>~PQQ?Cj9+?Bue!f}N#XL+IGi zvs^*Yt=9`hhoiVsbUPNdj~(U#!?C`-;&7v5yW@D}-Mun}=hM@J3=D*g#X<8?3{tw) zkB)7Q#p$Ioh1*eNQGLk0JNrEN&0L``gxj6S(%aCxilF-D?#uVng7EakGx0kXGko(k zM?RGdK^SQU7y)ji)?6JLTEL*1HNO-MdE&X#&76PaqcGD`2tzPzQ?;|kKv3s27g>NeSJ@I68Gr0*cyqhj_1=nW6>vAQNn*&c0iC9nR zM$d9&a%gy&fe~4@Kx=3@5+N{_dt8%|)iHT3-TFPo6 zwEBKW!Dgw%oHFIIomG%i87`t6zC_y>&lmWL`?!=q2Et8Z}Tjod+oB^S}h4 zP&N;k2vxxV48iyPxRc|)HwVM^_jrZFjiJ9z_7cIS5_PZhU39P1sH=m z82ywcJv1LhKY`H?FdS|o=qwl-9p*NG2{SNgODZt;3>fg~`DYp#-+>X0458+k$l>OZ z#lc3yNJ=D!kl@tWosH|O8~Hsr(x*e_Py33p(>1XZggV7?!CdCqpP_v^N-5DwS=iYKt?p#Wm-P0}OFQ)B z^*ka5t(53IdPYG$RX~$)l5tpu1~`%OGHybFmq=l^TESkYDuiL_FwQHWnMQn1%wXdYy36x9m0Zv^ho03*oqDQhr% z0E5TA?p=-(%fRT_N_w|kUgT330waM!$k zN!{p(V1a$z*DJ*`Fzf`zBFYPuj`P7lp>YNb@BlE*ix`b67#^ai8VuXxv=B(oi~K1W zJY_VZP6jW|&m9Ty2Em++fnDYhK?y7668`vV7NYxf_#jG8Ti;OvQt(7|>uiIOf&_&? zI9phXZ*0VKN|@fQDk!<=>T1j13glB6rZ7@nJohjKM2u@17#}G-FuwA75c$Z!P~qGi zvKiRG72+Srt*u8P{Vkpq3=}%_QH0GEHdF3kv{)-k~cr+B7h0>}ai^b8(Qg7T#g0x6h`qFjOAd{*H^s6y4?uZos3aQtMQFH);yEZvu>|MZLyY?6;ePF+Dw{ z))4qiU~m9~6I3vq;{8Va>$9=39tH-&#*_2F06c1Wu|>O5t}RzB z6tqLSP&_9IxGtQ0QOm zr-*SuFtp-(kbyDy{2?j)d#FZ%8*Cwrf-ZJD9ExbWy$$B z;?XFUTjfv_I4Iyz{J21|WL5r27HF-lQfSs}2z+M87(Y;OxTYLvRw!Rn82JI$^j#@* zcUC=xirJvzO`|}=D702N3Wm4IC^B-ng84jPgS&hbh!*7L>I;GKofR10a|8xaM7vS~ zFSg?tXDbmSCNwaT-k22_F>kU226lP3I-sxy567<58crr6)?grFESG_?hL<%!{_Q%L zSYKFSVEkqcMgzboYG5p|x4pjoh3)ntJX`}~>Rd1uPr*=Mp5wD2fWl8de!a%9ju?JV z85ki?2nuSm)i>2&zTpeby}-6CBLh6J94avLVurw=`eG)1gk4=I7*lGE@toc|s21LB+O8CP0T>slF$fHQSpnWOB91gS-w?(57iq4X477Bb z3#er9Vmb{n#F;vS62qBJr{GfhQu&v^yw8SNi)aoJ$i06b&8kZ+z@X*2zDfaL?2?51 zK_-zijp~!2l>KW~{zLwQT&hapKD;^wb@+7G#C7(;sLv%Cka6u7T)aNfwU4!0wc&BC z!6-6kM=0)U#10tz}>6$;@>1%r98{hQ!ZBZiZ}7{`&S6&PF)H3rJQQ!wzctD#tu zz(CkYCK8jh<1}VB2LpXv0K=<-fw$tw;(-cAL<0jmP5{Ha#+Zz#U@S*eFdlqi8(c54 z_5YZ_c#V_q6}P#9du4lpz*y0euOfl*Pz7U32V-j53Jl!V!Jvr2_I5iN7@DtBjo~?` z#;63Nv*b}cC*Hpy2uJhtjEo@2sG;ft4X;|`eWEC!%IG#a#eiFv90FTN%pdamduZGF zFgaQwmkp@yAg7o^R2)3llESY1clnS1`bkr%QlKVNNRiQvGO3x}rV53}0E28GGWPI* z`-#u{q@a+(aUR~i{}~s%_VNLZ3)oQi{~HAxhBgWV1udtPEayS0o`*kSa+?vdeNG&6 z-W}%wMuPDP|6#eet9iNK z=bSS$Nn^x5qj8e+%r|o;&nM6MF-IJ#fe}Lzpp3D5-+K`lHjkHs5yuobwZPU5Fc9ls z3C7Hf0HcM#aIGN;Ffb-B1j8!8fb&^8T@MDu`d5Jg=X1e$dYR7m(?&30o%_D$zGo{K zeOh_;EKifq!MXXLUl19Zz2r$_E)0718{ecaFK2SOoC+&^6hVy`zzT@>@A1Im8Z&c< zS+s&w6|R|#JXqgzmgTZ$e-^P>uK@c;q3}j?lI47DcgMo|-WnM%PtqqRbQ;^oLZR>y z9paPK$_e2G<3VY^pceo6XOmh$K&yo;4>l^O&8|bixDMwi+{2t*N0^d;FBl9@1%elY zfw_+UK+yLHqlMu=(4+@};a%6k*rK6WPjdwi4e4&d8DOw+EP!DdLF;HRp~bp~Mx~l7 zOi-~WI>XWn^-7jUTC8YFRRM;G^^w(db+V~~G+6~VDcnyr$-!6^V9fRa4F3QSsjcX5$k}0no>;_tV2|+gV9?HM(a;2f#6kIr9@=x<72_z{?Auwtd=%m zwBQi_}07EKktL&hL50^xwT*1Y>+GqrZKn&4w;v)k=v=G>N_3$TwS z(2u|UwHX6ocyYfJnb#ZT3Vm3b(Z>|9lvOB1Y z6tD;bJG9phFlNZj13Ek$3=7K`De!>N0FExKLZ4l7#~Z5ImC!73c!wu+mp z(kWM!GKNKffjFPV1A!6Z3Qj}8?ZggD3V|FlqGPr;V<5s2=hMPoF$Jv0?r}T6Pj|V-2T> zNW_CeQAt)TPD)lop`%#b5k_EKS9w!^uSS7!u~XLFibq{FU|3wqY!d3Ag6OLtDA_rD zdP)jUg#yk2*x>rR^(Poi|JlIyfVf98?I>uUxT_R)b{#`e8s{2S`Y&RC$@(e@a z{%&mRFm6XJ@IsZVRnsU0dUeFB~a=!QJqa8mQ_`sR1;Rgb^4_VIbu9hek=^ z2keb91t)=_xz2_L>cJ2OKG^N#5=N?)mWH4}OJ0}maD^qqu>p)0Q|JC%_?b?|3MYfU zl;~s9El6NAj!QY516coDItm>fi7!h;HH(2OzeKPiLEXl45tJxCf|YQ}nswRrd2>HmIvhk9JP7Nn5m3jUhw@bR(=Xi5bh^#|!PQ+Ezc zsc?tY(uU~`YQT1yZQuPK_JJ0VVQCGcJV3tmvGo5*Z%TRZZ|PXTVq;Jk!^`Wj-S#%y z#BOXIv-ISit-} zq=1(}#x;ioE)XOkrhq-{3mYBR!Jz)MZnSO{3T$d)>D7=!x`Rccc(Gf;tO1jWYNgfc~@I8s3 zn3N=k!@?9KTL%=7Gs^$QMkW*rLc!nyJ}>AI3Xw^vjTFcvM{hBk%$A6Y64HiJa}JS6 z%{kE9BPz)&nJtbZp`KTZLgmTl)6>sSDwnNAqr&FbUWa=Kb{`)U1QcYxDZ2>+xV|t( z%CDO2Kkcuqz-OhyY?|^h2e3i@K4PbfgAtEwSj4^H;qh=EhGXNgt=(w5${uRro;j`4^aMCn} z?n_58Fbp&O_&ePz2r`2B`weAkvgg_c3yPHS#el8VD!F@$N%VYS00SXW(CuG}QV`EK z`9=oEyqq0(yU_*W3ig3w@~`=F`3<;ugRQ)IjzYPx2@e#r2PjN-JE6c+j-xwSJc?lb zYq3~@eNt3i0r5!^?A=vGd{-YwB1grnO9C0^)#Ah3Q`p;gn-|w2BWls8U|a@Wp>Xka z=%ReUx)x`-ww z?%K>F?aNV+0bY2X&COSMGkiab}KoWfn zigcbWU{$g;bRodS!QN=E*3}vfTcyWJlv{nbktS}71@^lfoa^;Uu zxDr9rf_MQJnsJVFFtm;XZR`gxaW00SaAyd2RuDbpi9ZG!4PbzbeS-|j83BQYpn|q@ z!LT^oPIG=flgTmL6sEEdp8^3py5$fIETA%Se$eW6J1ktmWY5pb<#}L%u*WZED#|#J zesl#)U*u6LlFB@`4x5uJAg~-gM@5BZD{|;+&{?Q8Z>pP`gJqPgLX#b8@u=4+Ns_gp z7WvAP?+J|WpHwz4Ukg%@_3J?I%8#PK>7Cc7X~kPUXS_=3U=<$ibMY zO&I(sxcK&#PyiYm%k-+wh3JCwKE`+o!%SMjfQhgN7r?>^1*v=d<{ro(m#T1p3q#{9 zMPP)q3{W5S#03=4I&cFGkkQ~mPeUSO2&;{IZ~-j10-?dYcqumR00Ru8pAp#C$#@aw zV6f(tkvdo>qaF+iAFB0{EN5UjZku^k#3LTWV@?l-TqXxsSvDb{9gYYG+#v2`z5pnEU2H?yUr5uHkr7H}7HdN3+zaDfZBZYw`J zoIMV!UW@+|c0E6B98nm%DGo_#VxmToye^3ZYN8k=X&g&Lk%+{Bo+4FTa%&C=K}M~r z1WF1BBim(#LI$O>6i`=@VJ$32*z|zb2OrZ*#eqvtk@8OjlyL0(G2`*>Y}L2MUbEkR z?5y7B_hZLPdla>|tq&-Sqt@G+8U-@YLSvvo=uw282im1lZZ5t|rC|D3%3fTklR9WC zGq{?ekG=?_lmSHs71y8(>jD*Z=v2|KCkuE37nTOXcoz^x9|@zg@>bDcd2@9PgvE2h zqoetaW&S-Qlrm5lu{0Fas_rIj$TX?+beI`pv7YEKDFaOFf|XGsVH~S^8vMN-4L)se zjU<)F^xxT%@?l*-gyCIC7@1#n;qB8!cgjyL|8!U{gzLpd|-;@qPF2U~49<&Z?u!?J*#~vje zV!Veuni*oTn-+zPKb0kmo(zt{eSg38k*sz9J&j}?M}p5hH1cY56pEpO3z=xX ztokgq&|r$1q|girsO;usivy*B%_;PFD**^)-F+_TXO7!e?R0nUmq&#J%+%U^u2cbw z_W0E_)TwQTu{`RBrGZFk&o|S+P|B({6G($(vGL$Re)Va(^B9KDtiq-Zlm_Ytuw>a1 zFbr-Vw;NKJ9q~Feqy{?}&W>!ok}%A>a3MS19t4KAFdpK9Z+5Wdlp8$N!H~&KOBl&Q zcczd*3&ZE}wx0o%p-~!E%yb#bpvmVG*fCUb+HV{&4!<=1@#8IUYlp4oNZ+aPi(0Ft z;!+l9mUY|D5Vb68Y9Aip^P~&qf(Olb%3ko8riP&cAs8@j>;K?PhwtsZmdfxNf~C<| ztFDn%ZHK+NEOmjQW$y}qtHl__jTUB7N03XkZm<(8wd-KPqmaSVU;qs4)l5}QTPy=j z2t(Ax``uB%zz2Pi5fUjk5%b+^_JTVPI8p{J5HB#WxGF$(B?OgUToEq7A z@!KE0qzuxARLRZ&Fyz3?cUTwN;iq$heulfGj2+&JFnTkMvug)H7^ck@Gkyk&8OpRq ziUa07Q=b$lW?+1tA=BF66{-shQ@6VV_X6e|LR$s(feLZ(QNj21YNY09f7t&#cy|r( zDKdOT3SKa9cyT+`tZ@QXv-SyOGIV{19uEtIf<~h(P^9s-wl(Rmi*nst2N9)39j?gz-*0Jgq~YHpoz-TI8LIER1}$kQrpi43yJrRrfKPsmzA=oAS z3Q^8vR~M8pg!xemA6Aw&M;9qztjLwjymUE_Kn+ z^6@ZMn4@qGKp3bD62^g8tb*AM$1og)$>0c5-IZzn&~Xo-)y@0&LhLqJmyGX?SKItsWVp$ z227?j5Rm{p0}N-kpn4!RP{2@$l<_G%xb@-~aR}5k#@1P2h^SDY-5nDtg8@Uvj#dyy zj2tp(VRR-^21CXMWtb5I7{ZkCXz~j<^IY1Q(m=sL6Y+2|`0eksWeF#s3|Ie%c(vMO zRgf->n-NofZV6bdAcI&;+3~V+C8Z6MA?cCNgT2|S*ULgU-pb0ZQpPOlqERoeEAG;85O549!WaY?LQ<%KCbS~tsGV93f*(>fi6Fqx19$#F zho@+b2@+nQaLs%4o;Y6sASGRd?eDw;84b_j5W#S+%x1Sq2b%9z2&jC>*EZV4EEE#v#Zsk&`V z2{y+tQAa27U`6`FIL);-87wB~q!3Npj(8pK5o2LXDrhGU#JZd(Sn()ic)PpyZgH3F zG5+aBy$<4$!tkzy9)qx;#Q4Cv_|R(oQ>8M6+?kC>;r#a~93BMhv*@^L7ao;c!BepS z2q(x8>qCdf>KjkF?9@InhZ&1bAyDHWvOFu0$j3I@v!vwf@@C0o=(@VP5d{9eIfh$? z(c#fLI#TCC7@|)la0zj=l82@g*vPi**HTA{JGB@4O@;yLOra5uTUR4EzKnAC&W_Zz z5Qc~bN`*{gx0c#c?HN!?7eiqTHeBcP;nZae(-Oj^+vUtpP}F$THl+*}$4~QaV8?Dq zuZ1BE%3inzjXQFqu*Qw(ZZNbtsJ>t(WtJ7rFjB7YvSG3-+{OD#XG#>oll1_#Ky7;2n%1u$X+Fe zGpjgZR$j$`7r25E#&B|&fJ+QSedJ}v)sGI3z1m|i5C>kt7z|?=0pKyTY7s{}sEn&$ zI{ZUvsEfg_n8}dI5s*P7py}Lzba?Xg$7rkzI}^AZ88JB6%^KRkEXOo9g8rs@n zgA0vs{$=faTiVE?FwQhtliH4>4J(DFHiDLlw#cq2>(Z(qtU@JF`fBMy0g47g09`?f z)f5X2vN5u2z!iiY6Jb%CfkIHBAE1;7{VJse`gWgl?wvojxmUNlXFAidd2)JZJij^T z&YURSSPxhf5s@iMtHSVj`RNkET24CGC>nGT<$Lhy!16SoU$U_yzSerUaZq!?*s30) zm~!UlU%87x2_t)G|0yLq#cH!+3y&_?`o zV-MkWz8+0dA&U(fq$(Zf8-;a~6hcRvNeFq09u1G;!S)|)c;=0#-kXZgQ#4r+vW(W> z01#TK$aT2WEEK4_gH{;07;Nl82qA-z)`HpDBx@Jx{fSl>xM=)&idGh~4l6br za*E#ECVJ+0#THNYMjCmDw6c(Ok7!M zN1psiVSd_>y@X$WzkYPD_zuAkw6(SQnm(d@57ImqYy*$R9Py>z!!@VIVZR43oJFJz zXX@1>EVO-IOAPH7H_yq0o`?Wun`yk*FI=8ahUEZ7L7G z5C);)dZ3mMGKBg(H-e}<+=Ni-SgA}H-01wElAf7K%kR=87T${D%Dp%BB^Z(O19ce@ z2Xi@tEQhWZZrH1N>7st$yFsb*;M*2zlD@t}+SPlAT&*JPMaI~17LhXSN8kd6&D1ew z-q}T8v1N~|#_*nqkX(HC&L4=4L44g&_@?m?iC&qlROqa)BieT>>2~Gs0e}!X5F`M~ zT$WdLessOPO=wWx;IgIkFknKsDXBm!)tK}U9f(;bLY}fk!2}m750M^jn_^+9WSX%- z*F!hDp%C&2ctm@-e5Xq_1_)gpuqY>nJr5i>Puys4Q+qI2Cxtn~%PhC^Km$|jdC7&^ z0|_BwA(Z{_ptf&X9>hbTOa(s}1h(MWqz}fz{YGz0j#5b2cJbuRTBgFr60aW(ggv#^ zL(qQjTU%lmST!D6tM-n}7(4djBIe)dYWCO(Wtt4OB8Aqyd#(3S~&Q4qYXk=?HrsM)B+o0Z;M%tbmKS(#EX9 zGYJqT*rQ>8_7JlylLDTyz%8|h$YAHMAcFz2tXQW%hC7LJ8D$a-S-`lV9>Z`BWN^B8 zSuQ91iYwZ0aHAlMxX@h0Z?_q)E(fLW;U*p(QNW9a+S?irE8I{>!hD`8F1>|YzVEo$ z9#2;Y4i68?8FKc$kZfE=OjvG6U<~AzBY$k=siT58H_y_ zjI84v91|JGwA#*RU^wdUSQBRpP8$dIiHKH=L3bV;p9$=1&qL&LXg0q4oD#uqrFc;T zMvF7+0+gN&1@1eKS|xPQig+(+z=-t5N|GSlPqM}W)9Ox61w6k{g8}Qg6|*?CluU3j z=)W+MOAr{GFtlL&WKcihCk7*t8}OEiq8^9vp zw{(cFPWRC4XAG1**{b8%&auE^&URqcY<0_>h139s(pn#)k^&ZQ-`Ow$sY65h*GC}_ zqbR^W?In8`pTrL?X#7D|MIU~q*r zHN|ACbZb1UFhESknZV$iP8}g91k0o=42DDlwxBMt!$T>njt~f#42Oy9@EJ6{2a$Df zcgvyu(>+8`N+Im`BpCGL5**upH+OtIM|-fps@39-_|PoC7}ks-`t!pNAKtttwqp4~m&XDX zl1Ky7(-iSB9T+iGT&~a>3|#M#1`zJJ*@R*$p#vi!0AgV|2!==lkC_ZZ4Myae;R)w* zxgZ##kP>99=+IgT2=hJ|diw^YRD3p@Md=$rgMMF$?p@c1Ql^|K*z!_ew^9>HMLcOe zFjV&0JX{4BoDTMOa93(DRi{=-qQ6Z$KDiU$H? zeSZ=ec^~cOIxyn6XSmLvW!gUp#x#dJe?)1spvf4?0)(uCa5|VVtP*oEjja}pWK0N` zVLliz0)y|sQZCSeaV@dILXgo24DlHyfT8hV2qEW;&%tnS*3Rd39(>`M!GN_?kRdAB z>sS)~w)&x0`p zHu~adUxrMSfnXS*1qw*%6a;npG-m&Y!TzS5b939=nsAcBDmiL>`Ep3;`Sg2F@5!Yz zpkwguqgtzW<_!kuYDmVB0}OnU?*zfn2**G$Q1=K7MS#J{FbObJ?YSv*?qI;?o*yu{ z4uq~?pk<8AdpO1iA#^wf4Tin@ZOK6B9}Kp23GdY2e)ZYjC(AT|jiaS7qeH<@ORNcq z&UB-^?JS2OWLV%}@ZS6T{lg3kCw0t#37{e~VN|rw#cB(lAd33GhR&ZSxeIG41?NTi z0;5*vgKJHvW8j%mrz99mYrqzt0ON<7W8h}CmtzQ>I~Xut>jw;&I!7?B2rx*;5IT3q zc*i&Gyc|R525}4)uE0BRG=XGbr@>=s+`A&MB=mB*+$cjyE;n_1SH$UT^Jwxu(ImMlf16-hR6|#(SuDGf6oH9vN~B zI(Nr7;9z_nr5vMSf{r_j31G;>9$heSPKpBKN`TSt7)l=)bdTWxit zaGo*<9&uUSpFlGBm$#*m->O)Ao5^If2$qKR=Mn!_9{`M|C8{i|LAwhjF2Ja_&S)@JuuDgPu*YzMaU#H= zGIYT>?FU2UV0;`54AYdrV0;J)3!a0q;0?w%1mmX-hKgWV1&?1gQ5n9vJBEs2*p9K_ z0}K=n1O^L_MHmb1SCNcYmGuY*{}zJSfTS*swg)NMs$6D$iduRWW*w)2yYfhdQr_w9J z10c>oHi|Gak;Y@C28jhp5fA=$q078DQ9LkXHev#ar;@0+AVCChxfKK#{O;f}e60ShqvJLD1Wx!jS>H5;n0~+fG;cO!J<<>Y?Gq$&(-pT{QJzE86=j@_ z9{w7@{$7GhH{5Q+cn*P73Vs%W_Y2W=g__$l7#kUh4Gt;#J+Btb2C~-7axQ3SGH##n zBvaj!tI&UN(xamho+a`S=i?;EgO^eq4+MpFs%Et*y<4 zX%32pD9TVGHZn;KdgrpEd$m<(y)`2@F)6C&*1*<;4d-Pb2TC)Om{)dT!-$1Z{y=@7%~E->;KU zV~yDUZ5&6?GS#wG6(nNd2vc^woT{$8%RR?nh1mW3>*O# zEqKMw2#R3Xg`}Y8(jy4E8&U^Fx6?(<9fMUS-bU#&J#AUs=1rA~=4v+}m?bd;t)~w+ z!~=sJ4Cb;t01srn{JQ!CndyIkFs#~x#X+1f>RcGDg9M7OHQM-vmtadgM;LV7&w~@j zE*Hk9GAc~f_C#6R$~*ZBCYDTdX)@+|ryd{1SuWBKn*x~0nTOWS;8x+8DY<_{{?jK&Z1tu{g|P!JdkZ zahGwPKoR`5Fg8w6gjgFIDN%zOQXUK;x?2?;VlXa49owsjYPJ%Wp{7}kMAZTEFqc@K zP5v?Wy~6hFbXaVVQaX~lZ?i^ia_X{!bqYBR2ZL_FlJR`_AO$m-lJ655jp^U zFj-KS!E+3=1RHBfV?zgTNq=GaT!zy31*yK#<-za6`ZX@n25RpG(k; z=MxM$L2gUtHXn@QAE>#`!bQs#Mjb_%x2L5x8lxye@>&Sv8b!!-c#K^XVXmX$eWm9c zSVD;4EBhq=(;saYZ|KpzqUaq{H2GmAI{N~a)x{01=#aML)9}R^M0j~90a3?aO^C%~ ziiRW@257>FMxq9q0Om5r!eerR+$Qa5DQIZrb|Ea^DU5Lx0ffP)rA9H=pvJFng)lG# zEz&6r6d^1;MrE(3uTF`miJOoGO)+Y$3<6~2+(>6QokwjUVmbb;o-Y*AN*)ST6w>$H z*W^dunIEDDwVRMmrP4|qHu^6okc4~T!)Hhd(M%>3rcD=o zKKA}pjXaGoHZ}DwObZnq{tBrc^BEF?To^l67uTC<7se7WB0Q2>z!6UCc8Zb2094P} z9bfrwM{or0F~DJDP=t3K!kFrrQg!7NJoV;NwV;6#tnZodQ4?lfm4>qZ%NN?z{PBWTSo9e zUU9eEX6Ne%2Ch%2GR_D=e-uG|H&Fig$v43C;A`%(o>x^+hG7tb;WcE0<`+;zlj#9m z23JN;g2c2XmSRBLVsjmJ>RvC{n+PwCQMtD^-{8W4-btvlJxQKoK&>1gAP}(a+!lrx zL(tya-6|{1o`m1NG80p^VxpE7x--qqmoHy1`}VEG?8Sfd`-O3O(4~y?gp$w0NQ|fI zDf@TS+)TiEL&Ua-F#J|?#J8_4Wi%2>dVvrYmSuz}6~-mi!`AKYE>p(cnMa97hRA_{ z>!gG*MugEEC|k<#ab*OJNCeg%yqVdIAt4Y={CZef^VF;q z<2yFRNZ6B7*c2mix*>#tI!5g|vo{eUQw$zS;ZqC|Ns%s;z3jV~geA)8n3!S-M$H8G z0Lmzpc!wq0#An*AcekD!24_9&zi4q~TriEC7aFGp-L-tty2z{I>A@UK{Qrn>`ysEO z$wimXm>>1e>#q6Z`f*x9xP<8G)xh;F^%O!GC&~6@QgcC|bsg_b@RI1s*Q|CcqdYq> zFsr#{tL17$>p`Gx-PYEckX%^GI0T=;)>)y*yykkp_hm2aAoMnE6&ib6p_GYAF|-s6 z2D5{UJcgix!?1;cN>a3B$5yEbijaZ9;5kMHMVJ$tYb85E{^acJU)or=J-!o-NwniM zJ0Kgntp?Pih-sl_bKO{5=mkrU2!~70uPxO!GSbbhrj;O&VT=jlNtf(>yuB`>ofCBh_gX|hzsE`eqLja0aW04t?ck!PiF#c z<}L6RjiTNOka5}VG^{sS18%I{UGkN0X6FJHR*#MM#$LfTmCv9v+cNZ07K$RKJ;K6D zuXWza&9{+^^WzqhK~D~Cw_E*W7KYev+Nq%yCc$OwSDLvH8P#efF_(oOzX3!f24>&;c{>zM8OAR4m(1N^7FO1iuiaLw+MI8*?4p&BWVBlDira$z z#>Nl}4_B7wUSjqw$N)wp8Q{H_YZW-#oE&0dVQ~)c^>y)`^Pm{PTR=Wtr1Pg>;r1H; zn{XKT=W%p^N_*LOv|u}I-XkF@fKdU2ZPu1t(!qFH%~ku8C6L}y9OQuE-lAffJmvbnFE)R zP(B0BBpJB`CV$lz@fILbDnGq|es>dj2$OL^)18oJ+<}XKV1^-Q2>+J7d*)3WTh$EV zJuGb7h6jw@dsvWx6qRc??rvdH1yVFacn=G5V=JvjdFUei`BjQs2gd@%BB|?ZdUh_h zF^~up?cTVa@jeH_hTpuS0S1>wLF+IcfDAmlgr}=FbghGb*$uWOlm)Ct<*BWw6(QMB zWSESMLf*nNJI+En1)2AGZyqqX>9c4G)Jl-|08i0w)#lq+$aSH78?9M<-zReDs%w#C z@XkgpcE>T4q(oaUnv9DJTATXft;xtf!$67)XAbaQ6n9c)M{+?8zRuQNEo9drkdiVi zd-d)XD3FpHm0Bxz{$DKPzE%ZB701}_q%510QZ8d*n1!9MK6!Et?lG8NDlkXxKS7zKjCQ`ZuU=#=lMTRAPhH+eQEIe`I z$Vfrv4PXq=Ke&nv^d3Y;t5jxM>$zgk?B! z79hVkcM~p9AbiFRoVV$WXi4b{2zIIk+7(M({L5laT$OBje? z7&M6t&PZLIQ80B&GP0{@kYEV$3i|1v$%(Agh&M-O3sXHM_7Jk25^V9$a08jqT$t|z zWH{S*vf%PSO1X?ydwmKmWNu?2ogprih>Ys;+~nkN3rg9AdRc%$Diaz{$igH}@%Swy zKYpbHUMLS4G%JWH#@N^qJ=PclDioYRMm{#>8>Dd{$;fLRqQD|D&}nofBX-{IUQro6 z=6#*IaZD3{c#qQefDDt!kc{X>9T_nVXFJ-$Y|kAGAasf$|ZPJ1%&FA$zWn@8J&p zWO8+Nb$WF*2|M+NS&&>Pmw}JG@4nqCz1bqYDNST=&jo>DJDR4w+A5V+(ZFhHgoPEs z#gAh-UfXtEcVm4D{ue8&_`eu#!OMkgephQy51E@=ANp3s@A>i792)~&B^#c zWB?&ZOWww7R}D|2&u1ZdV*>`qiVRkfa`r-GXweqZb3ON_o$Ixcf&n7~A;GxnhS5^% z!8IIu-pIy1hXmaMBZFn&cq%So29m&Q6(A$V!de|LXc8IaNHQ)s8O@iIqvI&ag_vIZ z3RpmeP?ZwDe*M?8@jGw<8K2qhbnv;9Y8Uv<_^r7hr>$%32>`epctFu`d^8tI1Hb|w zzehT!uPt=rqy2^2^UWT3jDnv~n?r6kH5tW)cwDRO`MvYF@f7aL`^1EK1SbR8Ah(V8 zJ{SWXQ9MPuKK%0Fw`4kaTY0VX!6-NlqrZZKW@~>2I^UV`(s&7=aEeftB{GUc1`uHtEit}knO#_tMpx_y2wGS@H{Qea zAj3dYo?=fIbDg^8z={}-9%*4}92R|Fefp?sx&3V9per``5C~QP zffI_M=uCLPR0?k5 zJaxthQ2GWRUEt#Bvf4}b_0x3PJLSBC;ZbR6X?(mCx-vkzg;GT<+$ zLI_e|$lI`amI8K9E-oxQc`^$(amL18h>J2RaJ9UsZvXi6CuR+#!|PKbgQM{klZ-Q> z0{h-7`GC&%fzM@>-ge$@ZCRa8p=iR$6eoi`#fPpbT=r$hFoBGYwG@$J?Ap6qtGZ75U~qt08o(Oap}ZTP_m?*q?1x4Gbfnqe+% z9Tp%04Bca4yCt--A?i`eX|y00q$lJHTz)VxT#tnp6`{@7RSAG>d_&ij$WWKnK5*5v zfCE&1`7*!-tpPgiAQ^B;T9`h7);8DC;ZGn#I1K~?T?TQ%??foF52#9c-&wD^@UDMu zHyYhSk#g)0S5{FMlgi!6?_C zuALwm^&lB#e|#GiOQm-{GJOTf{)H;mo}Gci5H5pQ;d{wa%0lA`4-hO#BY*{r<#Zb) zPK;a^V@X-C3@O_Ra$#zkW!Z2TfqXo#EUXWhpe%dd8b~I%)4-3Z7Lws31~WhPzgVWX zJ-k4&f1y?Y79i*{_G!E8tlHdNRtj-JA5%;LF4VYA`bY@U>M_`?C!NMu2?h!iJ|P+j zdFBPfxPnf17d>^Mz{t2{WZ*$uT*_KuqicjqYX$HVM$w@<6p>*HGJ-O3y|l1}%|5I` z!aWC1jbz-M!_jXN8A8VljX?|Oal;mJ;3q208vf#mjD3&K2>5JJtroVhhNDp5>y&MW z$WRi`2(1S#q&|9TA095mP$$H?loEo=An{D_Oo6e4NwxTG`~3wGV44jkS{Pa=T$HZz z;!B39e(8b>CF@wXQI=);xX=_BsT&aex`6`XLd8*drSG;#utwejuG>pV-%TmCNF98? zdgd8w6;8&UJobHFeAfGx4|7qj*Ljjr_H*I!;?raQ9^X3j8t}E#Hb*)`#;raVv0?&|l zY{zkI8v!ywxE{boL0HIapC88yTz0S5Cbifafv9}j>&bt^>%Fi%&Y_Y>R8iuY$0S&g zL_%74`EHoNTQ^Ub7#U@tg1A`As<8IA&!h+VdO-J&`h;lUL0}vZ7<82%n13Gt7)slA z)iCiEJ_F8J zkxFrKEXe3b>_U5qHK|-hl0mCL6)7(l_yeuOO4!2FCf1~=xlLrKic}OC!98S4eipod zkZU-_@f;MQ0itXKdP+yD(!vNXI+kX3QHaJ>0|i|T!&bk~r5GaAjSz~*8p^>891hF2 z9qqVKD9K^YFbz7q@Ef^?c5fa_ARurWpcbg@_IvY5X(2?zzWPcf!CZ}#!G%o?;6kp* z!{J;27|>{~Gcriz!GR0!iliQYehm8U*GG?%D>FofXMgwU!O=CpbuC=RgYRvf_B~?; zf~m{ACdlYAPtk>ok_f>DW_oYa;W8z-3)-e6qbZa_Gqr)m!6x5s$U-{1*~bPS)XcqP zxZpbk7F_fRbI~H0foAc z5r#}-V~4OBoDTc~iQ(AHGj)@eVPH_mr0c8$L3F?$)3h8--%=K0kWe90u~^9G;av`F zIN0dZ^?adNR5{yv5Q`t`8@2X&wOX$aB0Ai*>mn6U_fTbbK|@dqj9em7LlGWC1zb~E z-{J^|0bpD}agaoPKKR~jUaa}EzHz7xibta*9~>PL8J`3g*GIhZjiU8n6I2ua54%_9 zRRhRC1dt5oDX9M~sSrM+(TUn!Ini=VLy|#0gD42dWb30ZMbt_+A*(|&$Y&%t8NnQb zt_=o}b*YDte^;8443=G}cz0j<3|gM3%GMeLuiQh_rOznGeQwPL?(r2XbQt(?^!YPy zwqC<=09he8`lQ0^?J$2qF_V_h>l%eZmJM?7eVs2U3qvC*ikXUgdqsc)l!v1LP{6Nb zN?F+U5}~AWiT*sitLH&Irulh@f;K%CUI&s2?~jyA)N;8du#rm$C}ge|xgUSx zm5&VQa>vOu4Lu^3N>4wNW_L%Dksa#^NCpgr_{cEBPQyenv`7mNU%LYs3Sndl(z89cr4 z$5P}nRKYgvGwRUB7)eH``Mo3pr^w73z`$+BboV=diSXlTGJTsAqXA%;wq|uH`$lID z;y%1II>jJQZ9_Uy%#+Kp49dMl?omp6QVczuW(bGTZuc?C5Xm>L5FLYdQdm$hghURb z3Sdwa#miDu90675xP^zKz^DTl^*T?!;V6s07`B^odWJ_+Ae^JU1~A5E9zRN=ra{T% z)OghUdKbr~Y)mUS87h!c-&m5d6FKaZLNfLk8P+hL0boR0$Y3<(=6VA^8IfSP1V)&x z1d*YlDUkTM5|FTUATT0*h9cu+I2nF0N-WJ*G=#u7JD`s&@a6;$(>I8*#<_)|4g5lNxPXv(6L((tbfSzY%4;(kZ=rX%;L- zMnT7dpz2{TD&oN)r3#Me?CG40f)Vr=^fQH0aRXPg^ByvC^DX*7iUT8d#I`2M$W_?q zk>DZdF-G}}6H%*;&b|X+gsAv$b>};(Kpnuc@M$R~<}rTqu<*^$6oV>IwkgWBbQKTu z80HqYFd~w29Ic=`3=Grb!Yy0p|AtZ^>sGlpMN$L?%}U8>DZV0YmxrcFFBAbl7#P(= zO_Xb8(&sG{&JE*&gFz#N@Di8dz!g~-_70z(kz`<8do=b4Sstwvj@afo8BQbQF(eu0 zR-A_0YWfH zNCX`y`lyOmW_s+9kwIX5d3@_TK_D62XMiLb@KOgXL^pPK&O3Y{+oqg+DGUaq zLUD0}0JL08zERlWYq1U=6{{xrpwwQp6dAPykU?FHiWH?DvwTo$bdI6A7?KL=@sWji zWglZO#anq}sXIIz#OYw3(YOrjgCql8_wJi)bjGrNjAUpOMwuK6lg^aGpia}PQjCRV zNd{0MzW5yn`-pm-jIppN$cT`n1s7;@ZZgI~lgJSBgZyAG5)Wx%8W$``FvN{g6(Mpr zB}3o~tP9%)z*dJf`JM^1VxYj|ih*HinuTH=KDYof4SPpe80j&v!>y&w1z`r!kk-R`j#2DSJ|E;ad<`3(-2gC$z^v+x+T92IJj4IwyBERXE(mEQ>j zpj=x=ICuxVjz=9LsS!%@ZU%V_1;%KtJKZZQZ%_yu7Lh?~)U|NaR~#8SkpTqIp|}vB z&?KRb7GlU4^b>vb)Of&494J1WLjzMW+s4vJMgqtfiUv9FxNz!^X1&}*GC&*#MMv3N zP#57;dIuTcaIo**44Y!9Ykt4fFVN%@TPlzKOK_3?Cqm$tY9A389n;ZK8uqPiCP&)^ zE^g~F9KC=YK9X$m6(koK03*7?N2wi)rRMP+Jzw=T`8Jp3Xl*dVP{|#L`-U7>!Xxpn z&I|{GyNnAIHTk5V^F30(0T`5hQz&%@Z4((*2M3?ygpqB>dLGBtxr1a_reH$xAu|t< zVd<}ai6g@u^lN?E5OaesKN~8p?Qi@NM@Fr}_OV8?q2k)ai?~NhuK^hsNQM%TA>rT- zy!lkTDH#SF3MrOl^CaT{m;k}d=YxMgpofNjd7M%+B}4(|K_1divsg-Jqa2J6(yJw9 zAr=deNHP$KqE8#j0)i2i7#19`dTnhURTWbmaK4#Rs~4I~6J&ryl0iu1yn3k~l)D&< z#k>Ef?EGHawxT$0MvTacrqMv(LSx7>jBuBi7BbQ%5Fnl*wuxN_xcB06`^$` z|J+Zk(5V>%6f#(PFI8837bX2nsM%gisgw*i559vjAfVLYU>^OfpZKx{avsb@8yG;w z&U~?;wr>@jnT2FXn>hdQp^|MjZolEcFWS+x?aP{uu=Ak)+FS;2GOkqAw!s#TXh_|6%-5kWkkc}s^o<|n#j0} zdSq z2sjG9(SuVW1LL)~ak%yYqqSyXC@B2V>Zd0+n#gF(#P>G)@olRMzrq3dge`RI z2iSeTr&!>{hkkD@^-oIh*mVJDI2#U!25s*#=39u+04&EnPp{=@`EXh(NG891xB)&pQIW1Y>ElG0@dfJn=e|xkaqep)NxW( z4tQ!8Pmu;~@477P9s(JNhOp6`BQ3J+v@jwv*kxN2GRqUOI%>iMw_4Eu-|2wM^w1W# zibwoHM1M8FCf~IR6!iaR85mOn1DytfVIJe1S)la?C7l)(R~$Y9BPB2jL8wYk&4PqG zNZ4tCga06S@U^9PDuL8@AD9Jq4ybta@tT0)c?=7M9GQjlm;qD^80yW{W4!8pUEf7u ztpDu!z5MJ9MiA@%(QliW44#kQy0}dG`3cmkVN9@Efx{nX^t#uj?csR2a|2F;qJl6- zj)tXM54tVv9ugTKoCW@n++&P8mzN)Z+8=4@|5c=zjAJYLHY#YNEyV`}hg|;*TMU08 zqPme^z3g0}pa|3~gnJ)-0i&9s=stITsN$UIJY0_I;8~MAFL5Ab0A#()-MERzd-3F44{B-VSX(i!V#=H9!tFBm{^7js+G)!pZ_6FM$L0DGB5$ALYJHfP1~F>MmzyUAP|eceA*` z6qD)wb#+yB_0+WgS78ap*`#11B44(mFMz;g}%s_i&`s_AsvR2g<1zQ=Aa-NL5HDjVJVyIcF=Hf zb@fDOFdX=#P;p)=eV6&!i+L8lXwJ2|HUKeZK`$L0HJ;tYm|P zbqpR4Uk_i#yW>kNZcyHGR^UPPBRL*S4|TSxJlIb@Ta3E(vZl7442^DK4iZc}NpTkU zTV2h9@j_{H+U(5!TxJhdEEphnO2Ux{y7k+rngz{*jxiK3sYvASRr3-Sw2V>Hm?Xms z2#dbnRsqH9)01e=yWBiOGCaMWZC>JY-!8ao>}+rEcfZg2L;P2t$p|40`3vbZP{7O# zVgzym^JUO5?)p7%4}UI|1}JhlYR@C5Ey8USBt_tR0*-4Cea!Y>LmN|01O-*@ARh1- z5MVr_6DZ?!MS28{{1%!x{Y+8Zo=0Rb99-ZNaPY_6Bh6FIgMz9Rk_;At!7Y3@{4uL_ zq%v1uJo&)T)>iBsw{KvA={$hOw~xveQaHdgb9qh!13y&@Mv=OTcOqrsHEuZ?ylrcW zD$>NYSYW&n=)!L(TcD=myE_^Q&uIjoc(wITQgHz_JnUNix_R~_`-wp~7+1;7WD<&d zAbfYZyP*dk&-(B{RLB}0%u0CUfelH=Y@SL7HSFnuw8t2JP(Xo#!Wv9UqHrPbz_B=m zKlB%UqHz$s23t~52EmOx*+DWq_W)p&r~gd-Y6KoyVs1HN3B_3Ojb{-ULDiapRIB;f zqXPB*j>x$2gYo{mUsk6Y*A%pIA^W^vDJ!+MjNSuaFoOgWph0ydp<`3o!ofXYaDPhU zjS?Sg5}vDy{$u zl(V1TB+pHv!I!kn;JmqvwA48>9EDR(SaxcaR z-sY|e4bqPs{PP-(Q^z;FezIUh1r@ZsIf*!q>wLk)If~X-lt*V*QAWkJprX!{nSd{A zrzKB6@PUE^frE%g2EpNk zuwZtu297=>;5356VbnhfD!yJ8cDFa8dUQXzNh9$JRG>GZ3Ll@IgBd9!Xuzmj%;%ia9sYC; zT69FNB68xmjb;LV3ulUGARE$|h%w+OedWj&GwMp8V7awwsTeQ1goczCkpIak-TsP; zZdt+;SglU=2rS6#APe4mC2tH!I+}`%{KXTI0Tb9&L3@kz@dMm{m}VpysN;Gl3;2M( z`5}`*G2l3yg%Oev@yGz#(QuDO!~<&=f((gw5QI4iN6GEv_Uiw)gY< z+3iHkkPXAxWD>U2E@O%doULT#n<^XniiO@lFd;3}hqOn0xk>zfCbG4>XKl8%nou0Q z026o(23>=Fc#3RD(UuT`O++d8=~W9&@DtL4f!EX^G%%<@U%`(1U#?-i1TD}{xI1pA zTFUS>^mjM|62X@Q!`qn?Um3BQU;-_miFk+5SP&IA^k$hJ1YuXJf}+d#?qZURYHt!W zX+WB=!eoHLabZ9oF_4iGWY8c37a=V?0vXSrZ-@+X>EXCAj3X?zPAwt>(Fn^0wJ*Wi z7JUXg4d7x`dUPwW%VeXFOwx8*(Ai`n5>@0dsLB*uy;Qw!1_uDpzSUn%WECCu~F;t#@5zQE)*a0!eqlyKi)Y)ON-{xXRB%)}+qL_mOBj69lEmO&3 z3bMYy53+8u#~(8|Qog7g_q zV{Hp}M22P6)Gb7}@gUW&@C6|Uq5-0aW3sK5H8<)9zy>Le+dKdbk=4CV^;ENiO`8vW z2hSnG@idh>+KOY4Y4)8HP(++71!!>ks;Oo`D^|g6SPNgSma@9ki=ia2(855R@K^}H zEz?(u7P4~Ve?BX@c)JcNu=wrv>YA|*Tw>aPuGscLU0X+Fq3Sv?@i$}I+9s-2YsYn~ z#kW`hwZdA6B{sHqv)Mx7(`4DAG|6Yp5YrPpGp{`ajj>uPi`#>bruq=*iH&BvVcT{E z1;GYoui7Cj#1f@uqtWm89b8k%tW>B;CSEL6Yn_hkMo^rU>W8q9IjYvcLJJ64NI{6+ zQM90g`%WhF`Ty9vp4YaKFuJ(;#sjRY-YQAA=>Y+fU@ zQ*QBAm}MJb+%a}LD`PXW6(zdnP&Ms)Tfe3z#uabC8;j58L*hIi8q&`_0R~<18be+Q zv#nU@`fzqtyhVaR)fJ~6cI%x(VT1)g5V>?)Kpa%`YC`t;& zO~wKYW^1Vsm^_CMp~?8xV6#ievLZpqKxcAFTFSO@qKB04OfWi+6!pqaJsV&JRM+Ek zTdxj2FB@&o#!R?I-7Dt9c8a0en@$^^S5-JeFJ^G`5K?r<%!d$KJW>qEsAFZIOKz++ zU@&l5ET!mDE8)mE=OR@YdI|RdG%edGAj(h*Vm|cD79ld%Zl#W))WS;gGFGl3L>a=e zpb4&FSP1}9_ypG~c$SvwRvj4h8)rZ$8-s=!P_|=0YcU|@QD^&f(%Dng;sP|BfTM{b z?O&4cvE$=T;i|gum}?OhF?-K&b$Dm-3}fu_#q>GUD)qjbVxS4$<8iM`84{^6psSsM zaE%LeQVb4w(h~KJ@8)oIIQ+7S7X~yM6GJ1GhiD}kY|_Pz@wjQ*hK%rd884XNJnXtm z=@4|2&-j-$6SU4|+|BtVlXOPC$TcxRjGW&)*vnnLUyCtR;0Z`o%EI9IzFW;uo=Ao# z7$uZ}p=evpj0|S2RxT9;8Q}Iog@QD3rNzbE+P{WMXc2 ze7oQ{o8D)$8s;>_e9B3NSin72l|N75{u8jy#^5cN2?osxjUcJUzx^!{i-@~pFlf6a zG+gqu^h8)_=w>tuUL>68-%;6f)LNEgF!?1C^A1j?O+yPl?ZW4Qh&w`Rkb?#3#W>9A zZ0TP0cQHzrYNHy}H5pXNpOGc0?W}za7U=!YFM<-S&ea(T)(8Mr+GLCJsp=VCfZu`PT1b6j$q7EfdvKwt%# zBF^BmCh_siB@7OzN_%)dW~YB+O9bo%SEf z1%yzcj5Swy2f3O-&-Ev8FVQ#9Z;Q$C38{vo$-RG0kFb|23{DpJ@K?Y)2z<+@3Tu$4 zgLIhB*DVlrl8Y%~Vlik`6?K{6`89YyeMrQ){PawFevCnFC(7V$0yxU*F-Xqg>`=?2 zdfkW}L-6-^0fj;RD!5g}zfYU7Jz0Yd;+lYI?pMJKTXt&#yL$dIx~T2!<@XL3w6pTh zyd;g!9EY2rSP4gZ3iUf z8*d;s5@i^L<}9PYvaP3ZCSU_83o>YC^xy;T1k1bB0q?^fS21WgX83q=Z2k9Yazv&- zp8s#|ou0sZ7)@R;;A@B<{pq9hhVgyi)A4>h#9KKeg|g7MkMmw7wqaa@;fxsQ442~& z+m+OYkwz4xdrqAYXv8rMw+iGXhWP%F9+4bf(lr*v`^1`+iho@P2*luasoWNFw|LFj zl(!*2DNJbPmd?;y`9K$%50&>H;kgGp7azeFf!+`fXTBJN(i@VxV5LDlDQH%uE68vj z8Ql>dDdrdgxfo&$#izV1coJWj7t=&y415#kroo}1)TdgS;eXD~_odA&i{rG;Bw;iY zyMbY0wyOo}DrKgHsik&n6$)6kQYfYS2P|WhxG8OH+O=uMU|LHV1(1Nqys`mb`QHiD zmwSGndvAWZdm{F^Du?pid~)tN=RWtFsh0$XTI>C*I=}y4*6Je_x`r2n@kS^q85pj* zKEw`=cA9h!f`k*q1IY0Eu`m>j9eiR8t5R-2hIz;?_n|_yrlCA5Pg8yjgUFY@s_TAf z>U*y-SRfZ}K!$n9E)L~lO&&9jSotZ}uLhJsyL`7^A}&NfMxXemlkijlxQ_?2%-jOi z16^1Nv53)Pl(g-X!Jm@^L-SV>_U1AE_YFstt2p>gm>EOX@$oB|eDuKl=aGWh$a6XxNO zi+JnzbS1@LXd{C&k!|zv-O^Al-U=A;&n9|)!e0L6>Embc!g64(MqIEI-wR$>m5_`d zGX3AxnYopPC-}nr!m5NMlYwK=!++S{LoPG7yzmh03EcRwxk@InBfq&n$iwW+{39^H zLby;c^mtAT8TZHgdl;XXS-g+N>nMxWWK0NvG0?-*ouyl77$8zGWDa_rwf49K!GIMR zN@Ex$UUFclHd@NX%Ti^1RsU!;1!EfS`4HjtGJ=7P444jjk#Nk73$LWg<$Pfe7q!vn z){Yf@vzbUzx*&u&8_2+EsuYU7j9K&0E31gb-}D^9=q&E->*`_r0s(`;@MCLD(>S%! zyC8umDi{_lx}NFf*pFa%Cm@eNdn`>)|1A`o)qK^UubOvjuT zihVs~uRs$ms6@fH32DA(cbRH#lVU_kchs3B9W$2*&5GS%4L+ zgVCt#>Z!D0U_iz_0$|8>Ej@j0ZV(lG|5dC+=ZS?HZkUIDKsW=Na=5UbQcv5bHr>Of zTN*4xUmDsNLIxXsY<;mQ8I55`W#EVbJ4o114$yQ2yyw>fv#{X7BmxdjJDRSfZ^U z7%abDd$mq~^bY^%UgF@N!xmCUM|oD%6Uh>IkxJsUH!%hqFi0~BsVuXE*1QBAuWY^6|DAe?=1{yJdWKdDcUN9wByShr> z+@tb1lR)bzHXm~yzV5=IsfQKdLemPvg2!MQ%3&>4=;vWM+O^qlW>BxSpNARZLP3b+ z))@kerQmEK00a zI|jy^dqZ>YRCfJ1U&Pc|Rbcqsufp<0b8mzIkEJSXs%RWS0`eK|fpc%A;}0LWy!7NY zb@xumutJ3gaWC3)U_Fbq1`5mVU7PP%cP$EVSKNuzt1o?AGE;GCAvqp_@|+J)P_JV1J}hk3-%SdM4e_VzG3Px-cxU|57> zS4)Y4RU9i0*x=qszK)MX~~S`SSSoE_$Ib`+V3!YOlR1=eAInuec9dp~au) z-NVB^Roa3sq#$6!X_5Mt-kK!a_7I+Z)Nd(;CJL=r-1IU0CI3Gx4ZHaWhS?{QMue{@ zgl99~KYjK$$Sy3cFe-RNU-(UvjIQ*1`oY2z6zrjOlub>rl(K&$$tY&htQ|Z^zCFl1 z$+*_#VRoKkvxEt^O?V*?o^22qlb$^Lfg)kPohstfi;TeldE+h*Q%kqjINu&_2u7NI z{|Uhmk@Z&P3}ytc@x=Km%OGMiX>0>CK|ZDaZZZ?DhuAY<(Ah-=pd#w<9q+98&YvOo zzRX8#0~5u9tFE{6%kJUhW`BdbPXZ>BxD=YiOvAJrX553`dWXR-m42q*@|NRobMo^zK%(h7$m9a#3ACeN7# z>7ov!!of&ANRvBED})O&iyxMKZ_jq+78op?i*#z}=N>U&YNiqoO9;gUxmcr_Nj%K7 zuwIKX0vM=tRCb}$8LMn`^f1E4$XQD*1%s7f3=cJLCjkYlR)Xbpm$%xvk-Hce)MAw! zqa5}z^5)_Eqs&04E?w}26e%!pjscTpWkaY+sRsrCzjeh814ETUwKzf@zA5!EoC{bt z(dvo9yZ;s;L#Kb7=`7;!;XmaTpWzV!@TJp zo;wYW1)D?+1|wNZRxEroX+uymJJrE4pb)KwmE$zEZSVZ}DAaE?X zHxC4i>c~bWDiI!;Xq8!f>AAOp(T+XfS&>6A;7$L&3PiN1v&uTsynrHIB{=4* zgWppyo;w#FI--?Sv)xoMOnDkRd@C2oF;MJ*0tObOVlX&?cQEXuC`!F8U?3L?hOTh; zPiHj8@TO|W#;T%k^@Cw%`C7m#B>$cXFa*%=B2@B-WTZR~7gqqQni;r50atsrLdsyZ?= z7!0R^Ka)t30l=U~_(HMWBh#;67`l=|WuU#V^UWf<`D5@9JZ2@E(XnpNh1EFYjfDChSn>mATCJdI0YkA z4$U0HElyGin-6?ZyGtgny#Hnv`^Qe)#CPscl-BAke^ zMx*k5+Q%Rzbym?$)>8t;9ts;D6B%UOl8Y{|AiZsj<83AivO|Rnn{X zV^vUNz*-?PL9ftYDmE&Oo9Uir<-%pW*)(F5+r@U7JKt)g2G?Fz4|tE|tJ$kqn=k&1 z5_~8e=Q`9dCq?yOV4RD*y_3OUoPOCxGE_p>WD;#cW(fD9 z8h=Yu435?xVhLUPg-yu!b%G#TNC1&QZolc$>7{Vdf~Z26tST6H!@1ZELbf1cc{l}Y z1cM9g4#q;@;YPXF+9|CPHuYM-2%j^ag=lbYK|*tE8d13EBaN}v284u8Np>B09fSy>%2nrwbd&Hu z4g%XXfqSi#qo^+Qt*O)ja9{*EZsOOTu1vFYR0Lrzz|!O!z+eeJ)Kp|^x4FePXA-)M z1g3movZR$`4;YL~Kn9pd!JUx7l#J>D@xR6vmZumDRs1G40VXxCJs6~9uy`n% zJ>1G-p*L+mr)*SnGJplkwi%2L{1H>~g28weOvuWvFQ0s?8V!h;1Nx+rKROUF+My7@ zO1W44BMumQ?Xph}gAsU`*;fWEV4Uyo8yH_Xg3FTD!3aGN1VN5LQ-A|!fw%t$5#!Q* z_mI2Z4MvX%S@RKnYTe4kV1N=RTB8Ba>77;HH>xely7?h*FbN=%YqZj1o~L)wWPL<= zM7W7|7r`i8V?|ui$6dX7h!Hh2V1jDm!3KIFUj1-K} z!@PlUt{Dc-$+-s%oR57S2pFNJ(jtPP1zEl#FyvYyIQ)PI3P#Wmx-$R_FGQ^cl|hUc zZ^47xGf2Cuq=ooz?B;DW-d9WwvCiL1HEsb)7x2ei42G?c@U9~nh6d+%&~RW`=rTnN zuqNEi`OEHMr))<11e3KCskV|_Nq$cZQ2E(CoO#kw zYV)ta6=fL9froj(;m}VU{3>W59On`;sKF<{VuDU)(1UC2sX-S{(!UT4GWr!85wtk& z9+pgAolhL}EPPGD5Opgvtkt@Q$CN(6@~I{)2pAGDgoPITHUc9PR0ww^ukiNvuJwY|hx@XW!kFMO;bw#elHfsrprRDdj{$SMGiPV3Et|YL?25`GMd@0KQg5Cg|8c=R%(GT5t4N1r zC>SRYDyZ*`tjK{PFhLXMVG+C9VwXUo)iVugBI(&VQ5|<{TRmiRciy^vQZmq-42l(L ze-At;7`zLr6!t34ILU~>fPsV284cSQLc>82Fpl-c0~oZlJ+coi2BR6YA)b`w?luR2 zQP>M9K``7y7Qvt>Az<+R-w(k!1TajPQotBZz~Ekm2Mh*-jloDF26S50vbXHMyG1vi z!AK&;hno=?{5VYgKlK;&I_pzu%8w=SWQE$il*P0YEs90N0o&ztMhuKrLlM~nvWn}nHwNok9 z1}EwO8QyW7-B!a51^@taVINWkM)DlEbzHMkA40L*w{grMF!TYwgp6?mg9}moIrK(K zvM*|yV)Oyy`!r&}&D{;V+ra=?*gO861BQX|pa&S`@PjEBgkY2vjPStJ2n<0+blf1b!CfHkvU#;O#MPbVk)c7s8#;Lm29Uu~M4C%G56nXmZ6Ciu?f@-|hzx94 zaB>mn<>9$)*-5c4@Y+6AGQ9MGxdnXDYPkw$n9s#vfDsFJ z`*Gmq5d?z<7BRLKb8*B-dle4GS`;z<%h~z9w3VfCeAUsbYMRYl=&P0_V2Wa+ff^x0 zb}9(l!VUxd8%j;Mp~D*ONU%)8bv8w~?oc-%VP4gMukzmo=-YjMo^$Svb7_2nn5VUe z*4vNY^ZYueVPcHfbz?8EKS$Bv#*o%AkntPZ=g*&i``D8Bn+?H84DoIIj%6buLobr< z4(2x}KahCACD9Xcz( zRiONWH`HBDXwZu$TR95B?HU?a`J!yirT`9djojH;?hHT85gCjIS2k#}Rb~WYv#kaU zZ}kA~W93(_tmj8L1ZX-+PN$HcTpb6D)ym}`&*_GHu(CZrN)?0BQTP$#!Ucmf;u8qC z6^sdW=(u2v-k~E6YzW513oou10EVzYU=Rp4Tic6z2{49Ve)McsO2Ozkf*q+NU<`WV z1Oi61XM(jP7$gx2h9;$^6yxU3o)z-?RO1RJLBUXm+&Kq~E`za|R17ZS>3ao16~hJN zjKOf5LguN@84L?Zcy%;|8OQ6ejY0!Fp1)_sU^F239xWt?V`=~d-Bh@@J?{${#0G*e zj4~l6rQ|px#sZ#+dy($q>$mWF{rdaOt*v>`j0}^3SdcX6WNV;Cy@l>5!Qw%qQ8|Ev zu!TWP`tq+(QHqHA(aeQF^~m~y$9Ao7g{>6<1xl? zXw$6*3}Jy1dj<6ZY3LYS2YZj&F)}+TJaGytf>Vcl z!aW*tV6e9aWCRF-mi>mX6XJX=*pOdT%XsFf4zJ)rk_%SY@s$ix4eS=g!Z(m17D_E+ z$ys6b?@QmUE_*brng`7o6B()v<3eF9XsA&KReS|Jq@3>_%p)1DJOCI{_(nM71zg11 zonZxYf!GEF9EJ>e6q2uX&7R!i0T>Czz;zD;s{l zG>Tzr6$*xW2*zn*D|On*PlFLViXvWCQs08%-dEx+0vOB%8iDAzOe3daU|Ay~5TGWB>>Fg}iGDfdQ#{|7r49I60PF zL4B`O$6B5x1HStms(Qz)P~UP_@W^xpuH`8g1O}tw+FatSFV`uR9Wn$ALIXe4fD5z2 z4@ayRlaUKX6C5Wg)ovc4=YnzZgQs8^#pv4@V-Sd=8WHxv5s$#=OZaUo-!>CPijfgV zHG+Jr7=9Q;uRH^WD8}8@UxESpeU${`rsmxX##;fSYa9h5p%|w&{N8V*fzePf8c8tR z@Oufsa3*80IgKI>F{Fdk+=;zg5PYZEHj`n>;n);Hc6gFK%*xxtYRYx7M25BuN_ln4 zYV&Ewlv*;hrc}V=3+iA6e1X;L`ILVJlcAD<>Mf@^!zW`0X)7ej01CMFU3Sc=e7`VY z99b}0E#nXv$Kdn6O2L54l?JXqsbci{j$%aYXzZPh6bx02{xEo^D@=nCM%k=!xTFWZ zU=k7-Q4nTSd-v`I<5nCEw{NGxFg3o-gko4QY>086Vw`qWdrJn4h6BbY<8Tv*fMK&z z@YyMb{13s95JDdZq5-m@ctB#rEn~DXU7Jn@&36kI42JI??p49I$*POrrC!v$B_}wu z(RaTH8LPduwYB+qT44=VNHLG&j4L_qOPWIJ_02rk7Fqsj`rkp~4DF;vc>pX9O8MP< zeuFIU9Fv_+29NL&80B&a7myWpofRG_7)^YmV6?4c!5~k;uzRT=`@ChMekhHwqe0)s z-Uf_o)ei!rSB-bqniMU!_n%lN6fo2iFzjAxOTidBEFc(e?A<~CYXXcdT|vQ6kvPTo zbFN~be6wQ2z}T?ewKhe2KNv_t!|I2EvEfwsxS7^y0*m&!X_b3hoW6obnjyh9Z)-bnI{DHJSEzePh6%Q% zH!5#J3XeY0O(Jm6Xw3w zDYg|1Ef`^jORLusVq^z>ro;t96CrDXwiSd=_*f??{b1cHsdbK-+zz|g#uw>t#}p&(AffMGEaFxkB|{zp z=(ZS_z146h)n5BsifJu7lrur-hm@akD0V6tp+1Y9nOCr6NO^U0<`pzIr8&XUthcO| zgbW?wyG&bQ>HGs1_1YJ3_!y+)+;p8gRgBhSjZjjeguU!Q z$-o5E;p~?IDj6Xi9bBx!F^|NDcU)=_bosV7{7M1mhm#vCvKH|v72TDxK;DBL+7`AZXlE4mPB3mh4VVRFHPk?cGmKYmzH@TM##=e`cJ$lD6hBID_kK%*L zDSRoVjK}Di@+$3DE#DpZQwtwb|Iw902{YiyWT4w`c3Y`o0M3fx!<~Dx+p=t?=toxfAuFsL;ATp} zc=~`9Rx2nOsu<}j%r{4rDCh0c5pSL_A*(rbAYuKuIhoLx0T;*X3rz?GO^o4HsrC~@ z5Jy}q3_%tpf>8)UiV$!nM%tcyKNt>ejImtJ$aLfhETv%tNkkYb2{34^183P2f2WuM zOfsgBk*D)dDUPt)r4C4hC80Bi^;Ue39)K}+gKsa7ot$7CU^5Hg;B!zC%%E}Cc+|Hh zrVX94U1CZ^B9w$bE`Mh#C|md(yu{J-Z&)%^F)SLQ70QbW#`?G2E>+E7osXxx5scYw zt@uzd)bb=5q8JZbK_o-LnB8_cGxaTCc;7#H(t6VR@A_ltHPBw?g@q9oU4?{&_X{m- zd&Vp}ce)rikJ*g)a?qJJR(`I-`U+#rwg@JLIHoPo9o;X6kx!` zT!F5w%-aLkx?rLT3PUc}aY+D;V4EXvu7hBh6})}oqI_9a7HCLMYO2HqfbmINq0xh< zl(?+qkx0hBr_gW|#6%eXC+%um)5xN*Z*i;>qcso&lbV3;DqV?ysWW$^d5F=+bI(05 zcQP&;PGo{hEewmP6bKRn1T&=V0m{2A;7c&Waw-Lo$xwS**-fRKMDJ{2F}}gzq^jj| zxw_`Q;znOGTY4Lcfl%Sr)kz3kurAW!4gJ68*#$$}3xdFFy9b{D>Yj~19(I$K&UFR- zeUCA8v3`!dOAaCoDPr)vmOIjg$VE#~gojj2$=Jr-bOvF}mKc2BZ`8ZPQ9?=NFA8N5Pau7x*)B8_MW zC2;vYAU8*7Wnb{3KP`C-PV*WNtMHqTYI`0ZCtuSie4D|cy4f{%5{@#+*=bA#{OR{) z2t?zoy5LyPq?S4Q5v$PY@epH30m+^;lpD$LY<#hI3~%!mmBHn0pIk`x+BgiyFdP5k7>9>27@KbFzAyUwel&3N!NCE04yX%&RDd1auvPzb9%qkB zqYsb*v;c1)cB+*j+MrWpFCQ@^ zN*Cc62E!2TxiAVy7_@*_M4dM~89R0it%Wd-vsMfZ_!ufBq-4iH-nU*mH)SYQ%g-t_ zt4g6PJ-3poq>;47g_STPVQ?vjT1lZm(h#WTFNGkMp+qyPeR|YNVA!hRWBxh`DPT$^kYao?7;y|vso?{S zIfF{eVZ8`2W?lI4zeA%BH0r`o??Da9zhHYI8En#eewiWrBP#>bDTc)OfQT}9Z!4Ne zRT9S7MP7)Cw*G84m*Scw31qZw2y$Covn1P-wCrX=)9G9omJAVL)XlA3G%lWc`<5n7 zW6}lOjm?mcL)=_#-W_jc24Ts$=&~YGfa7t(Nu9VMpZs$7>kN)CykS{TUkY(I0Ge$9 zg(LT_H^7O!jvDWx04V@7fXC3qEPh?Wk;j4o0E>V|tcxl9knUZtA(vZl)WtxYMcfUH zrN!5m3{Or^wKOy&z^9dg&Ud`$TY7cHP8csOg(2QIgkk4o)F2Fky^~R!uh&{T8TdX@ z!suHuJa|N+m`q3uS9B1I3aVSu^U5ljS>p&^UA zMsH4js5^Tp=n>rWX2LOGAcH~B8(PhwH@7li=s*=(3mS4GEg_dp#tlmYN)Y^t>`i{+ zoeshx@H9?W6UK1bI*Llwp>BXxDf(jZ9ncQjLqz;RbN80eg1jDUq9899NK z-x@#|k}S18uwwA9KT9A3!mwk&3|1ve*)jCRVu&!T7+ewtx#HnRdeA9UC%U^xubDAG z7+m6YvIImn+J;djT@f=sihLgrhq!Jvwm}|&TnjW*atq%?CsAR|h zVZ_4pttnxNR-mu?HukM~@KiiG4zix!#+B$|EpZQIkVZ(#K)-XlKt^W0$kzYd+Q-Pu zAdJ5yx!KCc$n#R5N=opp7(^J~<6}5wa=i(ws~a0M!jcpn|Ios1C2Ppwk?T#sCwj3- zD4qy1rVP9>C{8k1XP_Ryl%Y8sk~D_fs#;9pczf!bz6zg|A>vS1J>JV3GW0ut0TdJO zV8l4XsTV&L%RI&EpWx=^ln+)24N$NYB4MqZxDR$&7@v^Q33GjKpnM$uqU1Q(txDBc z7=+KZt5UV(R4IdZK)gS4T@i-PBD6v#RjyPj6cbOS)~e;oqg91!){wx-w7tOyF>!(y zj7Iun?PW|~M<(SB2w?DNgvv4Cu{lGY1KNJ`MXU9q>F<#|rhGK>#;XwZJ~zCm6B_=W zgfi&dFlNZt`#ot_f!KHt^5COix+_V$k|t>!YHjF?N?7CO2$lOy13VH2l!2L)U9yyS zq=bQtPAi6{2t%r2vR0n62tzVDtr+@eSoBay|NpahJ}+$qQ2-vo?#_=DGb%_ST|z+@ z7ts}P1B;tPP*hrpr`$bz>q$a^LII&bdn!ne7Vshn{qH>Xy_q3Vptw6jkidKf*#+_u zbRV02^X5HCEa6cY1q_q8EC}OPD_ibBm;{XsQNWpLUJ(~?c>_fQ1AS?TTUoZBWeq+9 zWv1T*0EY=~WQ3M1T|sDV2bZ8=MwX+XsX=H1Kt+;cgrVa9kwrW3Mb^Z|j9FMLy$eVa z*pbSat5IV%-=xs6rqY4Xp%WHgZ49*fqkDtk-k70{fgMiQkKlf7Wq?{KK*z-%QMf~? z#e0D15wU>2FfcrBDnfw<1&rzH5j&o#$XvDjV;#JH!VkpB zXH~AY-eC=8MO&>WsY0iLRY(_@Ak>X=cK2-zG*%S{0F*svR)!q&g9y%uu`!T*HYw&i z7#0#w-ht;jEI)XJU;rNR1*e_3u_|q2?Eu#NW8%YxP|r}pLg&)bQ0XNlDB>L284|tJ zsuCZTh8>+a$00F-EG8aGWsF&m=bWuBhc>GHcH1NbIkBTu_090Bv^5NM>ilapv^Dfr zR&+t9y+LQrA@L!I$3ueCHRNcU+ZuSetLix&3`0x_R#j$g2zo2X;fA#VYn?G`ZVVm| zc2_G>7ekz7SrIu1Sb}ZMoD4Y{q`iQG0kY=L3?2`qZ>yjh;)K0n{&+kdCg>at-mu_! zLtLM|C6U5i`3CjxPFGP6+0S|tSg-iBH3^+v{hR7J8&o(v`9&Ibb2sUSo_9I&FK7$5X-s&Nhw;3a%TVkzkxfQW`cL~A3Ff{Fi zCmYNJ$)wtpH4G9^hTb(yVSv}QGW4#2y&48^EI&Ma`PAYB5GR5Xa&mBxkOr^;jI|mU zE{1KW>=`*3GU!K9#>~Y4Tg9rbi(v!yP#)&O(%=q-%NO=}kIz%e`w$d*n9ohY&+l&F z6r$uZe9f@kA6tab`w)KRw-c#n$}~J;?R` zl|RWp+RpbijckqMCf9L($RuWkvaoSApk77V2-R>+j0*NfxebFd2%H-ay(wm||Y z)@VbVTS$Z;3k%7DAPA7ZPG9cxoHKJ~I-}7k+m{ntmzU#2H|c_O1Nlf38}s#t%Rt&iYNC2c?59Y03wb>_3%yQ1;yucreA;XCy=L z9bsC`zk59L*!UW261#f$;L7y93OqL?kM@dvhk`&AeB*ij60S`46(IYe3go%x&F@!m z>~~3rn4nqV*+WpXNY^nwXB%1I+~5~w8rR2(dqzn~T%n-u{~G5WpkL6)CkCt!`yaxS z3Z4}1e{>1o{#XGn>hQXp6$uvvlG${HLbg#s94ZapJ~q6fQOSjn3p!3OQIJ%H9J&Ou z;KMah13>9AN|ru-jd!`-E)hqEli#tK?qpK{((n=|ID|KkZ-mvCr*JY%6iyM0a_>I* z9SZa_6cCJBN4BrPanzY32*%}X>bI#NNIoC+RchLerfmhtTB*VTE&{epGATT_O}LV= zB-Rhk5^zCTD5dUoFxoPsWUryy^dbe(<@WnIr{M4uv6C)| zVh+Km*O83*G(i3wCYN9z3;zj=AKQn4Lb}QJf4qfY&}i*2N-B-uLWO-)kQ|=)Iotnn zL+f?c`Hk4elGWsXxwv>6bHeb4$t`I!z3WEW{KWh{M~^4`iv19N52l?#g+jYm{sO=A zTGEyR&m9j2r5I6=J4nXh51XHXODRe!D&e-C&fu3mSElw9cwZJwn<}WSC|mnB6(DVm z2PGJ(V4Qa?3eOmP_;iG&#QT_-xbLz3FAo?PWGlm*A zd(&bFV6Zn*3ltJ}%6x`P5rP)e)FtK$bV0-sVPo7J?pE8$F0!;veu%LobSKr85xk#%fQ3)Ab zqOr4sV9;ppw3vG=0K=ElnpuV7(94H`ado~BjOr3FwrCHf&xfMJ^ z9I>Miq=z2OEEurXy||gRp&$gwFPo6zdD*2M0lF|TDLhy3@2|B@KYBG}Fx<#qBN%Pw z9#$~;W47lzAG`)IUg=np@Cf5MtO0SaFF%=v*Fv!M_j&ybAS7%JvS04_;b z^G#v0wn9)n=)i~Tgf?J;V6=iZ6hc_g!K)h*90z@zAQ>iwXH2AS^gZw0UJORh0LFFR zqEOTK{Hwhh8ymrB?+yRU!U6`TpcxPVlorBJr}h!p02kL>0>B_#K+G**_|PP*F45TN z$O`>593&L3eyT73VTBgxtkm_H8}x+hm8 z*%|f9YR&D;cW5)pQ7yc-g5ZXx7qsS%3C>g<$-pKU>wgA^ANo&{m-UYTp1x z6~JJz1PtfTlZ!Lbg6}Uk?|uPfoFN&%K(>x&j3SU+WU8Iyxosc= zqBlCWqd@bg+CT<{J;VfF!@~LsQhJKnEv>nIX-dXyT$Gk62o{B0t3k+Uw*0&gd&7{9 z-`Qmfl2sv&`IB06@4p00FuDgz6eN>^IoE!D$cc6w<5UOZ+Taq`9q*{DzoCOswt!I} zTv%OV`&CDW!7DEZLr5rS1|+~G6dd9l!O+I_d0>i=(D_qfRCaWis2~_Dc3K~ngK+>{ zXmRzmY6Syh4aeX&|3A4PeRDtm%JG~3`0IjXQ1`0 zHFqh@$K)Ddf@MZ#kwQ3`$^0iQnm>bgNGpp$p5voH2ARkSVS$1R6p|JNe_%{|;olWG zM-a%E6H1~B72Ju$CMTGS40H($w29!3R%S%33V5Ixi9{`5e+u@I3{rE0!j(owXt6>l z6l4n4aJ_|9h}kiX(;I#N5BGF1+S@u9a)?Krkxw$DRbk2t(KC5?B3|j^Pl0*u^ea z#3o#hpZ+(wp#HImi}L2thj(q?&nRiltnqxy$cAy&f2sFuv1LCPW-5acu}6qu_1;kPJA(J^V&5H%?X2Wn*j z1-J(~=(d=DSQXOP-6w5T(8%bp1K3=Ckj>ra6Z1(VQr{S?4ZVZf89xmIv6Fz}6{)iFM>X!T76 zw{~6yV6d>JQfq)w?Hj;&x%A@nBO~Kb6k$Sc^MQZh(frXnyhU|Fe(n(Nb9};T#BIJU zlm{|s0(B~iFu5iLcqwdBa2`Wxj&I#3&7UEK%}HniB_bxZwsvM~RN$S3VTS@_R`6sW zfDBBa;Ajdlnd6!5xacweEh2bYh=*2gOG70jLrtKh96Pi1nLdM*)vA$w%YiNPj01_3 z8NU%qObQOqfqH<|WeVo_l@xv-FSeXcVa*z&r-L!_j&v~O+6}o2j#n%y znPdD-+1d59k!5Q*cJK!##t`d7k-z~yP7J3ut0a5DZ*wMbb7|%wRILi=3@x;cf|aagIg&7P=90!x>1UR5YJfGNzJN z!GnOQ@+@n?Yatbn#k&!6OXtBErKX1F4r!1yXY0`z*I;SNwRdP)=%Wtg1YqFqoMmd1 z(lBFrxiVt?4h4J-q5fw?4JEl0V(v}OO`#p6@WH8O_$+L%%8+2+);7BOY8_;7!S%td zBH%bD-snMh6l1ZwyPvPJ1LuvDGMQSHMdve{ZtepU>~Fk~^#4(o;26X+)W;iDI+Q`k z<}>LA2|HVjXEBwPy{Gej3ls1QQtaM2>OVQ9EsS;N^~#~Ue@{R5lNKG#1uXFSrw1-c z+m&SzZ!m3kw%X>+rU?;Jf53t%cE8;GwD}SO4BO7uR=B$q_RZZ?NW#GAy7lY&A8y5x zJy%*t+P>waEy4^YL&6MI_v2$4s1@qJJs$8{cu42?;dRQmBIbVo9!c8-!VEZW4l|5} zN6nA#pW<3oo$^|^ORfG7`UY7L(h9rpb%G<-aS22+hRxQ213W{%L`V<=^ii(w zO?qPQb>0XOss<)Pi5M5^;^S0^648#!S2w>pUq@;(d69CpD#1P9O1e}es` z_rL{oBoCnB-pckQ;4voHFFX^^uw7YG1vV(5SNS>!hV17pTf}_YrWg7`fPjPzXpf$vn43rzIObl$K~Ad~2s6AEbcRLF z-D_cFm9tS~fr{P|K&<8vX1Hl8M~MkI3?4T)jCQ*AriJ+}vq8_lJYQe`s@MsQp6WhC zSP%f?_5EsXUnfoUB;f!jpH3fNb7~6#3)m{!*^7E9Lqu>}t-2d}kSpPw2yb;ouYo$o z1nths?f`%E+lRCl<&iYlx;i_>zDfcIz0L(Jcv;wv(CeB87W|K$HJ}kVB9+Kwz`~|F z0|4-88z}I2Sb_&}6cS@}Js>a`hUC~!$NZTvi6iD7@1LUfSDW%$Sdgmsqn^ZA7G%go31J4l*J=jDja1A< zJ>#`N&Hhr`>q!=dPv|pa5=WSU@1>eyW>PfOqOq|Z2KuBtWXM4uVh%teVTP&@S(dS} z9meFUz@TJkqf}1(2Lfgi)LDH7j!_210f1Dm1fS6I& z!YF}phH)9rd9z6_47ucpQvqMTml~qU6pw=0gefuN%&+<_3xGk%7(tk!{e%-Yo&3{C z$_s{EvvM6bmAZQ6&8yZ1*bq3ljg2zuZ8TkTLy1ymJX30*Un)%GH>%hmI?!EP%w%M` zM9MGc)7dh>2xlXWn-d1W7-L7kSe(#A=wui}!!lIh$-y5k`u750z!9(_mHzGi3V{*C zLK9W^54PunU~EeuLHh6sJ4lCuA)`Y7!KcZvt*t2L7B>+~UIrN?blUd*bo>kNDQyDq zf!5FBFs@n_?f?c(G+j@ioFR#jhuu?Y3Mk+pOaMMr+7gGcXjxbg7(hl+$>4s%u{=7T z;kk=R1BN(^SxWSO27};`~mB}sN{mIEAUi@115Uv#Pzs_E!Cr;|Fm&fb<^lp3;i5tK^r;YX zGO5vA+ys%)eH8~dqNMHRHydx?!hIa~Xn1tFMWqgaVV{ku+P=7nt#7Y)GZ{D{G8P;A zSehYqKJ7Tzg~Qly6m1Kcy27yFh8E-~rtrB$V3+_Li#5PSBWveLsnPsY$hhC9g+Aob zN9pt4y8|re!`cieF?zzY+@oRpY^a;CLW`wmM8*tHra*=+*~VfGi7 zgVmAL%m*cAa{?A*v4%Jd$3j;uT7-I`qN`|6^wwkELT1BEsi+FuCeFB9ZDcVQqVtu{ z&>wy_ixo=YY~Vtc=?eC8W@S&%gX~fsfB54RW3*MNkq=lHI~kTeL5YhB{o#LCp%?>0 zQ^pfgNF;N0Qb`53EhZQu5V-^V;d^Qp`ep!mMt(bJ0TZNc^%wMqe}gYg9h?R%_!Ya> zVi-V1ybEMtul45}z42?PW?&p1#1i6Mj-SI}9RI_xwh)&V!YWRCF+QuYHfC8)QcA$EE%eO^8D|JBQu83AOrBzI zjDE1Aep@Y2QcA$+vn|Y5)J;%mp=2x(8HK*dh`JB*CF)!x`iuB1AewMO3n7EgdjUVt z@72QOrsfa(oYdgD2_rBTqQAZ1qN~UgXKeI_=WVB&r8Loy$z=15{jFwpoZd9<{s`gK zi$;?c&{(3ma5_7VE#1b)v$axvd}+K~tBMeJlWeC^5A6FkdUP_(bD>E8@ZQc*WwW0~ z2HMdW9NAot(>NMU1;D8E6Ak_JLZh&TH%)dtbL87{!GD;x^gK<0Is|ryIp{y_7 zx)YD1x%NHjV{^JEQ{9zdk9-MPpxFBTl5 z82(+@k*CF(r;E^R9GC!%gR`Td2?{gHvT7+u^|xe!K;h8uo^2sH5ve#nSPJ6vnUz^%#}cfEgOyYWZ-(V@*HHK>Wu-SPN~aq89b}~Q#2NjqKW}9 zT9*SB;4`?hbL&nQ(os)A2CZ&gBof~9gtkAY9=ih{1A#)h z@ue&svG4^9Tgc9a4jSXBlioguH2;qo5gg7>-&Mzx+z z`oP#B;YBOnhtw6zi7Md2?=(zqFizh4XxL|gfmjv+1jHJVibv`*+>qQ~;wxY?Z%Au= zo1B}{@}9i;z}Wl%3w|Yt4C+20Assb#iFrWW{VRj zMfP;bQ_Vw}4`hsE2R`V4$nd+2dIlDZihBqr_#cD8WJIt7AJM@ta2aPNLv?y|IOGR| zPBhNCg280;YZ8}UEti3z@uxuwAVMX(7jGlnkUSL>a2ZI01eHicuN-sImY25O0)B;t#cZH0*C}9v83I-%xbOHlQmAqtRnG6VAn82@zx`r7I-%=%z!STcx zk#PiH0l{Mn81hB=48eDp1?>l6GP;q$b=|c}zu-oxFbhHk!VFH-N@~hbVS`~tqxah5 z!NEa$XKy5FUkDdUhN8h45djD9aUU4U1~-OOYiSClmzKu)SEdXsCR-L53qCNO2pLbb zU#fvE@5w=u)*xyVvE%PrdZ7&%=pFnLlb2H49XYIS!0j`7%c6V zA`uWb4;kA`#*Ke|lE)`M8LQ|D2`E7V88iwgVf13%($8;cD1Ia` z#Ia+5_?QOb_;xa^bG_K8$~mV*Eq6*8Fu3_y!N4kw=A%#xV}^_(mosPp_EBSXCCBg> z3!xSYUNX=rMI1mv1;CI)bbf~1z%EG^jL#^bgyDeTijGgjW30`GTL2j>CByg&VM7l& zE5#PHkkQ*aaG7+KbQ_{KYI0V8frrH8LWV~se!jko)SyURMzszyNMPfC*2YVn!MH9y z8c&|pDjDEP*oZt!TVRm=yzlNgXO0LB3B*ALuK73UNq^TTnwS!opRmj0?x6pAz;X4>c%H}{*#^r$hHN>%grz_y5lkGJMU#Ow1jbWaGg1T z+g7d6F@f=%z!>C!FVHn!O!LBTBx>(=Eoy2?=20L6hY;m!oAr3$cYpJB2EpXpC$Z$#+RL)pt5DXda zU?7p03s^wk`3RFC>8L()TO)zRfYGKSB!PcPD3Q3;dLdYl3>X?~koe{KHwl+6l=JAR zT_2o@LcK^Y09=BP?+tv7C^>eY`p(fQrJ=>MN+H+3=Jyy&3JR{CehY^!HBMNcWo4*1q}q^h~vwTk8%FhXa66A z!Gj}(j9%Nqe{tV=X}TLdgpzq`K77vYKx};Bj_-~ z(^AnLS>K)Hpc^opo{Rzv=0g01It&wi2V*|m;oJ!=keiwdf&qo6r3#WBoJe`dm~p{) zX@%aJuZ4xSx<$3tA3btl@Rd7O%vI)FIoGCD5NL1|4K?69svanSzVpPA8)%5K zK&xSQg=Bm!y0gNCq+{7>NT30M5Be)UL5QI~;|xjkAQ(m_(1<|72ZLd{LLzfPFpNx~ z0Raz^1;%O^7+*=>`Ef7Ez{*wBGmf7-VV-DZy(c zw*ljx-mSJELAP`pggOkkjIavd%&Oi~%0tGg;lk%IG+*06Uu`_+(85oK!9vnh#Q+!v zja`W}pc3QJw0ugn?)$TT2!9cVh6r@jpIEWCAB;r>L+f|ke*-ii<>Tl~u+gN{;eB86 z++2QqXt;O?7$(G+_l<-FhJ}VoZi`@I@9oKu)6Y$t>n$Q<@R&*$c$iEro+~_)f~1gf z*>^G#TJSP%B?Azs%qY0uYz5N*azKs0Qi~1AI|&(F!gwOxIW`v{gTbh$eHKRdw7XW* zQ3uG>(i89R9F>j7u+vg{gL5S#C1hZDBpn!V7;V9jTOUx+Eo6A7vGR~_{@3JdJ1C0o z97wUy*_4F_bk~dofnfs2i-K;8jHiAsep4`-cYGF5_GU7sx|9q#?_96- zI1D^P!5Bl?o3ukgH++Ud05%L6;xN(*hVMF6s5rgmBT9yhj?IPf7{PpPL0hF(l?)pT zmVfFy*$Irq16nL59JmgHU$lElLyQ&U!0)QZ@Hq_@0HIf3h|!qxH|Pez;Mr^q4=xox zu|tfk&q5K6Ii|8*R;NL1Ku3EhvX<=-W7Id665<8WFbz}U(9KLL;-A#oR2Vc^T;B7A z7?$srz4^Ls^8(5j6jl=%6lVYo2{2U31tf)x+dd22DzytT9ugV6zE#N(G(d=8;ewH{ zEzCM(G(ZMN;E-}5g;;eM3dVx{JMc|8fd<+&rMP#%D!W%Ne4|n@Yzy-h_XZ(EhF#pV zLvKjdW7rlZl?)0kf@J8Mk$}-T`u={!<1?%RI39ZOGV{`D0>dvU_-)~dyMx$`=Ye|= zO&c(bku;QYH(c))o6Hv;2vw{0PoCNk)( zb3@1!9Vi)3nGAUo{U#N@<|EsJ+#m#(BeY6Qp$6^&gQ?&VF&?9_;In|fL7a4M2pK_p zt%7mz?tlj8po|YtL%}$@pR_DU6CtBPw_BsK_nH|LJmo?9w-aNm%~=+tiO^Y})HkzD zm>4c}E+zU8*JGqQx{Sef4J9lrq{Y^C=YL_3Ve+*>GKdX%@vl{)u&(Puc)m91HZU6g zZ;=c3TL2gWg$iUiML+qWse7NI%8~L}(5#eiKIO{$rOc%KOEQqJZHtD^XKja}OEM%^ zuD4UY5WVsWWUQcxFg|dpg&Kys481HlVEiCp490yHdKPL;RF2+L6JdNRQ!-_5df+LO ztN(UAMy<=Xfc9E$=|mG@d@7%zoM2NgR?cdC+hdgd7KZqyQfJ&m*f*k0gn+<(Xz1;L zahS3#C>hTjGR&SOf(2gGV<;GvKA#11>l~0ln0UFcr3rReXse#qbIsARJaL~TcnmxG z4zNMbATYb+FaoQ-?|^`gvU5`9fQ4D2z_@97lJG5LfYF>3l2RShQs$F6vS(6o-5t_W zon?m@$-beS+<_YdaP1Wu&q2oR7_~~RxZ|K)U}yvk)G;;&V?GNBkU?ND8P{b^E2K!+ z;W$!=wd?-hAqFzE@jOO8qvX2rCvX>dG8USZYGeYxLypOK$7JM2u%^}c40`gL>g*H^ z(S8dTCgvkb#`1iQ*R-CvqhLJ7xa%<@Im?1g#$;~B|M7)46*P#xTx01VFWBp1zZLWRCP78qd;V;dIQD)yNw-);&-n{!;P(*rMm zD_R=?d@&aYz0>jb8v&dzYThjeS`ZRrm@nyc$xvXTanBov-ot$X3m5|>Axz$%!D00G z1-H!oT@K^J2Xlc+@qTbA+Rg-VFyEr{d*p4`kFkdDt*#~eMZ-LN;dIw-dzFTh80GA2z(QPxKw(fBPJ|V02Z6)jnN+Y_%0q$eI;=tA2xC5Ifd=49 zxq!nkNf2kh#2mdQcg<=DqmH#k8pGhzooe;VBaCb| z8pL^4T!slU^o3+l!G|+;7$MuX-sf{~D;SNt4kN?@HRt>uhf(mlo3H=%#}vh^GM))0 z<9lL)g%ml!P%I!WiNj&ET7$6=3m4*xb*%livQQ?{(62s9DYkJv^mmxeDjC9o@fdhW zs?b>`kd1{|P%`xVGZc_ufiGPysC6x8S@4qq7X1Fgtj3U~W#JaYXM}~^M#I!iUdr-?J87(gLF&CN&F?Bvjxp?)s zJKVxzqpHoDHWqG?PkTP8L#K@eAp`OZ4(Fwu^_I#-W+B`{N___Dz^Ke*KvIbX7l(6g zEX*hwOo4@lk#s}PrP^2k8IX?(ezmx`2@4(6^U4ndkRT{ps?VS8&b90NOom@UR<@98 zEru*~j@Q17j4B*P9v1wHOWs@nz(cuEH{!4&k@wnIh=o3$&j#ZP6L~lnC~#2-v#|Pw zWUSf_L#F`$8j|rGO3{_0djLLz7gS32+>qf+aM3|XU|eozVG3kmU_u;*ZqKmA%V+Mi zwIF2Znj}@#w1zmHJDJ6H7Dhpau1PW~dlqHLQsl#XZ7iflT%X~SZ~aW9t%aGJK{C{1 zIAShP;OnUPYj_2}co`Gaf@1beXbX{^A%Q=VEHqGyt-)c0=?+&^!wMNT7j^U$hFX~2 z+mSd!*$^xs9PxMbl!??_sD*n%M)1l+uZ9h54FHD`rWs6UzmSVS10e=7$;0}`9KzoL z+(j6HhOCUi69O1KzeRjOBQe<9&O&0!DfPX#B?VYu!Cchuw*4KL3@5~BA`K-HD9Bw1 z7ujN43nRl)>a)O*UP3N2DHp?I?JYP34Mf`br&221)iZ^*=V1h;J_RF)hFLu`a^W2P z=~av8Ow0$?c!P=8Z{ECl{bukr>y|HgZejocf-r$Msqh(8lnc|kZ(G2X$xjBClWZ<9 zkqWmEJKEzB(4J;f;4|4O^4rYCT6mC^TU*l+@H|8Y6uo4ZOEMa>K1=&A_=2B^!42+JndZGckuY(04Lz7U34R8So7m@ZB5(Ou1>z81mt)4ew zp`!-q=Cz{F^nhNy`Rm0?mo8qs_}9O_A>How7b2Sb+@M1O1A+ylXvl^>r3RdCxEAY- zhC!j~$Y3H|%(k&GdZcI=;ff?^Xp;!8PQz>W+E}=!JyDPY1s!`>p~DKem~UfYhFhXY zfu<0P3j$*@gew}yKc_$_>b6n@|4hj#ZZbDy01S@zj&ZsAX`rKpOs&ZwxJuEG#R0lH zpfT0af=dRl;1`Ia3zv)b7PJVCKtp;4T|BhUQ@I#zZvkXPgbeK(R5XmgK=<=VTMLE^ zt>+nex%e=1;XHL;VKP+YAP9>q*9LkoU%hta67g{@P)6vgHh~7Q!8FJl9V#r`Z;N$( zX>)^4zlBG2ph0XHl~{rXcd(~1k!ow<W7+3u#44oA*M zoy}HDS_lePVjB04s$)hQR8_(}=Ax&4(g5A%U;}hOdpq*c+;57x7;0-_s6tu;9I7>b zs5HnUFxp#~*kr9jIO#?Vh~8EQk#~rYWW=S;9LKO-iG&#<<1mg}uZW9F(T)~S1V;$& za~V%HzCcbXQ#|i?aL91GKo|`57Z{TBeuo^B!SQ$FK*hUXxm*;^`5kghhH)9X@Z0!{ z{*D&3pkc@eav?){5nw~d z00Bm)Q$i^a(xxrY!NL%j03+0C{PE9L*Y9QC0^eD%WVmR(CN8daeSw9=bk#~tA;54i zRkPA?VJMC(S!#K4y4W*}LC6w=4Ku;D0WV-M)L>Y4+CIWggVCP4UKR#q zl#SARFJq^!*L}bp_ui9KtyxK=Kz@px+aKDOzh2%`EVDh~&fY?mMmIu|H=yqg^M|;J z58K_e4YZNjpAfB~5{EX(wF<&!1f(w){_M0yV?kwOlt*Zoe6deNjy zXy6ONKdz_Xjddsn)B3n?pwQq$_J|b>h4RH#1>lH9vEvI6vR$z;o={I8O(sw}i6A3y)dAnX|wrBi+FGD$_+}rNB65bFt{j-HRho;LIG#=IU9A zB3(2&vw{2bpd(8^`8BGrQ(*o)ldTbzE`-AV;f{yqXu%xx3d45s%CU(dbG)6%6Oya8ID|S)H^!Hm# z7g}NOJa)WSGY#0n7T58-ZZ`$WCu!RCtQENH=aWgCz9!;$;#>dueNc#z1O_SC!pFG~ z08j!HcE=e#e>Qjo44yq7?WE+CRSREqv0|%AhuOnHArc(zq`q>#xxD-!=NduPz1HW0<}p-eK#$d>H6gtCyd39>{m8`ed%AYfrdSY*G!MvEr_ zTM;iMEkdbYdRclb9@}qMAlJ@JcSY){@5z=e@26lc`7z<~cQPcrVGoJ8e+uH<9RLi* zA$}h_4ucxl{SV|a*mm#&X4nc2f$PVrHT|==;(`rUHBB37Y#|JB8by&Ag8*Jd5N25z zBrZ_Eq%mYcA{h{w1eqe#2EqOd2!T6Uprb0VN!RB)IEP@527(|6f*=Tj+cp<$2ZA63 zuP+u?)^0Kgf^aW~lS%&4W&}a(?i!leilW(=~@D9ax{#_(KKW}aXSNo_Rxm_UN@lp*LYKdWxem`S6t z8W-cDYr_rgweED@Kp3*=jrz1b2{+6}icA~uxV)a{`MZ1|;D(-QvfV)#(xOm>=^&;H zv+-5ggd1dJ3iApc3okTO_)Nnc*X=b4(9rTTT^)ffR=)Q5GhSs%du)RD28>*c`F9cU%XviYa&S$U8Rj}H;HkDyv&Lb+H5z{M$i@vQ3C-K zkO6_bFGysWz_MhS5mz9=gpmQ4ya-_*&45q-yZnK@_g0npuy)4VfjMeNNOE3IpSo2I zoP$ZJV2#gboxn&W;(UfS=0Tze?<*l0N)P|Q!UWr?nrj1t8G-?mQt^H49)dSQF!&Rh za9+v-gJp&_MZ&PlT}rQodgDtY6vIK|>|c-s(wyh%L@0(>rH-Ot&rC4{gPE{mUJb?t z%Cd}DAs8$x<2G?zU`a_T1Ote0m_L!r)$NZrMs0g8oB^E}XPpM#+FWC#XD9+l!U?Nqz7lOg_YM_Yl#bVz#*$aKfbDK28@iUBs zVQ}&%D@CA*()`iJh~}tb8l6F{pkR&zgXImcn5Ljqlme7Mb8PV#oYejTl2Q>AA6%<= zTfFr&YjW!91}QcQ;3Y+jXJ4Mcg*9gCqW zjq&bHJK|b;dJSSwp^`{T{jJkr-PrA7TINH;OPHfoU@?>;`^$xDR}x{VuE%45%sW}H zq|#Ddk7W)2ZX)ZIlsN`fXH$lR5iS1;ra(|nYacpVFZK-1NjK=6kq#sTmG?}OIUYmh zJ?a2ZQOTFc=KIVmc`smQWU2s!j_GhFw1bX^^6NOu1vx_81HqKNUf1yeL#U<~+dN z#nf{w#~{e1s^o0MU_`s4J~@I+A+rB3_iV<%3FJ%ZYvEAB~fhu?)G#-;u$s0nQ`=z@%17?<|C@EEXgQoaZ zbC<(_QO+xG$gxq~fWau=^yQ>Dm#+BzVvmzoYjmzL`JYTdH8F5%hP-$VLuFeWEJy-s zD8XP(n{j4$m$ZXg<(p$01}kmWaz(tkas@Sm`YeXL+(98!O^m;pFX9Hkq=~^cM%+wj zVA>Gnn1mLdxojLmXMCs|n={0tZX2wDb7M+Cfs&^iFqoz(erBtXjSWeuvUZI2w-0Sg zJ8cPyKmi#135*R@t|aF8@i!PO3*K;1FVm^|cjS$M017nuei?&tbTdL#u2#^i71uJfsIFDoVn%Vby|%|;a32=r3sLokakVMf zOd^A+WKz&S_OqJQ6+@no!(!qC1N^&2GA%=u8Zib0;flL2CC5|}DamvU@z_zfdt@8R z7@y8>c3^wC(Sso4AZTb11VIO5Qn8>)ZmGx_2@OLmC}1}kQJ zUetSytnIlNd5$5%%X``83eM0mWU`)s3m*sG^vWJO`4oU!WT>Q)oYB-XI0AX+8GxZG z`T!=Ar^d?3_v#qpW$*=J^i-ep%h8SHzf7H@2 zn3d#gET@GS7P(@sg1Ts+Wr(9M)D{Y3oME}Yay{Gj)({1?G;5xz=EYFef&!XOHcRr* zg(M?nGnR%SFMV+{H0e;^jGaU;IIF5%%$V)_a*0G>3)3Q#esnYN2(=Lm&+09>hLY=Qe+ z`6r79Ps1>LHm{!zZoDGYW=bqxSB_>~l6O74)^IC8zocXM?PSHEhy6(Ng3uoc^kGk> zaITKzgi&{We;82ly*l3skSK6j$6T|^jU{LD#0|2@qLbJ9j1{Ic%`P`1=LG>}0Ng8O z6jr^{i<*Xk>b;d765`t{x#;(rUGCw3j9uSL8(9=at4`OTNevVsx}=bF6>%Mi4z*}A z5S9c|gd+PaY?}c3k|i~}b^t@h)-BGylz>Q|bigP7y8!yQ=hw}>lbbDmcQP|~=p5|% z{O-B;p5P%}u-}J7*bv^#SuTYMs+JqP{t0eL7(uB7LLTo9<} zJ$wZ6oXdV+_eX~XXLGK1I1W9l*Mp-sm$e3#mAm`TfCp%FHo!f44qy)M^0Sr&s0V7| zBef64Ss=+JD?Q~D&!~{M946$E`4|}baY^Z?^-wDAb%2dlN8wl+0-v|=K)UMIaI@Q$ zn(NGgV&j_-#8ABb@$Guo`WY%zj#r$w}YD+*-*G*}QC%+|j* zrUkqyaLGMtk78&-S;&A1PDW9n7AR)y?g2kL`0G58kb4q0I}kFOM^mK%-nAMij}}}Y z+j<yV;YzizuDz;jg z7Gc~zfcq_IHrh%VoL{=jLl!#&iPTz6EId1*U-(fS*dS?O$k;#&g<{!XW(!|2VvNUu zYKjleFKx_bGO&bk-Q}S!-qlO~=n#L^7Yo~vOHIvyh3p(}lRtLYin1zB)L&D2K`u9FQjv8k zw+XXHKPVm1oKcRYUg_A4auM*jsVA>ai+S`SkT54hMs{{<X|_;BzqYfLY9%cJLy<59(IadLU5NAxSuWq?v074X zrFH|f2nSjfBm$zxAdDAYf&%mqRHvVST8!;-)_P(GY3c;wi1*K?5;tqKm^nuG*b zg!8Y-`Q*<>VG~ywuNJ~4hyn2lz?T-%5yYi&%7B2|>vm;r$BpmN^~}jXnio<=gljr@ zr^^fRwO_feTYm)XdlMoJ$i1qH$7I1NOytd?_t4~yw4s6qLzHo&ih-{>6mX@k+sO!s z7s7kZizq{t$rlTpt}937RtQ>=$(SY%jJ+NvJT>ybfIGf^Uf#HJOqv4vUMJHdY!SNfPCr{^3+PoUkxRPJ{_oNuLsJ4=ZW_0O(SVa0 z*4MkC%pUt+Ge9xhph|FudA~B(qox9TO!}#Mu}Yk46G?s7R>7;)*w| z$bv@dNgTk=RAcFR*kECN(qK|R8O}ImR4QDR+XSS&uS6HNGJuaO!Zj;xwMM(L_s|}s z;VnjTMM<}t7_WGL1g~tNfW`Lm7BG^_VAUpCv@(bm#I0CxsYYu8l=jxdyf>Lq#Nc(7 zEvzHX*Hv*hIWaLZlahI?QU-uCu^C=)2RQg6{uW(yL>DSzG@7_^8=F{KTKaAOdCnmV zzq4O?BM`!cMF8p|N{&IKgvyIewy=wSm7PE>3rzrJS=++YXFMZs$X`t?Y@=7%zostQ z$UvL@4-tC=J9!|`FS3Oix|NXB#e1ee=CVn)o?(0DiUt2nc4w6?L=<{x;&I6YP>1l) zf{BGA3>C-m6B33fLMsDDt8jm8(s*ima%~e(-L7sAQHicpyue25JLr=#G~Ns?K&8Ev z?VP+^qXR;bu!2Yi4VsEYaAgY)CJ~CoqE{~a2J*M}Y9jTWh*7beLN`bA%Qa=802VyY z^F7~peHQ>1m|r;6IzHD5{M4oaL}hfgLSi^Ak!#bSOXhy;+WAK z>@P09A}lU0E&y`#^TYatTc&S$&3z#hz`@G6>Q#^)b~I2{1?E;Kr>DdMdKG{d(S_zf zLPnG(j-WAePXGBi2}Re}~3vJxC?(_!?f>^RPalN+G1QXRUdZV&P=M^%X}z zn8y~DGtA`%yH?MY#O*=>D+4B420S*gk@=6Y>w9hE2*M4xIkiEKAy5jX#05LZn9xAv z(w0Uw7>Fq%5K5k7Q01Bgg0Li;a)5>0CoTD&0#6}vxNxvQZn>tY?RsW5m`uK`DNs&V0kjyQ8yoz$K zsnZDEF)?z013B?AWQjbBvM<2W2(`s*NzbbJoM-_sPu`jDd1O_wAqOkjs#dGT4=is( zKO6?!g%5${BQRlT80ybD#9rQI6+~omVUSA_@7JQLy$=jszO%m z2wgA?Wa9t;-&Qijj<5!Xfett0p9`<%tQD6 za<+JAN7%O#f-RwfEF%zMH(R$*#}J@pY?S;B#qn+2@5INqZMJU#-;yxOx7;=dqYI#c zraDHxx?yuvua21w$B4z49ig_E5F3sVB`H(guvy-uvR|SLOBp>o0vd*@LQfg|p#xZ6 z(ZjaLLJULEX+tT`!pbG-0^sXHWr5dd@WPHTELO!EVF9J_W?0>`Bk1nQ*9DOv%9z~j z+bw^zrnWBNi!H;BkZ2)OPx5$xF6WZntjD;QI(&QE?x&T(cO4eS&t--2d@#c2lp?Q; z3mgqQLKO{TAdDa(iqyRsA;Nli7cl36gb2Fn32;@-Q`p5q+-tahST10w4uE zsK#v|`ZlZ!+0*{DYe(?xLQTWRpJjzn`RWMTqz++2g~|{?Fe7}%h_6cvV`n&WoDh(j z!rfHEHn97yAWqsqK42EWj_`0XVUnCI=0H!{GVnhT+jfMrBv-4H2ucZKg9_q8i&pv6 z-r-_lZ1=Oe@SK~^7$>2&=if4pLHE4)07==722GnbSWx49ffP6fhSj=Fo1QHcu`Oe;_Dwvzs7lQ zz*%%*h3?oTVDbRi97TIoNlGP#fmeB9RQ7M2uk(J28A4)k!f>eD5q3Rgn2jPf%h8jh zg^J<)T_Cr>aw9o(pEyXSR#N7GejIq$RfCG$>ER%zjY|%OVIQg*g&Qe(I=ST^PM3Cs zZIlIGI(XHcEC8U3f7ibZ38R;jMV137<(UyG8%4bbN`YH+>{cs<=-%6F5XLPEgEmtz z@uJb`V-6jJQ5KJ;n6A}FR=NNVgC?LE*xD`GGME)&r>IFJ5Mgb7wscNDN55cY7 zVQ_D!P=f=%i@K+3fe4R%%K!*93KGWCHn&E>)D9`t1$#*FZwfa#+jqeeK%($6=3p4( z9XmoJpOG54t(0zN$6fPGrAaBpdtP|a1u`-ToxN+l;={M+*S)~mTa!`>HfsWV37x%5 z;w}i|@bEllVGu8*3z%HsJ3somv@oLT6$ybYL%Vb`2slRNyQvC8NYSP#X-H@UBK$HF zFHg!Cq6S4s7!e9XdCAu?@D3frMCCD9hOlBc>1<-Qw%z9;(8@OqA|(9Yk_I>8C}eBJ z9PsVc)Q(VTxUL)-ih(8u#}Dp?gyBIqR-7N?+u8b>z2sZGu3E?Nr6IytD=Q3zU&r_e z5z3+R`_cKk!XQktswWOPXcHth%- z-j6I)7J7pY@&O{0#8WtA#PK`r>+BHZgaI8n-;@>^oW6DE#Q2Yq^LcF|3gY;y+AOuk zR6J`7#A3*$&{QbYwh%x;Z{ocmEz+D!qY?yCOiV7@O9>R|sT;`2|1Lm0I=?de-m*^i zGrRltG{8K*Z{Ew!WSGODGfv;|vsC7LUd$%YyOA+Alld>*I?eH-Da+C@Jg6|VfH04m zF-ap7Mu1KlJ?X}bQKt{z+>1mb>qC&0>T7@35=IW1JfuM6`uvUiFLjBlK1m|ky;Y@Q zc(}@ev_TJ6#$QVqwN4(v{_2x?_KvEo2n{fg9xRMkt|+Umi8P8KfiO-<812W!eZ@mq zsz?skU;=iJfu$T89xh_pHZ7333Nbu9ORg|W%(F$DXac^~4G$~~UBHAc8bdEN!^7x% zkR)`*LaLAz<4o!6iTS3r2iuvu%j`l1X%l(9${v(NYMxq?Jd z89MvIB%y+!vQD_+WzX<{XADj3FatTToyjZ-{n;3c-~j8WpES;W%^ zqxDnP8N+RKJvw}MLa^_`@-Rq&Fsn2a7DnK~X16_IWgx5!)dlXP9<92<)MJ_xUB7%) zoIs)T<=qJsJa1bbo}wTE#-fO_052uOLv8D3j$%lS!I}F*Ou-Bf*g>W#LI#xt6-U!! z!#bk=!7ISNzYwxbG~E zS4ao>)&D)ln&!yuj3hh29Wo*YV8^s9^_dx|!{dyf_>HD~aiK7vwkaoy1t8AOKj zrs<(k!Qir?I22ivs2|DpfI(%nLxv@y6OkO49$xl@6;B*t8tFZ;JVY->X>?OWAUI%~ z*u#IEol$G*SP;ieMWdR#dMb!u+bT4RVXFq#D-B#0VP66Z`xOdwmkM%$M&NQ;AeXHW zd|6rO+rH`RemlRwo&QW?DlIupe{*7d=^veO&crq|E#%Q=ma3O_)ahgY~ z{sDoJ_Tn_x3rv0 zg|R|tLM%2cU>pdILAJtr^(tuBAYQ&H> zl!I#fVUD20iGj>OV(^93Jh19{w91XY3N<$p#{$U?7%dpDH577CY8Mx>UnM02oyJ@+0_(!er6tYuDblXZG=zypVML)3 zC_-R~36VmdnG~{L)2FZ7V|v?OXxtiDA)}kyjS-zN!H9DrQYp4ZVYrTt;izrM5@Lmu zvjzBP5r8vE4o;6f40}_#pxN++*vrW{*Yot-Q44GT; zG7q~urf1YN3MwHYQ(Tn~?#F{t8ilKM%!bz?0IM_r%|brv7gjLe?IklLG30L;^P+W< zPijJ$0XR5PD$i5wMRTV5Bhc{Xc-ORj9cJD!SBmY&o}-7Orhi-Qf`F;WqUO z&*GwpD9Woal#8YVln}$AC?IabgMxW#QA)HgI@GY*XdZU|Cvp+Ha9$3P)B=ciVH>nZ#VTn4t_S5ot0yOL9=>~UaPfNO>C z)vE=wP@x|0iHE$bS%c^B-*wz+ z^DPQP1+a&qR^(Q|%=9!Tt`V>4RgI;g;HC;@rQ7MAl*$#z*Si;#8^r+71=d;6zNr_q zm;;X$;H3J*m*Na~WAdP&W8e>*b12Yj82DVA1q8y^E12fgwW!kCkOY><{1#*0P@d|}^@x$kbMO-rel)I#;nis87ZlTh|^E~*IPF)B6 z@@8HI$McChJPe#ttx(CUaBfd$Ew*^H7KMJfWo_|e71tQlnl)C;%VEvz&iQP-W{wo38O!=8omaV8kRreIs zp;Yy(O9_QU0|``$FuSTI0RkW#@f?#V8fV;w=EtUW|Fcz8JgmP+MUP z&5@AyV$5AGJNcm))xxl6r5NL46!wHpxiRviP_!6h${7XKSE=IAi)q_?!I(QZ8k&uP zJLB-9)by##V_{5&H_zkoc#RKqb?ykn7*lT7apEwH9Y<u!H0Egl*9FiXB_WEa z2`)67K%YbN%nVe+37VYX`>sz+==F#R8bBs#hSEd==o$$cqFFje=_~?WGogGB^%6V{ zGKnuxoXC0!KFE`^iTPKvt_1&|b_24_<}OmCgvaj(N`mt7vdC*mN|@Y!+#d^q-s#KN zB_%;aoNZsx=Z|^aW-;i$Cd}r)vz2WG}vsul#4 z9Vv{_b3HQKmh9%Vu^p~}!A@7Oy%C{^S1J@Z_}>-K%kw;W)5IhN-{c**u*b;mzN8DE zexD!d`y5;waq!PO4+^EsMM`Jtb%18zLTS7~ei>TnU;KV*2uiY&%D0J{hi<^S? zn~2}zqSm_vgF+P_Mm5Kv@C{Gb{_@5%7q5>Ft*gFa)7bDukXnEXm)ce?aMhSx*mR>H z%O9;F-$V;R7e7UMGPP$6L&5EoF&A7U$~G?WHx?-PElPa}AHcqMqzfH*8frc7{T>qc zxGiQ}^sbOYFv^u(?+S0eX@}1L={1kqxg-aBnY#cGjMG2p6-v#P9gJ2}jppeU3U!$* z;Opb1gArMCp^&&GE3Kvi7G%_RU2su(3XJD_zH^KWf^prhhdnD0FyyHBM6!6_Krja0 z74|g8sMG|{3b0K{+x6yAVfo|{jITNvxXyTZ`jT29TW?AZFuHOiPpy!O*3CqU;Gu$J zxBw%GN6zbxq2r-U?p%Put=F7jRQw3W0)oL-WaM=)LQG&Nz40K#48{s87~efAygs=! z4TJ2qx;VNzIekHI-2le5E!y3Bls-jGTfo2|V9+Zh26o3FV9=+i8_%9_3^=7T=Tk76 z@+O;Oe5^-ok71ew8zF@xbzVd?XwQDW$hagJatQ!9u!4lpDHBTIh|$_)XduYWPa z?L^no)Q>Xu3c^FXaq54M0D9|f#*6JJCz*K76 z#XTf6Fzl&R&V@n_iVSBewa5Dwj1;3|$dMES7!%Dgl8lZ~_727ZBNz*d2nOlb>YsD4 zj1MkO15DMM_8J4`82ci%0|@ZTJx zMZjQo49^N2fPs!NO0qddxjaY52%cQxu2z!^+_rvnHCzsbY3p|Y!y1y*g1!{>>rPy7 z3XHxE2A~m5Q!B*mU?_^V13yXqCSVM~C|kh*&!}yHg0Es9!H}38L;V4cF=BO$${ZbI z$?6#JFD@&AmhFed05uqr-7!&VPH24=Np zCWVecOe0dDQW)G#8n($dZ~q^HTynp68cRVJlciwran znXu7OW-17SJH)_JePd>&lW{-bDKaVK;;AZwG^hAq$}#HfU@$vIr99763YxVD2I<#A zz&|<{hY&QDu?amX8yJ#KMoUYkM4FxyT83&QQtGs2P)uNh*pnibp%|%DgK#myfyNR| zPYT0A1>wRUmca!eI06QC&s+VhR|Rg{BN&`O4v`>WG1_suA2nHVxb8Zwe8KRKaYCgG>cBv3d zSjuif_k^d}D9MMSGQOgQO~7pg19I3@SWIVw)Cwzu zG5GXdLeRlzH13k&rF5EF0eu_)3MMC*j`gbWD7FH}MXdP%)ALxD?- zCYUoR5Iyqg5lFx>#^VXh`DSH8xmwvqM%i$TN(H{v_)lI~X#e}&OjrX$LP$#8b`wwu ziQ*>3xf1_VcSf&mV_6uNGD+lds>+Ta1hU!K5Dy8VNnu@6FK%owyDl)~Wtiu}kV%3A zg~nctFd!i(4x#cc7=bZ;k^_Fye-}V~+;h&Aq^5T7P2N18ZRvUn2T#SX-#OMV{dO11S5#Bw#Fied$gc-HJzkV1*6?I z3hB(wj`&NWm`#9y3|ulu3Z3)wP9c*yI*KER_4a{`Ax@`|4@L?6j4qTPXT5)l+vb!r zp+zKE&~e!B!=H_R6*obcEUdukk${0@xDD|}E9xdHG{`OBgsIdZz+7riJb^$$5@Ilr z3<6{EbE&$^Hd(D>1;D^%-x}jp82@gK@oT1p2~Ayh=-(x^7=mHhs$(G^^%K`QX{-n% zRB{7qfB5@Sl~SozFd5-B7`^wWqfvQ9^d)vmExcRIED#vTh-uI`XQg5ox$3qsC3!RjJhB~1;HRRK*$A^7jy^)1MJwoSA-J?-zrL@Xp)e? zXjc?zf%Qg*TnaRFmw#nod>+CPPW{htCHl?dH_OW@?r6}VW+NE3zFbsk)wIKl(4?K# zgB3x99eENU7(p(*=hNzIfF1%D;VbPY?F%DhLmcFEfvryINGHr^3)_Nn;ppy`EaUt( zUAktg^Y{eDaa{o0NIeM*NSMyx71{>d!9Y9!j2_U^y4Z5h^}X5fB@!Z_5CI`Y)JH5ez>qhyVj2_+W~#pjX>4sK`h! zbn#u(JR-p=7O5*0`S%~}(6_AL-|^<1l~gfLlOUE_BrxzFCyRB?@nt!xdeY!Ukd%VS zc<}c^Fz_OP=-6rvCVsihpLZ^WWSE5r3^?G49onW@sqSztgd&yhqMADf<3l9!kL%YZ zh#&^zz6)5u3&d=L2q7@;@8O-W$T+e3!%%=mESxNZ?5LFwN7&FEUbf)kDwd*BjQ5SV%LRpz^#E`S*>0B@O0&QNfpOgLwFJvR6 zgTT1BfU~g3cxQWKh6Nr`1P6g(+i(^Z8D-6N?2wJezCmDE!XiVdPNt*5U;tR)i;N?( z4glk8i;4^p7)BdKXgsDvHcuD6$e`vP4XrhG1Y=g%A@NRDxx<4xT18VkL@;J#H9>Bj z8=-3W1MumIjI&ZRqFtrwWL2C@otn4vz@U=v)Tm^*5$>qmzWv{i!MJ{vkpx=51j`_u z(IL{G2*%~vf5b&b!-2L(Kh`i5+Q!g!hg4+nBNTPjbsQjr@NlT$2=TDL=(w;|euTZ8 zPh^mS0g-_R0wWjT$_Bob&Zh$4>(35Fj{#B&rXp) zT$`KtBk~MJ#xY&Kh(*3esY$?qdDz=`<@fD;nuM=6g3* z8J0Wa7+#!A*&4sxt5TIQB`^?;*;eSVl=(fJsw}`|w)*5q#VC)Jr z(@z)o4?RKyUXgWtL?F7CKS5;<=YMe<2`gZ~-WbtH=orEioV)Mp7By^}{0MnXbAgPA zjc>uw4^Q9DWO4PSrvg1Q;0@qrZ?{0MirgVEuD(Gd?&Ex$;9YrWe`QYtWv?$wKnUKbXp2v{N9xoS}d39s{qD)#~?6-xs+w=07mQ?UVIF1kKsq4TxwwW z0gy32l@fqKxzuAYW*no$k8pPzf-%3y_yAy(B$2k@$JXiB)=9BzAP-l6zq;?CW!x`w zO9aia2@NknV~k+*$8KG1j&arGM?f+(RdrD@9Mm7wr@DqqN8?5)AQ=-M*&sR?8fX}! zTqOrRD0vI*} zBVi+{G5BDlDv(Rv1i2r9f!CqT{|xlcP+KOKp38*@jMS@J9Fw}k!(7975*Vq?7gv|) z8l(qA172rf7`?0Yjmvvn_P96lr5c*+IDiHU=>RSwFdB8o12Uk>Nbw?+^Sa&wG)Tk- zBg1xe_#+jU-0!JUQq@Y1&>&5*5(hd00t5cYhh;F@<9>!(RtA|UBTT9cHVh({z)oP< zHWvIwzJ?2#Yu|<)S0rQZH@65n=S9q=Yz@Jf>DZECAQ+-P$N=gH00YU0*`Nir&qou% zsB=j+`Cu4wO%MTdsqf!;`g1a)5gGOCbUFx*j zghmX;K|{4YSc`7tE0*(lw2d$197u-iGzpCTvaaFU*7%>{-_=URKsE>uu#Fgu-KsH} z!dmo&k%gL^CEFlTQWZMJF7yy#z3_Ksyg`5NTXVsnrj!Vb)S9jV7^?dX7~Uf=ToD*M z2JR{OQv~DD9v`mJFhpP|NA#BsFSf(_d@vN+%78uYbI|;DErB7{%F_DA)g=khcz6iG zSX%iBySZnu%^Z<2%1L}>fB>0^d?Ny5XFDs?8$({~B15&wuCehk z^MyuO^LfrYK?F=(ZI=~zmW6EK(~Ejij;l8W5fF^QbcFR?s}&78voml3f0PqAMuxzE z=P7EI3j#w}WOQJ7@JC>DVlc#7+T1|>7n7>LUG_r9kTySELVDE&FvJn+nx@t3E+$ou zGiG2M;I_8qjr(IqWLyvdZKIs0r0S+csg$GdOYmO^x|Sr=Znc73sFatx`4WQ+y? zhByM+Mvajn%LYrOAOezMv=GKD@h|&LA3cp++TlTZRZ( zAOj>z3$0_bpl|B!;2E1rZk+pdg@oC&O9JFDPah6CoG{ z*<_9pqk)gaFwAU06ak71(0Qcq4deQ*Bt1upqAYD~tx4+--4G0EWfPOEtG7=MAuSb) zYZ8Dl{Npo%A+0v36*ba0xCcC|3Q&<_6kQ*)u%f#@H%V*Dxm7qKf`VT zB9u(#7zK#HYV+D+JH{_68(fR$a_HWe#4yCa=Ch(}w3U>228r!qfMIBP?3)Yrlt#=l zNOWH%d*Gzh$QS>b&o<>!?MGxpV8DMh&Froy0_IXgM&cO>7ho87&+fb{c-Xw}(gxoa z)#mG)>szbO3!yY5y}Y|igHjcm!A>s>Fah2LD@dqaQiIXDJz!4Q3hG+arc?VmSv}72G@}gU@ray_CQOWKw=+ zn?fyIAsJVEEQg&-0bE?)tOBFBO`&SzqTp@UKq`=nAhe@x3TAbVWW3s-@h`)egMxIJ zkKs%mbPUxP;?W@hhGLiu3`bpIu(~4Cg8+tV#Ey}a*v(sKoD5onqhnlPB1Kx-!=0@P zu0uOXQ=U&D7?cYu@Avk$Dum@VB?H)C{S3~@x3WwhEYguJ7>4HEJ2LVN6^< zBXA9UqrBp1P|JX^T1=!?p!%!?SQu?V>kAZQQ zj&aDqsA_@{Bnb@jz;TvS=&>RhXc>G-%5sOMfWod1WH2-s8RS1|7$cD)EAzs@p-y0f zTgHSgNd@*mM4{-}21A24G{(#@Y-rAjD9q6`5Dj_~0+2zu@KUL}Nu|uA>G{PSgJBXd zz9AU*#xXE5J(sMw;?x=i14?f+499JV9Vj^RUF;k!IT$B=Not%H5WvOlkj@`)FmOtW z^e{x94_$0UeBPOXv00LeDnbg))*MVDCL>;wTBwdm|D>Ht{TE;WSE7W`# z&Eb}@DZSUiw^XrG~ZzaIMXm;nAPqAEz8Ae3GcyNrGreg$& z1H&{McoYsD4&iIHQ^(yER!G&ySc88DM&2Jwbb2c@sKF^1gbT=|Rx86Uh$~bvo!V3x zP60ov5cZB7_YU#xFoYuTFbRhCYp|st=><^z%YH+!r@Kq^PN*L@_t9+ z?Hl{9lm)5@(K#$1Yk1?lZnb z!^k`1nz%wCvO}~C+<=cw49KM<-ppdeEFoV#p#WeY8H@|+7@(jK<`bAZf2je6 z*@n4u07G5D(XBD6ba zT>}>g#y~~^!9dI4T!co{l1S$ki>GKAGzbF0L8iTFbvIx;J z?3RQAItC|W1_5BG_A%ZE!k;ixNA%8=gbg7G$yVDx<4DGy|P zLM~1KjJ&%eu7F?=%fLV|2paxaTwxFy0q^tO02c^GXp4_2wW7abFt}kDb|j&|QYju0 z#(c4_4#vB8I=r39K<(4hBXHMn}B%9{cos z3dV&6T;$zxPFTTaU=T8Zi#3oTQ+?w`JOm@;Tp$^C)D%{jLnd{LjA#~pj-sckBO&S2 zFYmR$$mT3aZ$D_vO671XnNBKI3U03Tz$n>4kVr6g{qMklhrm!UGQtV~1~>*G!vZco zf@3(YFRl=6z=*jhmtj^)FbWZKj4;3#cMPv7tgxVtu_1#R#(b^_M(zzB7ILcY7`glz zVDN~vxJYH;2*NL~AMI)+xfc0ME*%Ypkz*~biLasX z3bqBTjDos?2kj+j)+Q{>)J}W21TfB6i9xV<){#-j?zUkl1eoApOpZEI7g4D785nDx zN{w=I-%M2_whYR}VN+7U^Wszre)GDZpco}`I^pS~Ct8m&S<*a6y~yyLyyMnV>d|~r zUX{bDjsl#3U_(17d1xFwe|8LLK%5+tCwNP1WEw}qkCt@|TnvZ9wt_;vHd-;q7_CP2 zoU}r*a@Y_1VbBly*zP*lVXuErnhW zxX|ExFc?&|uAwq$wW_J4#zCj^9O9SG!Jc9j-|2K3Bsxk8Xgs-Gx?ZoR>$%LH+AUdV zmMRdXQgL5xa*Qifny8TcFjEh4=kH|J#2Z{kK>yP;A#~q^`+P$^#6vv9L;M4p8eh3& Sbb>Sh0000(EUk7;QaLYMT3L&VimiuUbWl9gr)pXqRY)=?zP`OnGA4e0eBHa2oM=kSm|Hk@ zwmvE%*lNAJc~FvHL)@lKBx0kziexz^9+h1<6HkzFNHI1g9^t^7s9l0TEF^S9E8M`J zP><3sARQ(e6Pja0gd-)e-8J*F5j6G$&6#MVQ6hZD?vxMGrPCG#AKri zM2P>&Ed>Ju6b}vj!XX_R8Yv|v|Nj2j$bvL4Fg-ar;L(jvWq&&y3%{gU#;s#XLqq4= zm}PvI^z-o3z93DSJy2-r-MgA~IKqYyS+AKWArV z&d$tWpX1=*-?g>0kZLk}LI+io*Zkac-iapscH@cVt#ag~;@&yzl4CmzI_H zqwM|Skit-7>}Fe?~JcTShzUz?|EzhhIxSyNP8@IWgy;513&(|IkO?vW%r|M7M-u zj#xE6EhqK4BZyNn@Uk4#pm#MUAG3a5`{Ba+-oBk>J%LUxzmI6?s~FFhZdXD$$eecn z%Q{j%HQ%?9`@t|~JtX$iv8QlWdPpmzWeWJ$w&%E%{prsC)?(Y24)M#Wsdh~N)K#u` zTK(n6lwwKa!kq8Mqx8?MaY81$fCKHiU30^fE z(u@t{$)&`rk0cWdY*|nJ+jso(*!A!8KL7v#YIIUgQvm)iDjWX(2M-qgL;hO+DL_&F zZT|dNIR0sca{h+ML;khpV8WZ|pZtQK zX4vMOb5j!Nfw|{9L)*-k^4BMU`0&2xJJ)LX&m#z&N@p;ueZ~p$~B^#k{jFF&z@#A2Vz(P=U^cs{C1Wxz*z1?E5 z;2(>9{I!nh>kyh3mgdzBOoWNqu|_t+(Bz1QiJK8n zKYrT;CtN0y=(W=bCm7H1+^E3>&VP-^!9XBh+`3iDym+0@*K2_$Uy{01(06YNp>N^1 zvH%ym$$GlCw|6E%z;rPVtD4k zgyv)dPx1|%a4t_Dn4r%PF*1W-f-ZGS#-PZHo>Kms683Lul%&`z=)3n;@VDRzy=#EZ zkC%IB5*K}7La!H#ac+YX+8u?0SSa{Az=R&R@5py_8!*5LrAIV&XA7$s^EELRz=W}6 zg1jccgpryUL+~$E7UOyvOfb~Mc;BF4T7p=Nr?HbNC!VvvE0F;o*{ zl2wchSPXtx7Q?4VjGkbL2vPS##OMNl{*VWYaa>t~R)9h4DK_Ku(x`!c2JxJj;hhwq zi4iXpq9`*Q{a^yBQlv~xK?yy$O8oNGX%a(QpBO|9 zS&Vkz8LP?QD(>(96P2mTJdB_owC(I+GZKemKtgX09lj57nHm8R1XcT5hD1ieKL{mk zrF=(dZtr1bic|GS`A0nVQahs<6(U9vF2>|tg3O;lj0}SqG>M@KI*Azex++zYf-xQF zt<`^<`80zggOn*XgfNs_G+iY3@Z5pQl=?^Wt=T3=#*GLf46LrN#;;Lk{93pMl_}Nx z>c`K4Ta+2NOmPrGSL`9?wBX2iv^Z7IEXKs$^C!l%gINqW5hJBY3?U}v>*K;smQt}8 zXi3N|g(4q59aKEW`@qeV#(1%7Y84L?I5SQmn<;M2Cbs%aH8Z?J07Ae2bZ6Z(TlD3ty1$ptP``snTjE>pHk5*eq5W7GtbDB7Z}zMNM!!$w`Ebjv64 zI4)C}0=dj^^imV9!U0^Sw%jB#eD}lDgcvddm#JE0lzJG-)C#*8%!x7ize)@TT#Rn2 z#L)hJUz^Y8OTl)IUJdSNS11&6efkh8lF0BxMkxt`8AXQG+iJ4jk;q6|zoR}OpvVw& zi>=}fuuO5?C^F(}pMQzt$Ux`sxSp2qmn|el8bwCRht;?ZQxm?IoY;&9r-kfnElwS? z7!|k}M){0!2N&Z9W-I6J6rJXs*Mj~J2^Ea9bb(zx7*^nB! z)~I~`-n;Zt6U@1&h>jU1aGBC|uWg>hm)Fl61$>)P$ZQIms_$AS2S3sqxh{RHmwH84?)< zKYf|%tZs$F>rZ7WKwqX_q0o@(&foCO)Jlk1j16-2%`V0{vltErG43hE;N*LZ`Zo1s zhSW)KhG3YQP|H@cX^n<+GhM!8NZCf9uA z{M`>AT%}Q&ss`lCjQc5i0yg7mGi5JzLVu-JLPa()G{#HD#1NPhL+JPap<;BBz`FqAe$xEd>-ii_q6Esl54(G=>7KqGUMr*??%+n6S~eeH_>LwA@6KY)BwU& zI=%kwn(r2J|J@ms@McOj!y<8zze41Z7!j}-Jg?F4vKUD$28bXa!kkx5j7b1NK=UL< zW*SWB4y0r;=$cf0V35Q><9r1uw%kt#S=aVTI)CrXaU`WH)t{u9Ybt5)GPFOrvNPM+iU*nD3C#ltO(wCNGnX%ur{wqzAn03jQS)Nd zdydTzM*svZGGn#6DMv=U7eYY0sp`kH8%KsOV1N*i88LMJwh%FtK1(R5+nU=n4Z?gj zg0|;N?^e)Pv42b>hNkf)Ch&dM%Z-i0**@dNP7+tCS;YjQMi{Yq%Vn?e1-%%8x~Zv2 zXb=YDeuv-R-?0{VP$q_;(rQ&4I`*am_xFKrLwDFs5<^L=)dlm|g5U3JEwUNTPKy71 z0B0s1UN_@%Z68!nWKbM35TTI}>If~X zYiHG3mvZzgCU6}0M5u0Ut>Z3*#@!7f#Dc+xUZ(+V#bU)Z z;|h7maZky+6T+DF^6+9p-F&fgmrN#itWhgIeIqdx6Gn_)uWd-Jx0R6)H#edQg*To_ zr34NM;g3(Nb#aFylgT(v&Q2T|B8FmuVL1>8zgOwPZg(n`a)+yFa>#Hi5u;s_vw>() zKY4jd60aby1dY0Re(CMPUz^n$UOs@kKFoxQI5LWnHbq6Wv3YEEcH+&;Mwu`ewV84k zq)YAWHYy~H7>$#C%{4-=Dc5SoUx&iI6fX#Beed)S(}Q}oKnU&2Yrm|~{FtC+j=E2edq3p>HHS|6nO$=Dj!(t{0Nd`)W`6gF{qHmbO zCZOQ?$g9C|NT!tp1%Yb>;Vr^M>GMI!S^o{HGg8SodTito4bWl z@y}lm=2BJUpr{n9+}H~c7_YNtU|4(afl%D;9Q4Eq2%l4cQDHF56~o#yy|%VC)7c05 zfVOqCwM#;=k`{_FYUZJ9A$SrT>+Fj#2BD-#Emkv`_7!7@6vF@v>|;>+JuG+7`NL0% zJrHWu-tT??hx2ypM85V5EC()3A}U{xuWx@>;$hnVgBw`&yZ`vcZoR6+`aLBC;ew}2FAMp#v7@8e~SXK zm-y*tieX>wg<Q4Yrqu3Sm27^cH~!kcH`7mf992CC6J@tGQhEHT{#B2jZY|Z(3m< z0#45dHboIRhKYv(5{Q-Qg*0QZc61;%C>@Ab%z|2ooaoa(lwqL=CL;{SPDZ?P-`dvD zIa{-AVCIcv?8^txJAZo5K>RP<@rJUI_|y4;caC4QSgKe0ss0Y2Kq~k~aBP?Ee$(rQ z6rqqsGOE%ZpVj_=aVY%HU-<`RBXIkCPrrM|jWI43Y^AZ3WeS<_z?3=kEEI$TWn-qN zYia%q4B2ul)g$$AA9R9|z&qK;)rp?2#nUgRCm9)&L{W@fbkyfr9Z#NVA$kq$-6GLQ%azUPZ$ikd6^J1FgowCEX19$ zig=<3Fg*OEBF`7CmT7L|tsSK~)rKeV0^SdR5C%i;LCnwwlNs%a*wPx|Cp#l;gTba3 zq{Ot;3wXLOub%(#lBwVa_1DY2pB(T0_DgsV$$+sC`96DsLU5t##_QDGnDbG8E|uNJ zSn96)0190z{tJG94MZb;&)vWJN+B>l_@s@ct5}l-Aaup>&`}7}^GjbAaXm1W8k2T4 zKN1eF(trPZ`W4*aDcs=VlwADsCA3OpoJ>fwz2~Y{(2s`3oy|}G{O2>2jOFM168Y}@ zDnS$^95sHj;m89RXnrOnVRG2l1uq9qS&xsOq&#up0jp8g$SYJZ$hH^^voc6`gn3vkmzjqX4UAAkfMII~43Y(n4ZaC52%2Zo(_4Oeso|gt z2cnS(JD~eb!IXTG@Bs}A(p?CLK%)TD=dog{`ugy&l#_Y5M_?3~3VtjQ8Ug6>xqTE& z$tMX%Nhj#^1BKz>XU8k)`Ng?4$})D-G7t9=3;tm!(kvezS3{?Z$smy-pCp_l!C)-d zm<`-E_Gxn;vy5fgBw=TiF-X*EdrU|z&xatq4+9t|DJDNjw%)!SDz$>?UA{zzM-14qPf2YX_WbY}w?47aeR6H^dE^cp=WT?-84a8yX;0O!o0Lj)3 z*+essMBxKkeLQs%DrbVLAI;M5>!28#EiW?{d`bvx<^%Oc$&j=%I>WpNW-sp$gyi$Q zH~_{=218z(yHFqsUT+7KZIN>awi%I<7hl+}dQHFx2nN~4weL8V!<3D zCmoIV@WMtkoPd9qrr+b2K1IZipK|$uQdH0+afY}Nw^AySYXD1E0Kmmp-K9^fIBbXVuUxS5i%NS zpaVr?H5dv(X8!R+mVOUme_KuOfC61Umhtig%k*Y>dHMo3Waf~=6u<0vVs?00WgYEw5$VhHKTBfCrT{NNq0a6qemVH zsbCy17`wX%F3!1kH848l9!{8ook&uBQa;%sV=#7B+ZjT*%wVW&G?1~riNE%x)$`t) z(G9R@^sA`~H3Fngd!RLDjl=kumgx!=h=z-Qm* zQ4|b_6c2??x>e!<1ymz08w=^WpT=&|K^n}JMuDJ!ihhWVwCeztXh61w1G=lYISCD( z5*lo;kd2c_2HH%aZrPYQt^{mOLW8FQjen7D(0*eOcS-f!hG5|5Kk5+4H#GLJ^BoRD zj)9Aj2+L20{HBEZ02mZwRivSs@_M|5QmRxcL5^0h0Hfk_GY)ZR>_O){9`Gpy zMy2ArARl>HJ7yrZ=7c@12^RoxL|c zGcyi9Q=VdJTaTx}wo}Diu26h%PU2yD$~iSPJu?k9GYw0jiw2|NLvrr5>R@!*Z37GU z!6qgq78c+KO6LL%5m3SUKoxy$v{nD1(*h@BPmYY-S(q3eUKpOZL$MQB`jv)8FcLZm z-f!8#01rdguU{V;9v&VV8orDnu8Ib02cq$8zx9Z%70c$J&Kv&E8;nEVQS+naYkrVz z)Ngr5>HG)obC+_l65-$tD85|I3l}X+h`z`#wE^<2OsNd+{PxL|86-}Z0+`0|f`IuD((POG}WPij%hxAndTEJy;D|yNV=+zEeSGVqAI2ocEtw_UZ zN5<;vNibrlzLvf_@Z}3l9@gQHzpSId5!HTc{kA@ihQk}-sK53u>i0*((WpO)uOt%i z;>I3=5tf6|`Jh-Rl}bf#zzGUoEEK(9#X<_KSS*o*6mHAGfbEw7;^7e}xDR9;%!iD` zeNY6cAQ&_9X3ppq@vxO%0*TmyC-4X_0T1vCky$YrTk9AJ1wp(+k<23eghD9dp%5~1 z0>2QM)zE}F7?w>W1KH5w;E)QzSbu@fj87G|{kTV&-Jcrrv4>Cn8{F4ZOI4VHBsPBR zG+4^nmbkPq2Z8*`MJ?KHCiU^_o1mV|qNrqJh08!;O5ltH+db&op?r zG=d4Yo@*c(Z;xR~j66*2&?kSw(xAkXks$T;2oAbq+Gntl4J-`M&D$;6b z(02Tm8~JQcK^y>yyyKUAUUV=p*8oEu0YDOA`P_Mrl0y`7ImMj|K~tQMlo)sPbgRVU6#!#gexY_D2%r;3$paAS<2s{j(+UtWCilSd06Os{Bhqf& zR!>e=A>}h2ujN^sbw-1%4vZI@S2kg7-n3|CJPdQC_I+d9XyD1sXadvl`fm73LlwV} zdkr}@B-wZE4T0+TY_0%lI7C#sLHccQ!M~x1kN-VegNNx^#m8y5ZXbL`15<+sRH<$L zDhvp%XflTjREj898A?W9=p&~Rjc3$$FN}mvR$*NP8F<6=yTfR&*fLe1mhUur7`hJE zCF*(W_PnKJ*l*SVhhK07xIm|8Gd-nv0F8RphZ#o=~TFvpU7Iolc^LyR6S_O3w`AkT!4>AD{#6cc!%o*o;l)!=?vPG}_ zXo`WD8;AfdVjg#Yvtn>o?wPeoYf7%8xg(eB2=?61Ezt}J_4#x{R<;gC9LvQWa~nsuyTVO0&c5oMM>m`9!0;c?M?y^a4XE-71RH=%O&U zMw+0!-Lf^S`WiL+^oICxdd?`QO`ZtJm}~Zs!7KywZ!O7)lnqOR`^!wmWU~jrqCS*b zhEQs=Me=%Y~=JK;u7*g(>?M zV9+#z-(loo)?4LRD%IQg57S=Y0%k$38E`Kn(?hLn$g4z68N| zVmJ&pfQm<7o4qs<;o+-m|5GBr^{SPyZ9-N*ygCPu7+Bt1F%#q$@ z$!JW!tzC08&sHZGFs86z=pnMon!xF|?g57fSuvOkoK6^Ou`6a7xoAqit=*e17z`B) zOfg!u_#Pt|*fa`r(H86-{5bMqjf}m-O}ng*QAhz9*(`#QgX;)n(r&OAL|0Wc3D0_a zWnCBh!C=L}J9fYG zHN!VD6DaX)?csL~9%9}SgQ0R!EqY?Th8|+R57fr{@Swqi+Y@L21L`48w_(~h0Xva6 z$r!cOdFY?c+Y;0?6b_tdV8+9rPIYP>t8nivUDIM zV;8{~lz3PO1(6FuMj8J1WPe%YU`l{-={JEvku8EDwTJ!n%0IQ9Gt9n=S&!|Z#FCFAY!nC78t;)r&VX`vL2pdXDGm-RBi9Zs%ySfSZNIk+moQ1xOpQl2#S zu>L}ojA7M-rRy^FR~ZaI14j(sJX^oga-K5^T;QHoBm>fnnggm-NQZ-p=d=6 zdb@~!cASZVQG;R*KiV-T(gB4K(aYFQ+CKp-KxfXXdasQ{0p2FA|GZwG@zDX9$t0wfto z#(A67YPACvR48P{0HaC54S#L0#l{vd9QV(Yw0FS+j6MMtUJ7+#DG&^}zpkc=zSs?8 z4}gG3Bp`OB_kdXVCq~)@bc)20b^~hIpe=( zA0R*pHj<%wD2MQ>rE`HZA;C=YqOk`8gQo?D$%BRkhf>QV81gSi{2>Zl>`^Acc}Big zV>+Uw7z~D_SZcjiL@v;(h(-5(! zF`3|TTFx`lF0iAyr6o$gcX`fsP`V)lxjqVDAm1gg&uKUI z;P&_`TBG8|`JM~YF%MADAQ)a)Bu}j0*n?#r2BXxGsI5yq9o-8qJh4RxhA_NLxt1)( z9+DwG1A)KSyQ`~vA%pdERWO(gJijG#YV4t7^O@GIc)owJtE+Dau^7n5L7g>KlK`BMd zti_uI1NylwJXkN{T$DQYv72^bZo#I5!Sl}xt;T9-m{#=gRwEG-3+gH9ia}GI<)Ky{ zaF|vdiFyMSa(((=6AauN(<=4mA~}IU28)0Lwo#%Z&tPDX6}@SdRa0Xx( z2FFuDuGiw=zxrZmr0d_M7~K4hs(m~nKu{sLKrncT!j4viTV|o+@mgpGUZ%2H#zIfM z4?!@Bxma&25B&<0AqXG~s9dn2sw?i6?_ng(W9AB?L4SHSc&caKI0)U<$^%Xea*j<1 zurU_&GG`dUP_ny~2bvgEYfrpYN!1IG5*>`qZpo%^6%5vCK!fMcSxG4Q@JpwqIs+wY z<>{h7z>tvmtrv9wXjA8U6R1mI7$-?+#z6-e6?6XBjXT*TQpjRLlz7I zBj9Z9!RgUQKRz%UoB=WzMSLmXi}l+iUoFPly4eI8Iu>H;+_lu&Lm5kfT(iZEd^#5J zqNW(Z$Z2a2IC}#KXlU>;cqA7bN%20uO`GJH5KOXFGI&d60t`}ee4S$2ymau~_JCS> zTF;^ih6_UajaJPTa@V9DW_=>Z(AlUk9%||lP;N*)jBeG>e;^xdl=SUV>X9CldKf_f zbi;WNG)&2N_=TV(#gN&sP>jpx%xuEX@rXIx@i&>+;7XBH>tG7W05rG&1#mDH zVDt(vhh+Oa<=U(n+^}FHEI9K|k@$Z`hc@(UgFr&WBwXM@N<8OMdlj9C7CiorHm3lkYS8gOSQ^hnAf9UD`;MH(^J zjDeshBp4V;+2!BU%48Uus7cx6-_uHDfaz#xa>0V(nwNR#D~IaI;Jku1H!84jHc5!epOFH>$GkWtDuqH%~nzy%$l6T2XP5B*3+pjkAETI%gloF*PdT(H4d z>}KVrhHiX>&Rn0|!z7UbqS2@oq9lcaku>peg~*`1LPtW}gkZ=$e4CFpkO99K3(@hb zv0z9i&v7gYjnZ%CLL}f&xQ+X6nR-CUs2G4DCJRw8DUT)f~?WGAN+Z!N8sdwEC!4E4OKd$Y=%wu|O`S zOg&h~4g?tj3j%|&KrUz?O>PT^kN?b8D`WQfk*YodcXOvr`LRDStn5F!IiED5SbMd-KN+{48= zCWBVvt={q$3E%uha}R=yRjr4?bz0^kb87D4GLr$O)oPIn!NvNf>6PkX4K+hw2-XYc zqSn@TzTNWWAgrbBtVD;-1tiWh?Sv3FVnl`phQ18I1$Z#GOX^DKMqJQn$V6M8;0%r* z5E?ocK`}Tb^B}iA1Y;k;XwSxKemuZPph3+fO~T=rqc((V8p$YXXrPgPmvH=9ad)=i zfi#2BU^Y0cB`%!(ZFm?aGSohj-g_l3=9W6z@Bn1!Xy_|~CmLmvi|u$oGG6R68>*pt z6BnQ49{6Cde3V6lP3OY##D1<#GN2YhXs`(`;15ZgQq66K&u9UwUFc{(?3pa< zS1DWup0FK~dyrelC%kNNaj;!LpW<>vaW_8QxD4WO{H!Gy=CKf7W`GT}B27F~6y%<6 z*TYypp`mz$Ar*v0+a89O=8ovZuPwF%-YBy)GTio<*QU@Y!WoXNvNxt!s(2yxP#Ois!?n41-jAVlpxi<3(~JJjVsslfGcJpFmB zr+p7IZl}1;SkLwWxG;Y2 z0ZT7^u9ewwScWrtfU~+|WXH!&Sjg$KdKehH?}C+ZiLFY2Mb{ZUz-f>p~~5M*G$|@$*xM1DAuYQAovL`^zDY4|F=|V~y8(qT+`AOn-@Dte8I81Ja_Foc-~c?bbpged|7Y(ESlZaK zI6f~kaA%N^gs>Bm5JklmjUhp`L^T*#YHh`B7kOC1mdCQ?0sVNk25S-`QP-;4u1!cw zgv$E1ahsRG0`CLtJ?Gv`5|{UKCK3989v`nW7x*)A{N>*RBk;J6@!~W|+!mrp5ZG3Wa^3Q*On4C-m zdr=77o1g#j#}W7$x##UkVQ_wa{%?>dI2Bxh*;W{v`XdjH1dqX!}u28g6Y~Fd{=!Pg>MRmK`>{(dj;Ll`&H2NyXL~-{Zn8- zxA!q_e-37-wmzD{YJ8GoM&{z#t+8ZYa$y9L8J4{LS2%!YA(^!@jb)Q-FP=*fd8Fho>v-T&c-`>xL0 z^Y^P27@}Uo#N6COr@}-$8J{rd3VbFd()lSOiG>6V5yKG*heMqTq43gDNTVwRhKB== zTfNBc-3yQvjP=4rY2Byv9?PEG6vB;6BSlf5OU}dc z&R4JK6I{M0upQ@NU8mlRm17<&t~Q0a<2oOT(-l7Rh#PGRGoK-%R0Vb6 zj7R(3VB=>H%Txu&(g}~S)}|1H^*Sdpvcf%BTYIlvVeA#eFje8vIdoTF@1uUZ51oy# z;(aL0q>Hs;I@*UqBoCVwh5JwlK^x;nirrxHs*pIt7;o>diz7S4Pr+i?>iZ%2Yh1X z;8>f&doe^*&>tUUc^n|#j4{P_7%OFHySMGavz`|rg4WQ60OR7JMpKYrRQ$~m7OzV%G$I&s?;=Y|dK)*34GR7-182WS;!1z~ov$Zi^R)Rqzl_ezxQA?pFMk+Hj1%0*l z8Gn{7g)Ka{oiTQ-T1vZ?V1$SY00tCJG0QTXLc-vv1c(Y#O$;oB*K(wb0?!V!J_fIT zTVTwd!}jNE^!bm`Q5Tb7yg7!h-lJFi@Mey#;PJQ^g2A~c!mCaGEoiVbLsn2d9+h=~ zVIG}vw=qsvFinTv0)yX*;2yY**d2gjH)ALpC1El)nggDLEOy5zkv&G`7-P{=s0uL3 zeyYciFH~BV&y&XUT9JAUVS&L}xH(`pa|qQTq%y)}q^yL#e}d7VDqwzS|59?k76b3Q zD0m(hN)Kk40OJC{VCXh39vIXTYNcGRjxxowU6)`m;Wlbi1y3@UOHMEZ19(_g*kTS4 zSvAP(-FT0CKT}L7rOp5hCfvp(^$Xuz;^`sC6z6G1g2ANQASjS;4mH*aSz$7?Rv&Oo zAqNhk!px1}!0I70afJi*D)|MOVy)9;_;WS19cedFVLX4!WCW%6KB9h#*dAt#laZ!E zXir#-eX7FPducM73SJ4u>)%!|kb;6w@qEILR;4xA&KAHp@YwL&_3Dt~xvbzXeok?1 z*M9;VPF28OV_Wu zGV*38DfF)^=Y9rDr#)wj6eMGWtnl)k;J|r{lqs#t<~c~g8VBP5!GNO@41o=&{T zo+o^lW!M{pgE1t*m>>yYqQJVz4Pam?|p;(cYLJq{s;(U>;044(}r-&Sg7R5Wq zQL2LWVW-n%gyngdtT58_+HxS(5a%hf!flf=C}(TCr0=y)xOelp?)!yvCa+{Q5(jAiV6m|JDOx9MUIG6q@<$QXWN&IUj6W#_5h0s~m# zM^rFkf`Sp<@ey9$12CLo=rr^dz+fBLD#HRno4$Zk0EHS!QA^b&2u7}gr)9ctTPzAs z5tRx8l+VQoSz$8Y0fIK!^xkBJ5dh(51VMs==ZyeWLAOBY1m%4fg>?Z&K~;Y_hrahE z0S3<<2gG|22QYXaP?w8?QK?j}nqZWvU_^m}TJBI)0gPO3D{2>v@DZkm532g_JiKy$ z6b3M$_1Fg@7^yu$fkT3^_jSQg)(*1hzNN`9cQ5d?K(FiOq^FQh&$BH~uRLUh<+Ml{ zNvW_UILXnkVO*N+YfU)kYgt-}vWEVJWtC3g0KsDH(G`Z}EYy^CtF-E#F)n!Bg7v%#(+5V85|7o7|~{RWg}w%1|Qs-^cZ0! zcnt?+Fk-?`oVqn=v(CXtDP9=LH2MdF**D+H!*h`$4$KbkeeNbJOl()$Nr+VG-dl#h zNrGD_NKVr9YY0k{aWo*DGoGUNriPc304VGUg@EK_--bdb2?4>$yVqS59tto@9yWb| zvr-a_Qt6!NF(#_~25>NjSg!nr2ZDiJTrd4Jg@^>h!$imLG=PySLVpsXLI^3~?puF~ zb5VH!19x+N8YC)6r#+yHsY^}HIbWEpn6yFoBu!?nv%s`(b48^FM(#!)50 zhjL^vfC2==WC+F=3C0cw!z7z;1jA$_nV&5%G606Ne=zK441J@}W-=H*1MmG}gOL@O zG#Qn+FbsHBuOw|KEN~QR=(h1pT8;&}flQAN__XsGEO~$*{ zZ=YF~ql-dwmUdQYf&tYPjO-GNQ4jWwft4T@7&BGe|G!98kYM-~1f#~mnAs{~#vm$~ zA4COZDw7BXcYEWIL~MX@n!)*6ry{_}SQ(>#F!ZVSwljvZd4RQ)Fd6D}NqFx~8w$~? zsHIj6P)LhOsj_g=WRrnOBB_JIYEiUET(+SQmc`Sg)|#Y(r>^u!?Pn~LA@ax1R{o%y z3@b-CUW$A1zT3U*ktW$0>F5KV9Zsax$#YLh^WvG1}v|Y zU=+z_jdI2Mk@~v z#%udvnEb{_lVMqLpoAWt+*QRg84;O2sw6S{_? z$w2R&u_&P{Ky%}!$ryVnz4xywFrNoj(5kqo7Qk2+U_4gV`P3j}jBe8xxPlhIsJwwh zF{i|DpaVb)jGU{Rf^P^E5R6)lgAujBNY@Yywfh<=Hz){e0bt}g7nm{fUoc~IRdAbb z%>ttllVCLZ1A`%L`ha(A%k0RkwIN0y|!SlVVw9(CVCv)jV zuJBK3Ei5p^K`y=8?HbG@d|yv{+O!tJ-{Ao+n(Ep}DY(~YEIAa7gMq((D`Vgc2s8)P z?AK0?fq?-{(E~4Guhe<3xHEJx7`$w~xeF-+U;rnMV7wqN2w?_~1<@R_zO8caEwTrC zZ@NO_P}uLJ+H&Hnx{Xhvr>^tjk*j7o@tsM!f~IMMB4uRu9oSkIo%o171?X)oW@z=P zrs4QC1r^swtutd9t%U`~izXO_=`Meim?_F}X7E|spWsM5QmVJWNE(DSQt2o&ENgKK zjIC~9sQghX$ARg$z{n#Qa6guG!kU9didnO?zymkk4GREpK##u+xC!K7s2P~&TL%w2 zcs+|Zs0zA!JdsE&iIlOEcVaVkTMI(;fmmuOHvb>2pE7$~0T~h5 zgQzezI5_-2%FgenscqZiXVWGvAx4M+q6BZ$7=l|PQP@#L;K>b#iXrAAA>Fz0#Rqe9 z9{0a+p6|a>(jGx7lu{}pReoceKxA_YDiGMPW6s+h-!aBot7X$UyGLtTU78uPrl0j4 zW6UwvxT(I>=!L&kfe}^@bBz?Tw5TzM2i3=5z?GT@AX9e&Wzx80^wM z0vNQum+uZ(Yov7ff_aF;gDM82Jzx=xH3}_|rR^Xv$b-6pn451(AcVmPSOkMzC}e3x zD6TplR0o4WwISta1_Sfu{gtdCGQox*N@E%Z7+M__ngz$lxGsw?C zWI<*|=o6Mml%*KH*1pGmt-(5U3niPUvQB_;$M=}D174M_d@WFUt?gdhwaOaup|Hdn zjj;oj?XJ8RT@^6y+D5q8cKdEk5Dlhbkqn32RR4b)U_d-xvmI8GuIYe52o8e6@;5&RJvf}$z2wNRQC7u_wE3N}uD zV=#gQ23*_Wva=r|5IG~w99Jq}Qn*fg5NJkjO6@u^AzgSW=e4h?FBh%#HVHRo`#AryJ^qs&Gt+jh_-l)<15p?mpz z_Fi!aGJ3RFDxRvm8$-9Zr3aPmapGesa@*QoYyuZwJSYNT&EG&^eEcF{&N zi37zw@fi$rmNL+`gU;%Eo8g$~!)hd#<)1s!A<>?#y^a6=L`Hu`^kFF!k)P=3Q&zUN zOZ}x6YoZUYhPH$U@KR2;HqbIDJUrjkYLH#c7;=Y1D26RtdqsoogM6hY z+j=rjU_dBjOY2nq-vx}H2@LvyqA6>dd^J0}nhV~|qyOP-^n5de@s_~IQvcjpD;PBy zv~P%Kf_J&@d@1E?j!_dt2zO5$vtb3JZV2*B<>mwiIN0(540_!NcD(vn4j8Q0A{2bl zlNAI8k@4;-h2`iFIyw9oi`71y0R~A2(711k}xnPVc1~W7A^8>(OAVx>z z#Ha}jA1&g+mj8Jo2QN=f#<>B$w)`Gnp06qq3u=C9S{(P#a)e2s$f^?Y}h zK-sf`QP~rLFBPe&5xtJofDo3B^1uiLJGKZ6N=wzHSt!zVAcP+*h1w7X!@hp>8Z}aN z0>)%rBOS1Gh%5Ei!AQ(74s_rs#^OjB+l+lwtH!$U&rShjVMD=y(I$}rpB#cz#c?bvq($T=h0#P?dG-SyhulL zZjXLoE1$*MNik3gQm$qb12@wZj#2q8JV5l6>%5DiO*Dqw0eTh6?xy_c7+~xeCTPlYS}~ z3qKq#j0*>2bOKDkP^B|%&Ikbv*>e$+98@-+D;A8^e2v8mV09oKYQM@sjGZeo`AU;i zV*^8Z7}U@rz2!ooC+f^24A6CF9-iwq*5sV_m;R=`bd%@Gd&t@dz+etWiosZNXh^un25%VRl- z2mJTXg?7-~dncdEWwEI;i}M0Tvw4JW#1e33YcU1fIakuQ5@P_2Tej!5h%Ris;B^c% zT89S(b9ziSSf7z9WzEmgJC{4>Vur|gO6XLw(LBO^#Mn9$((WFK5jXUvQl@Zk*}pRZTIPNasIgpp)Z*XY(+8(`!F&GX)3kQZ-QZ5f)AQ5IG$#O~&$2ZM-K43}eJq^Mqla-W9?wgU@BAtV zAymvN9_)$7Wg|>K`ir7-ZYritzFEuh&@bE8B)0V0igqwwTT9c|3Hkyw07jE-Ytke) z^xi$9zPa?KUai#4I0@sa+TXXRc<`oP^~8b9LL!kErLXjbR>Bz!!%Wnij3LPQxgNz* z!h)mOpP?9Dy0)_BzkjBOvOW2`FYxDl?c2RvefO#e#Vm87V7%SiyyuQ^?SKB**+FlH zQzK+J$Vk;Q82^S)5Eg$38NA2U`yJZ4X>uMkV}w)rS~#@T9RTAagyN%eL4UCJ=aues zVZx|4L-7bzny;l;oAnwWZ^%Ts3)8j1x|R-_v5rP}gyMmq4y+FcBUsTpCEmQ`blEhW zzl<>tV<*286V#FcvH|&KCTOk*nrD{(*3l@pl1}yKa&*_Cs*vnz7DSL%Y_f=K-ZqcW z&dsDFsnEMf3QsVCeN`2wsR9_55jwU6i0$XZ1VjTSNT3rwK7X{_@2QzIcvv|iCiaN~ z`UAOuRuD5#jA08HGz}nP<~uRL7anS%NU(^EUMZbz6)=`-o^m#dcpxtR!(hO?g0;#% zDo9`rc~Ts?ou_>59;&4t>;MJgLAhY#`g0wjEuVdhB9YDR`ak7sc~5IQTqt#9|G-Ze z7ftC1ckvIotnkzbl&|G#DXIwp40tmbA{ibS{wDlGWYKR_pU&6fq9?0{#f5@gz`#gR zU5;O$mq2BORcDv|&k!03;$mioeW!nUZy0V_W-w01$Tm(6Kb^?Zo|;7B)CYfR>Zt{c zSdJ_n3xy+*+}>=lWp_3=cXl3Fz>u!qnf^DKPztjF0~h#UHsb9TFsRWwI^DlG9>UUI zv4IUc80dLV9lf6)?P6(9Z&2UxhJsT8m1S+oPwk^wCk_r0SlTPL4-jy}OjO>Hv{Y{& zVhg$am<4bF3>LKPJotEQ8G1r@tof&v#mWsZDClk@Fa!wY;w>3fi^MA(E@p`n-Ua@k z^3)9q(RZX7wf<^+lyVH%H%-jV%lYfZ$J^4V37}ztg30x?#=zGU6gJLVt><<6jbckK7Czrt=Q< z^+u!n!;Qnk4PN6z+^wHj_nx0NZ~69jlj9SMM?#@^D3r?&8VfY)8A7YLXY*@ z+DvUNq6-fVd~jN%-8{n3AUfU;4Zc{TH^4ZB2Fb|{^9V1Fxvlr}=j-%-t+^=0L(s4k zcKUA~a8qyM;^6d5=tPVfs&gK1OuZznctWm}O9X!`h|RZ(UVsbe`qb3)NpbM^0AT#K z`smTBA|XahFc_=RYaSQCVskTk>UlT#4?E#d-L!1*1#aMq^ctB5Ti6k-LdNu0p&Hzp+{BsHH~xo{>J zm4|}(feCe^ z@S%`Ev;F3krIqKfqZK$&>_*{3Z9jR{Zw6!L07gl{neQ`jqtq}Js@^yKhO`uc zfxPUpJV%>@Zp8wh%TK8fp^x-}&VdSqgS}_uYu{#9XH_s@K!Ob$GR{|4p1+qTe+yV3 z8cf~#a~Yv{uZ1p@3r4KnMoTTsR!1sE(W`*lN~Qj?HG{2t9Ox z!(o)_r26|KaoExlK3F{XPwZB}SQ4@|G%z?gL;?5K%F5P+XOfg+G8zI#FxGdEkB@gL z;GR1=nwxZO-$mnfvN2%ZvImD20XIp;h)e>TO9mwf1Ew-Uz9}t8I?%;}&f@ds)RVr) zPq-t%GGjsW)_O)-3g!w1zBqG0_oqi~RM$C6sawH|M0W7u$UYt84Ukg(%@B$KeNlei~Q8x|+ z3!1mH6r*ZHu0N*-$)|EtQ@jqVvBu&B0~qsUfMI%mqw{2pj>&L}Yt9)AbG1}uJensX z7&fEvP%0P27e2GP=Xg}ve6^((fh>-@P^LD7NL+16q72K!&H+XmhP)JM^Y&KSHK$a{ zQZ0pA1lS}JQR~lF=8~?xE+C`I3W!T4Nq(gS0E*qp9ajTl9e5UWWrZzjxJm1?An5M01C=w?$mFdfPT zu;{Hm-54X52N=J>H0Ump4E-zRg0Q%Cx*(xC6k*8#7^k>U!(Sl202hSCt?JVwa2cV) z1>UDLL;vDEb3s@%o-RnJ+U4}P2HhSRsu=oL$_22vR8eXjW08}x00U%*eTSq&F?2Du z&bO&uMx?as+OIVlkf7|tz<+}iIHZp-goW?V zBSfNfD{|z*b*1pA5PoZ}iqf?CTs+lt>x>aXDFTD3P%?_y(2!iFiLmgUQ9!W8zSKu~ z2^LI+e7IapY^`k%C>F&dC>X94)~g{~$h^=Y<_TDoeBvFa$e9dT&iMZQAK%Fi#F#2b;6m_DKb90C2%j#Tqqf-aDRV4e(^V%sOL;4QJK($M=~+FfJLu02idyN=D}= zVgqz=@s29Sn90F^kmqGQEac@`Gw5bdaJ+jL0T_D{_!+lk+-BGID>RzPsO^6v_k<9p ziC>mF!XMMj1t$PO#^B2F^XG}9Uw_@6a3y16%M>C23{FNlWDpuh;A=&9Dlr&UMldiH zh2l-OsDBU~GcFh(3>m^c4~%jA!Ar>i7BF_C=Epiq)aZ2OHWdu0hH~+niv^4wsc5X{ zR*4ZZ3Wl1J;l>@b4o+Wqib_=2v>^HxCiGLCDWL*f01V>d>V*;`V6(kuYWV{y;bB20 zjudfWd;s1h_o~Z`B-lWQ2gag7F`mt{g1gQup+R=|>Gw|x25O#-V6^2)FR+O(E1ChF zMZTgxoX2TG1CQD^71(x(XUhxSEYqP7e5p6D`(qv$Dbw%Jgb0ImL6d+(+wi51k6xrz zF`(WR#sbJ*eJ*7uLQ3wkI zuX%e|fD1bFNA# zN#T`%U`Ak=6)1)#32&Ajq?K!QgaGlU$hb&^YI5}K^c_Rc8K}waKp7wnTpoqODdeT% zF@V8>k_<+{VA;_lwHVDc)n&D;hccsqJhFG zGGc>$UMW0Z_giMdQ3g?O80g?B!kbpVOO8;}xiJOB(A6W)mr^V=@;+%WJf_?O!_y1F zLb=%6;pOg9Rvi{F2!SHOpkq3PazbRJQsL4gR4Ev$8HH*gXT^~kI9Gavl_bD`IdY+7 zyb%KzyxeWJii9eLJ0%+b6-Io96+YjF2L`G*v7#XhtKv$bTy6dr)!EZvC>LJj z9cwp?05Bj9jK){jzzQpdI8qM{t2u*P>`Hl>p>Izx;7AP{Mo=)63}E4L;W<*)#|Yx_ zk41HZs0blrSy#bGTr$<20|3nuf($lY{N~_q8M9%m38950S29Q*R$)8D2W1bn$Trty zsY6_Hzz__?u$m-Bbvh5tb>{>C6M#2I;q-)Tz8(-AloTUg8>c&2DhmzwwZ9R zIVix3=%AN`9uN$}2v1J{1|Wbj75Gq6H1a+%ra>4CHHj`149}6unV#hzc$h-)O%ULv zWVn8m1{j&J>30}jV=&a4Dhe;~A&%6b$qo96YB-C?02`horGjB`r1VMJr;X9@0=|T4 zl&2I+IAnkWEG97n#% zr0|*le6|XPZsPMeI4v0LNSU93(}lKstQdu4xF?WLPZ(bt?cZ0D98F&|=p&3`N5c z4xG;7HkGoB5P>h{p`lj5MJnX8w8W6;Ti-4l9v55N6_%D5Bn_$=Fu)+f;czjxVi^Ho zfDAPk3_U=th+%|QN=v*~guppTOPvPeOHt%)ypHEM`Yt3x6~l9+*6%wbSX^6=2hXG8m(0c` zWBZ#8tzIiwS7I&}94crxls>C4d!my1Z|p{jskXJ|7Rdk`j%;N2 zz=U#R!Y<_J3 zGXZnwK!R|7$##6x2)@pZXjY+xM;DC!1ZZBL*&An6LD!*u9w~Jjmhv7 zqlgP6Ld@1H70)UfutF|Q%IJ359E*YsL1WepzMcIrUG@=fWrz$Fje;$eTKONc{tifo zfDEAFiUzQd;;FUmmNG_I7cyMUkl=e#_QPO0?2@5ms3#?0xLjC9@KM(uCPQr*_EHWo z7tezBE^YB>9$9kdiC%63gt>^YBW3ZWGDHT@5E$6xC>CKy%HE}oYnt7ylWcOtdjf{- zBitv+5Hw&C=Xs%?>qwP7ABu)o9ip>gv*5E0+^W27tqWRH$fZ-y%z~ra!*tk3fQAbhiUpJL|CF84OCnJe#vvDMk=Q~CYDpNO70jq7K~sI5U|u3niG1BZ z&{$zzf^9_uq@mqK5(F1yhzZ!Ioj+jDch1aJd-2RSAw3-iKYsU&dcJ$nE{Kb&<{plp zK?cNVEVqm2Rz*|c8f3r)ut9$j7yJWwQB%QUCq!@oGF)WVRG@LG*(1U+k$#ZqHOvH{ zbFY6Soq`PD00WG8iRwB#iV8PEhN!y`JF%;{hqFd&{=jI631++#Twq3OostLRNxu&# z1P0N!aPk>5QfeLD-x@Rw7cw%X!7FjaWC$8R4HrFd(N-Oo`r*7gePKU@4frBCv2Mp! zRY;V>r`t%B%Kt5HIAvXh3I~&nmd2*Mit5eWDEcGJ5<8~|W2lFsd(Xe#6#BEzI8JJcumr86)I@3k$1 zf?_~JME^X9U_|3k^DdVB(MVzdpdk{lFbQup8Id7xx!6$oc@^}~#f6Op7eRngPKA<* zb8onqGY!te_$33eYK*U3x*ShbMcr&B^sz#DzwNOE?bm87OV&>0>_uxXKL^GHH z4X|NSOW;C%_I={Ca|bk-4SXFX?P35flohIuD`-IGG0MTnnwkt*s?5i3*a0ro6|UKl z@1}P%7Q{tbT_M9pM7he4iy^pB=%UTp;zyzbf4Eq)ps73&`otk0hz+8HULxI5!n>-i zz?&HXg{SCppEyXMt#FvV#BN4QYC#@x@lIFapfsjf@v#>NcbC@&^jBaLfDp3h#3_j(NZ}Smfi}!x`_q7Ve7>1v4sI zF68W6A4%`N^zM-aGfFWkY#zzZYhOiz#jt=1Dl%#_Qg61Z8o1Eu#2#Ry6=J~%o!73b zD}0o6@~S9)mQx?+oX$2pLPO-?;(!cqe4r-7pR7n0sH3=C;BKq}u^~e1E?6)_t-WSD z2;d1!0Ts1&6a7Z7ol_et{uGjLlkEC-tP0!Jvh(T=T*+fF7P)x$kUFb)yjF#Q43FH1 zRUx@$m3-p~s314u-NTk8KHSnp0v49K!gjk|3uZ=Qg}!m4LfIbh2Ls|E8sN9f`*AAd z2@S`2b&M!BmXA{*Rm?UnJtIzyWs6&}7W&e7>@PGXC;qc{hCgYnSr|9NBr}uALc&Bf5E|63g$t)5;u&xwEo3e& z9qmF#EJ-uXkmkxkjU*DRA;nXApf5!t5pm}r`)A_uKerT*&-i7R4$%y;Vd=*oGnptH zzKm3lHxP(KSbOyj9TZQ{7a|3`+JMrbgEs(md4stW4XJYnZeZvgJFr9W`~4j_ zsC0#TMRd@Eu1^uKI^fu7gA;-6Z7lLp)aMY7t`a{EY%wbJtjrcK2K-wMDzMW$z&)Q3c;bnV~8*X0-ZYO zh95EvN$r6{U;Qh@uSbfaeECm6mH!V|DVoNPr0*chJ#grO`jY)&L++Z3;FBjlwJV3= z#l>N*yJHv|8}9BHyvd}uONXJME*+$B_!qD)?n{m}YK@rGrAvDIxL#RSx^Nhw-Ut_q z-8lFPG}mXW8;1Z*tK3U=VF zYr|bQuyML?ce^wMT503slL=`t!>D9rzuamvO)Uh1$H`e z8o9zW-Pz6^LV5NB+rnJu4t%_HalCT}W0Sb}c$@3Op~M@_-*M=z`qKXfFiL(D(K{`` zKig(t)YnxziS-5Df%*PTOdlQnHA z@7oS?z-7h}Yw)(gEe9Rvq-W}jUx^G0j4*NGuQeLKmt9&wFOE4Fo@NAjeti7QdTj;{y-;6zrqRgwl>x&BLz!t{OLodd`qAw@KA76^+L7^wpLhrYZ=0G3=9bu zCyY^Yq##SUkDuXUwz7?`EfyHsI+_tyLH)wIm6)VW3JbS6h36RGw!lD* ziXNM~$f3koh$&4HY5;@n%Di7Bou}TYFCHjp-K1|>U?6H^jFO9l`(JflqFt%fH|q8X zrSu`RD6mdnu|8i-Fs3iiC~{5YU?Slz zm^K)Q7;qpk*q+EC%fR@KmuM$1(a*>NV+h6DgHsV0@!M|^GT^Y&4#wmrUs&k^hY5hu zi1HJIUI+jKd!$;=!00PhvTk2UHW+>^s@#H6U)LB40HYZ(R_GaqNzf4(Z&0G0UZXBX zHW;aEzOWKGEb$WUk;cH-ZI2kK0>C)(2*I#Rw93%s0l<(3+80)m128CLoT(NVWgCnf zJwrN^#9%OO$yT#%fYF|DZ1ph5=tqnii`cr{4hE}AIR@j!HZqCBAOw~Wj-6uw8O-4OugD=h0tIaG%07D%ff43lY&ne>fpzqg+Fk}27;(kH z@O+Oxc!w(@2j4kHgI?dK?GS-Mx`M;t`AwC&OkJgf4u}#z6doYm#@xL;KZYZ;!OPE! z9Q0Gn2E~~B$R7GbUV7oMiavOk<3fjhfN?uX+kOJ$V-pPN3{9qXa!x8CHIzcgfkVQ< zkhXaEhzjluI+mjRW*t;F4yyVy=YpwZ3|L@9Z7`fBdK$j}8^=?$o#tRvf*|Iwjuhju z(4lZsC7mpAF#c&5Xnku{iWu+KriBhiyk(C0Q!qkS!jTj?$nOD0G25&|eP@9YIK@ip zbV%rM#z!Z`QHSDSz`@w(nYh?t3t-fuEig)Yvna*D2>;B@q_pPZ`;bm6cN|6*T{tL< zi=S{9bK@}fi620RLT=tgD0KH20ukB8F+?JtBT=`&@Y^L36si~)x>Nh9Zx|R~uWKmK zGU3hzUsn+rKB2?HN%alOu{Fj5A_fOznuU+*yK}LFiBaFkzI}Q0=;Q_3WFC#SkHijH z)*%(yH-UkOvFB|oO05Qj4)HQiEL4DjrIZebP1+$a457nBgU4?bEVRG~3yV_0KR$Zm z_&cSgA3eJBfeb&qc20)2cyTdu=NJ|ioRguAEiCx%c0w#B9XqHI)4by#Wy?ddbBAm; z@R>j)@ugHF%nKhifPoER1w?^?m3`MYuzvC#w%yWO*=9YSk$Vdq=B|-stPOH7SiS*= z)HT3(Jt%ZA3k(d@Xnni5^PT4o1x#i*5*!1vZzLI)9v&o+Z?v-V;_BxeR5;o#9Vg*OtWtw&ZIege_DoKu#2*G%^I)0;m!& zHPWa7O7ik5)E9*ER6XfwK1Aw2=R7-3hzl{e*ac{b9m7BxtAyAoG9!&9)o8xWT6^E) zYXfF_XyW60ovrE~|IXfP?|r%6z}NKN#xwjT>f47}H-0e17%38x%qMRv3)jB7;Wgz7 z4sJq$L{7mljZ?W?HQCxi$j@`CxKaG3`u1fdL&YgQ2|Y%#Wm3xW_0ocR21A2Sz}Ui6 zlTv&p;<44zLVu5?7Et=efchpFgk-H#Jqf`${n*k%M>m&3Jp%`6=unSggQ1J`%DOO! z`r7Z6mV@F0Z!<8wKUZIxxyXQ`1rHa{(h!L25XRS2;a;`S6YQ~Ma{?L7 z7TjWiFXy;89e{;kzty0+U%zIzrrQSNI?Aq+pCTBSKT=wUXTDgJm7tptFsQx*HW+h~ zl-gysc736hh3`rSx)LUSqWTUT=2^O^^zsww8s_=(bjy-?x*&U$#!u`D8HELcQBW{E zv&dC3Db>nCEVY%IvN%;?A?n+=D0*X~pP%3ykVIQqh@38;%369l)&vZy@Age6L*)S& zoDa0(;wEpMbQ>+9+Z1EmdWK3fhDb_Xcni$TZgJl0V+JtONQTG%?O(rz6YrY;_FDpA zhBc4JnH1aRykF1k?tU%z5|{F&aj!pJ%GJsa89edbz3;BU0$y%-8o4MRhf@yYQ3LL|KS8!e2+v2wG$-cYiT4$0NWI^42477@>`3|Woa zPHZaXg9W_wSdCn4;9o5ETf-|`sbR6O{L?8cAT_?cYRFJvBGCvfM504Y79y*xG<91+ z+-&K{Klg25@cO#tHkunesK-m{EkHbYqxtPz$d5rNAJJr0QG`{E61~P6`ayZWOx%Xv9 zDSN<0tyCDL-$3*w9zT7;C~9~X-}6Q?dgF|)^nB8>UdHK-R zE%tIc_l)tlo?n4dcKpQ_xCmOqDRW0zkiH_~4({W7ej2eF7KqW6o?i_*7J_^-+-Ah$ zah!M3v?fcd&1wb=Ob}E32{0agPZ+jM%!Kjeoh2{;hYZ2+OH!)XGAR|-4k?LvrVlvJ zr#%7&Mm0nWSQ#Xx4nr+0#H7JID;8!MGeLcO2nJzD4vQm^`A%=E+CxeT7X6$@w@mHZ zMKHJ!wj<#h^tUSOu|vvZ0GUI3NKf1MeE)zE#LwJh5=7gv$=a;qbjkmDi43#@3^$A_xiS{soC7bxP2-; zTIUHpkJ>&DJ;(Watiw}c~2N|g_X>=YwDd95T=?bL}ay2DG zORcriA%n4Gsm3r@Ercrg&|%Dbr&>cIeNrvNNJerJWTc_)lnnA9c@GkjW|7HQu>D0? zxR_E4kv&FHQ|{nm3W2MTp%o=;O6{<4oZ3Q|YqCj4;AJo36~A$`WLsDx5mAtV5NXwr z(T%H*)*KRYx{NT_aIwZXD&j^U3@%{7dG7sdJ8;qn>bcdYYjW4Z;`|9P#$KR$0T_I$ zzNPlTJ^T5l_>^a@(;*~-&$D_MkZ4NC&~2%R zNSCMAiwJX@xNtqdCyRKsEsPeb2l?8)uF*8agOH)yQmH&iT*H-8t{S%M7nM>TTy)*R zC#xqWY_ekX6@|$zkWokr8M-Z{(Q`m>;^~uQxQUCdFj>k@xlG7UU$Hgi0vTH=Aw##N z)P`rm*kA_t;#xhVXK_NrC4) zUQEEaEfEy=C^x`(hK0E6mJ|q^rY;@cPZ?G(GE@-$dH`j$@tNxi#=Oi!U7mvkL!|@de%BA)fIrRfOA$d*nwafFjU^nZG!@tS?t~c4}k}} zboP(Dfq;h=y1c{5GUBFt*G8ehb09;($X6>d&UzEoJit(Ykb{g=9P?vn-}Dn~MUu2u#A+Cud`}1((YTF48#<`ow3f3|s0k;1MD+gGb>q zkqg98;KDb>)mn^rT`pR1yR5zehD%Xj-=^pZ%Le0AHwu|gAf9GZGTOLdaDd!O|Fk@2cCBT3_Z{0hX;6p)c zNm@wfDKa4CJOu?K%ucBsz<6JtY-xcHYsI+l74$iEkzppPg{7`n0T3s#Yxk&1(!*Wj z)#?pcm`;xedePwwGW^4{g%1)CpB?TRMO6^zCsHwAzmTy3 zGPX=K6MB8cy*c1-Pp|(%wBl#Sra@z+saN1BP0FLm?Q9 zqX5Kaq$A3O8|Z7lwH&QW$aZKjBn#|$q-gli?!i&x|Uh?oiVjL?72j6G_@TPSeLyHMQCv`Nk((1vph zIP^7TVcR4BLwqzdG8cG=w-2vexd&fSx#piPqg}InV-)vHQfGL*cMv}%)WTskUz_%N zQ13?XP9l8mj~Y5Vr+d5Z0h4>!;lx+?XXDg!{+LMaaj%6U9>7owJMirjurMkze9Aw~ zkAjP7{!=JKYHVLmbc5}hJ&`?;+-}Pnf}7CPh>wxhkY#y=i=&8dg&$q)cMan0AQq1( zbaW0-@|}_l>I_&|Lj0t8kM_+|VBogg$VVaGz1|V!M+dsw$w$;l*D4sDOcp+4R7*k# zMEh-X^Y{NVzGS?L!nTL~<;3CTwwGW~hmUxeCd8D9kCr1_;p5g1(yY6d=qKJMyjQ04 z@DifQwd|M2uGMlprpx$Hp!^P}KLCOcS+4=(z6a`D9>acFr_?ta;xZOJloP-LU|1$W z74@*}M~#8SX*u2?@5fve>#m5JfWeyE1_R|IsB=sNoR;I2_Wo0TU;mi_)W4p(6%je8 z>bym#6jU@&81pTx<9g4`2^qzQbMxCsf!IkWfbm=A!5lsb9r$Q$hTGLhkAG%YQ|xz; zUCNh3*QVhO-j+h63AU}>3ynkemFgaYA#aGEd|wGee88(r`;o0;HjC{A{F;Y+aNtOv zhvbHs^kgVT?XB0|508PwdT0`#Jc&>BPIJ4O^(!BfOneZ9{tl1&!{+p5Q^FC8y?KWWa-TjkbJbHn22WarqZwnY1KYa&|?QVO32*D^` z)+rS`Eah{0Piv?QEZ)8^`{6s7m8vB@KmsW!|k}l0^~O{wjK1_Km4GzZv}&QEpf((_7V%% z5le~WruqgJoEk7*S)8@*l=6wMD9-y9wh_8!9smrGktzQ6>&xQ0(HJ;`LyULZ7G@CY zt}poKGU7K7N(IDMl*R*-2{`NO9Vs3iR7<${CH2-Jh;O`sKxgLgP8nw^lm4%&ydxmZ zUIS6y=~3TAR&KqQe0e&VM9npAYYc2)*sGFhNtT4c#Yud^9}=KuX+e~C>Xt8h#3JjE z7LQigbdcK6GR2X+fq!S_aA*Z@z{PM%{RY1F>MMdBU#uZ?JzXLg5Z0&Ir%>>t1qyC3 z1A&fHn@g)WvpUcb6rct=o6=HLeC9k*X%f%04HdL3-4m8l7;EXhw%gIs0-v6LM) zbubylb#Y1>$WOKEl;Y@tuVAB;AI<_>l3aC+U&+Do4A_9I#R9S~vlvm&YHpG}ox_4yw~$YQ6FS<6Oi~Ih^Bpa4}xO+Ek_`QtE-PU@6Z( zm1U;^|8T&C<9kmF6Up=m-f-x7a)GiRGFY=}Aqvm^JIII}2@|~h7)*hz3|g=d1tokZ zrqg7LAx(AMkq4$ZwKSjj{IqR@$W|?_o#c zW>ra)1dQseW8oUc84Ek|Xz%0{`vu{knSz4&0~qk)*|dO>{LHZsxOOejY@r{eBj)`i zU3WBG-P^^OQD%(J=)JemYxGV8(d!5i(R(Kt-RRL?C3;8@CDGd$y#&#FixSZzK@gwc z`u@3Vo#(8(?pf!o)9&8S-mHjdaj4_I<(Faymq@?^z0Me??=eK zSAbw;hW1{v@b_9fu;tUxzE8-bx_SD-fBy|!eyGEfyM7*lra0M80g6R5%l@=$=)W>7 zZ#j!lq6k+5dK9G_fliQdS=3n@Lgwo}a{|SWOf{t+0yN$nSbC*KO3QL@tG25!I#8=s zWT%v7^iQfzvRSH1B@kI82tvYovuvXc@quj?YYZvyT#ZOk)eJL-f-0^`r3is4CRbNrv{wZRho^< zxjuSnW!BOwhVQ2}FuZ?*_->TZl~~J+=ezpFd(jMkZ3obMy5`h~7(3nQGJQcogDR*e z|M91vz-IgTVBdkSNTHtI-+cbX3px%t30JaYftoaP;Bk|+h^6X7zc%j|kvV&Di)+mr zB89EWZ&cM2SATf9VITd#Xzu)=(g`Z=9&vk}hhkYus%QklDL!P*?BI6$_oP{>UQ1Z- zm@=qNcJ&hSsSA6j!s#@-lI=C&S;H6n`9(N@&!Rg6jPGJFf` zXMc~N*S+|+6Z!?d>=YRT(LSwae-hOWs!^6nQIw{qPTh(SX1U0J2^qox(->;dYKymm zC~0a=N9cS)`4UT|Fg5YUEeLa^a+marh;Ea~Vno$2vv{a|iV(4{eFL))YqlEr>5T=i z3{|_Il+|!DO{~g#EBnCtM~40Hl2)L<6Z=8Pj4H@V!Wb_;w-guV;f%nVP*V6~gMjL8 zK+s#FW=|S+CG@Zz&388rN6TDJ?$!5$wZAT888OYir49!+6(5-qFmRKUig#m!I+*mW z1<$Vg2$8mSEH(fsmo$FkM6C5rl*TZWO>c{X8{N|_m~UmmrZW@ zzX|!==XsP;;Mj)ZZ2-+czBBsaxaD6%x}X2{_@q#7K$?`rb;aQs^R zGYInc*nCWs?tT9w6L39wCWp%mDpM0|bdm6nx@vKbxzKR3BSx0Z0d zaCFMQU|dG$?2SBY1Db3NOC=k_l@ZlmIE_kknZlM5>QrGu+(PlU?9hqQX%^;c?{MW) zuKuBM>|CE+GG3lS0`a??jTnZXgy^)(njisB5Zo0k3w(kvzV1|VPv>g1{G^qe5x~7E z^i^uhvRe4{LhW|O-^$a@J4a}up=DugH)43qq9xpWBff7pHEe%Z(ntTD#JZaNDLoTSTVs*RbIvi#b!;kTike)?*Q*lW6wX+R;M0MdIUDaz z5F6NB#-0&pINQa{ofMT2`TUTkh?yNNn(TTN0uhxeJ34tqU7{m##{F@vQ0F7c@u$@y z!nL_Wk_hJ5(uZg_X(w1q{%t}T+QN}Nkcz=ozc=-5zl{dBp6pM)`xn^U_3Ly67fD$m z5pn)eP$$gq>_TW) z`@-~#p~}qM-26_X=`K6uO8-$l(83C9(6Pm=-ls*At?1-oLHg!t%Vu}2Y5~pJv2*0E zX&oNb_a6^VbhVcx$_NrHJP1LB4GKsB*~hKKFB{yeNYY2Q21Fe1eNBdsQsTr~J+w%` zN+PgTa?~g{?OLhVzT8+S_slnavtCI`;o0o1O;Azcd3%k6t8#~@p(G!5g0?xXoBJe= zJ7|*ljjpJ-CgL0xaxed=v5DCUQMq4MtD*vxcQpGX>=I@h?e4t*sJ{tefH2M}UQvjs zbhudWcS`c~%7}TEC>*i626U`^a-mn_FY5k#?wU}|)PtwwyV?hKEPD%iHB2+BKcrs7 zP4)BViV&8%50{<5WOM#V<|7X)4s!GHZEkc7-Rzz;!l2HGEM|z>my9!jGmV!*M9-Jv z`d4K7qe$sx1{lrCIC*kcq4n39Yio3Sim`Xf?{ztnsDL}SbW6WsaZzg7GIWN&ry}#r zmnnfXYU@Zx8zlHdz}GOJJZbLB7jYmaeZva>QpGwf<+s!`&>OY*mE#kT#Mj`v_j`)! ziz@NU>zW28is9GyTri)1)Fe?CDGH662N|>>!@EvRg#jKVkZMzCvR+OhW&OaF-NCXQ zuvd&hh{L`lL_cy4W3bZ4uR}4zlE(7Y0?%=H$T9BT+zGX}^JB^ER4fNWVS9_W6jlF? zDM2C)ofp;6%5v_`Mm?1NPf0NDMx1gDKih019#S7@w<=+P1w*Gy7*lSPM**xLs_kX` z{$kX&w`N=9WT>G{I?-rU{=z8^qczCe>#KcW_uFO?-`yH&I&?8zdXGq60QeVprK5CA zw10ao=fSlxtu_N?0bC)|gs&Ke&3@R$jGW6R$hAsgQ6*q7mtS8!rDEiodx^00t_xR6 z8POaJ;C!*w>WR(YxKvm;q#$Ol$gg(O73r3+(3wZ5-I+XaAfR7nMUu4Bv*y-#7VE}h zg;kT>3R%m6&??%!VJ;=`N5AlS*m)y)L!bIN29Edp4u!Ws*+<*i9(>Qc!;KvH$fVHH zlf|}TID&Zp7UD-_MHO-GPUi>l(N$lO^DvCUVxe}nlQGzSs#Ve#;R#kPNpjR&+inCbOif4w%#W zX$J@S3x|NRo~a%wZiT~>?O&4~?UTkm4eYpz-wfK>I|AQ3;Y0HLL@+=8$~0WxD&%+Y z^?lQdH{{FEA65J6B=;3cB9ql1=qH#Vn~Ik&z#LOY0cYSydO@f)s*#}=b)mcpY`7ky z0qY#F&w6w@$hk5Hs&ex5>(Tk{-bE)59G^IX^RbY)aDtcf{WOq56LVWK!T13>3#kpQ zs)eqlu%CSPTr!!1zu{D&V7G0t;x6gWgLs1Tww-i7T_KU7wTJGvzNBdCu(qC(S(zZ5 z2GftlL-Xn?0TtS;$EVtTFA>QXeuC>cWUX9)?oKq$hxKi-e(|dRHaCG+9Vas{4@wtT z+2^cv#mo+1%R3;TvGx87ox1CFuhgG`#106UNJKw#(-*@5IN-|@iJ}?tgDEws0pO|Y zL+eN;?6=Q*rwkl1i{I|`tTz_Br37Hn!yBFun!kch&bhb!W`rvLO!#pL$+eey@u?FB zXj+xe0X$W_5GeHrEFi4B8bbZ!Xa{X`N&~)XU>?+3{HyndeV#)I2lW?>?hE5&y^B?K zlF*K0wcFzK{)E&v3y0` z{ax!n#D=*UzW)|m>a8)+OO>#M#m>}QM;UCswmG{MJUxOAYmWV0djFx=;38S-LW6^|NZ zQtCEZ{1rO|gK2F|&`z^vdSng2^2T+AlIrcmLMtyJid zGtf7S|kKk)TwNXK`B{~>7C$|lhTI*pck#t62-Fr_x6W$KUAtRsI7hy z=f5w5j%j-m${K-^dleMmi8r1M?#<4TbZCKoP?Gg8`@PcNtw;iD+ke0MY-7a7nn^@9 z1HnPBp4;(x<9ChP{b>TfVOY2iRMP5oQjZoD1W~r}&)C243fJstI!vf!PDHwt^rRCJXu|?P+ezUSli3``_6T91bpklx)$}l||_VHkD%E#T{`X&gxuEAE?=!b>+?H1_t z&mYy3i2^xQwf_+OYK~9M`?cjEtlP+Ob2K)^Jk6j^2C-?x5}FX6&-~x zkvp&ruCcq7SPLgp zW5l__#pPhizNw9X>WK&Y(_q`>_P#S`LW9IKGF@RZ7G;JeA{uvmExO|&d^_eSZOw=% z2<+(HbFzYBXJdwVo-a~rN+t2hjaf=-S6!#KfnP@^CZshY-1S4trf+QmQPM#tzy7sf zg@dAweJh}eB@4(W<4Irf6;fXCCZaClCC9<(F_B(+qPb$5z%jM!r;5<<KNV-*dA3i6ZDbv56Txu;PDOXnPo(jlI>O#^CW_3*woX$X<&cKt_W{1T5 zjSnBG;pt!j*zL~2Wvl>Z!h;*o8tDO(9(WeBY+>IQI|bk3t15Y?+Tqd?)v$I|3uKYz zYM_WNS*xeOFL(SVf$JQO*Jo<{!Ppxc&1_>vnhT4!wf^Z<-)gTCKYrm5&rY*BaQp?z zNh#{kcQ%3ik?UtB&6ml-?PovMcZ5d~nryY^gDWjhKQ>RM^ny#Xl%Kl0s zN}{V({lP5W+#_4NRLO+}opFZ4RNzE7-r869rLEB~rRO96y$7yg!E{Arnu8;A?hBiv zC6aAfLmCPfTTm|k)nNTk)@EUL8r=wHQ4;kZiidl7ly*vccQIJSAV{zsPW5pVWn})w zp_Cs3+ZKyfD_r573#&h#>GLsZ zC8WOYS6Wd9JO>L{j%SR5-(*PIpNDn})4cMfe*QA77GMYZbJVTtCu;*p0_9BRQBPn# zD+dN^R#f{PnKNn2f3A(@1hH1bg_u{pPJ==>v3O&YET%FGBz+`2?iET0d`JNFa8S-@ zr|I9LQ`L%;0%E1-d;-HG#3P+_AN`~A);KbCHb3raaYXq@-@Zv_OOMs&bIvs(qd=PO zEJngn>}DNevakh#PI;*0@Y!jZ{70mEuGd3D^Jp|WT+_fEYFc6v z3kwFYXD-nv4k;p@N8Brz;y4WZ`hU1~Hj1s1p$j?7ra)q+*u#3(ly8x<5ezJEc={t^ z0!whqW<4~x&!THN(c%i%U~hxl_aO8^Q#kw7$kYXMj%pfLnlhfDg6xY?B|Q-eyw4`g zU06b93${ZHj|9{K{V|rG=LGmBbh(v(kCv96il=Enj5H>PpU4n>n)z$n8T@ASNvtB( z)SH#}f!LqMN&z=7%BEX+zp$W;w7(1X{ltwQw6z(ZFo02x;{=aA-;T9v6_A(k)tw*b zD8u$>(poQRDA)09<$vjfm{$tY$Htbdm1w&I$CJia9!R#P1-+Y)B@qb?<9UiC5lRbM z(6GWU2m=#2GlK%Bd11eUM`F?*^I5-MN106#w@xj0D7LJmJKzfpTOfHZ4irE9P{k5f zCaa^ykJ{>KzIXj1BTMt+yBc8V)sy?BQ2G2Hj|K9PH~WdoEVjd{%cO*CH+>AG!D9}` z6Gd_77r7U~q}x9l8hr61JKNGEjj{>J0ex;bJgT3eNm@z7V(^Sddvo;lO2tNcFj%-R zDssHzyWxfzLI0-4(8xtOH{vNija@%p(#?!8&4lI6n3@$F7CJJ{G|SlG$ZJ6O*~yw>bIJUpmL z?&jx00-~q%HREX<$@5yS1Zj-Fc9Tj*(x?mfCfT;Q?-k;!IiJ%+9#Ci&hPYGCb4|FF zM3O{4B?aaMbX|_$(8gwecCf1U94%j8y<0D&^=18DKF~s_GH1dUO9qkbJ5w?fIe3M5 z5^?rmcKPwv<Vx z1IYTvgf&*U@YLe-V06@ZCSA!LS`$>t?WzoSh!@?LSBJP?ENN{M!o5mywhyyICkL=E5sxLPp*$D;?87lpc06L7{R#dMtbf`Ffpl2? z(@7kLPv_wWe;Hem%hqlLjuvvgl8Bd9b_@2^KgY>yS$VM|Qp#zCCA@A24n|j45G$9X z*_{6)4E+Rq&7mZu_wTwj@IT#!B}80T~=o3hKq#PdWub zA;{cS#@v!NEXS(ner&$Uy z_vWm4W49NV$No$16OIDHxr2+B4?z!ECG}BXfog}mFU^#qwW$nW#C-Yu+A?F}{#bre z8j1SjEFG5|;$z#hNaM8PQH*(2^lLomt6YwFT6;$28-`&;F^WRDr=)@i=DFw^aefyQ zOudd;j{R(ntsg9rA#3crKMT8+;wulUvdBqjL{iz})WQbR6oUKq&?hPem$*?wQ1$dN z^4c9dQcP($43smC9uwZvwG9|nT{jR*!?$owDYa4+u??tK{FY;gR#baeF6hPVSJ6!^ zZ+nKDY^2gk0di6LFTEZg_z({wycH}S4hOVy^M|h~?N3lAk%-lAV>K+|F+`9gZKsRP zM`JLs43>&&cGgDBOYO!k0=yi&k*b|~Wn9@_oK`7ciLH8y)TzWbgeum)S%w31(JDQE zmOCCS>IrGx z{$ll~>9!mrZtmaEP+=r5=ir&f^gD)$ZoGY~W?USKszz1)ttETsZzZzisUIj(2dlm7 zDj7UIbvBtp-j%+IPT~{ko&|TFEBzv)&jhk>p*X2!^Zllt4I46Q4ZkxSU-^vOJV>*z z+OWSk{f<2up0oC+lHqgn4TgU-^S6FFmye+RFKC{X6`Cc7P2swxZ*ywxll-$<3?Sg= z{ibJidxl;8LrmWw_-|k&-|>>JuXR!csA_8J`}U4MD2~O0Kke)OOi;C;*`D~ocf{3b zFH+mxV+bn=IRM+Tx;IDQ?K7Nc??#0x-r}U?*`e+-&Z?Ygm0#Il;{O*P01ish_Z(;1*iIz7bLA# z%Qb+M_eoXnpD_iPi_=5*N)m*HMxknBdlKDOh!%zDxU~~ly|*rx`oxQGo-&a3 z&A5${PaU?TUf27+F|pGQ*m=6@$y3^w)1T=e$F*h$E6Yl50#Z(v0aGwV+T#a;xCeae zAKIqv-?Hj_Ii5%iz1C`fpoT^-5;N=16lgjDE#kgd9 z-tMkTCv@S}E03@;x;%#6aNFCasl|1zVV=cO`T!YvhYrOzE zW~Se9hui+_LT0=hd*Z9rj{j7uo!{}|v4ne^#E@lLSn*RKPZ_7eNu{rX$<1@EB^%Kp zi|efbNsHTr8LiYVJNHXvx{u~Icm&Q59=UeXy-)P;1e)7DPNM;$gFi_kgI^_+ekdC9 z%V88^Jf4<4xH~^UKNS?a9K-7&brYKOltD4}l+f<_Mf__u!nC-1O5>-@wHQHNWKF-5 z7C2Os-SK~>mF$j7)H^6kdRbV&wPLBi848!NjOo++O5ROl+P~Tb&KKJcsaICoAB|>c zwtI{cxX4fk*Vp`NREa%7JKp>E!6Z)(mKYopd)zQc=b+djrQn$W z9)CdD4v8t@yY4Ij9*mEEVruAbBUz3BiER9mMrB`pyfqB(vG}vG?ZZ6LxeIeu)r+h4 zyx!Gr{)}@RQWFZ@P+wPS`bh6u?DuW=Q07v%&(XwBf>D@Q%Y%`HqW+PgWuLdE^xE54 z!`^7}j_0j^i64=utgm{&Td1jTur=ufr`NYz#$J~RhMfkxUKu6_#W{VAjd2jd%XzK4)BdT|xNIj{V^GJ1Gu z9bgi-ja_&7)jp(xce5c3jyY7kMGf@(cJXk0M9OzYS-sWf8*QJbocAfn_J>SN%f7R> zwdVV%!kb`p9m-`bd_C#4OcH&*kl(6x*PjEwN%AyGgpH*--q5Q;cF5du0&e8h2rz*# zNlSnEIH}lkeD~5PIkIWNpSAuIik4SmVfofT*N!=;x9XQ_IKEQ;9mLo!X7o!G1ugSs z=8$LqDN?*;QZXrg3sH?yJ1!5Os-C!ZSQiHM39h?U$w5KxRVALr+Wo7EEpJ z2xU6IN4WM%yEOG?)vTW7u$WPdX~y;MPSxSC4esl+>XOJbT0vt$uylGUt0G2r&C{3# zx=)0e@09C1zx-jd-jQ>?r%idZ=HB0(|t4`J1p&J0LhAA?F`6lHh4EgWOCo0TvcB^G6rrDJ?;QJJ-=9q&0=gStUXKW8Q&91?*oFcB|hILaRoxDB{nYr59&sb@z1 zXmuw7s*#=iN&m{^r0H*Up==bWo!kY!q)3=F{cFxR9>PIw|8U0tL>-#!T(if%!_(Lh zHGA@J>iWw(gGiXoUwY@-a9Od3)q6v7zEqyYq)7g{Rl>GUrbDIQVFT@NTf%JMDRhY3 zHgsThgq<5HDxhu5iuumoj@aX{GpRJd#&SjHAg@=GDJ?$ogURcaQ?@6vuyP<)q8t%i zTKA=?WSpMgd1)Dbi`9+sL%kqS!!AwRVF_xB~sS`Or@ef1FjU>(ljRVZSUfG;)2 z<*I^(G0x80>IEydeU%#Aq|sUq3Z_6wNxwE1e3Z&|JvE_TP4@iM>%SH%(Ul6HO7OtN zZSvrZ>tI)}%F14P%*}#)v59RW*M;uD*k+^5Iq))(K2Q8ATa3Ne2E(kvp~tK+7A*Tu zXSqXL?f?|vhXfPM;}AhV_FT?u(ja&V%RT}OAsg|bKzZczZX5M%KddOkXzHlWzL}{j z&Q!3q2LSd=S_mk_JdIMncep~Y5bnmw175wdgL?>}7~`&PVXJZJ%NoQ{RhwC|V}S)H z9yN^|3*99bO@GLjv%`*TbZgEAC!)8R*K1;O%`}p9$GiSH905j11=0tTpcsIt7)~>> z#+oB4-AW%&$6p-mvULsW*1+FplV(nP8gQrn-jOFgA-U5^RC5S=rX+^P>1pO$9HEr| zaZ(n>;O!+2ll?ed0hGWymWe1a{C2g@c{X`Ui4Ox}0h$$jr0|0%VK)Yhak;dp4y#`w zxG4TLy)!8icK?HB8n~EVj@pVGwP4Oxfgy@k_eZtNTAWQoQK5UHXWJk45h-o}bq(}H z(IQ68;t1i_da~pkp+rmFR8+Xk2d`M@#c8+Whs$uUDgQJpk4W;ku25pP;X_1s?|3?~ zA*mcI2^F_nW-}D)EDaGR3@}kdb9l)UjJa6w423`nP7JWzTi# zPtjP$hD7j2IVd5SwBg&dj$tMEcCw=Dne{Uk8fU}-Etb;97;6=rn~pUZG(tGst0o+s zUzo{fn4h5Ub}=)PU*mDFg(a(L5B|X_k@LqNE{hueJ%4D(%-O-ToX1cp_ZcaMh_v>7 z*Ooh0!$8Tsty-&I+NSL|G9dR(oak8l5Z#COeB)kVLfsrp&}yQIHUm>iIWCO9?$o#B zK-}%+1k%62&hXE~&f@lw%5AiChC}F~ZB?|WBzhD)X!gB0q!RIoQ{`2GzaB)={C^br&#%I7XwCesi_~<-22`r zkg2;6;Xn1%q2&zpH9E2Fl_1{jd)TDfMkGFEUPT4)k4GeVuV$rTG+}RPN5utj?Fv}% zYyBf72}%_`D%uk_z&xi&`%9t6VXtZ@Rf`CYBPSXPSc11PW)0Y#n9L80CX*_`dD|Fp z2GyY1vp)1{=Ao~K;TbUHe{wXg-mI<(W31NLzx%>%XpdDME)h=~64k;?1^#ikhZSSLlb@SkPKM9#nhF z8DHB2jj*U{zfQ{wx>og8dFeVp-jBhARSDPz4K}IbRQR9vrt!d3RuO^RFh;%(OcX83 zsp4m8eB{e~9%ay@1!+k*0+e}8_K!ZUT`4&+X}=fvokk05(0lL*y8c7XAU70fcGqkC zY=)1Ka!iA)=;x5SySH>JU{P;;<@~JnULps%)C8PnmA&F`nicK;%_GA%jURCy^kYZE z)KoSVNqTF!MRIs=drzhE(OSoEgYpl8`-`OcO3WJPte=SNYUUr|7yURe;lxOTKUbdb zqP92@niudUBw{k-3sxK>F56KaBH(~!M(1N5VH9aKztv^9+ady$7HRuihNhAk>MpK{ z&m0k5j7#pBjw|T8*vzsha3{nAN`QU(S4*MkRStVO+y)T7!qCXakKaS3GpC?%0>DTRSRIUJp&GR46mJ$XDXs2c&zn=dv1UJB-)>Tr484C|6VqHMJ? zS{FO8L&X$Q`HOKDm8%Z^Zi7hD%(%xxRa#699XeN*y@TIpn8aJ!aHZ|9w2FTlSUFbj zBPl;JS4fIT%+U;&5JXQ!S9_tWq-Zbz{=O|u^X&E4)$m^y_;hE-c8B+gr+j__#MJ@6 zu?#(?!!jq8Ae)U(*vpWUO17+SgYdDy!7HBS?ZuZUt27JeeebDn>Lt0sJ(71s*k#%J zz08qpM)pKBU51o8nM8v8|*9jAb$u!FJ>3ZI4#^Hj)o8<#`?MTN*dckvXNkz^MYm1KuXR@lH>Wy^aW6Iw=^U*Qy z8)OwVr!CikBmFvm(GEap{How-f-c zO`Me=4N?f>Q_LHgJPa1x!uHi4Yk|)#l{kP5)KE=}@EH>#4~h-I;@KY{9h|kKN~MG! z$nQDUuze1B{Gkr-t56w~=_}F>H6~JL&yj9PnaWnC&;>CAQjpb?apbjnI<_SK$?@27 zX6?_}ZE~&5CMBH2+BZ4AGxGi*A0D8^w!ffV;NGi3btUn@LZR5-qoTHUy-5(vYGV^y zeMWRSD(uRYk2HOVd>r!@PKvJQz1kSU$t9*=5PJsz1PmG~h^`MZd#aj@ynWptK`3!9 zn2)rC>N9t`w^Og#yT0o~vhnB#rbJ=eS9?jsX>+uf;Q)pVpX|5jv)Y>{mB`}9Nb}Iy zbjB>0ofni##|~)NOgSEPyN6<1<>KqV4-r@+NT-Ck+#$xV)4_!5sId}LRY7i;yC9w@ z0Zd;8A3=ZErfzsXS11Fc5rm`UUjji+k4Gu2oZ;UI=_Y!ox3O8gc&Ys_4cOOynW#c zJu&+WhUe1Pyz1>`-$~ECJc$=~?Z|I<*s!>Xkj^*~itTfS>sb(Ap+;D~k-1 zZ}zFTN{KRsu&K5NCO=A~(N0ota}vN-a8Yv9umw0Gtz@==;x=<=3j}d^{LlvrLHM#T zV(P=PW*w`iloQ;2fo-sT%KIdlCzcjvjfEM_Ze@X;anHnKKl{e|{3O(p${0~x4zv98 zGcOf$bSx2`p=oMNVRrL-;&Xi#MquE@^@Jz31#@%gi4f=zr%C; zPqZl{K?X*b4-|wKU2F9gBX9%h)tzGF5Q>sIkM{;MGaWW{sh^~+h8`RUW|%Z%+z)bi zh5%AY_EY9+endko!ZmtPP>0C=B$=0w)ILN(X#ItE@2Vvc$ZvwuMB zrcFQL1G<;1ZS)2zBcSJi;B;%KNW)S^Mv+FZ((YfK#XK&$;!AGYb|zAbTuy$k+zXHh zMYJ@uqI>4u59ead0Ix&qwK@&RkM$hrLiZtwrhTtI>tGneZAkBIzNZpe>X=zK&juaQ$TM1y^c$tHlIDvJiURo|0MZDM~bQQcM{!TWK<#A zkl2_4Q3}>>5(?zKfzR#%) zOzhUtV&FaHuK`{LrM6u_Mhw$+MF&6Boxj%Dwr+rf#-1OV`+^%W&Vz7$$-ob#M#5XB>peDA57lHUvcBjuEwTbiyiy#uh7GC zKaJOQ7)A4h6xVP04-%~E#gFm5%on7u`VH{#jGc%)Q!v~G*+z&edi4`6!@sR{OFj&h zhip8!m>DdUR(VR$7VsnG?BZ0=yFOCmNQ2iAET4%{8mw?Mwgphh1#4?NebyX~i}}nK zFS-qzQ<{<}qY)GPG6e$K|C)1sreRB(QM+{(5P3w z=4b6{X`JS-oxd!gvW9l#5lK2ltfT+6yg8+7V?ifmCJ1*qHq%&Z>Y_lbUiS<}$* z9-nYIg_Eas3*S|j^FxI2#xp1Hi+;&XN)Or(i3vVP<9p;>Px~3=x}cG%h7c1JK9gOI z%V(o5F0@(DgfQjTl+W8+_IgOKQG~Toi(r^|NqQZm4 z-r*V9Fcv0S=(ocb`-LEn7jZogkXU`^vIk>7q}~HR(a6n3+Xe^pgD3kgE(R9-AOHF5 z;7Gd@)8OsB$h~rQm^b#w!NR@oXG+2VD>+4WHN+#tABASDR2p(SCdH*)xUWlp%j;}C zrU^$eu1TntdA0A&H#dQ)g%>xMns|EQp^MKn{t#`wITNNj>TIu=rNYz4fqd<@d@bnr z$@{Yq1+rIBEX96=s`1oZXMSsl6w+9}r2TZzNr2Cp%b91-Qq4JF|+4#HlSHwg8 z9t}Eqc;qE+;^IF83NsDo*7LT>LRw7(MFp1w5$dv5tUN^OjKO>Ha9)av)o01bPJ2eV zz&z{$dmL145|~K+7o95+H{;4a*Ea+9(DBJS!I1W_YXGe_lg1XUnk;D$`zfPmytLtwxYl8#)#^ zYP}x#YOMx7w`s>emWW1l7C92fjmHe)c=Vbc+J#`gYpL^sPO|=X_FGY;gC%9}l>?{# zY<8%_Q72EoEAzz4DO*1zP0D6yySh!4Q#epjhlmhuIG3E=1_LX>H<1H~DgVAQ?Z%!M z?^9(qnAgV}wLbUNi*cnIkiEF&%5QNdt(VLLQ;0OB*NRK~b60@up1HWM2omZaDJdkG zEJ9`JR;cU4fC3%3=f;f?uKKC2vGK0uFh^wiD)M{F7=6n+=*B4 zLHwQ@LX`kg<|10F-m8U|ZWl;-%F&Ab1c@ET&De_l*F(K2^GgFjPnaDxYkAFVlIJ{+ zVasIW0kQEAKmBRb#5l;Ep={|FCF~|90Lyz$2McWlA^2%*q)MFhvnNFL$AQh!^jhGF zH0mD~+-5ya))hfqWDr-b7&qzLSC5_|Et%M-y`Gfy8$YnoiX!+Zv%tijLyp*8jfvP^ z!0a7j_y@W#h)bGh;J6%T%PrWX&64HE6uPMjTWsK?5ASvE1V5sNM0-_ zvTd1w0zwL%mj;CK3_>%M5S?7`JKG5o>SRP~#yPt=83OSH6uI?IRA<%UP-7t0 zkcgFSbGWO8073-;VIH_crK!0z)r(6gRQA@Zmq*2@XqhTaXuz*7p5hhLRQnI%i@^GU zQC>{%jMV}JjW(+P#2P}fLdao-EfTLwM~eU-*gQn;jQJT=2J{h|!rA7W-OkPo{kB+W zEO_8^H}+7)vdC%o8j*dEQRGWbu;J)atR2Uc3O^5v~- z`9!V)d3v3jNn*;`!1OGK{mKoQ2#RQ(1gB#H8zNPi0eOp}Ru^3nQG%;V+JOKmkG$%2 zgBti!bllev63r0`06Hz{Dex^S!BI}P450~k=1Ve9aW&Nv8O%Sge>*1CJFE%U7XfuW zxsFu{Y8V}w8!R-Bzw*4Mtu8_gEn!5JAwEz6BRKQF>%3zL|d_oK>++Ny);d&qgT zUS(>#Mj}XHa4sAK0?!x(7-@C18W~{XZLm-CE+Na(ymopQSLO?0I4A5f4S{i?(|8}@ zw}`u2XW~N1cyJUpsM5r0TwBvnQ=PnL0728127il<5+?vH33j2= zjjj3uX}f9-%OgSPPXzqlo&Op=4U!%Rak6lnZ|TxQOt+-331S9gS&co>4^7-gT@3qDNZ64!y7A zOWpl!m;b$!D%K?I#lJk=GL-tSUzw(`oPjl=ht?mije{cd%{~M})DYJckeXS zUu-xLr{X`(@B{we4~htulPo*9^4{BN{6Svi^mj1-}x$NhAFlL=8+McHf>tn`H)eUy= zS>tA{K1IEz?5}tPcOghZnZ@btCea|YWpWAJsfuRCjetx5Zds zD|LBbBJZb+;8eL4rk8*>P_$y%s%$4oD;IF5zYyHm`cz~P7j~JTl9~4Bhl-wzQ3hIr z7Ti9^Nz-zS_%1KlB2{|Ji;e~NSn73W4=-A_3aRD9Dzj$<7^mN9qHSqd}6kk zsG4_5Ti`CSue<)7oee!70m7(9LT%8;EQ?;2>FHM&`r|LT({R|(!z?hl0C31WF3k}d zBNK%wnX3I8SWO-gS;)*_)3i&WGhN0l{OgKZlpm%G>Ny~?k5s^oJsFG5WRe1L!|;TE zE|DhzRqWCF+=AEhqvX~e9-KfL;BXfkF&AsqR-Mr%Sa7;F`wtdk3g&rLfEn8PWB^}u zpm-^X)_1cCQiLNQW^nHTJfs>6jOj?zi62*amu^%=b3DaIwS$IsG5Sh^_b@qtVs8fN zXFHNF`7r~$RD#n^fQeO}_bZ{9^Vm|q&+-hurpoRVr7NI-X(+s@6W2q~*&t zPaxpvZTo|e&~p(zih~>pMw(VX{bY_P^bLIgs~pB*HH&aC%46Uw<>k{|}| z2ZrsvrNTvW!T-iN7_p^?$BQ<`tQmRA^*AZkys-GQ^m_PtUMoW6n*imD|G$j$e;@`2PDhu$ z%t&{M{IaA2rbrU*TrfGRP#T2fMQKyfXG7R1h_o}a=yD%V8>Y}hUp>^yt_jcVZcV0j%)S$MzGr! zA!r2dGQxu=rd9bB^>Ldj&=MAc>V0nfGz?ki1IIe?ca@`qRYwCv{ovZO`P!MC>*?6}z(l@;wBcs@wHf0q}# z6|uvT#mg-y#W%OdhP&gBJ$2TouUXM)AWfvgTCRWYg-wZ*{WWWxHcuVUl=iwTO+rXO z+TC@dutRtOtsC@uxY=M>CoCNgQ{UY#X@yiZsFb3)ks!1R!~jyC0^yvePpN+9^4tNR zJ$(`$lQO`FgCwH;^f@DLM+KWj6J|t#mr>eW&sl$uOSLA8-@(Qt z3(w(|ftsp+--jRxNAem!2*rb|NdAIWed|htTb)juYAF=AzY)qx_+TS^nd;Laoy}uSge@%~Jn5N!pf8dP|la=br)T%TJ{dg4%&h@7530yNtFO1$TE6ZA*{{F#?FQ zKMB!a=M7FxI7JJK&G7pE6LX+CjT^0O!zi4BG`Uf+VN~BiBrowcfjizFPD;{;grk-8 z%UN8PZtrNrmPgB$I%wiK=jfO&xK^(10)@Tu4!owDe>UrxgyOmyZ#hqqnny>7eFGW~c?PADZx@*4lju>c=H-gCpi4^`H z0E9q$zvVAgHp&-TDWvFcP**UpzOavw!oabcF|5ETIkW8*Zt_A3?IM0UiVD$@5g;Sa z>ABSQT@2M!qZaI9c$gIkjfHi}PFGN&V{y~~Lx&KdkPs*o7pMGpjG-cf%$q~%31Nc0 zg0Wah+hc};n?){EVL>582opj@+CeT1g}nlXSyf0qp&~!eR4^CAgMmB7Fc?x%1dt#m zmzqt)7d54d15%raX6AxJP4j0JGP6^3t`OhC+19($HQ`p!T2`8140c6 z91xM9!i5H1!KmaMd%vg9=K>hiw7mweXs0ksh5>!T*b`B(5e!UJSRwo_W;`%z=j2_$ za*Dr)JO={p6uQtbu<$NUib4^=!0O|2NTD;qcWWguyq$!)Rqls^!oy+|xRCfdja*Q> zLvx{+ct#b4fwaC}w`*h18>{ zvFT)#x7>b1uSgoph|LsU|E^I+!>|p7(@qX8qj8=D+9}M^l|9FuF#m>_OFKobZAoE9 z8Ai!ezzQ4^b$v?;T^1Y0q^VFWVbd142q|=tYif&??6sGvK#?l%=a^T3cIgL%M*LV}=RDhP}By^T`Fct|EV zPK^IjfKPkFC@2qIYyuhM$c2DGBVu!f^Vq0$7EFb^X>1~1Yon0x6!=b|B~xMDb)o*= zs=^TLFo#e3rKvD!;dQ>bExwB(3lB^!`V?N)p~|RT-bA5e@kJHEU=j=-3P6M)Aygn1 zf%6bPuYhAP2|*l$384b981pN9>QIT1QzQru!h}hMYfl_G>{r0MwHlEZ984rM6;}M* zJA;0OkrIL-Bp5UZ6hZ}Jalo(eu?Ge{F$)63t^e3No7Oh2Fbb6HCD4EwDzl z)eTpV+xU&6pUyt{#jeY%h-54fi1{hJ#(VbQrd#3GL#+2-_fe1%tv?P<{<^RH4L2V@ zJb3N@HzfTOe&=(gRfRe}&iJB_0!xCO-|Ef7w)#GtK5MRi=ch0SqMk7m zA{9ql>(#JF;j81P41#n&c0|lP|MQrW#A;TqAr@YRtNVAYOC`ttyDFU7CkISLZEU4H z<5j@_Pdc{`k_XlxG80V2le)QtSg1_0{lIO1ZvMfL=l?SkPAWEx7dXYV>mT05~H?-(1du7ytxWcjj~jdo(i|$Y^w@)ejQZdh2c?nGnhj1{Hxeb z52QMk38j`=DKjc=B1--9y@pyUAsRuBrLVyjw|hLSzwb|9=<0dnl&ZsNPDIt z8}LED-+1)sq*kjn2=*r@Oouf9Yp6C5ihN-v?5B`2S7CavN_c>_kpI55!oYzd%B%Gz zQ=$1OB=C_cIK%_KPfxMs8S}v(4%VLW;ol}w5%E(P&2?ycNgL-19hSQ}q#}MHpuUx2 zodjM#Oa&A+jC49?JECPTm2`wu`1wOCkPoLY%w%{uI$}fwXe#8?di7c~+)JTSZjiDV z!rO?5fXh5)7z(|of}YQ>Ur&}RJ6~lxEM(!5|Ky{L?V&IrHT2qQppsQN^A2ImlBbS zT<3c$gwWm`x*!OR#>b~JnOTQSW@x3d$5f*=Jqw+xXe?Ey%EkQA31(N(L0Hq4H_@-!3D^;72>!{B{Eh zQV{Lh2^x77CJ)-s=CO?VEDm=+H%+218%9osjJiVBDzX6uSNpPj**0<#h#qp-D^GBbxyQ3-0=rnKaIY5W$_D-$hLN6++O=C}h^J5cr7Kjsb<>C%iTd zyo#+q@!A?wVX9iKSDjA0hs|Q3jQg~KXX1x>{R;l(do(Z9Z$KfC!naTc3@CVT5Bhvi zzk(3MTmQ2$0}4+3NmX?kw+smlHAZ069_v<+?@5R4CH==h?+nndV4)3c9r_h$>z3K^ zo;FvnSL=lY`jVJ2@L|1Q!(deGx-%tL5)VeaPg*Bcu)H& zgFc`V3H)Ww!1VQF3Wg~Ex~?nv^tDe<-y<+w;=&_+DfAkOq;LZ%bPP)iy0SI*3A7-* zkp%gnz9fA15O$#-NrKJc;PfcWKxgM_!Xj9vCP6{(dPczr>sIiUfs0eWZiQ_MMnJcM zoAwe8>Q-2x&1^m6r5K5fGQ2qB9Qj#a48aZ;VVcaoyw_+nB6b}L{tgAh*STzltU46D zDY%KRB(J4%xxfg=ApBLqlZU4NEyziEo&UfdP|bBD(4F(w3KOXt+Zc6>t+5m=iFyx=#HiM7-3$M| zE)K*i{Av;UL;fvXgj9pA@ZA6W(U8JU=M=5WbN@B^*7UO#*8IMuA%)EpIL59wj_}BN znF{8I!R={bP+^OVxr%zQbEJdpGN9YzaSSQUcS)C803;h@7ffd6ex4ds5YX_@Dh6W? zJ4b!a$X@6MfKk&AM&O=I@G%a?j(#xG#4!wm@p3#cCJ7i|8wJydei3feYR7|P7wm6I zZ-lpRAqS6$EQL@LjlJ*d89yvym6-!M+LQ#?j6kg{5jNeMoMz~~VU2wp*@Tz6&D@X*4 zlMlTdTzfenp*R~}LhFJ3g7$a*VqGBdFbk>#CYyXosY;Xjin2*K~~7 zgbpwgIw%pT}VALu-Tz0s|r{Gs~l|%Q#@Vvi1~~t^kZ=342ModCmf36C5K~ z8c;xBp#Mq~jMr>1s4w&s98u`McJm|;-RGlbCK&YX-&eSRo_9xY2r^7CoS7<&z33}U z6{>h85Ey9H8DMac1{$37i%mZmT<9L33HfVaV9U@3!yLeG{&QJB7+f%o&xB0_3`WMs zZDp}1ShT?Sb38ES`e0NGGov~NG|#C#?w!uP3OL68=ORQ@t0K!W+7P|AmwF11lF%ge zD&E24N;)}_?HG8)`wD9%3I<6vc11QA*fMS$J%xuY=%mv^VBi_XQGo>p_`=Jh*`C7e zSr)IeHzd`V=h%*cjUhADQX}+Oo|6gFa&=SO0rE^6^terhNffiUh>{QS5??Or#Xgp6$HS@+cdyP2O0YfV4C`* zDi~coU@Q-UF=BDhOlwdPUOAmmr9D7JDd;s-dCF1{a~9M1mW2+fKgi&R3043F?<~|^>Bw*0|TgGIR>3{ zzsu_d!%ZjMKM>Twpbu(-u|h(rm-E860>e}o1Y>!$CqYVq*70LnN)cB93|y@RFdmPv z0R+07D@g{j5Ddm?Cw_$ouy?MOm2=>5J~0}M_7 zUTfb&<>^jMVFxFC%p8NxEsm=xu)$Dv;^1`8qz(o<`JSZ%z0XYF3Jl8-7zJ*$8H{ z1{+B-(n`o=1~6XbpWNVY>8Qk1m?TL?H%5=abV2@2s~U|%pd9iW2%q=FbV_=3mXg3E{o#Z1{7?mgDapMf5xdst@xJJ<-=ta;R5&j z<~jY<1vo$DcIg`VM!Az?Du~D-U^DHmats8F_`gu9!7fUPk|c6bGA)-lI6@79fs&4s zC;3lMl;RloG)Wvsz{n~NZX;kE(rWF6wgP9daNIKKT)RvaEC>v883VvbXeq#s1MCX# z4vvT2jYkWCaZJF_yujzmfh&}+r&SaH4D1+M3U&g<$DEqNZjL&JmV(sE!+Srk_9~)^ zV`wQ@F36kzaB5gV5U`EYIBTqX0TzeBm>S`(uwRN1`6(pZwThiy3WqXPqk_Red}v>4 zwfZ}qkSowRMX}R;(xrfLk5j;8yn{~!qbOzdrcwcUlgvIW*@wzhs9FmX-?WQT=3qV_ zlsx2ov?Qv~dWF}`lQe+g(Nr*by4@{XtP3;W&ZvR|K*=7BRFpE!)$1D;r?O|TU#5D2 z!KlB$-&l8LaBtzwe^7ij{Mog>E{oh}3PwajgcozyW$;7_4Lk;uib?=dv@Azr%- zLdsIx!^bc^jgH|Hjk7et;94Y>%DaaYB%4hVxabLW3{8cLBLc?CpaO?G6banz(aZ6# ze9sl?qzHnCg=W|nGWfj)A|OI8@zsuh?bmOiTHAoZK4DD-obFwQ0&P@H5CLm&buFY=q~ezG+1ttWc&l{ zlsfTfDy(#|Qw(3pn3yGCoZS*WVwwtzxbF0m6Rv&JBtyB3QB4#G7_2fO{}d+~?}#h# z0&F67E_OK^;kwgP$cp9cmMByT*G zihE`BF~xQa9-j#CZsk=76TBsOg4VVrdXgrOX)46%n|~e@IF7>#G2C8w#d3R;C3~fW z(YX+o3vgck0LRF%>$UdP|5A27KW$}M9-n|mHbN+*P)HF%T1hDtB?(HVQdN^*kZd}g zOk7n$B_)U^i)k&eF&qPc+W4wnYh^pLW zi9nKpWL&CL`Dl*TC~GcC9g`p`G#*c*V2iW5jgbN$#-ddBc@Cl$Mn(mU=?gj;M;n79 zs%1-2s_pa?2TRwSB!kR5K>J$hB_o7WQ|6*nrvy=x7#2j5;eZi~N#-$OZ7ki7WJDDx z`}TF;|LWVX`hDG>&1cAFKO3gZkD>X-XUx8XvJkmE?an&(#nn4k&vhJ2SLC_6x8vMy zS|l(!j2;5`Iet5$y|uEfh?;&^Q%SqDN4BP*osm|Qc|h)vo^4Fz{8~wz(7$dHE7KC zq=gaQB5jaP20WZqZH!UIBWx~8^=?YERITbH!#yLiNw`>xQeD!*00Q*UBgxQh3|*A6 zDtJGGf$Y0~WtMrk|8RwuNG3XGR~Z`ftaD#b!X?VS>5w0eSh;eEcHi?Usu6O%)&@qO z`r{Av(xHU6SB6vsm8Mb%z%Y8~*V%X1KlRF^y{FG!P!AZJ9xbU%(CDEHV7!>?`lqhB zUFPBP7+t0K6isyQLQOoa3&sS>QELF>Wy~rW-BjuzLyMbt?CIfyXLM;QtOytdV?pRw zx2c7Z+{wo=E`=n+dq>(BxlmB5wNayoZuIsr`$6B~;fADnH89K`wxorzF+#0w*_h$01vcjx4-};gim|4LqSz)ovEjQ84EwlquL5Jf zpNdct&#rI;_3STlodOt#I*gYYNcUp#Tt~Vh&qEBx%W^82iwYQv7BIR4pddO(MJPVp z4(JGKI~8vQj7|l{^Z*s1Fm|xDAUu$AmvCSN!`rFAnCbDH-X$P-Y39^aZFLj%T7c22 zU`%py@$y{)`zaGP$>{i&beii=xGW*bID80M-rhXv27%FT-bhi-(gmqVGR;>iBpHX( zJFm&Ifie}Pa>eLjqlfE(Xq4+uao4z12MU8x((Y{r!}vRRE|kJyjM1_!42p-1%q%{5kiZ#DKKUq zc11GC`zV5sRssV_ zhOI8;y%(9yuuK=EbAeLev50^%yEn`0F>9HWx{{{|b}<{^0xk8rr4;z9V3NV81S+rJ zyjiqON)5(C1V%`D+|=v7;nhXMUw#bvL-J7FyG9S*fepSeg-1riPARZ^ zoRL#}WioW}cw;x!LoP&CnFq@M3e*kfqX?~$6$}hSi7X5e4-7;ll_wndFrSw*JKJUt zx{G&vNCj2t@%WD|gMludfDt}FMwcoylQz_r))F1ace4lG#XEgU@i6mYlMdLHaPW^P z#zmxlq8Lar5~pn1U7$!-@@!d#l@6}fuE-^7elJ5Mb*k1{(v&DaRy`LDN%XX{&Fb(; zkQjOWrWnY+eobIpwRqs?Q_55nKc5nN^^U}qh)3xiZ9ij@!Ks}j8N|Z!27Bn;c*{R5 zjD&xnQz%NAT1t}IZB}tLn)9#+ltyN%Q_mTUF^h-T7DTKfQ3SXA+~@s;RTQRLZ!NRyN?wZyEQQ8HdX%7G8mo&OSV=F#8S4Y zkoLWKmJDiH2n>>B+#@jPwX#PmLSWptY}O8yE7_gJa-c#iyiUq3*3Ol=tC0+bc3u-J zWy_>gyI-DxuOiuWfPM$0eFTX=%_|hRW${2EY?xaX)6Bx#QnzG)vJj=MWyu52T4I>$ z97_hZEbyUs*9H^l+?0e;mn|Lu#zaCy8%ahF)?-3oLABOm{TK@QOJ-Pskzp|8)V!QQ zB51Has@IAx#PjHL=i(tcU@P(&2IH{VLkJXX`!yK;8W`#ft&z$47nDBe2r9hQ1cn*! zo;gtPVtok*Q|na?2F|?D^CEWZtbvixV8jw0YvnwX;kp!5V)h=cT4bvcS`mt_Y+!hA z1S`4Z8_p+)f;Yuq%Th7nF3`oMiC+J%5Vifs+jS9WI3cMx5WH0h@;bN$Hlim;y|Ncy%9qgWs`#$>?E; zz~GXHfH8HGJn--{_rYl)Fj{CfPBNqvh|m5cdC>RHnZUQ>EvSAW1AT}P25hT^JvzfS z8{rg#>QtYb)08Oo=_T_}45}E0b{0{u4MH)>pO}A#yE@g@V8m1EOu98NJX8@BD+vb3 zxh3}|Fx~>T(kpG-2ER`5``} z97DPpt5^qT-etcegTP4U1CnGc7Jq&ClkFV=qgbRj0;6sn_VbVuFgVE|qq@}LBXK5lj{1Ugu~(i3eM9~^jguORAg^umbb;s5-ObYS*}zVE@vdldEk%> z2FkL}I2$A|_(b`fMZwdqj6za9S|BWq2BXjHLBK%Z1P)509PCm@V?irMzu5z_Z)6nc z^--{kev*Je3!*&O?Idz<|cKhx`2|1Pi2{_Dcu5T{MBd4npWkJGQGVjIMq#F!Gx7LL3p%iR0 zdxut^Nt(gm{>&y^U@JKMxBuHWzsY2N^Ht+xjV}c&L`F7%Sc=L}$v3aXL^iNX10D|l z`c5%hDc)&(DDjXKY@_~^fbk=-K<~fMOV))#slFN(=Wg%{-8jPe3%kWf#2gFh|6(ZdWw&!f%g73tpyRtXw8YUO9%k>_P zvt-ngjHlp2gMp@>^6(`S#3igVzJ0)WhPDNfKv6FDU*(d;z1G=GOJJbUy+ce;tD8iF zXuxLgT%|%kwhjg{5l_n^{0QUK;2+hEA?;-;VuE{omXd#}z8P)Vi$BQgMC$TPqk00aax~ zA!OV5!fIrTm2Bl|t6-!MJ2@tDkxsV)#k|*qizthF>S(=(5dkASI;|Ch z;SdHelOWTazV`EBb=6u}7(LzD(8(Y$IHr9;Qc+uin$5_Vv$yT$u3$k6Gq-uI-a`U+ z&*5c&P-rHUos{39?c^G;Seu-TecIUw#=OiRaBE2ogJ4xa2%)jELX|_4U7_JMT#y2( zJgWtkfnGSMl*@N4qX8J(WMohd0TsYPMNTwP|GC6bj0H!#!~G4}x6I(=aty{B zfWb?njK{^snPuSTL6 z00UScaw?tm`8s;fPeUy@?A?0OQ|E!efE2tCtpF49j?;4k9-pTRTVHzKFw>;YU5784T_v3HHj^H707y8JV4>-7uC=WKMM(BrjOY$8?jy=8cgeN>PF-2ArjfIUiOY*J2*xh_A z8^vHaiE`~`TZ?-!YG6#b!8qx)jpwXngp5@gMsQ*%7#Bvqy8jg~*Q&yzF#M>uelKw_ zD`X^VF_fDNt`lDU;%b@ng5`p+$Wxi4ug=4D1x6Z?lnV>s5{h5Ca!LN5D6sI4e_j7O z+$@Cw0YO18hYMJEx^&^}5E4Jaf|9|lktbbs9;gf@WPl4YP%(vnoKuYP>@&FFbg;U9 zt=_{$&c1~MM=^i|z2Pn)XHMZ>oxmcN_!J%-yALp)ku|}!}e=u7i%Vz0Y4$>i=zAwB+v}#}kjvftgkJF<|d=d48|0|AZ1vuN@;3_ z-*6g+3cB@KZxfT627rM>D%e^i<9j4d^CQS_JlPqh0GB`vmqD+Nu8;@FT`@eSTuO>4#*s#aG@2Wo(tq0;6kwQ zG%f|t5xTV66-KEqKC8J{zjg{9>UZ2rkI%7}F2w*d4i}7tr@4C0V4zukg=Ni$_55%P{m+09uMX7L9S2b%UQ`iz|7T_z}SukQhq;`YRTeMuuaQ(EYYRb z6l0n`?JcU+!WO1o(bQ0DV9d~mz0S2-u1_t^?Yg3=u~r0wxKL%nmlR4(sx?@%OUCC^ zmg2?G1~4=lA|!v-Trd{Rob}NhVUFcO{%J6rd=JH{B;^;ud;n_E=z*?FQTNB5t|tSh zi3^d7q26W>{W3=gCV+)oGek#(i!k+=wjPXidG{Nzg-|=?DEe{?r-ciWi~a)}D5v;1Mx#UvgI z7PGZHJeTfh35+y--s4{%9ryeFN3|xmsA3S+5vbD7}vNc*#l7XF; z9upY4zsg`#KRkZ?VV$kIGy^hP-IC$C2rzg#00xZL;G{Ve>z0`VU8zOx4K_3u0E4-B zbZE;OJc0tRz2a(ZAt51le|04QK?F3{E>E~c1^YsdHXz+kvbv~~Hn?)EVkvDl~Z z&}3&d7^}0a&#!*|`RD&;8(sk!q8O1*8yHA3NT350c781u4^|X01V*sia?dqbnyy6t zqhCWPUr>p}X=nsY9tIc;=mH0>57r+)e*gY`;{6taDK#e2X_`D^Fpy+$-1_)E+kd=& zzrF-1LG!QE8c3a*a8$e=3|fWb=6lZ!i%bIyHyRoXB^boT!|we(#Df3>ArnlIp}Tz& zNaf?#kL~YaoRbW2p~28(0E=G`NTtRPcy@XlmjxjUz(O0aAVVNUT#U8t?_r(5K&iGV zngSLO42pSA9^fG{0WjQ>AxLN}v|z+e9<-zbD+C5~0g>w~VuRt};-L;|Bc=dT&d1!EjQ#kq1wntgq8w_h?Nr z2#hWp7-Cb%=splzj0d-ye$wM2@L=3NHnGNQ0vHGkJ(jR0vfX7OqhmM%FdWGM8sGw8 zP#{HIbR6K}Zm_bW0eJ0319E{tin+LTkOu;TD^fy6&`rj+!v$Zy#t-t~d%y#>06@QB z;DSu$f|or9cvxQo7`0eRUO&~aP=VCa`l$mvcs^w?0D#*N;)+2q66C=&?M%4@g4YP4 zu{TWi>gQLY7|;?U80Ufrndl|KE7vQSj-!56u9Dl(_nE*5q@9?Sqt}$5Z2ai+qf87e z9k+quB7@KvaBm=k&<-WT==z<}xU_@>bD!2x4t)8xU| zcKi&uK#K8Fz=%OV&|f9ZxOk@Xz{Pl25XAr)4i<6>CwYkqkJ=5{8o+Rq;pPH@5xw4V zum^xa79=vOuH+6u@eKn4#E&d$?6k`6u(FjkB=O>L+BF>mUyx16<&Y4x|c?47IIefubbeutvQ=AXN@sH+bl# ziU*SceW-B(!O)rafq|3^F^Nk5(5x9Q!6|03&lOZ4WSqsf5r^q`!_D1y<0?1yn|N{m|HsHvmDF?IkJ9>(J1k0PM}>j_HyT(IB^aTU`FEgA_=u(OB?dh7 z;lhS_bLnX$8TF-eVgpTBM72F8EI#_^kCSdLcrxv8?-C*-4jKRT(MJcPA=!6>WH>+5 zc;P%{-sT$t=TWb9k>UJ^)?VO}$peN$bVdRF7BG-ta0`PnZ}W|SNxt7UO9p;IMSWz< z=;6zy-3H0fsW<&Ypj$Q15lHq85M1fEJCL#tuicZFNoxk90XPT@HYpFbTkrIRnOeLw z8Z|D8`HQirzF_t+P?`oAO=#dd*Uil{fX9~*OEtg&FmRFDZ;H_C`R(rr z3+Cec?_bt)k$Crx!I+qwbjbMVdm=;7_+2v^4-4}y$&kwwz;FVoVe{v3DO$|#xUvk@ z!GLjVuN<{}l0zw$3`m6DiGh+7T6;WbZuT%HdzExyO4b6CwoVJw&VDy|xBw~!lni|si=kLEKG6ao}PyDV?f$mA~TcIF19|ol42Lw`~uE|WB?KbQX>PFu^Qd`*6FvB z3>=eoFRfdK_>Xgo4`e_w(DKGH0;%KHM*+xQV-al_$XI1Egp0l27H(*?s5OJ%uyIL@ zxyXl(SUkux8TOY9;Ub>0{SFsIGB9}H%EE~WRH-&bZOysU2T2Bf2^ZC74_#0T=7PZZ z)1Us&85xWvXgG}~pqUH`r;vd^C3;+BoM`HON9KhLOmAYcR_#}Ub|dpP)iLr#T8!Eb zK3W9=LyTw5%RzGy1HEr1LkF<{1N)W01u}1gwLRF7aVcGra?k&Ri!qxAnm5>WE>n7R zkPX+U>Pef2gws$03tG*=1u}25-6P3Rnt@KYlZ4N5%MVel$*#!2AjnW?kRb=JFc+6> z9tK4+8qiQ!NXyUaVSpAx$f%bLF)B}yVAwny-^69AIhIo6&HKc~CsY*mkzn!NcmMhn zf+3^K7kL82bLL`9@(fv%KYU03n?uIOO-V*!WgeF)E!_MAy--O<3&VVg36+@)z>rMx zBB)u;9CH!9YxQtG6(BMQ1~JT;i-8MsAcYiRt0ZIq4Y@q2ea5&?1p+CPU8~M98OZL) zkm})R7lD-hE~y{`EWmJR4Wx85@L2?8)MennVuiTavknNg-wqa4LZLMS#VKrui3WPD z9_}KrZ306r##^h0w)3TFAw%cj5Ddlwt#IqexQ8X9fecxaUEu@~(Lg= zZ<}Lq%ih4FoON$i+PwuDzyafzKLWj_ShQ_{L&+sFnk}VfAk~^wyWe49>xRfcIF!DH z=m%jzdj|y$Ru5zl8j1!jiUsW*6gVJdnD+y<)MM6;zyTin*Ie2LXz0w%ZDRLkZ~kls zkb#Mb$u<#C%)eFt@JAU{TuETyXznH7an(Um2w>NpYbbfNxE6 z2)JM{SfBiZtsr=UVJxg4{Y@$3tIyRT8Vn+1^5HkV)r-(z{h$WKFZ%M5f@tRaX7`-X zU>XAPW`r~Qp~NBMw+Ri6gBlQZvX&(0kT?JtKm(#AL4(9I)LuR+a7g#j3PWfx4O*(f zyJv|U)cwG(6$~SN33Uqbh(yT>lcCTU=5U1L8*ZP>iX3)Z=WmfTRMsHrZBxxNXHnz; zGMfA>=}(gj3Wo0{B@XctCvc#lrOGJoD~^jC@`#2?;1gU}QyrKKh_KLl@y^dk7|#+$ zDth+OcOPGTst*XNsioAU;~~hB1GCLwp_66g7IYf-`l#GQP;vAyII?y0CNE(YOlD9mdCx`}@x4NPQ7hAI&IA4&)xfuHdhU4} zpcB)@fHIjdW?t7I= zWf+TMGQ7k4n;+~#ZKv%x&gRC$@D3Y0w(U5toL8=G+qI2kB&-sv>(y$hUaulmRI5j; z(a`6RSU%dyLp|%nLM)d5=TfGISPaQHWiE6fWhy-)Lvz7k%up;_eCm1sdcS&}_q3Re zMM5jKhzr?Z+4jzV?44gsTh|@O>AiP3=j!U>YhBe>wuO_*!bj)Y=fm$DU+(>e^%^8i2qjag*J-6vDWx$OcBZ+dzw8nPV&sS!-w357|899@loOw9?=QYO@3 z&9ZIVwQY+Wg%ZP{1eX%DO~3w!PuH(WJ!5m1AfJBvKW{Pu@-#$`liwjnS9~Ud;qXE7 z77nWtbcYTCG6uu4T~@YbRE-9m=N)^$>4HooQ|*sR`nGyo+uK*tb{>M(*4jcP!G?Uo7fLWZ$R z5Cm{p@qvMXW=n2Hj3~{X4~5jd7wFY@a4-tazKQ-*46_Sh!APs zcs&bT)~_~h^s-BU6>g>%1zc*@WF}>9d}*opf)1G0H0673HUJ>B(cq*`$QY6&K;~u& zLddL>bmP4mfWX3x(~JNwyr;IOJA!u!f&eN@To)j7%2gjJk_-1pzL;_a@(bifoy%Eu zf#cRoQ>WPq0pCP>9t zocnQ&as}_Lk<0j2jsOVLvowL>WpzTRi{AMB@&R>%b%Tnr{-!#??w=tIyA-R481`R( z(@o2O5_&M0U{v=g1OZYB?!~3J#Md<5q8(%IB?J|tU7Zk~{(=eZ7=tFXV|1F(j?sm| z9m4>NVSv3rZtvS{5o0S8-r$5MApik72Dh>VxEKR5`Hle)Bh1CfS6PhPR15>!G3LQy z^uxu_djHf-D*+~C;A7Y^1Z)@v+Ek27F;s<)kp~dqVsuqPjECDp3|#vjUqFBf>1vMQ z^z$WXk>=*OjW+KXHPRhpM6YhgpnHsIkQfiXD;)# z81|-O$iFHD5hKVq-}wMQj6Cfa(>h3u?b0zcpcq!~JKeM*U_u>y3_FGpDe>2xjAtpP zBnG@=R78x&t1vN!*iuRdcMPrCV&K|$yJ^X^{apf%b1_QxGn20XOQ~vhjNml5W5C6r zXTB>TMnMCf^5(Bl_GnPTejQ3Ut5xAB)Cfjgdw#Z4eGFKSCR0;GF9HZgG}B6+2zi3h&nJH=@$D;G zUDq;<0{OQ~l41m@7)u~A@=T1``kmh~sw9T#368$hUQrMGiFr$9h4zR8%0Atsn%;2LDb>8*qlc7ZkXOEWPn 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